diff --git a/.classpath b/.classpath index f5617dd0454..c5d1e81bbd0 100644 --- a/.classpath +++ b/.classpath @@ -1,15 +1,9 @@ - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/.gitattributes b/.gitattributes index dcc153cfebf..799d79ab4e0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,15 +5,11 @@ /CHANGES.txt -text svneol=native#text/plain /LICENSE.txt svneol=native#text/plain /README.txt svneol=native#text/plain -/build.xml svneol=native#text/xml 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.jardesc -text build/forge.sh svneol=native#text/x-sh -build/forge.xml svneol=native#text/xml -build/manifest.forge -text build/support/AdiumApplescriptRunner -text svneol=unset#unset build/support/template.applescript -text /delete-me.txt svneol=native#text/plain @@ -99,8348 +95,6 @@ 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/cardsfolder/abandoned_outpost.txt -text svneol=native#text/plain -res/cardsfolder/abbey_gargoyles.txt -text svneol=native#text/plain -res/cardsfolder/abbey_matron.txt svneol=native#text/plain -res/cardsfolder/abduction.txt -text svneol=native#text/plain -res/cardsfolder/abjure.txt -text svneol=native#text/plain -res/cardsfolder/abolish.txt -text svneol=native#text/plain -res/cardsfolder/abomination.txt -text svneol=native#text/plain -res/cardsfolder/aboshan_cephalid_emperor.txt -text svneol=native#text/plain -res/cardsfolder/aboshans_desire.txt -text svneol=native#text/plain -res/cardsfolder/about_face.txt -text svneol=native#text/plain -res/cardsfolder/absolute_grace.txt -text svneol=native#text/plain -res/cardsfolder/absolute_law.txt -text svneol=native#text/plain -res/cardsfolder/absorb.txt -text svneol=native#text/plain -res/cardsfolder/absorb_vis.txt -text svneol=native#text/plain -res/cardsfolder/abuna_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_gatekeeper.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_horror.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_hunter.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_nocturnus.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_persecutor.txt -text svneol=native#text/plain -res/cardsfolder/abyssal_specter.txt -text svneol=native#text/plain -res/cardsfolder/academy_rector.txt -text svneol=native#text/plain -res/cardsfolder/academy_ruins.txt -text svneol=native#text/plain -res/cardsfolder/accelerate.txt -text svneol=native#text/plain -res/cardsfolder/accelerated_mutation.txt -text svneol=native#text/plain -res/cardsfolder/acceptable_losses.txt -text svneol=native#text/plain -res/cardsfolder/accorder_paladin.txt -text svneol=native#text/plain -res/cardsfolder/accorders_shield.txt -text svneol=native#text/plain -res/cardsfolder/accumulated_knowledge.txt -text svneol=native#text/plain -res/cardsfolder/accursed_centaur.txt -text svneol=native#text/plain -res/cardsfolder/acid_rain.txt -text svneol=native#text/plain -res/cardsfolder/acid_web_spider.txt -text svneol=native#text/plain -res/cardsfolder/acidic_slime.txt -text svneol=native#text/plain -res/cardsfolder/acidic_sliver.txt svneol=native#text/plain -res/cardsfolder/acidic_soil.txt -text svneol=native#text/plain -res/cardsfolder/acolyte_of_xathrid.txt -text svneol=native#text/plain -res/cardsfolder/acorn_harvest.txt -text svneol=native#text/plain -res/cardsfolder/acquire.txt -text svneol=native#text/plain -res/cardsfolder/acridian.txt -text svneol=native#text/plain -res/cardsfolder/act_of_aggression.txt -text svneol=native#text/plain -res/cardsfolder/act_of_treason.txt -text svneol=native#text/plain -res/cardsfolder/active_volcano.txt -text svneol=native#text/plain -res/cardsfolder/adamaro_first_to_desire.txt -text svneol=native#text/plain -res/cardsfolder/adarkar_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/adarkar_valkyrie.txt -text svneol=native#text/plain -res/cardsfolder/adarkar_wastes.txt -text svneol=native#text/plain -res/cardsfolder/adarkar_windform.txt svneol=native#text/plain -res/cardsfolder/adder_staff_boggart.txt svneol=native#text/plain -res/cardsfolder/admonition_angel.txt -text svneol=native#text/plain -res/cardsfolder/adun_oakenshield.txt -text svneol=native#text/plain -res/cardsfolder/advance_scout.txt -text svneol=native#text/plain -res/cardsfolder/advanced_hoverguard.txt -text svneol=native#text/plain -res/cardsfolder/adventuring_gear.txt -text svneol=native#text/plain -res/cardsfolder/aegis_of_the_meek.txt -text svneol=native#text/plain -res/cardsfolder/aeolipile.txt -text svneol=native#text/plain -res/cardsfolder/aerathi_berserker.txt -text svneol=native#text/plain -res/cardsfolder/aerie_mystics.txt -text svneol=native#text/plain -res/cardsfolder/aerie_ouphes.txt -text svneol=native#text/plain -res/cardsfolder/aesthir_glider.txt -text svneol=native#text/plain -res/cardsfolder/aether_adept.txt -text svneol=native#text/plain -res/cardsfolder/aether_burst.txt -text svneol=native#text/plain -res/cardsfolder/aether_charge.txt -text svneol=native#text/plain -res/cardsfolder/aether_figment.txt -text svneol=native#text/plain -res/cardsfolder/aether_flash.txt -text svneol=native#text/plain -res/cardsfolder/aether_membrane.txt -text svneol=native#text/plain -res/cardsfolder/aether_mutation.txt -text svneol=native#text/plain -res/cardsfolder/aether_shockwave.txt -text svneol=native#text/plain -res/cardsfolder/aether_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/aether_sting.txt svneol=native#text/plain -res/cardsfolder/aether_tradewinds.txt svneol=native#text/plain -res/cardsfolder/aether_vial.txt -text svneol=native#text/plain -res/cardsfolder/aether_web.txt -text svneol=native#text/plain -res/cardsfolder/aetherflame_wall.txt -text svneol=native#text/plain -res/cardsfolder/aethermages_touch.txt -text svneol=native#text/plain -res/cardsfolder/aethersnipe.txt -text svneol=native#text/plain -res/cardsfolder/affa_guard_hound.txt -text svneol=native#text/plain -res/cardsfolder/afflict.txt -text svneol=native#text/plain -res/cardsfolder/afterlife.txt -text svneol=native#text/plain -res/cardsfolder/aftershock.txt svneol=native#text/plain -res/cardsfolder/agadeem_occultist.txt svneol=native#text/plain -res/cardsfolder/ageless_entity.txt -text svneol=native#text/plain -res/cardsfolder/agent_of_masks.txt -text svneol=native#text/plain -res/cardsfolder/agent_of_shauku.txt -text svneol=native#text/plain -res/cardsfolder/agent_of_stromgald.txt -text svneol=native#text/plain -res/cardsfolder/aggressive_urge.txt -text svneol=native#text/plain -res/cardsfolder/agility.txt -text svneol=native#text/plain -res/cardsfolder/agonizing_demise.txt -text svneol=native#text/plain -res/cardsfolder/agony_warp.txt -text svneol=native#text/plain -res/cardsfolder/agrus_kos_wojek_veteran.txt -text svneol=native#text/plain -res/cardsfolder/air_bladder.txt -text svneol=native#text/plain -res/cardsfolder/air_elemental.txt -text svneol=native#text/plain -res/cardsfolder/air_servant.txt -text svneol=native#text/plain -res/cardsfolder/airborne_aid.txt -text svneol=native#text/plain -res/cardsfolder/airdrop_condor.txt -text svneol=native#text/plain -res/cardsfolder/ajani_goldmane.txt -text svneol=native#text/plain -res/cardsfolder/ajani_vengeant.txt -text svneol=native#text/plain -res/cardsfolder/ajanis_mantra.txt -text svneol=native#text/plain -res/cardsfolder/ajanis_pridemate.txt -text svneol=native#text/plain -res/cardsfolder/akki_avalanchers.txt svneol=native#text/plain -res/cardsfolder/akki_blizzard_herder.txt -text svneol=native#text/plain -res/cardsfolder/akki_coalflinger.txt -text svneol=native#text/plain -res/cardsfolder/akki_drillmaster.txt -text svneol=native#text/plain -res/cardsfolder/akki_raider.txt -text svneol=native#text/plain -res/cardsfolder/akki_rockspeaker.txt -text svneol=native#text/plain -res/cardsfolder/akki_underling.txt -text svneol=native#text/plain -res/cardsfolder/akki_underminer.txt -text svneol=native#text/plain -res/cardsfolder/akoum_battlesinger.txt -text svneol=native#text/plain -res/cardsfolder/akoum_boulderfoot.txt -text svneol=native#text/plain -res/cardsfolder/akoum_refuge.txt -text svneol=native#text/plain -res/cardsfolder/akrasan_squire.txt -text svneol=native#text/plain -res/cardsfolder/akroma_angel_of_fury.txt -text svneol=native#text/plain -res/cardsfolder/akroma_angel_of_wrath.txt -text svneol=native#text/plain -res/cardsfolder/akromas_devoted.txt -text svneol=native#text/plain -res/cardsfolder/akromas_memorial.txt -text svneol=native#text/plain -res/cardsfolder/akromas_vengeance.txt -text svneol=native#text/plain -res/cardsfolder/aku_djinn.txt -text svneol=native#text/plain -res/cardsfolder/akuta_born_of_ash.txt -text svneol=native#text/plain -res/cardsfolder/alabaster_dragon.txt -text svneol=native#text/plain -res/cardsfolder/alabaster_leech.txt -text svneol=native#text/plain -res/cardsfolder/alabaster_wall.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_cavalier.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_grenadier.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_musketeer.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_trooper.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_veteran.txt -text svneol=native#text/plain -res/cardsfolder/alaborn_zealot.txt -text svneol=native#text/plain -res/cardsfolder/aladdin.txt -text svneol=native#text/plain -res/cardsfolder/aladdins_ring.txt -text svneol=native#text/plain -res/cardsfolder/alarum.txt -text svneol=native#text/plain -res/cardsfolder/albino_troll.txt -text svneol=native#text/plain -res/cardsfolder/alert_shu_infantry.txt -text svneol=native#text/plain -res/cardsfolder/alexi_zephyr_mage.txt svneol=native#text/plain -res/cardsfolder/alexis_cloak.txt -text svneol=native#text/plain -res/cardsfolder/algae_gharial.txt -text svneol=native#text/plain -res/cardsfolder/ali_baba.txt -text svneol=native#text/plain -res/cardsfolder/ali_from_cairo.txt -text svneol=native#text/plain -res/cardsfolder/alibans_tower.txt -text svneol=native#text/plain -res/cardsfolder/all_hallows_eve.txt -text svneol=native#text/plain -res/cardsfolder/all_is_dust.txt -text svneol=native#text/plain -res/cardsfolder/all_suns_dawn.txt -text svneol=native#text/plain -res/cardsfolder/allay.txt -text svneol=native#text/plain -res/cardsfolder/alley_grifters.txt -text svneol=native#text/plain -res/cardsfolder/allied_strategies.txt -text svneol=native#text/plain -res/cardsfolder/allosaurus_rider.txt -text svneol=native#text/plain -res/cardsfolder/alloy_myr.txt -text svneol=native#text/plain -res/cardsfolder/alluring_scent.txt -text svneol=native#text/plain -res/cardsfolder/alluring_siren.txt -text svneol=native#text/plain -res/cardsfolder/alpha_kavu.txt -text svneol=native#text/plain -res/cardsfolder/alpha_myr.txt -text svneol=native#text/plain -res/cardsfolder/alpha_tyrranax.txt -text svneol=native#text/plain -res/cardsfolder/altar_golem.txt -text svneol=native#text/plain -res/cardsfolder/altar_of_bone.txt -text svneol=native#text/plain -res/cardsfolder/altar_of_dementia.txt -text svneol=native#text/plain -res/cardsfolder/altar_of_shadows.txt svneol=native#text/plain -res/cardsfolder/altars_light.txt -text svneol=native#text/plain -res/cardsfolder/aluren.txt -text svneol=native#text/plain -res/cardsfolder/ambassador_laquatus.txt -text svneol=native#text/plain -res/cardsfolder/ambassador_oak.txt -text svneol=native#text/plain -res/cardsfolder/ambitions_cost.txt -text svneol=native#text/plain -res/cardsfolder/ambush.txt svneol=native#text/plain -res/cardsfolder/ambush_commander.txt -text svneol=native#text/plain -res/cardsfolder/ambush_party.txt -text svneol=native#text/plain -res/cardsfolder/amnesia.txt -text svneol=native#text/plain -res/cardsfolder/amok.txt -text svneol=native#text/plain -res/cardsfolder/amphibious_kavu.txt svneol=native#text/plain -res/cardsfolder/amrou_kithkin.txt -text svneol=native#text/plain -res/cardsfolder/amrou_scout.txt -text svneol=native#text/plain -res/cardsfolder/amrou_seekers.txt -text svneol=native#text/plain -res/cardsfolder/amugaba.txt -text svneol=native#text/plain -res/cardsfolder/amulet_of_kroog.txt -text svneol=native#text/plain -res/cardsfolder/amulet_of_unmaking.txt -text svneol=native#text/plain -res/cardsfolder/amulet_of_vigor.txt -text svneol=native#text/plain -res/cardsfolder/an_havva_constable.txt svneol=native#text/plain -res/cardsfolder/an_havva_inn.txt -text svneol=native#text/plain -res/cardsfolder/an_havva_township.txt -text svneol=native#text/plain -res/cardsfolder/an_zerrin_ruins.txt -text svneol=native#text/plain -res/cardsfolder/ana_disciple.txt -text svneol=native#text/plain -res/cardsfolder/anaba_ancestor.txt -text svneol=native#text/plain -res/cardsfolder/anaba_bodyguard.txt -text svneol=native#text/plain -res/cardsfolder/anaba_shaman.txt -text svneol=native#text/plain -res/cardsfolder/anaba_spirit_crafter.txt -text svneol=native#text/plain -res/cardsfolder/anaconda.txt -text svneol=native#text/plain -res/cardsfolder/anarchist.txt -text svneol=native#text/plain -res/cardsfolder/anarchy.txt -text svneol=native#text/plain -res/cardsfolder/ancestors_chosen.txt svneol=native#text/plain -res/cardsfolder/ancestors_prophet.txt -text svneol=native#text/plain -res/cardsfolder/ancestral_mask.txt -text svneol=native#text/plain -res/cardsfolder/ancestral_memories.txt svneol=native#text/plain -res/cardsfolder/ancestral_recall.txt -text svneol=native#text/plain -res/cardsfolder/ancestral_tribute.txt -text svneol=native#text/plain -res/cardsfolder/ancestral_vision.txt -text svneol=native#text/plain -res/cardsfolder/ancient_amphitheater.txt -text svneol=native#text/plain -res/cardsfolder/ancient_craving.txt -text svneol=native#text/plain -res/cardsfolder/ancient_den.txt -text svneol=native#text/plain -res/cardsfolder/ancient_grudge.txt -text svneol=native#text/plain -res/cardsfolder/ancient_hellkite.txt -text svneol=native#text/plain -res/cardsfolder/ancient_hydra.txt -text svneol=native#text/plain -res/cardsfolder/ancient_runes.txt svneol=native#text/plain -res/cardsfolder/ancient_silverback.txt -text svneol=native#text/plain -res/cardsfolder/ancient_spider.txt -text svneol=native#text/plain -res/cardsfolder/ancient_spring.txt -text svneol=native#text/plain -res/cardsfolder/ancient_stirrings.txt svneol=native#text/plain -res/cardsfolder/ancient_tomb.txt -text svneol=native#text/plain -res/cardsfolder/andradite_leech.txt -text svneol=native#text/plain -res/cardsfolder/angel_of_despair.txt -text svneol=native#text/plain -res/cardsfolder/angel_of_fury.txt -text svneol=native#text/plain -res/cardsfolder/angel_of_light.txt -text svneol=native#text/plain -res/cardsfolder/angel_of_mercy.txt -text svneol=native#text/plain -res/cardsfolder/angel_of_retribution.txt -text svneol=native#text/plain -res/cardsfolder/angelfire_crusader.txt -text svneol=native#text/plain -res/cardsfolder/angelheart_vial.txt svneol=native#text/plain -res/cardsfolder/angelic_benediction.txt -text svneol=native#text/plain -res/cardsfolder/angelic_blessing.txt -text svneol=native#text/plain -res/cardsfolder/angelic_chorus.txt -text svneol=native#text/plain -res/cardsfolder/angelic_curator.txt -text svneol=native#text/plain -res/cardsfolder/angelic_favor.txt -text svneol=native#text/plain -res/cardsfolder/angelic_page.txt -text svneol=native#text/plain -res/cardsfolder/angelic_protector.txt -text svneol=native#text/plain -res/cardsfolder/angelic_renewal.txt -text svneol=native#text/plain -res/cardsfolder/angelic_shield.txt svneol=native#text/plain -res/cardsfolder/angelic_voices.txt -text svneol=native#text/plain -res/cardsfolder/angelic_wall.txt -text svneol=native#text/plain -res/cardsfolder/angels_feather.txt -text svneol=native#text/plain -res/cardsfolder/angels_grace.txt svneol=native#text/plain -res/cardsfolder/angels_mercy.txt -text svneol=native#text/plain -res/cardsfolder/angelsong.txt -text svneol=native#text/plain -res/cardsfolder/anger.txt -text svneol=native#text/plain -res/cardsfolder/angry_mob.txt -text svneol=native#text/plain -res/cardsfolder/angus_mackenzie.txt -text svneol=native#text/plain -res/cardsfolder/animal_boneyard.txt -text svneol=native#text/plain -res/cardsfolder/animate_artifact.txt -text svneol=native#text/plain -res/cardsfolder/animate_dead.txt -text svneol=native#text/plain -res/cardsfolder/animate_land.txt -text svneol=native#text/plain -res/cardsfolder/animate_wall.txt -text svneol=native#text/plain -res/cardsfolder/ankh_of_mishra.txt -text svneol=native#text/plain -res/cardsfolder/annihilate.txt -text svneol=native#text/plain -res/cardsfolder/annul.txt -text svneol=native#text/plain -res/cardsfolder/anodet_lurker.txt -text svneol=native#text/plain -res/cardsfolder/anoint.txt -text svneol=native#text/plain -res/cardsfolder/anowon_the_ruin_sage.txt -text svneol=native#text/plain -res/cardsfolder/ant_queen.txt -text svneol=native#text/plain -res/cardsfolder/anthroplasm.txt -text svneol=native#text/plain -res/cardsfolder/antler_skulkin.txt -text svneol=native#text/plain -res/cardsfolder/anurid_barkripper.txt -text svneol=native#text/plain -res/cardsfolder/anurid_brushhopper.txt -text svneol=native#text/plain -res/cardsfolder/anurid_murkdiver.txt -text svneol=native#text/plain -res/cardsfolder/anvil_of_bogardan.txt -text svneol=native#text/plain -res/cardsfolder/apes_of_rath.txt -text svneol=native#text/plain -res/cardsfolder/apex_hawks.txt -text svneol=native#text/plain -res/cardsfolder/aphetto_alchemist.txt -text svneol=native#text/plain -res/cardsfolder/aphetto_exterminator.txt svneol=native#text/plain -res/cardsfolder/aphetto_grifter.txt -text svneol=native#text/plain -res/cardsfolder/aphetto_runecaster.txt -text svneol=native#text/plain -res/cardsfolder/aphetto_vulture.txt -text svneol=native#text/plain -res/cardsfolder/aphotic_wisps.txt -text svneol=native#text/plain -res/cardsfolder/apocalypse.txt -text svneol=native#text/plain -res/cardsfolder/apocalypse_hydra.txt -text svneol=native#text/plain -res/cardsfolder/apostles_blessing.txt -text svneol=native#text/plain -res/cardsfolder/apothecary_initiate.txt -text svneol=native#text/plain -res/cardsfolder/apprentice_necromancer.txt svneol=native#text/plain -res/cardsfolder/apprentice_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/apprentice_wizard.txt -text svneol=native#text/plain -res/cardsfolder/aquamoeba.txt -text svneol=native#text/plain -res/cardsfolder/aquitects_will.txt -text svneol=native#text/plain -res/cardsfolder/araba_mothrider.txt -text svneol=native#text/plain -res/cardsfolder/arachnoid.txt -text svneol=native#text/plain -res/cardsfolder/arashi_the_sky_asunder.txt -text svneol=native#text/plain -res/cardsfolder/arbiter_of_knollridge.txt svneol=native#text/plain -res/cardsfolder/arbor_elf.txt -text svneol=native#text/plain -res/cardsfolder/arc_blade.txt -text svneol=native#text/plain -res/cardsfolder/arc_lightning.txt -text svneol=native#text/plain -res/cardsfolder/arc_mage.txt -text svneol=native#text/plain -res/cardsfolder/arc_runner.txt -text svneol=native#text/plain -res/cardsfolder/arc_slogger.txt -text svneol=native#text/plain -res/cardsfolder/arc_trail.txt svneol=native#text/plain -res/cardsfolder/arcades_sabboth.txt -text svneol=native#text/plain -res/cardsfolder/arcane_sanctum.txt -text svneol=native#text/plain -res/cardsfolder/arcane_spyglass.txt -text svneol=native#text/plain -res/cardsfolder/arcane_teachings.txt -text svneol=native#text/plain -res/cardsfolder/arcanis_the_omnipotent.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_bruiser.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_crusher.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_hybrid.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_lancer.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_overseer.txt svneol=native#text/plain -res/cardsfolder/arcbound_ravager.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_reclaimer.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_slith.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_stinger.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_wanderer.txt -text svneol=native#text/plain -res/cardsfolder/arcbound_worker.txt -text svneol=native#text/plain -res/cardsfolder/archaeological_dig.txt -text svneol=native#text/plain -res/cardsfolder/archangel.txt -text svneol=native#text/plain -res/cardsfolder/archdemon_of_unx.txt -text svneol=native#text/plain -res/cardsfolder/architects_of_will.txt -text svneol=native#text/plain -res/cardsfolder/archivist.txt -text svneol=native#text/plain -res/cardsfolder/archon_of_justice.txt -text svneol=native#text/plain -res/cardsfolder/archon_of_redemption.txt -text svneol=native#text/plain -res/cardsfolder/arctic_flats.txt -text svneol=native#text/plain -res/cardsfolder/arctic_foxes.txt -text svneol=native#text/plain -res/cardsfolder/arctic_nishoba.txt -text svneol=native#text/plain -res/cardsfolder/arctic_wolves.txt -text svneol=native#text/plain -res/cardsfolder/arcums_sleigh.txt -text svneol=native#text/plain -res/cardsfolder/ardent_militia.txt -text svneol=native#text/plain -res/cardsfolder/ardent_plea.txt -text svneol=native#text/plain -res/cardsfolder/ardent_recruit.txt -text svneol=native#text/plain -res/cardsfolder/ardent_soldier.txt -text svneol=native#text/plain -res/cardsfolder/arena_of_the_ancients.txt -text svneol=native#text/plain -res/cardsfolder/arensons_aura.txt -text svneol=native#text/plain -res/cardsfolder/argent_mutation.txt svneol=native#text/plain -res/cardsfolder/argentum_armor.txt svneol=native#text/plain -res/cardsfolder/argivian_archaeologist.txt -text svneol=native#text/plain -res/cardsfolder/argivian_blacksmith.txt -text svneol=native#text/plain -res/cardsfolder/argivian_find.txt -text svneol=native#text/plain -res/cardsfolder/argivian_restoration.txt -text svneol=native#text/plain -res/cardsfolder/argothian_elder.txt -text svneol=native#text/plain -res/cardsfolder/argothian_enchantress.txt -text svneol=native#text/plain -res/cardsfolder/argothian_pixies.txt -text svneol=native#text/plain -res/cardsfolder/argothian_swine.txt -text svneol=native#text/plain -res/cardsfolder/argothian_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/arid_mesa.txt -text svneol=native#text/plain -res/cardsfolder/ark_of_blight.txt -text svneol=native#text/plain -res/cardsfolder/armadillo_cloak.txt -text svneol=native#text/plain -res/cardsfolder/armageddon.txt -text svneol=native#text/plain -res/cardsfolder/armageddon_clock.txt -text svneol=native#text/plain -res/cardsfolder/armament_master.txt -text svneol=native#text/plain -res/cardsfolder/armed_response.txt -text svneol=native#text/plain -res/cardsfolder/armillary_sphere.txt -text svneol=native#text/plain -res/cardsfolder/armistice.txt -text svneol=native#text/plain -res/cardsfolder/armor_of_faith.txt -text svneol=native#text/plain -res/cardsfolder/armor_sliver.txt svneol=native#text/plain -res/cardsfolder/armor_thrull.txt -text svneol=native#text/plain -res/cardsfolder/armored_ascension.txt -text svneol=native#text/plain -res/cardsfolder/armored_cancrix.txt -text svneol=native#text/plain -res/cardsfolder/armored_galleon.txt -text svneol=native#text/plain -res/cardsfolder/armored_griffin.txt -text svneol=native#text/plain -res/cardsfolder/armored_guardian.txt -text svneol=native#text/plain -res/cardsfolder/armored_pegasus.txt -text svneol=native#text/plain -res/cardsfolder/armorer_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/arms_dealer.txt -text svneol=native#text/plain -res/cardsfolder/army_ants.txt -text svneol=native#text/plain -res/cardsfolder/army_of_allah.txt -text svneol=native#text/plain -res/cardsfolder/arnjlots_ascent.txt -text svneol=native#text/plain -res/cardsfolder/arrest.txt -text svneol=native#text/plain -res/cardsfolder/arrogant_bloodlord.txt -text svneol=native#text/plain -res/cardsfolder/arrogant_vampire.txt -text svneol=native#text/plain -res/cardsfolder/arrogant_wurm.txt -text svneol=native#text/plain -res/cardsfolder/arrow_volley_trap.txt -text svneol=native#text/plain -res/cardsfolder/artifact_blast.txt -text svneol=native#text/plain -res/cardsfolder/artifact_mutation.txt -text svneol=native#text/plain -res/cardsfolder/artifact_ward.txt -text svneol=native#text/plain -res/cardsfolder/artificers_intuition.txt -text svneol=native#text/plain -res/cardsfolder/artillerize.txt -text svneol=native#text/plain -res/cardsfolder/artisan_of_kozilek.txt -text svneol=native#text/plain -res/cardsfolder/ascendant_evincar.txt -text svneol=native#text/plain -res/cardsfolder/ascending_aven.txt -text svneol=native#text/plain -res/cardsfolder/asceticism.txt -text svneol=native#text/plain -res/cardsfolder/ashas_favor.txt -text svneol=native#text/plain -res/cardsfolder/ashcoat_bear.txt -text svneol=native#text/plain -res/cardsfolder/ashen_firebeast.txt -text svneol=native#text/plain -res/cardsfolder/ashen_monstrosity.txt -text svneol=native#text/plain -res/cardsfolder/ashen_powder.txt -text svneol=native#text/plain -res/cardsfolder/ashen_skin_zubera.txt -text svneol=native#text/plain -res/cardsfolder/ashenmoor_cohort.txt -text svneol=native#text/plain -res/cardsfolder/ashenmoor_gouger.txt -text svneol=native#text/plain -res/cardsfolder/ashenmoor_liege.txt svneol=native#text/plain -res/cardsfolder/ashes_to_ashes.txt -text svneol=native#text/plain -res/cardsfolder/ashnods_altar.txt -text svneol=native#text/plain -res/cardsfolder/ashnods_transmogrant.txt -text svneol=native#text/plain -res/cardsfolder/asmira_holy_avenger.txt svneol=native#text/plain -res/cardsfolder/aspect_of_mongoose.txt -text svneol=native#text/plain -res/cardsfolder/aspect_of_wolf.txt svneol=native#text/plain -res/cardsfolder/assassinate.txt -text svneol=native#text/plain -res/cardsfolder/assassins_blade.txt -text svneol=native#text/plain -res/cardsfolder/assault_griffin.txt -text svneol=native#text/plain -res/cardsfolder/assault_strobe.txt -text svneol=native#text/plain -res/cardsfolder/assault_zeppelid.txt -text svneol=native#text/plain -res/cardsfolder/assembly_worker.txt -text svneol=native#text/plain -res/cardsfolder/assert_authority.txt -text svneol=native#text/plain -res/cardsfolder/astral_slide.txt -text svneol=native#text/plain -res/cardsfolder/astral_steel.txt -text svneol=native#text/plain -res/cardsfolder/astrolabe.txt -text svneol=native#text/plain -res/cardsfolder/atog.txt -text svneol=native#text/plain -res/cardsfolder/atogatog.txt svneol=native#text/plain -res/cardsfolder/attrition.txt -text svneol=native#text/plain -res/cardsfolder/attunement.txt -text svneol=native#text/plain -res/cardsfolder/augur_il_vec.txt -text svneol=native#text/plain -res/cardsfolder/augur_of_skulls.txt -text svneol=native#text/plain -res/cardsfolder/augury_adept.txt -text svneol=native#text/plain -res/cardsfolder/augury_owl.txt -text svneol=native#text/plain -res/cardsfolder/aunties_hovel.txt -text svneol=native#text/plain -res/cardsfolder/aura_blast.txt -text svneol=native#text/plain -res/cardsfolder/aura_extraction.txt -text svneol=native#text/plain -res/cardsfolder/aura_flux.txt -text svneol=native#text/plain -res/cardsfolder/aura_fracture.txt -text svneol=native#text/plain -res/cardsfolder/aura_gnarlid.txt -text svneol=native#text/plain -res/cardsfolder/aura_mutation.txt -text svneol=native#text/plain -res/cardsfolder/aura_of_dominion.txt -text svneol=native#text/plain -res/cardsfolder/aura_of_silence.txt -text svneol=native#text/plain -res/cardsfolder/aura_shards.txt -text svneol=native#text/plain -res/cardsfolder/auramancer.txt -text svneol=native#text/plain -res/cardsfolder/auratog.txt -text svneol=native#text/plain -res/cardsfolder/auriok_bladewarden.txt -text svneol=native#text/plain -res/cardsfolder/auriok_champion.txt -text svneol=native#text/plain -res/cardsfolder/auriok_edgewright.txt -text svneol=native#text/plain -res/cardsfolder/auriok_glaivemaster.txt -text svneol=native#text/plain -res/cardsfolder/auriok_salvagers.txt -text svneol=native#text/plain -res/cardsfolder/auriok_sunchaser.txt -text svneol=native#text/plain -res/cardsfolder/auriok_transfixer.txt -text svneol=native#text/plain -res/cardsfolder/aurochs.txt -text svneol=native#text/plain -res/cardsfolder/aurochs_herd.txt -text svneol=native#text/plain -res/cardsfolder/aurora_eidolon.txt -text svneol=native#text/plain -res/cardsfolder/aurora_griffin.txt -text svneol=native#text/plain -res/cardsfolder/auspicious_ancestor.txt -text svneol=native#text/plain -res/cardsfolder/austere_command.txt -text svneol=native#text/plain -res/cardsfolder/avalanche.txt -text svneol=native#text/plain -res/cardsfolder/avalanche_riders.txt -text svneol=native#text/plain -res/cardsfolder/avarax.txt -text svneol=native#text/plain -res/cardsfolder/avatar_of_fury.txt -text svneol=native#text/plain -res/cardsfolder/avatar_of_might.txt -text svneol=native#text/plain -res/cardsfolder/avatar_of_will.txt -text svneol=native#text/plain -res/cardsfolder/avatar_of_woe.txt -text svneol=native#text/plain -res/cardsfolder/aven_archer.txt -text svneol=native#text/plain -res/cardsfolder/aven_augur.txt -text svneol=native#text/plain -res/cardsfolder/aven_brigadier.txt -text svneol=native#text/plain -res/cardsfolder/aven_cloudchaser.txt -text svneol=native#text/plain -res/cardsfolder/aven_envoy.txt -text svneol=native#text/plain -res/cardsfolder/aven_farseer.txt svneol=native#text/plain -res/cardsfolder/aven_fateshaper.txt -text svneol=native#text/plain -res/cardsfolder/aven_fisher.txt -text svneol=native#text/plain -res/cardsfolder/aven_flock.txt -text svneol=native#text/plain -res/cardsfolder/aven_fogbringer.txt -text svneol=native#text/plain -res/cardsfolder/aven_redeemer.txt -text svneol=native#text/plain -res/cardsfolder/aven_riftwatcher.txt -text svneol=native#text/plain -res/cardsfolder/aven_smokeweaver.txt -text svneol=native#text/plain -res/cardsfolder/aven_squire.txt -text svneol=native#text/plain -res/cardsfolder/aven_trailblazer.txt -text svneol=native#text/plain -res/cardsfolder/aven_trooper.txt -text svneol=native#text/plain -res/cardsfolder/avenger_en_dal.txt svneol=native#text/plain -res/cardsfolder/avenger_of_zendikar.txt -text svneol=native#text/plain -res/cardsfolder/avenging_angel.txt -text svneol=native#text/plain -res/cardsfolder/avian_changeling.txt -text svneol=native#text/plain -res/cardsfolder/avoid_fate.txt -text svneol=native#text/plain -res/cardsfolder/awakener_druid.txt svneol=native#text/plain -res/cardsfolder/awakening.txt -text svneol=native#text/plain -res/cardsfolder/awakening_zone.txt -text svneol=native#text/plain -res/cardsfolder/axegrinder_giant.txt -text svneol=native#text/plain -res/cardsfolder/axelrod_gunnarson.txt svneol=native#text/plain -res/cardsfolder/aysen_abbey.txt -text svneol=native#text/plain -res/cardsfolder/aysen_bureaucrats.txt -text svneol=native#text/plain -res/cardsfolder/aysen_crusader.txt svneol=native#text/plain -res/cardsfolder/aysen_highway.txt -text svneol=native#text/plain -res/cardsfolder/ayumi_the_last_visitor.txt -text svneol=native#text/plain -res/cardsfolder/azami_lady_of_scrolls.txt -text svneol=native#text/plain -res/cardsfolder/azimaet_drake.txt -text svneol=native#text/plain -res/cardsfolder/azorius_aethermage.txt -text svneol=native#text/plain -res/cardsfolder/azorius_chancery.txt -text svneol=native#text/plain -res/cardsfolder/azorius_first_wing.txt -text svneol=native#text/plain -res/cardsfolder/azorius_guildmage.txt svneol=native#text/plain -res/cardsfolder/azorius_ploy.txt svneol=native#text/plain -res/cardsfolder/azorius_signet.txt -text svneol=native#text/plain -res/cardsfolder/azure_drake.txt -text svneol=native#text/plain -res/cardsfolder/azusa_lost_but_seeking.txt -text svneol=native#text/plain -res/cardsfolder/back_to_basics.txt -text svneol=native#text/plain -res/cardsfolder/back_to_nature.txt -text svneol=native#text/plain -res/cardsfolder/backfire.txt -text svneol=native#text/plain -res/cardsfolder/backlash.txt -text svneol=native#text/plain -res/cardsfolder/bad_moon.txt -text svneol=native#text/plain -res/cardsfolder/bad_river.txt -text svneol=native#text/plain -res/cardsfolder/badlands.txt -text svneol=native#text/plain -res/cardsfolder/baku_altar.txt -text svneol=native#text/plain -res/cardsfolder/bala_ged_scorpion.txt -text svneol=native#text/plain -res/cardsfolder/balance.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_barbarians.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_bears.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_conjurer.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_dead.txt svneol=native#text/plain -res/cardsfolder/balduvian_frostwaker.txt svneol=native#text/plain -res/cardsfolder/balduvian_horde.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_rage.txt svneol=native#text/plain -res/cardsfolder/balduvian_trading_post.txt -text svneol=native#text/plain -res/cardsfolder/balduvian_war_makers.txt -text svneol=native#text/plain -res/cardsfolder/balefire_liege.txt -text svneol=native#text/plain -res/cardsfolder/baleful_stare.txt -text svneol=native#text/plain -res/cardsfolder/ball_lightning.txt -text svneol=native#text/plain -res/cardsfolder/ballista_squad.txt -text svneol=native#text/plain -res/cardsfolder/balloon_peddler.txt -text svneol=native#text/plain -res/cardsfolder/ballynock_cohort.txt -text svneol=native#text/plain -res/cardsfolder/ballynock_trapper.txt -text svneol=native#text/plain -res/cardsfolder/ballyrush_banneret.txt -text svneol=native#text/plain -res/cardsfolder/baloth_woodcrasher.txt -text svneol=native#text/plain -res/cardsfolder/balshan_collaborator.txt -text svneol=native#text/plain -res/cardsfolder/balshan_griffin.txt -text svneol=native#text/plain -res/cardsfolder/balthor_the_defiled.txt -text svneol=native#text/plain -res/cardsfolder/balthor_the_stout.txt -text svneol=native#text/plain -res/cardsfolder/bandage.txt -text svneol=native#text/plain -res/cardsfolder/bane_of_the_living.txt svneol=native#text/plain -res/cardsfolder/baneslayer_angel.txt -text svneol=native#text/plain -res/cardsfolder/banishing_knack.txt -text svneol=native#text/plain -res/cardsfolder/banishment_decree.txt -text svneol=native#text/plain -res/cardsfolder/banshee.txt -text svneol=native#text/plain -res/cardsfolder/banshees_blade.txt -text svneol=native#text/plain -res/cardsfolder/bant_battlemage.txt -text svneol=native#text/plain -res/cardsfolder/bant_charm.txt -text svneol=native#text/plain -res/cardsfolder/bant_panorama.txt -text svneol=native#text/plain -res/cardsfolder/bant_sojourners.txt -text svneol=native#text/plain -res/cardsfolder/bant_sureblade.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_general.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_horde.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_lunatic.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_outcast.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_riftcutter.txt -text svneol=native#text/plain -res/cardsfolder/barbarian_ring.txt svneol=native#text/plain -res/cardsfolder/barbary_apes.txt -text svneol=native#text/plain -res/cardsfolder/barbed_battlegear.txt -text svneol=native#text/plain -res/cardsfolder/barbed_field.txt svneol=native#text/plain -res/cardsfolder/barbed_lightning.txt svneol=native#text/plain -res/cardsfolder/barbed_sextant.txt -text svneol=native#text/plain -res/cardsfolder/barbed_sliver.txt svneol=native#text/plain -res/cardsfolder/barbtooth_wurm.txt -text svneol=native#text/plain -res/cardsfolder/bargain.txt -text svneol=native#text/plain -res/cardsfolder/bargaining_table.txt -text svneol=native#text/plain -res/cardsfolder/barishi.txt svneol=native#text/plain -res/cardsfolder/barkhide_mauler.txt -text svneol=native#text/plain -res/cardsfolder/barktooth_warbeard.txt -text svneol=native#text/plain -res/cardsfolder/barls_cage.txt -text svneol=native#text/plain -res/cardsfolder/baron_sengir.txt -text svneol=native#text/plain -res/cardsfolder/barony_vampire.txt -text svneol=native#text/plain -res/cardsfolder/barrage_ogre.txt -text svneol=native#text/plain -res/cardsfolder/barren_glory.txt -text svneol=native#text/plain -res/cardsfolder/barren_moor.txt -text svneol=native#text/plain -res/cardsfolder/barrenton_cragtreads.txt -text svneol=native#text/plain -res/cardsfolder/barrenton_medic.txt -text svneol=native#text/plain -res/cardsfolder/barrin_master_wizard.txt -text svneol=native#text/plain -res/cardsfolder/barrins_codex.txt -text svneol=native#text/plain -res/cardsfolder/bartel_runeaxe.txt -text svneol=native#text/plain -res/cardsfolder/barter_in_blood.txt -text svneol=native#text/plain -res/cardsfolder/baru_fist_of_krosa.txt -text svneol=native#text/plain -res/cardsfolder/basal_sliver.txt -text svneol=native#text/plain -res/cardsfolder/basal_thrull.txt -text svneol=native#text/plain -res/cardsfolder/basalt_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/basalt_monolith.txt -text svneol=native#text/plain -res/cardsfolder/bash_to_bits.txt -text svneol=native#text/plain -res/cardsfolder/basilisk_collar.txt -text svneol=native#text/plain -res/cardsfolder/basking_rootwalla.txt -text svneol=native#text/plain -res/cardsfolder/baton_of_courage.txt -text svneol=native#text/plain -res/cardsfolder/battered_golem.txt -text svneol=native#text/plain -res/cardsfolder/battering_craghorn.txt -text svneol=native#text/plain -res/cardsfolder/battering_sliver.txt -text svneol=native#text/plain -res/cardsfolder/battering_wurm.txt svneol=native#text/plain -res/cardsfolder/batterskull.txt -text svneol=native#text/plain -res/cardsfolder/battle_frenzy.txt -text svneol=native#text/plain -res/cardsfolder/battle_hurda.txt -text svneol=native#text/plain -res/cardsfolder/battle_mad_ronin.txt -text svneol=native#text/plain -res/cardsfolder/battle_mastery.txt -text svneol=native#text/plain -res/cardsfolder/battle_of_wits.txt -text svneol=native#text/plain -res/cardsfolder/battle_rampart.txt -text svneol=native#text/plain -res/cardsfolder/battle_rattle_shaman.txt -text svneol=native#text/plain -res/cardsfolder/battle_screech.txt -text svneol=native#text/plain -res/cardsfolder/battle_squadron.txt -text svneol=native#text/plain -res/cardsfolder/battle_strain.txt -text svneol=native#text/plain -res/cardsfolder/battlefield_forge.txt -text svneol=native#text/plain -res/cardsfolder/battlefield_medic.txt -text svneol=native#text/plain -res/cardsfolder/battlefield_percher.txt -text svneol=native#text/plain -res/cardsfolder/battlegate_mimic.txt -text svneol=native#text/plain -res/cardsfolder/battlegrace_angel.txt -text svneol=native#text/plain -res/cardsfolder/battlegrowth.txt -text svneol=native#text/plain -res/cardsfolder/battlewand_oak.txt -text svneol=native#text/plain -res/cardsfolder/battlewise_aven.txt -text svneol=native#text/plain -res/cardsfolder/bay_falcon.txt -text svneol=native#text/plain -res/cardsfolder/bayou.txt -text svneol=native#text/plain -res/cardsfolder/bayou_dragonfly.txt -text svneol=native#text/plain -res/cardsfolder/bazaar_of_baghdad.txt -text svneol=native#text/plain -res/cardsfolder/bazaar_of_wonders.txt -text svneol=native#text/plain -res/cardsfolder/beacon_behemoth.txt svneol=native#text/plain -res/cardsfolder/beacon_hawk.txt -text svneol=native#text/plain -res/cardsfolder/beacon_of_creation.txt -text svneol=native#text/plain -res/cardsfolder/beacon_of_destruction.txt -text svneol=native#text/plain -res/cardsfolder/beacon_of_immortality.txt -text svneol=native#text/plain -res/cardsfolder/beacon_of_tomorrows.txt -text svneol=native#text/plain -res/cardsfolder/beacon_of_unrest.txt -text svneol=native#text/plain -res/cardsfolder/bear_cub.txt -text svneol=native#text/plain -res/cardsfolder/bear_umbra.txt svneol=native#text/plain -res/cardsfolder/bearscape.txt svneol=native#text/plain -res/cardsfolder/beast_attack.txt -text svneol=native#text/plain -res/cardsfolder/beast_hunt.txt svneol=native#text/plain -res/cardsfolder/beast_of_burden.txt -text svneol=native#text/plain -res/cardsfolder/beast_within.txt -text svneol=native#text/plain -res/cardsfolder/beastbreaker_of_bala_ged.txt -text svneol=native#text/plain -res/cardsfolder/beastmaster_ascension.txt -text svneol=native#text/plain -res/cardsfolder/beastmasters_magemark.txt -text svneol=native#text/plain -res/cardsfolder/beasts_of_bogardan.txt -text svneol=native#text/plain -res/cardsfolder/beckon_apparition.txt -text svneol=native#text/plain -res/cardsfolder/bedlam.txt -text svneol=native#text/plain -res/cardsfolder/bee_sting.txt -text svneol=native#text/plain -res/cardsfolder/befoul.txt -text svneol=native#text/plain -res/cardsfolder/behemoth_sledge.txt -text svneol=native#text/plain -res/cardsfolder/belbes_armor.txt svneol=native#text/plain -res/cardsfolder/belbes_percher.txt -text svneol=native#text/plain -res/cardsfolder/belbes_portal.txt -text svneol=native#text/plain -res/cardsfolder/belligerent_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/bellowing_fiend.txt svneol=native#text/plain -res/cardsfolder/bellowing_tanglewurm.txt -text svneol=native#text/plain -res/cardsfolder/belltower_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/beloved_chaplain.txt -text svneol=native#text/plain -res/cardsfolder/ben_ben_akki_hermit.txt -text svneol=native#text/plain -res/cardsfolder/benalish_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/benalish_emissary.txt -text svneol=native#text/plain -res/cardsfolder/benalish_heralds.txt -text svneol=native#text/plain -res/cardsfolder/benalish_knight.txt -text svneol=native#text/plain -res/cardsfolder/benalish_missionary.txt -text svneol=native#text/plain -res/cardsfolder/benalish_trapper.txt -text svneol=native#text/plain -res/cardsfolder/benevolent_ancestor.txt -text svneol=native#text/plain -res/cardsfolder/benevolent_bodyguard.txt -text svneol=native#text/plain -res/cardsfolder/benevolent_unicorn.txt svneol=native#text/plain -res/cardsfolder/benthic_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/benthic_djinn.txt -text svneol=native#text/plain -res/cardsfolder/benthicore.txt -text svneol=native#text/plain -res/cardsfolder/bequeathal.txt -text svneol=native#text/plain -res/cardsfolder/bereavement.txt -text svneol=native#text/plain -res/cardsfolder/berserk.txt -text svneol=native#text/plain -res/cardsfolder/berserk_murlodont.txt -text svneol=native#text/plain -res/cardsfolder/berserkers_of_blood_ridge.txt -text svneol=native#text/plain -res/cardsfolder/beseech_the_queen.txt svneol=native#text/plain -res/cardsfolder/bestial_fury.txt -text svneol=native#text/plain -res/cardsfolder/bestial_menace.txt -text svneol=native#text/plain -res/cardsfolder/betrayal.txt svneol=native#text/plain -res/cardsfolder/betrayal_of_flesh.txt -text svneol=native#text/plain -res/cardsfolder/betrothed_of_fire.txt svneol=native#text/plain -res/cardsfolder/bewilder.txt -text svneol=native#text/plain -res/cardsfolder/big_game_hunter.txt -text svneol=native#text/plain -res/cardsfolder/bile_urchin.txt -text svneol=native#text/plain -res/cardsfolder/bind.txt -text svneol=native#text/plain -res/cardsfolder/binding_agony.txt -text svneol=native#text/plain -res/cardsfolder/binding_grasp.txt -text svneol=native#text/plain -res/cardsfolder/biomantic_mastery.txt -text svneol=native#text/plain -res/cardsfolder/biorhythm.txt -text svneol=native#text/plain -res/cardsfolder/birchlore_rangers.txt -text svneol=native#text/plain -res/cardsfolder/bird_maiden.txt -text svneol=native#text/plain -res/cardsfolder/birds_of_paradise.txt -text svneol=native#text/plain -res/cardsfolder/biting_tether.txt svneol=native#text/plain -res/cardsfolder/bitterblossom.txt -text svneol=native#text/plain -res/cardsfolder/bituminous_blast.txt -text svneol=native#text/plain -res/cardsfolder/black_carriage.txt svneol=native#text/plain -res/cardsfolder/black_knight.txt -text svneol=native#text/plain -res/cardsfolder/black_lotus.txt -text svneol=native#text/plain -res/cardsfolder/black_mana_battery.txt -text svneol=native#text/plain -res/cardsfolder/black_market.txt -text svneol=native#text/plain -res/cardsfolder/black_poplar_shaman.txt -text svneol=native#text/plain -res/cardsfolder/black_scarab.txt -text svneol=native#text/plain -res/cardsfolder/black_suns_zenith.txt -text svneol=native#text/plain -res/cardsfolder/black_vise.txt -text svneol=native#text/plain -res/cardsfolder/black_ward.txt -text svneol=native#text/plain -res/cardsfolder/blackcleave_cliffs.txt -text svneol=native#text/plain -res/cardsfolder/blackcleave_goblin.txt -text svneol=native#text/plain -res/cardsfolder/blade_of_the_bloodchief.txt svneol=native#text/plain -res/cardsfolder/blade_of_the_sixth_pride.txt -text svneol=native#text/plain -res/cardsfolder/blade_sliver.txt -text svneol=native#text/plain -res/cardsfolder/blade_splicer.txt -text svneol=native#text/plain -res/cardsfolder/blade_tribe_berserkers.txt -text svneol=native#text/plain -res/cardsfolder/bladed_pinions.txt -text svneol=native#text/plain -res/cardsfolder/bladed_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/blades_of_velis_vel.txt -text svneol=native#text/plain -res/cardsfolder/bladetusk_boar.txt -text svneol=native#text/plain -res/cardsfolder/bladewing_the_risen.txt -text svneol=native#text/plain -res/cardsfolder/bladewings_thrall.txt -text svneol=native#text/plain -res/cardsfolder/blanchwood_armor.txt -text svneol=native#text/plain -res/cardsfolder/blanchwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/blanket_of_night.txt svneol=native#text/plain -res/cardsfolder/blasted_landscape.txt -text svneol=native#text/plain -res/cardsfolder/blaster_mage.txt -text svneol=native#text/plain -res/cardsfolder/blasting_station.txt -text svneol=native#text/plain -res/cardsfolder/blastoderm.txt -text svneol=native#text/plain -res/cardsfolder/blatant_thievery.txt -text svneol=native#text/plain -res/cardsfolder/blaze.txt -text svneol=native#text/plain -res/cardsfolder/blazethorn_scarecrow.txt -text svneol=native#text/plain -res/cardsfolder/blazing_archon.txt -text svneol=native#text/plain -res/cardsfolder/blazing_shoal.txt -text svneol=native#text/plain -res/cardsfolder/blazing_specter.txt -text svneol=native#text/plain -res/cardsfolder/bleak_coven_vampires.txt -text svneol=native#text/plain -res/cardsfolder/blessed_orator.txt -text svneol=native#text/plain -res/cardsfolder/blessed_reversal.txt -text svneol=native#text/plain -res/cardsfolder/blessed_wind.txt svneol=native#text/plain -res/cardsfolder/blessed_wine.txt -text svneol=native#text/plain -res/cardsfolder/blessing.txt -text svneol=native#text/plain -res/cardsfolder/blessing_of_leeches.txt svneol=native#text/plain -res/cardsfolder/blessing_of_the_nephilim.txt -text svneol=native#text/plain -res/cardsfolder/blight.txt -text svneol=native#text/plain -res/cardsfolder/blight_mamba.txt -text svneol=native#text/plain -res/cardsfolder/blight_sickle.txt -text svneol=native#text/plain -res/cardsfolder/blighted_agent.txt -text svneol=native#text/plain -res/cardsfolder/blighted_shaman.txt -text svneol=native#text/plain -res/cardsfolder/blightning.txt -text svneol=native#text/plain -res/cardsfolder/blightsoil_druid.txt svneol=native#text/plain -res/cardsfolder/blightspeaker.txt -text svneol=native#text/plain -res/cardsfolder/blightsteel_colossus.txt -text svneol=native#text/plain -res/cardsfolder/blightwidow.txt -text svneol=native#text/plain -res/cardsfolder/blind_creeper.txt -text svneol=native#text/plain -res/cardsfolder/blind_phantasm.txt -text svneol=native#text/plain -res/cardsfolder/blind_spot_giant.txt -text svneol=native#text/plain -res/cardsfolder/blind_with_anger.txt -text svneol=native#text/plain -res/cardsfolder/blind_zealot.txt svneol=native#text/plain -res/cardsfolder/blinding_light.txt -text svneol=native#text/plain -res/cardsfolder/blinding_mage.txt -text svneol=native#text/plain -res/cardsfolder/blinding_souleater.txt svneol=native#text/plain -res/cardsfolder/blinking_spirit.txt -text svneol=native#text/plain -res/cardsfolder/blinkmoth_infusion.txt -text svneol=native#text/plain -res/cardsfolder/blinkmoth_nexus.txt -text svneol=native#text/plain -res/cardsfolder/blinkmoth_well.txt -text svneol=native#text/plain -res/cardsfolder/blister_beetle.txt -text svneol=native#text/plain -res/cardsfolder/blistergrub.txt -text svneol=native#text/plain -res/cardsfolder/blistering_barrier.txt -text svneol=native#text/plain -res/cardsfolder/blistering_dieflyn.txt -text svneol=native#text/plain -res/cardsfolder/blistering_firecat.txt -text svneol=native#text/plain -res/cardsfolder/blisterstick_shaman.txt -text svneol=native#text/plain -res/cardsfolder/blitz_hellion.txt -text svneol=native#text/plain -res/cardsfolder/blizzard.txt svneol=native#text/plain -res/cardsfolder/blizzard_elemental.txt -text svneol=native#text/plain -res/cardsfolder/bloated_toad.txt -text svneol=native#text/plain -res/cardsfolder/blockade_runner.txt -text svneol=native#text/plain -res/cardsfolder/blockbuster.txt -text svneol=native#text/plain -res/cardsfolder/blood_celebrant.txt -text svneol=native#text/plain -res/cardsfolder/blood_crypt.txt -text svneol=native#text/plain -res/cardsfolder/blood_cultist.txt -text svneol=native#text/plain -res/cardsfolder/blood_frenzy.txt -text svneol=native#text/plain -res/cardsfolder/blood_hound.txt -text svneol=native#text/plain -res/cardsfolder/blood_knight.txt -text svneol=native#text/plain -res/cardsfolder/blood_moon.txt -text svneol=native#text/plain -res/cardsfolder/blood_pet.txt -text svneol=native#text/plain -res/cardsfolder/blood_rites.txt -text svneol=native#text/plain -res/cardsfolder/blood_seeker.txt -text svneol=native#text/plain -res/cardsfolder/blood_speaker.txt -text svneol=native#text/plain -res/cardsfolder/blood_tithe.txt -text svneol=native#text/plain -res/cardsfolder/blood_tyrant.txt svneol=native#text/plain -res/cardsfolder/blood_vassal.txt -text svneol=native#text/plain -res/cardsfolder/bloodbraid_elf.txt -text svneol=native#text/plain -res/cardsfolder/bloodcurdling_scream.txt -text svneol=native#text/plain -res/cardsfolder/bloodfire_colossus.txt -text svneol=native#text/plain -res/cardsfolder/bloodfire_dwarf.txt -text svneol=native#text/plain -res/cardsfolder/bloodfire_infusion.txt svneol=native#text/plain -res/cardsfolder/bloodfire_kavu.txt -text svneol=native#text/plain -res/cardsfolder/bloodghast.txt -text svneol=native#text/plain -res/cardsfolder/bloodhall_ooze.txt -text svneol=native#text/plain -res/cardsfolder/bloodhusk_ritualist.txt -text svneol=native#text/plain -res/cardsfolder/bloodied_ghost.txt -text svneol=native#text/plain -res/cardsfolder/bloodletter_quill.txt svneol=native#text/plain -res/cardsfolder/bloodmark_mentor.txt -text svneol=native#text/plain -res/cardsfolder/bloodpyre_elemental.txt -text svneol=native#text/plain -res/cardsfolder/bloodrite_invoker.txt -text svneol=native#text/plain -res/cardsfolder/bloodrock_cyclops.txt -text svneol=native#text/plain -res/cardsfolder/bloodscale_prowler.txt -text svneol=native#text/plain -res/cardsfolder/bloodscent.txt -text svneol=native#text/plain -res/cardsfolder/bloodshed_fever.txt -text svneol=native#text/plain -res/cardsfolder/bloodshot_cyclops.txt -text svneol=native#text/plain -res/cardsfolder/bloodshot_trainee.txt svneol=native#text/plain -res/cardsfolder/bloodstained_mire.txt -text svneol=native#text/plain -res/cardsfolder/bloodstoke_howler.txt svneol=native#text/plain -res/cardsfolder/bloodstone_cameo.txt -text svneol=native#text/plain -res/cardsfolder/bloodthirsty_ogre.txt -text svneol=native#text/plain -res/cardsfolder/bloodthorn_taunter.txt -text svneol=native#text/plain -res/cardsfolder/bloodthrone_vampire.txt -text svneol=native#text/plain -res/cardsfolder/blossoming_wreath.txt -text svneol=native#text/plain -res/cardsfolder/blue_elemental_blast.txt -text svneol=native#text/plain -res/cardsfolder/blue_mana_battery.txt -text svneol=native#text/plain -res/cardsfolder/blue_scarab.txt -text svneol=native#text/plain -res/cardsfolder/blue_suns_zenith.txt -text svneol=native#text/plain -res/cardsfolder/blue_ward.txt -text svneol=native#text/plain -res/cardsfolder/blunt_the_assault.txt svneol=native#text/plain -res/cardsfolder/blurred_mongoose.txt -text svneol=native#text/plain -res/cardsfolder/boa_constrictor.txt -text svneol=native#text/plain -res/cardsfolder/boar_umbra.txt -text svneol=native#text/plain -res/cardsfolder/boartusk_liege.txt -text svneol=native#text/plain -res/cardsfolder/body_of_jukai.txt -text svneol=native#text/plain -res/cardsfolder/bog_glider.txt svneol=native#text/plain -res/cardsfolder/bog_gnarr.txt -text svneol=native#text/plain -res/cardsfolder/bog_hoodlums.txt svneol=native#text/plain -res/cardsfolder/bog_imp.txt -text svneol=native#text/plain -res/cardsfolder/bog_initiate.txt -text svneol=native#text/plain -res/cardsfolder/bog_raiders.txt -text svneol=native#text/plain -res/cardsfolder/bog_rats.txt -text svneol=native#text/plain -res/cardsfolder/bog_serpent.txt -text svneol=native#text/plain -res/cardsfolder/bog_smugglers.txt -text svneol=native#text/plain -res/cardsfolder/bog_strider_ash.txt -text svneol=native#text/plain -res/cardsfolder/bog_tatters.txt -text svneol=native#text/plain -res/cardsfolder/bog_witch.txt -text svneol=native#text/plain -res/cardsfolder/bog_wraith.txt -text svneol=native#text/plain -res/cardsfolder/bog_wreckage.txt -text svneol=native#text/plain -res/cardsfolder/bogardan_firefiend.txt -text svneol=native#text/plain -res/cardsfolder/bogardan_hellkite.txt -text svneol=native#text/plain -res/cardsfolder/bogardan_lancer.txt svneol=native#text/plain -res/cardsfolder/bogardan_rager.txt svneol=native#text/plain -res/cardsfolder/boggart_arsonists.txt -text svneol=native#text/plain -res/cardsfolder/boggart_birth_rite.txt -text svneol=native#text/plain -res/cardsfolder/boggart_forager.txt svneol=native#text/plain -res/cardsfolder/boggart_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/boggart_loggers.txt -text svneol=native#text/plain -res/cardsfolder/boggart_mob.txt -text svneol=native#text/plain -res/cardsfolder/boggart_ram_gang.txt -text svneol=native#text/plain -res/cardsfolder/boggart_shenanigans.txt -text svneol=native#text/plain -res/cardsfolder/boggart_sprite_chaser.txt -text svneol=native#text/plain -res/cardsfolder/boil.txt -text svneol=native#text/plain -res/cardsfolder/boiling_blood.txt -text svneol=native#text/plain -res/cardsfolder/boiling_seas.txt -text svneol=native#text/plain -res/cardsfolder/bojuka_bog.txt -text svneol=native#text/plain -res/cardsfolder/bojuka_brigand.txt -text svneol=native#text/plain -res/cardsfolder/bola_warrior.txt -text svneol=native#text/plain -res/cardsfolder/boldwyr_heavyweights.txt -text svneol=native#text/plain -res/cardsfolder/bonded_fetch.txt -text svneol=native#text/plain -res/cardsfolder/bonds_of_quicksilver.txt -text svneol=native#text/plain -res/cardsfolder/bone_flute.txt -text svneol=native#text/plain -res/cardsfolder/bone_harvest.txt -text svneol=native#text/plain -res/cardsfolder/bone_saw.txt -text svneol=native#text/plain -res/cardsfolder/bone_shredder.txt -text svneol=native#text/plain -res/cardsfolder/bone_splinters.txt -text svneol=native#text/plain -res/cardsfolder/bonehoard.txt -text svneol=native#text/plain -res/cardsfolder/boneknitter.txt -text svneol=native#text/plain -res/cardsfolder/boneshard_slasher.txt -text svneol=native#text/plain -res/cardsfolder/bonesplitter.txt -text svneol=native#text/plain -res/cardsfolder/bonesplitter_sliver.txt -text svneol=native#text/plain -res/cardsfolder/bonethorn_valesk.txt svneol=native#text/plain -res/cardsfolder/book_of_rass.txt -text svneol=native#text/plain -res/cardsfolder/boomerang.txt -text svneol=native#text/plain -res/cardsfolder/boon_reflection.txt svneol=native#text/plain -res/cardsfolder/borborygmos.txt -text svneol=native#text/plain -res/cardsfolder/border_guard.txt -text svneol=native#text/plain -res/cardsfolder/border_patrol.txt -text svneol=native#text/plain -res/cardsfolder/borderland_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/borderland_ranger.txt -text svneol=native#text/plain -res/cardsfolder/boreal_centaur.txt -text svneol=native#text/plain -res/cardsfolder/boreal_druid.txt -text svneol=native#text/plain -res/cardsfolder/boreal_griffin.txt -text svneol=native#text/plain -res/cardsfolder/boreal_shelf.txt -text svneol=native#text/plain -res/cardsfolder/boris_devilboon.txt -text svneol=native#text/plain -res/cardsfolder/boros_garrison.txt -text svneol=native#text/plain -res/cardsfolder/boros_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/boros_recruit.txt -text svneol=native#text/plain -res/cardsfolder/boros_signet.txt -text svneol=native#text/plain -res/cardsfolder/boros_swiftblade.txt -text svneol=native#text/plain -res/cardsfolder/borrowing_100000_arrows.txt -text svneol=native#text/plain -res/cardsfolder/borrowing_the_east_wind.txt -text svneol=native#text/plain -res/cardsfolder/bosh_iron_golem.txt -text svneol=native#text/plain -res/cardsfolder/bosk_banneret.txt -text svneol=native#text/plain -res/cardsfolder/bottle_gnomes.txt -text svneol=native#text/plain -res/cardsfolder/bottle_of_suleiman.txt -text svneol=native#text/plain -res/cardsfolder/bottomless_pit.txt -text svneol=native#text/plain -res/cardsfolder/bottomless_vault.txt -text svneol=native#text/plain -res/cardsfolder/bouncing_beebles.txt -text svneol=native#text/plain -res/cardsfolder/bound_in_silence.txt -text svneol=native#text/plain -res/cardsfolder/bounteous_kirin.txt -text svneol=native#text/plain -res/cardsfolder/bountiful_harvest.txt -text svneol=native#text/plain -res/cardsfolder/bounty_hunter.txt -text svneol=native#text/plain -res/cardsfolder/brackwater_elemental.txt -text svneol=native#text/plain -res/cardsfolder/braid_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/braids_cabal_minion.txt -text svneol=native#text/plain -res/cardsfolder/braids_conjurer_adept.txt -text svneol=native#text/plain -res/cardsfolder/braidwood_cup.txt -text svneol=native#text/plain -res/cardsfolder/braidwood_sextant.txt -text svneol=native#text/plain -res/cardsfolder/brain_freeze.txt -text svneol=native#text/plain -res/cardsfolder/brainbite.txt -text svneol=native#text/plain -res/cardsfolder/braingeyser.txt -text svneol=native#text/plain -res/cardsfolder/brainspoil.txt -text svneol=native#text/plain -res/cardsfolder/brainstorm.txt -text svneol=native#text/plain -res/cardsfolder/bramble_creeper.txt -text svneol=native#text/plain -res/cardsfolder/bramblesnap.txt -text svneol=native#text/plain -res/cardsfolder/branching_bolt.txt svneol=native#text/plain -res/cardsfolder/branchsnap_lorian.txt -text svneol=native#text/plain -res/cardsfolder/branded_brawlers.txt svneol=native#text/plain -res/cardsfolder/brass_gnat.txt -text svneol=native#text/plain -res/cardsfolder/brass_herald.txt -text svneol=native#text/plain -res/cardsfolder/brass_man.txt -text svneol=native#text/plain -res/cardsfolder/brass_secretary.txt -text svneol=native#text/plain -res/cardsfolder/brass_squire.txt svneol=native#text/plain -res/cardsfolder/brass_talon_chimera.txt svneol=native#text/plain -res/cardsfolder/brassclaw_orcs.txt -text svneol=native#text/plain -res/cardsfolder/bravado.txt -text svneol=native#text/plain -res/cardsfolder/brave_the_elements.txt -text svneol=native#text/plain -res/cardsfolder/brawn.txt -text svneol=native#text/plain -res/cardsfolder/breach.txt -text svneol=native#text/plain -res/cardsfolder/break_asunder.txt -text svneol=native#text/plain -res/cardsfolder/breath_of_life.txt -text svneol=native#text/plain -res/cardsfolder/breath_of_malfegor.txt -text svneol=native#text/plain -res/cardsfolder/breathstealer.txt -text svneol=native#text/plain -res/cardsfolder/breeding_pit.txt -text svneol=native#text/plain -res/cardsfolder/breeding_pool.txt -text svneol=native#text/plain -res/cardsfolder/briar_patch.txt -text svneol=native#text/plain -res/cardsfolder/briar_shield.txt -text svneol=native#text/plain -res/cardsfolder/briarberry_cohort.txt -text svneol=native#text/plain -res/cardsfolder/briarhorn.txt -text svneol=native#text/plain -res/cardsfolder/briarknit_kami.txt -text svneol=native#text/plain -res/cardsfolder/bribery.txt -text svneol=native#text/plain -res/cardsfolder/bridge_from_below.txt -text svneol=native#text/plain -res/cardsfolder/brighthearth_banneret.txt -text svneol=native#text/plain -res/cardsfolder/brightstone_ritual.txt -text svneol=native#text/plain -res/cardsfolder/brilliant_halo.txt -text svneol=native#text/plain -res/cardsfolder/brilliant_plan.txt -text svneol=native#text/plain -res/cardsfolder/brilliant_ultimatum.txt -text svneol=native#text/plain -res/cardsfolder/brimstone_dragon.txt -text svneol=native#text/plain -res/cardsfolder/brimstone_mage.txt -text svneol=native#text/plain -res/cardsfolder/brindle_boar.txt -text svneol=native#text/plain -res/cardsfolder/brine_shaman.txt -text svneol=native#text/plain -res/cardsfolder/bringer_of_the_black_dawn.txt -text svneol=native#text/plain -res/cardsfolder/bringer_of_the_blue_dawn.txt -text svneol=native#text/plain -res/cardsfolder/bringer_of_the_green_dawn.txt -text svneol=native#text/plain -res/cardsfolder/bringer_of_the_red_dawn.txt -text svneol=native#text/plain -res/cardsfolder/bringer_of_the_white_dawn.txt -text svneol=native#text/plain -res/cardsfolder/brink_of_madness.txt svneol=native#text/plain -res/cardsfolder/brion_stoutarm.txt -text svneol=native#text/plain -res/cardsfolder/brittle_effigy.txt -text svneol=native#text/plain -res/cardsfolder/broken_ambitions.txt svneol=native#text/plain -res/cardsfolder/broken_dam.txt -text svneol=native#text/plain -res/cardsfolder/broken_fall.txt -text svneol=native#text/plain -res/cardsfolder/broken_visage.txt svneol=native#text/plain -res/cardsfolder/brood_birthing.txt -text svneol=native#text/plain -res/cardsfolder/brood_of_cockroaches.txt svneol=native#text/plain -res/cardsfolder/brood_sliver.txt -text svneol=native#text/plain -res/cardsfolder/broodhatch_nantuko.txt svneol=native#text/plain -res/cardsfolder/broodmate_dragon.txt -text svneol=native#text/plain -res/cardsfolder/broodstar.txt -text svneol=native#text/plain -res/cardsfolder/broodwarden.txt -text svneol=native#text/plain -res/cardsfolder/brothers_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/brown_ouphe.txt svneol=native#text/plain -res/cardsfolder/browse.txt -text svneol=native#text/plain -res/cardsfolder/brush_with_death.txt -text svneol=native#text/plain -res/cardsfolder/brushland.txt -text svneol=native#text/plain -res/cardsfolder/brushwagg.txt -text svneol=native#text/plain -res/cardsfolder/brutal_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/brute_force.txt -text svneol=native#text/plain -res/cardsfolder/bubble_matrix.txt -text svneol=native#text/plain -res/cardsfolder/bubbling_beebles.txt -text svneol=native#text/plain -res/cardsfolder/bubbling_muck.txt -text svneol=native#text/plain -res/cardsfolder/bull_aurochs.txt svneol=native#text/plain -res/cardsfolder/bull_cerodon.txt -text svneol=native#text/plain -res/cardsfolder/bull_hippo.txt -text svneol=native#text/plain -res/cardsfolder/bull_rush.txt -text svneol=native#text/plain -res/cardsfolder/bullwhip.txt svneol=native#text/plain -res/cardsfolder/buoyancy.txt -text svneol=native#text/plain -res/cardsfolder/burden_of_greed.txt -text svneol=native#text/plain -res/cardsfolder/burgeoning.txt -text svneol=native#text/plain -res/cardsfolder/buried_alive.txt -text svneol=native#text/plain -res/cardsfolder/burn_the_impure.txt svneol=native#text/plain -res/cardsfolder/burning_cloak.txt -text svneol=native#text/plain -res/cardsfolder/burning_fields.txt -text svneol=native#text/plain -res/cardsfolder/burning_inquiry.txt -text svneol=native#text/plain -res/cardsfolder/burning_shield_askari.txt -text svneol=native#text/plain -res/cardsfolder/burr_grafter.txt -text svneol=native#text/plain -res/cardsfolder/burrenton_bombardier.txt -text svneol=native#text/plain -res/cardsfolder/burrowing.txt -text svneol=native#text/plain -res/cardsfolder/burst_lightning.txt -text svneol=native#text/plain -res/cardsfolder/burst_of_energy.txt -text svneol=native#text/plain -res/cardsfolder/burst_of_speed.txt -text svneol=native#text/plain -res/cardsfolder/butcher_of_malakir.txt -text svneol=native#text/plain -res/cardsfolder/cabal_archon.txt -text svneol=native#text/plain -res/cardsfolder/cabal_coffers.txt -text svneol=native#text/plain -res/cardsfolder/cabal_conditioning.txt svneol=native#text/plain -res/cardsfolder/cabal_executioner.txt -text svneol=native#text/plain -res/cardsfolder/cabal_inquisitor.txt svneol=native#text/plain -res/cardsfolder/cabal_patriarch.txt -text svneol=native#text/plain -res/cardsfolder/cabal_pit.txt -text svneol=native#text/plain -res/cardsfolder/cabal_ritual.txt -text svneol=native#text/plain -res/cardsfolder/cabal_slaver.txt -text svneol=native#text/plain -res/cardsfolder/cabal_surgeon.txt -text svneol=native#text/plain -res/cardsfolder/cabal_torturer.txt -text svneol=native#text/plain -res/cardsfolder/cabal_trainee.txt -text svneol=native#text/plain -res/cardsfolder/cache_raiders.txt -text svneol=native#text/plain -res/cardsfolder/cackling_fiend.txt -text svneol=native#text/plain -res/cardsfolder/cackling_flames.txt -text svneol=native#text/plain -res/cardsfolder/cackling_imp.txt -text svneol=native#text/plain -res/cardsfolder/cackling_witch.txt -text svneol=native#text/plain -res/cardsfolder/cadaver_imp.txt -text svneol=native#text/plain -res/cardsfolder/cadaverous_bloom.txt -text svneol=native#text/plain -res/cardsfolder/cadaverous_knight.txt -text svneol=native#text/plain -res/cardsfolder/cage_of_hands.txt -text svneol=native#text/plain -res/cardsfolder/cagemail.txt -text svneol=native#text/plain -res/cardsfolder/calciderm.txt -text svneol=native#text/plain -res/cardsfolder/calciform_pools.txt -text svneol=native#text/plain -res/cardsfolder/calcite_snapper.txt -text svneol=native#text/plain -res/cardsfolder/caldera_hellion.txt -text svneol=native#text/plain -res/cardsfolder/caldera_lake.txt -text svneol=native#text/plain -res/cardsfolder/call_for_blood.txt -text svneol=native#text/plain -res/cardsfolder/call_of_the_herd.txt -text svneol=native#text/plain -res/cardsfolder/call_of_the_wild.txt svneol=native#text/plain -res/cardsfolder/call_the_skybreaker.txt -text svneol=native#text/plain -res/cardsfolder/call_to_glory.txt -text svneol=native#text/plain -res/cardsfolder/call_to_heel.txt -text svneol=native#text/plain -res/cardsfolder/call_to_mind.txt -text svneol=native#text/plain -res/cardsfolder/call_to_the_grave.txt -text svneol=native#text/plain -res/cardsfolder/call_to_the_netherworld.txt -text svneol=native#text/plain -res/cardsfolder/caller_of_gales.txt -text svneol=native#text/plain -res/cardsfolder/caller_of_the_claw.txt -text svneol=native#text/plain -res/cardsfolder/callous_giant.txt -text svneol=native#text/plain -res/cardsfolder/calming_verse.txt svneol=native#text/plain -res/cardsfolder/caltrops.txt -text svneol=native#text/plain -res/cardsfolder/cancel.txt -text svneol=native#text/plain -res/cardsfolder/candelabra_of_tawnos.txt -text svneol=native#text/plain -res/cardsfolder/canker_abomination.txt -text svneol=native#text/plain -res/cardsfolder/canopy_cover.txt svneol=native#text/plain -res/cardsfolder/canopy_spider.txt -text svneol=native#text/plain -res/cardsfolder/cantivore.txt -text svneol=native#text/plain -res/cardsfolder/canyon_drake.txt -text svneol=native#text/plain -res/cardsfolder/canyon_minotaur.txt -text svneol=native#text/plain -res/cardsfolder/canyon_wildcat.txt -text svneol=native#text/plain -res/cardsfolder/cao_cao_lord_of_wei.txt -text svneol=native#text/plain -res/cardsfolder/cao_ren_wei_commander.txt -text svneol=native#text/plain -res/cardsfolder/capashen_knight.txt -text svneol=native#text/plain -res/cardsfolder/capashen_standard.txt -text svneol=native#text/plain -res/cardsfolder/capashen_templar.txt -text svneol=native#text/plain -res/cardsfolder/capashen_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/capricious_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/capsize.txt -text svneol=native#text/plain -res/cardsfolder/captain_of_the_watch.txt -text svneol=native#text/plain -res/cardsfolder/captain_sisay.txt -text svneol=native#text/plain -res/cardsfolder/captivating_vampire.txt -text svneol=native#text/plain -res/cardsfolder/captive_flame.txt -text svneol=native#text/plain -res/cardsfolder/capture_of_jingzhou.txt -text svneol=native#text/plain -res/cardsfolder/captured_sunlight.txt -text svneol=native#text/plain -res/cardsfolder/carapace_forger.txt -text svneol=native#text/plain -res/cardsfolder/caravan_escort.txt -text svneol=native#text/plain -res/cardsfolder/caravan_hurda.txt -text svneol=native#text/plain -res/cardsfolder/carbonize.txt -text svneol=native#text/plain -res/cardsfolder/careful_consideration.txt -text svneol=native#text/plain -res/cardsfolder/careful_study.txt -text svneol=native#text/plain -res/cardsfolder/caress_of_phyrexia.txt svneol=native#text/plain -res/cardsfolder/caribou_range.txt -text svneol=native#text/plain -res/cardsfolder/carnage_altar.txt -text svneol=native#text/plain -res/cardsfolder/carnassid.txt -text svneol=native#text/plain -res/cardsfolder/carnifex_demon.txt -text svneol=native#text/plain -res/cardsfolder/carnival_of_souls.txt svneol=native#text/plain -res/cardsfolder/carnivorous_plant.txt -text svneol=native#text/plain -res/cardsfolder/carnophage.txt -text svneol=native#text/plain -res/cardsfolder/carrier_pigeons.txt -text svneol=native#text/plain -res/cardsfolder/carrion.txt svneol=native#text/plain -res/cardsfolder/carrion_ants.txt -text svneol=native#text/plain -res/cardsfolder/carrion_call.txt -text svneol=native#text/plain -res/cardsfolder/carrion_feeder.txt -text svneol=native#text/plain -res/cardsfolder/carrion_howler.txt -text svneol=native#text/plain -res/cardsfolder/carrion_thrash.txt -text svneol=native#text/plain -res/cardsfolder/carrion_wall.txt -text svneol=native#text/plain -res/cardsfolder/cartographer.txt -text svneol=native#text/plain -res/cardsfolder/carven_caryatid.txt -text svneol=native#text/plain -res/cardsfolder/cascade_bluffs.txt -text svneol=native#text/plain -res/cardsfolder/castigate.txt svneol=native#text/plain -res/cardsfolder/casting_of_bones.txt svneol=native#text/plain -res/cardsfolder/castle.txt -text svneol=native#text/plain -res/cardsfolder/castle_raptors.txt -text svneol=native#text/plain -res/cardsfolder/castle_sengir.txt -text svneol=native#text/plain -res/cardsfolder/cat_burglar.txt -text svneol=native#text/plain -res/cardsfolder/cat_warriors.txt -text svneol=native#text/plain -res/cardsfolder/catalog.txt -text svneol=native#text/plain -res/cardsfolder/catapult_master.txt -text svneol=native#text/plain -res/cardsfolder/catapult_squad.txt -text svneol=native#text/plain -res/cardsfolder/catastrophe.txt -text svneol=native#text/plain -res/cardsfolder/cateran_brute.txt -text svneol=native#text/plain -res/cardsfolder/cateran_enforcer.txt -text svneol=native#text/plain -res/cardsfolder/cateran_kidnappers.txt -text svneol=native#text/plain -res/cardsfolder/cateran_overlord.txt -text svneol=native#text/plain -res/cardsfolder/cateran_persuader.txt -text svneol=native#text/plain -res/cardsfolder/cateran_slaver.txt -text svneol=native#text/plain -res/cardsfolder/cateran_summons.txt -text svneol=native#text/plain -res/cardsfolder/cathartic_adept.txt -text svneol=native#text/plain -res/cardsfolder/cathodion.txt -text svneol=native#text/plain -res/cardsfolder/cauldron_haze.txt svneol=native#text/plain -res/cardsfolder/cauldron_of_souls.txt svneol=native#text/plain -res/cardsfolder/caustic_crawler.txt -text svneol=native#text/plain -res/cardsfolder/caustic_hound.txt -text svneol=native#text/plain -res/cardsfolder/caustic_rain.txt -text svneol=native#text/plain -res/cardsfolder/caustic_tar.txt -text svneol=native#text/plain -res/cardsfolder/caustic_wasps.txt svneol=native#text/plain -res/cardsfolder/cavalry_master.txt -text svneol=native#text/plain -res/cardsfolder/cave_in.txt -text svneol=native#text/plain -res/cardsfolder/cave_people.txt -text svneol=native#text/plain -res/cardsfolder/cave_sense.txt -text svneol=native#text/plain -res/cardsfolder/cave_tiger.txt -text svneol=native#text/plain -res/cardsfolder/cavern_crawler.txt -text svneol=native#text/plain -res/cardsfolder/cavern_harpy.txt -text svneol=native#text/plain -res/cardsfolder/cavern_thoctar.txt -text svneol=native#text/plain -res/cardsfolder/caverns_of_despair.txt -text svneol=native#text/plain -res/cardsfolder/caves_of_koilos.txt -text svneol=native#text/plain -res/cardsfolder/celestial_ancient.txt -text svneol=native#text/plain -res/cardsfolder/celestial_colonnade.txt -text svneol=native#text/plain -res/cardsfolder/celestial_crusader.txt -text svneol=native#text/plain -res/cardsfolder/celestial_gatekeeper.txt svneol=native#text/plain -res/cardsfolder/celestial_kirin.txt -text svneol=native#text/plain -res/cardsfolder/celestial_mantle.txt -text svneol=native#text/plain -res/cardsfolder/celestial_prism.txt -text svneol=native#text/plain -res/cardsfolder/celestial_purge.txt -text svneol=native#text/plain -res/cardsfolder/celestial_sword.txt -text svneol=native#text/plain -res/cardsfolder/cemetery_gate.txt -text svneol=native#text/plain -res/cardsfolder/cemetery_reaper.txt -text svneol=native#text/plain -res/cardsfolder/cenns_enlistment.txt -text svneol=native#text/plain -res/cardsfolder/cenns_heir.txt -text svneol=native#text/plain -res/cardsfolder/centaur_archer.txt -text svneol=native#text/plain -res/cardsfolder/centaur_chieftain.txt svneol=native#text/plain -res/cardsfolder/centaur_courser.txt -text svneol=native#text/plain -res/cardsfolder/centaur_garden.txt -text svneol=native#text/plain -res/cardsfolder/centaur_glade.txt -text svneol=native#text/plain -res/cardsfolder/centaur_omenreader.txt -text svneol=native#text/plain -res/cardsfolder/centaur_rootcaster.txt -text svneol=native#text/plain -res/cardsfolder/centaur_safeguard.txt -text svneol=native#text/plain -res/cardsfolder/centaur_veteran.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_aristocrat.txt svneol=native#text/plain -res/cardsfolder/cephalid_broker.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_coliseum.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_illusionist.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_inkshrouder.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_looter.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_pathmage.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_retainer.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_sage.txt svneol=native#text/plain -res/cardsfolder/cephalid_scout.txt -text svneol=native#text/plain -res/cardsfolder/cephalid_snitch.txt svneol=native#text/plain -res/cardsfolder/cephalid_vandal.txt svneol=native#text/plain -res/cardsfolder/cerebral_eruption.txt -text svneol=native#text/plain -res/cardsfolder/ceremonial_guard.txt -text svneol=native#text/plain -res/cardsfolder/cerodon_yearling.txt -text svneol=native#text/plain -res/cardsfolder/cerulean_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/cerulean_wisps.txt -text svneol=native#text/plain -res/cardsfolder/cerulean_wyvern.txt -text svneol=native#text/plain -res/cardsfolder/cessation.txt -text svneol=native#text/plain -res/cardsfolder/ceta_disciple.txt -text svneol=native#text/plain -res/cardsfolder/ceta_sanctuary.txt svneol=native#text/plain -res/cardsfolder/chain_reaction.txt -text svneol=native#text/plain -res/cardsfolder/chainbreaker.txt svneol=native#text/plain -res/cardsfolder/chained_throatseeker.txt svneol=native#text/plain -res/cardsfolder/chainer_dementia_master.txt -text svneol=native#text/plain -res/cardsfolder/chainers_edict.txt -text svneol=native#text/plain -res/cardsfolder/chainflinger.txt -text svneol=native#text/plain -res/cardsfolder/chalice_of_the_void.txt -text svneol=native#text/plain -res/cardsfolder/chambered_nautilus.txt -text svneol=native#text/plain -res/cardsfolder/chameleon_colossus.txt -text svneol=native#text/plain -res/cardsfolder/champion_lancer.txt -text svneol=native#text/plain -res/cardsfolder/champions_drake.txt -text svneol=native#text/plain -res/cardsfolder/champions_victory.txt -text svneol=native#text/plain -res/cardsfolder/chandler.txt -text svneol=native#text/plain -res/cardsfolder/chandra_nalaar.txt -text svneol=native#text/plain -res/cardsfolder/chandras_outrage.txt -text svneol=native#text/plain -res/cardsfolder/chandras_spitfire.txt -text svneol=native#text/plain -res/cardsfolder/change_of_heart.txt -text svneol=native#text/plain -res/cardsfolder/changeling_berserker.txt -text svneol=native#text/plain -res/cardsfolder/changeling_hero.txt -text svneol=native#text/plain -res/cardsfolder/changeling_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/changeling_titan.txt -text svneol=native#text/plain -res/cardsfolder/channel.txt -text svneol=native#text/plain -res/cardsfolder/channel_the_suns.txt -text svneol=native#text/plain -res/cardsfolder/chaos_charm.txt -text svneol=native#text/plain -res/cardsfolder/chaosphere.txt -text svneol=native#text/plain -res/cardsfolder/char.txt -text svneol=native#text/plain -res/cardsfolder/char_rumbler.txt -text svneol=native#text/plain -res/cardsfolder/charcoal_diamond.txt -text svneol=native#text/plain -res/cardsfolder/charging_bandits.txt -text svneol=native#text/plain -res/cardsfolder/charging_paladin.txt -text svneol=native#text/plain -res/cardsfolder/charging_rhino.txt -text svneol=native#text/plain -res/cardsfolder/charging_slateback.txt -text svneol=native#text/plain -res/cardsfolder/charging_troll.txt -text svneol=native#text/plain -res/cardsfolder/charmed_griffin.txt -text svneol=native#text/plain -res/cardsfolder/charnelhoard_wurm.txt -text svneol=native#text/plain -res/cardsfolder/chartooth_cougar.txt -text svneol=native#text/plain -res/cardsfolder/chastise.txt -text svneol=native#text/plain -res/cardsfolder/chatter_of_the_squirrel.txt -text svneol=native#text/plain -res/cardsfolder/chieftain_en_dal.txt svneol=native#text/plain -res/cardsfolder/child_of_alara.txt -text svneol=native#text/plain -res/cardsfolder/child_of_gaea.txt -text svneol=native#text/plain -res/cardsfolder/child_of_night.txt -text svneol=native#text/plain -res/cardsfolder/child_of_thorns.txt -text svneol=native#text/plain -res/cardsfolder/childhood_horror.txt -text svneol=native#text/plain -res/cardsfolder/chill.txt -text svneol=native#text/plain -res/cardsfolder/chill_to_the_bone.txt -text svneol=native#text/plain -res/cardsfolder/chilling_apparition.txt -text svneol=native#text/plain -res/cardsfolder/chilling_shade.txt -text svneol=native#text/plain -res/cardsfolder/chime_of_night.txt svneol=native#text/plain -res/cardsfolder/chimeric_coils.txt -text svneol=native#text/plain -res/cardsfolder/chimeric_egg.txt svneol=native#text/plain -res/cardsfolder/chimeric_idol.txt svneol=native#text/plain -res/cardsfolder/chimeric_mass.txt svneol=native#text/plain -res/cardsfolder/chimeric_staff.txt -text svneol=native#text/plain -res/cardsfolder/chimney_imp.txt -text svneol=native#text/plain -res/cardsfolder/chittering_rats.txt -text svneol=native#text/plain -res/cardsfolder/cho_arrim_bruiser.txt -text svneol=native#text/plain -res/cardsfolder/cho_manno_revolutionary.txt -text svneol=native#text/plain -res/cardsfolder/choke.txt -text svneol=native#text/plain -res/cardsfolder/choking_fumes.txt -text svneol=native#text/plain -res/cardsfolder/choking_sands.txt -text svneol=native#text/plain -res/cardsfolder/choking_tethers.txt -text svneol=native#text/plain -res/cardsfolder/chorus_of_woe.txt -text svneol=native#text/plain -res/cardsfolder/chromatic_sphere.txt -text svneol=native#text/plain -res/cardsfolder/chromatic_star.txt -text svneol=native#text/plain -res/cardsfolder/chrome_steed.txt -text svneol=native#text/plain -res/cardsfolder/chromescale_drake.txt svneol=native#text/plain -res/cardsfolder/chromium.txt -text svneol=native#text/plain -res/cardsfolder/chronatog.txt -text svneol=native#text/plain -res/cardsfolder/chronatog_totem.txt svneol=native#text/plain -res/cardsfolder/chronosavant.txt svneol=native#text/plain -res/cardsfolder/chub_toad.txt -text svneol=native#text/plain -res/cardsfolder/churning_eddy.txt -text svneol=native#text/plain -res/cardsfolder/cinder_crawler.txt svneol=native#text/plain -res/cardsfolder/cinder_elemental.txt -text svneol=native#text/plain -res/cardsfolder/cinder_giant.txt svneol=native#text/plain -res/cardsfolder/cinder_marsh.txt -text svneol=native#text/plain -res/cardsfolder/cinder_pyromancer.txt -text svneol=native#text/plain -res/cardsfolder/cinder_shade.txt -text svneol=native#text/plain -res/cardsfolder/cinder_storm.txt -text svneol=native#text/plain -res/cardsfolder/cinder_wall.txt svneol=native#text/plain -res/cardsfolder/cinderbones.txt -text svneol=native#text/plain -res/cardsfolder/cinderhaze_wretch.txt svneol=native#text/plain -res/cardsfolder/circular_logic.txt -text svneol=native#text/plain -res/cardsfolder/citanul_centaurs.txt -text svneol=native#text/plain -res/cardsfolder/citanul_druid.txt -text svneol=native#text/plain -res/cardsfolder/citanul_flute.txt -text svneol=native#text/plain -res/cardsfolder/citanul_hierophants.txt -text svneol=native#text/plain -res/cardsfolder/citanul_woodreaders.txt -text svneol=native#text/plain -res/cardsfolder/city_of_brass.txt -text svneol=native#text/plain -res/cardsfolder/city_of_shadows.txt -text svneol=native#text/plain -res/cardsfolder/city_of_traitors.txt -text svneol=native#text/plain -res/cardsfolder/civic_guildmage.txt svneol=native#text/plain -res/cardsfolder/civic_wayfinder.txt -text svneol=native#text/plain -res/cardsfolder/clairvoyance.txt svneol=native#text/plain -res/cardsfolder/claws_of_gix.txt -text svneol=native#text/plain -res/cardsfolder/claws_of_valakut.txt -text svneol=native#text/plain -res/cardsfolder/claws_of_wirewood.txt -text svneol=native#text/plain -res/cardsfolder/clay_statue.txt -text svneol=native#text/plain -res/cardsfolder/cleanfall.txt -text svneol=native#text/plain -res/cardsfolder/cleanse.txt -text svneol=native#text/plain -res/cardsfolder/clear.txt -text svneol=native#text/plain -res/cardsfolder/clearwater_goblet.txt -text svneol=native#text/plain -res/cardsfolder/clergy_en_vec.txt -text svneol=native#text/plain -res/cardsfolder/clickslither.txt -text svneol=native#text/plain -res/cardsfolder/cliff_threader.txt -text svneol=native#text/plain -res/cardsfolder/cliffrunner_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/clinging_darkness.txt -text svneol=native#text/plain -res/cardsfolder/cloak_of_feathers.txt -text svneol=native#text/plain -res/cardsfolder/cloak_of_mists.txt -text svneol=native#text/plain -res/cardsfolder/clock_of_omens.txt -text svneol=native#text/plain -res/cardsfolder/clockwork_beetle.txt svneol=native#text/plain -res/cardsfolder/clockwork_condor.txt svneol=native#text/plain -res/cardsfolder/clockwork_dragon.txt -text svneol=native#text/plain -res/cardsfolder/clockwork_gnomes.txt -text svneol=native#text/plain -res/cardsfolder/clockwork_vorrac.txt svneol=native#text/plain -res/cardsfolder/clone.txt -text svneol=native#text/plain -res/cardsfolder/close_quarters.txt -text svneol=native#text/plain -res/cardsfolder/clot_sliver.txt svneol=native#text/plain -res/cardsfolder/cloud_crusader.txt -text svneol=native#text/plain -res/cardsfolder/cloud_djinn.txt -text svneol=native#text/plain -res/cardsfolder/cloud_dragon.txt -text svneol=native#text/plain -res/cardsfolder/cloud_elemental.txt -text svneol=native#text/plain -res/cardsfolder/cloud_of_faeries.txt -text svneol=native#text/plain -res/cardsfolder/cloud_pirates.txt -text svneol=native#text/plain -res/cardsfolder/cloud_spirit.txt -text svneol=native#text/plain -res/cardsfolder/cloud_sprite.txt -text svneol=native#text/plain -res/cardsfolder/cloudchaser_eagle.txt -text svneol=native#text/plain -res/cardsfolder/cloudchaser_kestrel.txt -text svneol=native#text/plain -res/cardsfolder/cloudcrest_lake.txt -text svneol=native#text/plain -res/cardsfolder/cloudcrown_oak.txt -text svneol=native#text/plain -res/cardsfolder/cloudgoat_ranger.txt -text svneol=native#text/plain -res/cardsfolder/cloudheath_drake.txt -text svneol=native#text/plain -res/cardsfolder/cloudhoof_kirin.txt -text svneol=native#text/plain -res/cardsfolder/cloudpost.txt -text svneol=native#text/plain -res/cardsfolder/cloudreach_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/cloudseeder.txt -text svneol=native#text/plain -res/cardsfolder/cloudskate.txt -text svneol=native#text/plain -res/cardsfolder/cloudthresher.txt -text svneol=native#text/plain -res/cardsfolder/clout_of_the_dominus.txt -text svneol=native#text/plain -res/cardsfolder/clutch_of_the_undercity.txt -text svneol=native#text/plain -res/cardsfolder/clutch_of_undeath.txt -text svneol=native#text/plain -res/cardsfolder/coal_golem.txt -text svneol=native#text/plain -res/cardsfolder/coast_watcher.txt -text svneol=native#text/plain -res/cardsfolder/coastal_drake.txt -text svneol=native#text/plain -res/cardsfolder/coastal_hornclaw.txt -text svneol=native#text/plain -res/cardsfolder/coastal_piracy.txt -text svneol=native#text/plain -res/cardsfolder/coastal_tower.txt -text svneol=native#text/plain -res/cardsfolder/coat_of_arms.txt -text svneol=native#text/plain -res/cardsfolder/cobalt_golem.txt -text svneol=native#text/plain -res/cardsfolder/cockatrice.txt -text svneol=native#text/plain -res/cardsfolder/coercion.txt -text svneol=native#text/plain -res/cardsfolder/coffin_puppets.txt -text svneol=native#text/plain -res/cardsfolder/coffin_purge.txt -text svneol=native#text/plain -res/cardsfolder/cognivore.txt -text svneol=native#text/plain -res/cardsfolder/coiled_tinviper.txt -text svneol=native#text/plain -res/cardsfolder/coiling_oracle.txt svneol=native#text/plain -res/cardsfolder/coiling_woodworm.txt -text svneol=native#text/plain -res/cardsfolder/cold_eyed_selkie.txt -text svneol=native#text/plain -res/cardsfolder/collective_restraint.txt -text svneol=native#text/plain -res/cardsfolder/collective_unconscious.txt -text svneol=native#text/plain -res/cardsfolder/colos_yearling.txt -text svneol=native#text/plain -res/cardsfolder/colossal_might.txt -text svneol=native#text/plain -res/cardsfolder/colossus_of_sardia.txt -text svneol=native#text/plain -res/cardsfolder/combat_medic.txt -text svneol=native#text/plain -res/cardsfolder/combust.txt -text svneol=native#text/plain -res/cardsfolder/command_of_unsummoning.txt -text svneol=native#text/plain -res/cardsfolder/commander_eesha.txt -text svneol=native#text/plain -res/cardsfolder/commander_greven_il_vec.txt -text svneol=native#text/plain -res/cardsfolder/commune_with_nature.txt -text svneol=native#text/plain -res/cardsfolder/complex_automaton.txt -text svneol=native#text/plain -res/cardsfolder/composite_golem.txt -text svneol=native#text/plain -res/cardsfolder/compost.txt svneol=native#text/plain -res/cardsfolder/compulsion.txt -text svneol=native#text/plain -res/cardsfolder/compulsive_research.txt -text svneol=native#text/plain -res/cardsfolder/concentrate.txt -text svneol=native#text/plain -res/cardsfolder/conch_horn.txt -text svneol=native#text/plain -res/cardsfolder/concordant_crossroads.txt -text svneol=native#text/plain -res/cardsfolder/condemn.txt -text svneol=native#text/plain -res/cardsfolder/condescend.txt -text svneol=native#text/plain -res/cardsfolder/confiscate.txt svneol=native#text/plain -res/cardsfolder/conflux.txt -text svneol=native#text/plain -res/cardsfolder/confound.txt -text svneol=native#text/plain -res/cardsfolder/congregate.txt -text svneol=native#text/plain -res/cardsfolder/congregation_at_dawn.txt -text svneol=native#text/plain -res/cardsfolder/conjurers_bauble.txt -text svneol=native#text/plain -res/cardsfolder/conquering_manticore.txt -text svneol=native#text/plain -res/cardsfolder/conquerors_pledge.txt -text svneol=native#text/plain -res/cardsfolder/consecrated_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/conservator.txt svneol=native#text/plain -res/cardsfolder/conspiracy.txt -text svneol=native#text/plain -res/cardsfolder/constant_mists.txt -text svneol=native#text/plain -res/cardsfolder/constricting_tendrils.txt -text svneol=native#text/plain -res/cardsfolder/consult_the_necrosages.txt -text svneol=native#text/plain -res/cardsfolder/consume_the_meek.txt -text svneol=native#text/plain -res/cardsfolder/consuming_bonfire.txt -text svneol=native#text/plain -res/cardsfolder/consumptive_goo.txt -text svneol=native#text/plain -res/cardsfolder/contagion.txt -text svneol=native#text/plain -res/cardsfolder/contagion_clasp.txt -text svneol=native#text/plain -res/cardsfolder/contagion_engine.txt -text svneol=native#text/plain -res/cardsfolder/contagious_nim.txt -text svneol=native#text/plain -res/cardsfolder/contaminated_bond.txt -text svneol=native#text/plain -res/cardsfolder/contaminated_ground.txt -text svneol=native#text/plain -res/cardsfolder/contemplation.txt -text svneol=native#text/plain -res/cardsfolder/contested_war_zone.txt svneol=native#text/plain -res/cardsfolder/control_magic.txt -text svneol=native#text/plain -res/cardsfolder/control_of_the_court.txt -text svneol=native#text/plain -res/cardsfolder/controvert.txt -text svneol=native#text/plain -res/cardsfolder/convalescence.txt -text svneol=native#text/plain -res/cardsfolder/convalescent_care.txt -text svneol=native#text/plain -res/cardsfolder/conversion.txt -text svneol=native#text/plain -res/cardsfolder/conversion_chamber.txt svneol=native#text/plain -res/cardsfolder/conviction.txt -text svneol=native#text/plain -res/cardsfolder/convincing_mirage.txt -text svneol=native#text/plain -res/cardsfolder/convolute.txt -text svneol=native#text/plain -res/cardsfolder/copper_carapace.txt -text svneol=native#text/plain -res/cardsfolder/copper_gnomes.txt -text svneol=native#text/plain -res/cardsfolder/copper_leaf_angel.txt svneol=native#text/plain -res/cardsfolder/copper_myr.txt -text svneol=native#text/plain -res/cardsfolder/copper_tablet.txt -text svneol=native#text/plain -res/cardsfolder/copperhorn_scout.txt -text svneol=native#text/plain -res/cardsfolder/copperline_gorge.txt -text svneol=native#text/plain -res/cardsfolder/copy_artifact.txt -text svneol=native#text/plain -res/cardsfolder/coral_atoll.txt -text svneol=native#text/plain -res/cardsfolder/coral_eel.txt -text svneol=native#text/plain -res/cardsfolder/coral_fighters.txt svneol=native#text/plain -res/cardsfolder/coral_helm.txt -text svneol=native#text/plain -res/cardsfolder/coral_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/coral_reef.txt svneol=native#text/plain -res/cardsfolder/coral_trickster.txt -text svneol=native#text/plain -res/cardsfolder/coralhelm_commander.txt -text svneol=native#text/plain -res/cardsfolder/core_prowler.txt -text svneol=native#text/plain -res/cardsfolder/coretapper.txt -text svneol=native#text/plain -res/cardsfolder/corpse_connoisseur.txt -text svneol=native#text/plain -res/cardsfolder/corpse_cur.txt -text svneol=native#text/plain -res/cardsfolder/corpse_harvester.txt -text svneol=native#text/plain -res/cardsfolder/corpsehatch.txt -text svneol=native#text/plain -res/cardsfolder/corpulent_corpse.txt -text svneol=native#text/plain -res/cardsfolder/corrosive_gale.txt svneol=native#text/plain -res/cardsfolder/corrosive_mentor.txt -text svneol=native#text/plain -res/cardsfolder/corrupt.txt -text svneol=native#text/plain -res/cardsfolder/corrupt_court_official.txt -text svneol=native#text/plain -res/cardsfolder/corrupt_eunuchs.txt -text svneol=native#text/plain -res/cardsfolder/corrupt_official.txt -text svneol=native#text/plain -res/cardsfolder/corrupted_conscience.txt -text svneol=native#text/plain -res/cardsfolder/corrupted_harvester.txt -text svneol=native#text/plain -res/cardsfolder/corrupted_zendikon.txt svneol=native#text/plain -res/cardsfolder/cosis_ravager.txt -text svneol=native#text/plain -res/cardsfolder/cosis_trickster.txt svneol=native#text/plain -res/cardsfolder/cosmic_horror.txt -text svneol=native#text/plain -res/cardsfolder/council_of_advisors.txt -text svneol=native#text/plain -res/cardsfolder/counsel_of_the_soratami.txt -text svneol=native#text/plain -res/cardsfolder/counterbalance.txt -text svneol=native#text/plain -res/cardsfolder/counterintelligence.txt -text svneol=native#text/plain -res/cardsfolder/counterspell.txt -text svneol=native#text/plain -res/cardsfolder/countersquall.txt -text svneol=native#text/plain -res/cardsfolder/courier_hawk.txt -text svneol=native#text/plain -res/cardsfolder/couriers_capsule.txt -text svneol=native#text/plain -res/cardsfolder/court_archers.txt -text svneol=native#text/plain -res/cardsfolder/court_homunculus.txt -text svneol=native#text/plain -res/cardsfolder/cover_of_darkness.txt -text svneol=native#text/plain -res/cardsfolder/covert_operative.txt -text svneol=native#text/plain -res/cardsfolder/covetous_dragon.txt -text svneol=native#text/plain -res/cardsfolder/cowardice.txt -text svneol=native#text/plain -res/cardsfolder/crab_umbra.txt svneol=native#text/plain -res/cardsfolder/crabapple_cohort.txt -text svneol=native#text/plain -res/cardsfolder/crack_the_earth.txt -text svneol=native#text/plain -res/cardsfolder/crackdown.txt -text svneol=native#text/plain -res/cardsfolder/crackling_club.txt -text svneol=native#text/plain -res/cardsfolder/cradle_guard.txt -text svneol=native#text/plain -res/cardsfolder/cradle_of_vitality.txt -text svneol=native#text/plain -res/cardsfolder/cradle_to_grave.txt -text svneol=native#text/plain -res/cardsfolder/crafty_pathmage.txt -text svneol=native#text/plain -res/cardsfolder/crag_puca.txt -text svneol=native#text/plain -res/cardsfolder/cranial_extraction.txt -text svneol=native#text/plain -res/cardsfolder/crash.txt -text svneol=native#text/plain -res/cardsfolder/crash_landing.txt svneol=native#text/plain -res/cardsfolder/crash_of_rhinos.txt -text svneol=native#text/plain -res/cardsfolder/crashing_centaur.txt -text svneol=native#text/plain -res/cardsfolder/crater_hellion.txt -text svneol=native#text/plain -res/cardsfolder/craven_giant.txt -text svneol=native#text/plain -res/cardsfolder/craven_knight.txt -text svneol=native#text/plain -res/cardsfolder/craw_giant.txt -text svneol=native#text/plain -res/cardsfolder/craw_wurm.txt -text svneol=native#text/plain -res/cardsfolder/crawling_filth.txt -text svneol=native#text/plain -res/cardsfolder/crawlspace.txt -text svneol=native#text/plain -res/cardsfolder/crazed_armodon.txt svneol=native#text/plain -res/cardsfolder/crazed_goblin.txt -text svneol=native#text/plain -res/cardsfolder/crazed_skirge.txt -text svneol=native#text/plain -res/cardsfolder/creakwood_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/creakwood_liege.txt -text svneol=native#text/plain -res/cardsfolder/cream_of_the_crop.txt svneol=native#text/plain -res/cardsfolder/creeping_corrosion.txt -text svneol=native#text/plain -res/cardsfolder/creeping_mold.txt -text svneol=native#text/plain -res/cardsfolder/creeping_tar_pit.txt -text svneol=native#text/plain -res/cardsfolder/cremate.txt -text svneol=native#text/plain -res/cardsfolder/crenellated_wall.txt -text svneol=native#text/plain -res/cardsfolder/crevasse.txt -text svneol=native#text/plain -res/cardsfolder/crib_swap.txt -text svneol=native#text/plain -res/cardsfolder/crimson_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/crimson_kobolds.txt -text svneol=native#text/plain -res/cardsfolder/crimson_manticore.txt -text svneol=native#text/plain -res/cardsfolder/crimson_roc.txt svneol=native#text/plain -res/cardsfolder/crimson_wisps.txt -text svneol=native#text/plain -res/cardsfolder/crippling_fatigue.txt -text svneol=native#text/plain -res/cardsfolder/cromat.txt -text svneol=native#text/plain -res/cardsfolder/crookclaw_elder.txt -text svneol=native#text/plain -res/cardsfolder/crookclaw_transmuter.txt svneol=native#text/plain -res/cardsfolder/crookshank_kobolds.txt -text svneol=native#text/plain -res/cardsfolder/crop_rotation.txt -text svneol=native#text/plain -res/cardsfolder/crosiss_attendant.txt -text svneol=native#text/plain -res/cardsfolder/crosiss_catacombs.txt -text svneol=native#text/plain -res/cardsfolder/crosiss_charm.txt -text svneol=native#text/plain -res/cardsfolder/crossbow_ambush.txt -text svneol=native#text/plain -res/cardsfolder/crossbow_infantry.txt -text svneol=native#text/plain -res/cardsfolder/crosswinds.txt -text svneol=native#text/plain -res/cardsfolder/crovax_ascendant_hero.txt -text svneol=native#text/plain -res/cardsfolder/crowd_favorites.txt -text svneol=native#text/plain -res/cardsfolder/crowd_of_cinders.txt -text svneol=native#text/plain -res/cardsfolder/crown_of_flames.txt svneol=native#text/plain -res/cardsfolder/crucible_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/crucible_of_worlds.txt -text svneol=native#text/plain -res/cardsfolder/crude_rampart.txt -text svneol=native#text/plain -res/cardsfolder/cruel_bargain.txt -text svneol=native#text/plain -res/cardsfolder/cruel_edict.txt -text svneol=native#text/plain -res/cardsfolder/cruel_fate.txt svneol=native#text/plain -res/cardsfolder/cruel_revival.txt svneol=native#text/plain -res/cardsfolder/cruel_tutor.txt -text svneol=native#text/plain -res/cardsfolder/cruel_ultimatum.txt -text svneol=native#text/plain -res/cardsfolder/crumble.txt -text svneol=native#text/plain -res/cardsfolder/crumbling_ashes.txt svneol=native#text/plain -res/cardsfolder/crumbling_necropolis.txt -text svneol=native#text/plain -res/cardsfolder/crumbling_sanctuary.txt -text svneol=native#text/plain -res/cardsfolder/crusade.txt -text svneol=native#text/plain -res/cardsfolder/crusading_knight.txt -text svneol=native#text/plain -res/cardsfolder/crush.txt -text svneol=native#text/plain -res/cardsfolder/crush_of_wurms.txt -text svneol=native#text/plain -res/cardsfolder/crusher_zendikon.txt svneol=native#text/plain -res/cardsfolder/crushing_pain.txt -text svneol=native#text/plain -res/cardsfolder/cryoclasm.txt svneol=native#text/plain -res/cardsfolder/crypt_angel.txt -text svneol=native#text/plain -res/cardsfolder/crypt_cobra.txt -text svneol=native#text/plain -res/cardsfolder/crypt_creeper.txt -text svneol=native#text/plain -res/cardsfolder/crypt_of_agadeem.txt -text svneol=native#text/plain -res/cardsfolder/crypt_ripper.txt -text svneol=native#text/plain -res/cardsfolder/crypt_sliver.txt -text svneol=native#text/plain -res/cardsfolder/cryptic_annelid.txt svneol=native#text/plain -res/cardsfolder/cryptic_command.txt svneol=native#text/plain -res/cardsfolder/cryptwailing.txt -text svneol=native#text/plain -res/cardsfolder/crystal_ball.txt -text svneol=native#text/plain -res/cardsfolder/crystal_chimes.txt -text svneol=native#text/plain -res/cardsfolder/crystal_quarry.txt -text svneol=native#text/plain -res/cardsfolder/crystal_rod.txt -text svneol=native#text/plain -res/cardsfolder/crystal_seer.txt svneol=native#text/plain -res/cardsfolder/crystal_shard.txt svneol=native#text/plain -res/cardsfolder/crystal_vein.txt -text svneol=native#text/plain -res/cardsfolder/crystalline_sliver.txt -text svneol=native#text/plain -res/cardsfolder/crystallization.txt -text svneol=native#text/plain -res/cardsfolder/cudgel_troll.txt -text svneol=native#text/plain -res/cardsfolder/culling_dais.txt -text svneol=native#text/plain -res/cardsfolder/culling_sun.txt -text svneol=native#text/plain -res/cardsfolder/culling_the_weak.txt -text svneol=native#text/plain -res/cardsfolder/cultbrand_cinder.txt -text svneol=native#text/plain -res/cardsfolder/cultivate.txt -text svneol=native#text/plain -res/cardsfolder/cumber_stone.txt -text svneol=native#text/plain -res/cardsfolder/cunning.txt -text svneol=native#text/plain -res/cardsfolder/cunning_advisor.txt -text svneol=native#text/plain -res/cardsfolder/cunning_lethemancer.txt -text svneol=native#text/plain -res/cardsfolder/cunning_sparkmage.txt -text svneol=native#text/plain -res/cardsfolder/curfew.txt -text svneol=native#text/plain -res/cardsfolder/curiosity.txt -text svneol=native#text/plain -res/cardsfolder/curse_of_chains.txt -text svneol=native#text/plain -res/cardsfolder/curse_of_marit_lage.txt -text svneol=native#text/plain -res/cardsfolder/curse_of_wizardry.txt -text svneol=native#text/plain -res/cardsfolder/cursecatcher.txt -text svneol=native#text/plain -res/cardsfolder/cursed_flesh.txt -text svneol=native#text/plain -res/cardsfolder/cursed_land.txt -text svneol=native#text/plain -res/cardsfolder/cursed_rack.txt -text svneol=native#text/plain -res/cardsfolder/cursed_ronin.txt -text svneol=native#text/plain -res/cardsfolder/cursed_scroll.txt -text svneol=native#text/plain -res/cardsfolder/cursed_totem.txt svneol=native#text/plain -res/cardsfolder/customs_depot.txt -text svneol=native#text/plain -res/cardsfolder/cut_the_earthly_bond.txt -text svneol=native#text/plain -res/cardsfolder/cutthroat_il_dal.txt -text svneol=native#text/plain -res/cardsfolder/cyclical_evolution.txt -text svneol=native#text/plain -res/cardsfolder/cyclopean_mummy.txt svneol=native#text/plain -res/cardsfolder/cyclopean_snare.txt svneol=native#text/plain -res/cardsfolder/cylian_elf.txt -text svneol=native#text/plain -res/cardsfolder/cylian_sunsinger.txt -text svneol=native#text/plain -res/cardsfolder/cystbearer.txt -text svneol=native#text/plain -res/cardsfolder/daggerback_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/daggerclaw_imp.txt -text svneol=native#text/plain -res/cardsfolder/daily_regimen.txt svneol=native#text/plain -res/cardsfolder/dakkon_blackblade.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_bat.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_lancer.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_plague.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_salvage.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_scorpion.txt -text svneol=native#text/plain -res/cardsfolder/dakmor_sorceress.txt -text svneol=native#text/plain -res/cardsfolder/damnation.txt -text svneol=native#text/plain -res/cardsfolder/damping_field.txt -text svneol=native#text/plain -res/cardsfolder/dance_of_many.txt -text svneol=native#text/plain -res/cardsfolder/dance_of_shadows.txt -text svneol=native#text/plain -res/cardsfolder/dance_of_the_dead.txt -text svneol=native#text/plain -res/cardsfolder/dancing_scimitar.txt -text svneol=native#text/plain -res/cardsfolder/dandan.txt -text svneol=native#text/plain -res/cardsfolder/daraja_griffin.txt -text svneol=native#text/plain -res/cardsfolder/darba.txt -text svneol=native#text/plain -res/cardsfolder/darien_king_of_kjeldor.txt -text svneol=native#text/plain -res/cardsfolder/darigaazs_attendant.txt -text svneol=native#text/plain -res/cardsfolder/darigaazs_caldera.txt -text svneol=native#text/plain -res/cardsfolder/darigaazs_charm.txt -text svneol=native#text/plain -res/cardsfolder/daring_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/daring_leap.txt -text svneol=native#text/plain -res/cardsfolder/dark_banishing.txt -text svneol=native#text/plain -res/cardsfolder/dark_confidant.txt -text svneol=native#text/plain -res/cardsfolder/dark_depths.txt -text svneol=native#text/plain -res/cardsfolder/dark_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/dark_heart_of_the_wood.txt -text svneol=native#text/plain -res/cardsfolder/dark_maze.txt svneol=native#text/plain -res/cardsfolder/dark_offering.txt -text svneol=native#text/plain -res/cardsfolder/dark_privilege.txt -text svneol=native#text/plain -res/cardsfolder/dark_ritual.txt -text svneol=native#text/plain -res/cardsfolder/dark_temper.txt svneol=native#text/plain -res/cardsfolder/dark_triumph.txt -text svneol=native#text/plain -res/cardsfolder/dark_tutelage.txt svneol=native#text/plain -res/cardsfolder/dark_withering.txt -text svneol=native#text/plain -res/cardsfolder/darkblast.txt -text svneol=native#text/plain -res/cardsfolder/darkest_hour.txt svneol=native#text/plain -res/cardsfolder/darkheart_sliver.txt svneol=native#text/plain -res/cardsfolder/darkling_stalker.txt -text svneol=native#text/plain -res/cardsfolder/darklit_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/darkness.txt -text svneol=native#text/plain -res/cardsfolder/darkslick_drake.txt -text svneol=native#text/plain -res/cardsfolder/darkslick_shores.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_axe.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_brute.txt svneol=native#text/plain -res/cardsfolder/darksteel_citadel.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_colossus.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_forge.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_ingot.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_juggernaut.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_myr.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_pendant.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_plate.txt -text svneol=native#text/plain -res/cardsfolder/darksteel_relic.txt svneol=native#text/plain -res/cardsfolder/darksteel_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/darkwatch_elves.txt -text svneol=native#text/plain -res/cardsfolder/darkwater_catacombs.txt -text svneol=native#text/plain -res/cardsfolder/darkwater_egg.txt -text svneol=native#text/plain -res/cardsfolder/darting_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/daru_cavalier.txt svneol=native#text/plain -res/cardsfolder/daru_encampment.txt -text svneol=native#text/plain -res/cardsfolder/daru_healer.txt -text svneol=native#text/plain -res/cardsfolder/daru_lancer.txt -text svneol=native#text/plain -res/cardsfolder/daru_mender.txt svneol=native#text/plain -res/cardsfolder/daru_sanctifier.txt svneol=native#text/plain -res/cardsfolder/daru_warchief.txt -text svneol=native#text/plain -res/cardsfolder/daunting_defender.txt -text svneol=native#text/plain -res/cardsfolder/dauntless_dourbark.txt -text svneol=native#text/plain -res/cardsfolder/dauntless_escort.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_cutthroat.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_embrace.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_horror.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_jackal.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_marauder.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_mercenary.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_mindripper.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_slayer.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_trapper.txt -text svneol=native#text/plain -res/cardsfolder/dauthi_warlord.txt -text svneol=native#text/plain -res/cardsfolder/davenant_archer.txt -text svneol=native#text/plain -res/cardsfolder/davenant_healer.txt -text svneol=native#text/plain -res/cardsfolder/dawn_elemental.txt -text svneol=native#text/plain -res/cardsfolder/dawn_of_the_dead.txt svneol=native#text/plain -res/cardsfolder/dawnglare_invoker.txt -text svneol=native#text/plain -res/cardsfolder/dawning_purist.txt svneol=native#text/plain -res/cardsfolder/dawnray_archer.txt -text svneol=native#text/plain -res/cardsfolder/dawnstrider.txt -text svneol=native#text/plain -res/cardsfolder/day_of_destiny.txt -text svneol=native#text/plain -res/cardsfolder/day_of_judgment.txt -text svneol=native#text/plain -res/cardsfolder/day_of_the_dragons.txt svneol=native#text/plain -res/cardsfolder/daze.txt -text svneol=native#text/plain -res/cardsfolder/deadapult.txt -text svneol=native#text/plain -res/cardsfolder/deadfall.txt -text svneol=native#text/plain -res/cardsfolder/deadly_grub.txt -text svneol=native#text/plain -res/cardsfolder/deadly_insect.txt -text svneol=native#text/plain -res/cardsfolder/deadly_recluse.txt -text svneol=native#text/plain -res/cardsfolder/deadshot_minotaur.txt svneol=native#text/plain -res/cardsfolder/deadwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/death_baron.txt -text svneol=native#text/plain -res/cardsfolder/death_bomb.txt -text svneol=native#text/plain -res/cardsfolder/death_cloud.txt -text svneol=native#text/plain -res/cardsfolder/death_cultist.txt -text svneol=native#text/plain -res/cardsfolder/death_denied.txt -text svneol=native#text/plain -res/cardsfolder/death_grasp.txt -text svneol=native#text/plain -res/cardsfolder/death_hood_cobra.txt svneol=native#text/plain -res/cardsfolder/death_mutation.txt -text svneol=native#text/plain -res/cardsfolder/death_of_a_thousand_stings.txt -text svneol=native#text/plain -res/cardsfolder/death_pits_of_rath.txt -text svneol=native#text/plain -res/cardsfolder/death_pulse.txt -text svneol=native#text/plain -res/cardsfolder/death_speakers.txt -text svneol=native#text/plain -res/cardsfolder/death_stroke.txt -text svneol=native#text/plain -res/cardsfolder/death_ward.txt -text svneol=native#text/plain -res/cardsfolder/deathbringer_liege.txt -text svneol=native#text/plain -res/cardsfolder/deathbringer_thoctar.txt -text svneol=native#text/plain -res/cardsfolder/deathforge_shaman.txt svneol=native#text/plain -res/cardsfolder/deathgazer.txt -text svneol=native#text/plain -res/cardsfolder/deathgreeter.txt -text svneol=native#text/plain -res/cardsfolder/deathgrip.txt -text svneol=native#text/plain -res/cardsfolder/deathknell_kami.txt -text svneol=native#text/plain -res/cardsfolder/deathless_angel.txt -text svneol=native#text/plain -res/cardsfolder/deathmark.txt -text svneol=native#text/plain -res/cardsfolder/deathmark_prelate.txt -text svneol=native#text/plain -res/cardsfolder/deathmask_nezumi.txt -text svneol=native#text/plain -res/cardsfolder/deaths_duet.txt -text svneol=native#text/plain -res/cardsfolder/deaths_head_buzzard.txt svneol=native#text/plain -res/cardsfolder/deaths_shadow.txt -text svneol=native#text/plain -res/cardsfolder/deathspore_thallid.txt -text svneol=native#text/plain -res/cardsfolder/debtors_knell.txt -text svneol=native#text/plain -res/cardsfolder/deception.txt -text svneol=native#text/plain -res/cardsfolder/decimate.txt svneol=native#text/plain -res/cardsfolder/decimator_web.txt -text svneol=native#text/plain -res/cardsfolder/deconstruct.txt -text svneol=native#text/plain -res/cardsfolder/decree_of_annihilation.txt svneol=native#text/plain -res/cardsfolder/decree_of_justice.txt -text svneol=native#text/plain -res/cardsfolder/decree_of_savagery.txt -text svneol=native#text/plain -res/cardsfolder/dedicated_martyr.txt -text svneol=native#text/plain -res/cardsfolder/deep_analysis.txt -text svneol=native#text/plain -res/cardsfolder/deep_reconnaissance.txt -text svneol=native#text/plain -res/cardsfolder/deep_sea_serpent.txt -text svneol=native#text/plain -res/cardsfolder/deep_slumber_titan.txt svneol=native#text/plain -res/cardsfolder/deepchannel_mentor.txt -text svneol=native#text/plain -res/cardsfolder/deeptread_merrow.txt -text svneol=native#text/plain -res/cardsfolder/deepwood_drummer.txt -text svneol=native#text/plain -res/cardsfolder/deepwood_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/deepwood_tantiv.txt -text svneol=native#text/plain -res/cardsfolder/deepwood_wolverine.txt -text svneol=native#text/plain -res/cardsfolder/defender_of_chaos.txt -text svneol=native#text/plain -res/cardsfolder/defender_of_law.txt -text svneol=native#text/plain -res/cardsfolder/defender_of_the_order.txt svneol=native#text/plain -res/cardsfolder/defense_grid.txt -text svneol=native#text/plain -res/cardsfolder/defense_of_the_heart.txt -text svneol=native#text/plain -res/cardsfolder/defensive_stance.txt svneol=native#text/plain -res/cardsfolder/defiant_elf.txt -text svneol=native#text/plain -res/cardsfolder/defiant_falcon.txt -text svneol=native#text/plain -res/cardsfolder/defiler_of_souls.txt -text svneol=native#text/plain -res/cardsfolder/deft_duelist.txt -text svneol=native#text/plain -res/cardsfolder/defy_gravity.txt -text svneol=native#text/plain -res/cardsfolder/dega_disciple.txt svneol=native#text/plain -res/cardsfolder/dega_sanctuary.txt -text svneol=native#text/plain -res/cardsfolder/deglamer.txt -text svneol=native#text/plain -res/cardsfolder/dehydration.txt -text svneol=native#text/plain -res/cardsfolder/deity_of_scars.txt -text svneol=native#text/plain -res/cardsfolder/deja_vu.txt -text svneol=native#text/plain -res/cardsfolder/delirium.txt svneol=native#text/plain -res/cardsfolder/delirium_skeins.txt -text svneol=native#text/plain -res/cardsfolder/delraich.txt -text svneol=native#text/plain -res/cardsfolder/deluge.txt -text svneol=native#text/plain -res/cardsfolder/delusions_of_mediocrity.txt -text svneol=native#text/plain -res/cardsfolder/dematerialize.txt -text svneol=native#text/plain -res/cardsfolder/dementia_bat.txt svneol=native#text/plain -res/cardsfolder/demigod_of_revenge.txt -text svneol=native#text/plain -res/cardsfolder/demolish.txt -text svneol=native#text/plain -res/cardsfolder/demon_of_deaths_gate.txt -text svneol=native#text/plain -res/cardsfolder/demonic_appetite.txt svneol=native#text/plain -res/cardsfolder/demonic_consultation.txt -text svneol=native#text/plain -res/cardsfolder/demonic_dread.txt -text svneol=native#text/plain -res/cardsfolder/demonic_hordes.txt -text svneol=native#text/plain -res/cardsfolder/demonic_torment.txt -text svneol=native#text/plain -res/cardsfolder/demonic_tutor.txt -text svneol=native#text/plain -res/cardsfolder/demons_horn.txt -text svneol=native#text/plain -res/cardsfolder/demons_jester.txt -text svneol=native#text/plain -res/cardsfolder/demonspine_whip.txt -text svneol=native#text/plain -res/cardsfolder/demystify.txt -text svneol=native#text/plain -res/cardsfolder/denizen_of_the_deep.txt svneol=native#text/plain -res/cardsfolder/dense_canopy.txt -text svneol=native#text/plain -res/cardsfolder/dense_foliage.txt -text svneol=native#text/plain -res/cardsfolder/deny_reality.txt -text svneol=native#text/plain -res/cardsfolder/denying_wind.txt -text svneol=native#text/plain -res/cardsfolder/deprive.txt svneol=native#text/plain -res/cardsfolder/deranged_hermit.txt -text svneol=native#text/plain -res/cardsfolder/derelor.txt -text svneol=native#text/plain -res/cardsfolder/descendant_of_soramaro.txt -text svneol=native#text/plain -res/cardsfolder/desecrated_earth.txt -text svneol=native#text/plain -res/cardsfolder/desert.txt -text svneol=native#text/plain -res/cardsfolder/desert_drake.txt -text svneol=native#text/plain -res/cardsfolder/desert_nomads.txt -text svneol=native#text/plain -res/cardsfolder/desert_sandstorm.txt -text svneol=native#text/plain -res/cardsfolder/desert_twister.txt -text svneol=native#text/plain -res/cardsfolder/deserted_temple.txt -text svneol=native#text/plain -res/cardsfolder/desolation_angel.txt -text svneol=native#text/plain -res/cardsfolder/desolation_giant.txt -text svneol=native#text/plain -res/cardsfolder/desperate_charge.txt -text svneol=native#text/plain -res/cardsfolder/despise.txt svneol=native#text/plain -res/cardsfolder/despoil.txt -text svneol=native#text/plain -res/cardsfolder/despondency.txt -text svneol=native#text/plain -res/cardsfolder/despotic_scepter.txt -text svneol=native#text/plain -res/cardsfolder/destructive_flow.txt -text svneol=native#text/plain -res/cardsfolder/destructive_force.txt -text svneol=native#text/plain -res/cardsfolder/destructive_urge.txt -text svneol=native#text/plain -res/cardsfolder/detonate.txt svneol=native#text/plain -res/cardsfolder/deus_of_calamity.txt svneol=native#text/plain -res/cardsfolder/devastate.txt svneol=native#text/plain -res/cardsfolder/devastating_summons.txt svneol=native#text/plain -res/cardsfolder/devastation.txt -text svneol=native#text/plain -res/cardsfolder/devoted_druid.txt -text svneol=native#text/plain -res/cardsfolder/devoted_hero.txt -text svneol=native#text/plain -res/cardsfolder/devoted_retainer.txt -text svneol=native#text/plain -res/cardsfolder/devour_in_shadow.txt -text svneol=native#text/plain -res/cardsfolder/devouring_deep.txt -text svneol=native#text/plain -res/cardsfolder/devout_harpist.txt -text svneol=native#text/plain -res/cardsfolder/devout_lightcaster.txt -text svneol=native#text/plain -res/cardsfolder/devout_monk.txt -text svneol=native#text/plain -res/cardsfolder/devout_witness.txt -text svneol=native#text/plain -res/cardsfolder/dewdrop_spy.txt -text svneol=native#text/plain -res/cardsfolder/diabolic_edict.txt -text svneol=native#text/plain -res/cardsfolder/diabolic_intent.txt -text svneol=native#text/plain -res/cardsfolder/diabolic_machine.txt -text svneol=native#text/plain -res/cardsfolder/diabolic_tutor.txt -text svneol=native#text/plain -res/cardsfolder/diabolic_vision.txt svneol=native#text/plain -res/cardsfolder/diamond_faerie.txt -text svneol=native#text/plain -res/cardsfolder/diamond_kaleidoscope.txt svneol=native#text/plain -res/cardsfolder/diamond_valley.txt -text svneol=native#text/plain -res/cardsfolder/didgeridoo.txt svneol=native#text/plain -res/cardsfolder/diligent_farmhand.txt -text svneol=native#text/plain -res/cardsfolder/diminish.txt svneol=native#text/plain -res/cardsfolder/diminishing_returns.txt -text svneol=native#text/plain -res/cardsfolder/dimir_aqueduct.txt -text svneol=native#text/plain -res/cardsfolder/dimir_cutpurse.txt -text svneol=native#text/plain -res/cardsfolder/dimir_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/dimir_house_guard.txt -text svneol=native#text/plain -res/cardsfolder/dimir_infiltrator.txt -text svneol=native#text/plain -res/cardsfolder/dimir_machinations.txt -text svneol=native#text/plain -res/cardsfolder/dimir_signet.txt -text svneol=native#text/plain -res/cardsfolder/din_of_the_fireherd.txt svneol=native#text/plain -res/cardsfolder/dingus_egg.txt -text svneol=native#text/plain -res/cardsfolder/dingus_staff.txt -text svneol=native#text/plain -res/cardsfolder/diplomatic_escort.txt -text svneol=native#text/plain -res/cardsfolder/diplomatic_immunity.txt -text svneol=native#text/plain -res/cardsfolder/dire_undercurrents.txt -text svneol=native#text/plain -res/cardsfolder/dirge_of_dread.txt -text svneol=native#text/plain -res/cardsfolder/dirtcowl_wurm.txt -text svneol=native#text/plain -res/cardsfolder/dirtwater_wraith.txt -text svneol=native#text/plain -res/cardsfolder/dirty_wererat.txt -text svneol=native#text/plain -res/cardsfolder/disappear.txt -text svneol=native#text/plain -res/cardsfolder/disciple_of_grace.txt -text svneol=native#text/plain -res/cardsfolder/disciple_of_kangee.txt -text svneol=native#text/plain -res/cardsfolder/disciple_of_law.txt -text svneol=native#text/plain -res/cardsfolder/disciple_of_malice.txt -text svneol=native#text/plain -res/cardsfolder/disciple_of_tevesh_szat.txt svneol=native#text/plain -res/cardsfolder/disciple_of_the_vault.txt -text svneol=native#text/plain -res/cardsfolder/discombobulate.txt -text svneol=native#text/plain -res/cardsfolder/discordant_dirge.txt -text svneol=native#text/plain -res/cardsfolder/disease_carriers.txt svneol=native#text/plain -res/cardsfolder/disembowel.txt -text svneol=native#text/plain -res/cardsfolder/disempower.txt -text svneol=native#text/plain -res/cardsfolder/disenchant.txt -text svneol=native#text/plain -res/cardsfolder/disentomb.txt -text svneol=native#text/plain -res/cardsfolder/disfigure.txt -text svneol=native#text/plain -res/cardsfolder/disintegrate.txt -text svneol=native#text/plain -res/cardsfolder/dismal_failure.txt -text svneol=native#text/plain -res/cardsfolder/dismember.txt svneol=native#text/plain -res/cardsfolder/dismiss.txt -text svneol=native#text/plain -res/cardsfolder/disorient.txt -text svneol=native#text/plain -res/cardsfolder/dispatch.txt -text svneol=native#text/plain -res/cardsfolder/dispel.txt -text svneol=native#text/plain -res/cardsfolder/dispellers_capsule.txt -text svneol=native#text/plain -res/cardsfolder/dispense_justice.txt -text svneol=native#text/plain -res/cardsfolder/disperse.txt -text svneol=native#text/plain -res/cardsfolder/dispersing_orb.txt -text svneol=native#text/plain -res/cardsfolder/disrupt.txt -text svneol=native#text/plain -res/cardsfolder/disrupting_scepter.txt -text svneol=native#text/plain -res/cardsfolder/disruptive_pitmage.txt -text svneol=native#text/plain -res/cardsfolder/disruptive_student.txt -text svneol=native#text/plain -res/cardsfolder/dissipate.txt -text svneol=native#text/plain -res/cardsfolder/dissipation_field.txt -text svneol=native#text/plain -res/cardsfolder/distress.txt -text svneol=native#text/plain -res/cardsfolder/disturbed_burial.txt -text svneol=native#text/plain -res/cardsfolder/dive_bomber.txt -text svneol=native#text/plain -res/cardsfolder/divebomber_griffin.txt -text svneol=native#text/plain -res/cardsfolder/diversionary_tactics.txt -text svneol=native#text/plain -res/cardsfolder/divination.txt -text svneol=native#text/plain -res/cardsfolder/divine_offering.txt -text svneol=native#text/plain -res/cardsfolder/divine_presence.txt -text svneol=native#text/plain -res/cardsfolder/divine_retribution.txt svneol=native#text/plain -res/cardsfolder/divine_sacrament.txt -text svneol=native#text/plain -res/cardsfolder/divine_transformation.txt -text svneol=native#text/plain -res/cardsfolder/divine_verdict.txt -text svneol=native#text/plain -res/cardsfolder/diving_griffin.txt -text svneol=native#text/plain -res/cardsfolder/divinity_of_pride.txt -text svneol=native#text/plain -res/cardsfolder/dizzy_spell.txt -text svneol=native#text/plain -res/cardsfolder/djinn_of_the_lamp.txt -text svneol=native#text/plain -res/cardsfolder/do_or_die.txt -text svneol=native#text/plain -res/cardsfolder/dodecapod.txt -text svneol=native#text/plain -res/cardsfolder/dogged_hunter.txt -text svneol=native#text/plain -res/cardsfolder/dogpile.txt -text svneol=native#text/plain -res/cardsfolder/dolmen_gate.txt -text svneol=native#text/plain -res/cardsfolder/domestication.txt svneol=native#text/plain -res/cardsfolder/dominate.txt -text svneol=native#text/plain -res/cardsfolder/dominus_of_fealty.txt svneol=native#text/plain -res/cardsfolder/donate.txt -text svneol=native#text/plain -res/cardsfolder/doom_blade.txt -text svneol=native#text/plain -res/cardsfolder/doomed_necromancer.txt -text svneol=native#text/plain -res/cardsfolder/doomsday.txt -text svneol=native#text/plain -res/cardsfolder/doomsday_specter.txt -text svneol=native#text/plain -res/cardsfolder/door_to_nothingness.txt -text svneol=native#text/plain -res/cardsfolder/doran_the_siege_tower.txt -text svneol=native#text/plain -res/cardsfolder/dormant_gomazoa.txt svneol=native#text/plain -res/cardsfolder/dormant_sliver.txt svneol=native#text/plain -res/cardsfolder/dormant_volcano.txt -text svneol=native#text/plain -res/cardsfolder/dosans_oldest_chant.txt -text svneol=native#text/plain -res/cardsfolder/double_cleave.txt -text svneol=native#text/plain -res/cardsfolder/doubling_season.txt -text svneol=native#text/plain -res/cardsfolder/doubtless_one.txt -text svneol=native#text/plain -res/cardsfolder/douse.txt -text svneol=native#text/plain -res/cardsfolder/douse_in_gloom.txt -text svneol=native#text/plain -res/cardsfolder/dovescape.txt -text svneol=native#text/plain -res/cardsfolder/downdraft.txt -text svneol=native#text/plain -res/cardsfolder/downhill_charge.txt -text svneol=native#text/plain -res/cardsfolder/dowsing_shaman.txt -text svneol=native#text/plain -res/cardsfolder/draconian_cylix.txt -text svneol=native#text/plain -res/cardsfolder/drag_down.txt -text svneol=native#text/plain -res/cardsfolder/dragon_appeasement.txt -text svneol=native#text/plain -res/cardsfolder/dragon_arch.txt -text svneol=native#text/plain -res/cardsfolder/dragon_blood.txt -text svneol=native#text/plain -res/cardsfolder/dragon_broodmother.txt -text svneol=native#text/plain -res/cardsfolder/dragon_engine.txt -text svneol=native#text/plain -res/cardsfolder/dragon_fodder.txt -text svneol=native#text/plain -res/cardsfolder/dragon_mage.txt svneol=native#text/plain -res/cardsfolder/dragon_roost.txt -text svneol=native#text/plain -res/cardsfolder/dragon_tyrant.txt -text svneol=native#text/plain -res/cardsfolder/dragon_whelp.txt -text svneol=native#text/plain -res/cardsfolder/dragonmaster_outcast.txt -text svneol=native#text/plain -res/cardsfolder/dragons_claw.txt -text svneol=native#text/plain -res/cardsfolder/dragonskull_summit.txt -text svneol=native#text/plain -res/cardsfolder/dragonsoul_knight.txt -text svneol=native#text/plain -res/cardsfolder/dragonspeaker_shaman.txt -text svneol=native#text/plain -res/cardsfolder/dragonstalker.txt -text svneol=native#text/plain -res/cardsfolder/dragonstorm.txt -text svneol=native#text/plain -res/cardsfolder/drain_the_well.txt -text svneol=native#text/plain -res/cardsfolder/drake_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/drake_skull_cameo.txt -text svneol=native#text/plain -res/cardsfolder/drake_umbra.txt -text svneol=native#text/plain -res/cardsfolder/dralnus_crusade.txt svneol=native#text/plain -res/cardsfolder/dramatic_entrance.txt -text svneol=native#text/plain -res/cardsfolder/drana_kalastria_bloodchief.txt -text svneol=native#text/plain -res/cardsfolder/drastic_revelation.txt -text svneol=native#text/plain -res/cardsfolder/dread.txt -text svneol=native#text/plain -res/cardsfolder/dread_drone.txt -text svneol=native#text/plain -res/cardsfolder/dread_of_night.txt -text svneol=native#text/plain -res/cardsfolder/dread_reaper.txt -text svneol=native#text/plain -res/cardsfolder/dread_return.txt -text svneol=native#text/plain -res/cardsfolder/dread_slag.txt -text svneol=native#text/plain -res/cardsfolder/dread_specter.txt -text svneol=native#text/plain -res/cardsfolder/dread_statuary.txt -text svneol=native#text/plain -res/cardsfolder/dread_warlock.txt -text svneol=native#text/plain -res/cardsfolder/dreadship_reef.txt -text svneol=native#text/plain -res/cardsfolder/dreadwing.txt -text svneol=native#text/plain -res/cardsfolder/dream_cache.txt -text svneol=native#text/plain -res/cardsfolder/dream_fracture.txt -text svneol=native#text/plain -res/cardsfolder/dream_prowler.txt -text svneol=native#text/plain -res/cardsfolder/dream_stalker.txt -text svneol=native#text/plain -res/cardsfolder/dreamborn_muse.txt svneol=native#text/plain -res/cardsfolder/dreamcatcher.txt -text svneol=native#text/plain -res/cardsfolder/dreamscape_artist.txt -text svneol=native#text/plain -res/cardsfolder/dreamspoiler_witches.txt svneol=native#text/plain -res/cardsfolder/dreamstone_hedron.txt -text svneol=native#text/plain -res/cardsfolder/dredge.txt -text svneol=native#text/plain -res/cardsfolder/dreg_reaver.txt -text svneol=native#text/plain -res/cardsfolder/dregs_of_sorrow.txt svneol=native#text/plain -res/cardsfolder/dregscape_zombie.txt -text svneol=native#text/plain -res/cardsfolder/drekavac.txt -text svneol=native#text/plain -res/cardsfolder/drelnoch.txt -text svneol=native#text/plain -res/cardsfolder/drift_of_phantasms.txt -text svneol=native#text/plain -res/cardsfolder/drift_of_the_dead.txt -text svneol=native#text/plain -res/cardsfolder/drifter_il_dal.txt -text svneol=native#text/plain -res/cardsfolder/drifting_djinn.txt -text svneol=native#text/plain -res/cardsfolder/drifting_meadow.txt -text svneol=native#text/plain -res/cardsfolder/drill_skimmer.txt -text svneol=native#text/plain -res/cardsfolder/dripping_dead.txt -text svneol=native#text/plain -res/cardsfolder/dripping_tongue_zubera.txt -text svneol=native#text/plain -res/cardsfolder/dromad_purebred.txt -text svneol=native#text/plain -res/cardsfolder/dromars_attendant.txt -text svneol=native#text/plain -res/cardsfolder/dromars_cavern.txt -text svneol=native#text/plain -res/cardsfolder/dromosaur.txt svneol=native#text/plain -res/cardsfolder/drooling_groodion.txt -text svneol=native#text/plain -res/cardsfolder/drooling_ogre.txt svneol=native#text/plain -res/cardsfolder/drop_of_honey.txt -text svneol=native#text/plain -res/cardsfolder/dross_crocodile.txt -text svneol=native#text/plain -res/cardsfolder/dross_golem.txt -text svneol=native#text/plain -res/cardsfolder/dross_harvester.txt -text svneol=native#text/plain -res/cardsfolder/dross_hopper.txt -text svneol=native#text/plain -res/cardsfolder/dross_prowler.txt -text svneol=native#text/plain -res/cardsfolder/dross_ripper.txt -text svneol=native#text/plain -res/cardsfolder/dross_scorpion.txt -text svneol=native#text/plain -res/cardsfolder/drove_of_elves.txt -text svneol=native#text/plain -res/cardsfolder/drowned.txt -text svneol=native#text/plain -res/cardsfolder/drowned_catacomb.txt -text svneol=native#text/plain -res/cardsfolder/drowned_rusalka.txt svneol=native#text/plain -res/cardsfolder/drowner_initiate.txt svneol=native#text/plain -res/cardsfolder/drowner_of_secrets.txt -text svneol=native#text/plain -res/cardsfolder/drudge_reavers.txt -text svneol=native#text/plain -res/cardsfolder/drudge_skeletons.txt -text svneol=native#text/plain -res/cardsfolder/drudge_spell.txt svneol=native#text/plain -res/cardsfolder/druid_lyrist.txt -text svneol=native#text/plain -res/cardsfolder/druid_of_the_anima.txt -text svneol=native#text/plain -res/cardsfolder/druids_call.txt svneol=native#text/plain -res/cardsfolder/drumhunter.txt -text svneol=native#text/plain -res/cardsfolder/dry_spell.txt -text svneol=native#text/plain -res/cardsfolder/dryad_arbor.txt -text svneol=native#text/plain -res/cardsfolder/dryad_sophisticate.txt -text svneol=native#text/plain -res/cardsfolder/dryads_favor.txt -text svneol=native#text/plain -res/cardsfolder/dueling_grounds.txt -text svneol=native#text/plain -res/cardsfolder/duergar_assailant.txt -text svneol=native#text/plain -res/cardsfolder/duergar_cave_guard.txt -text svneol=native#text/plain -res/cardsfolder/duergar_hedge_mage.txt -text svneol=native#text/plain -res/cardsfolder/duergar_mine_captain.txt -text svneol=native#text/plain -res/cardsfolder/dune_brood_nephilim.txt -text svneol=native#text/plain -res/cardsfolder/dunerider_outlaw.txt -text svneol=native#text/plain -res/cardsfolder/dungeon_shade.txt -text svneol=native#text/plain -res/cardsfolder/duress.txt -text svneol=native#text/plain -res/cardsfolder/durkwood_baloth.txt -text svneol=native#text/plain -res/cardsfolder/durkwood_boars.txt -text svneol=native#text/plain -res/cardsfolder/dusk_imp.txt -text svneol=native#text/plain -res/cardsfolder/duskdale_wurm.txt -text svneol=native#text/plain -res/cardsfolder/duskmantle_house_of_shadow.txt -text svneol=native#text/plain -res/cardsfolder/duskrider_falcon.txt -text svneol=native#text/plain -res/cardsfolder/duskrider_peregrine.txt -text svneol=native#text/plain -res/cardsfolder/dust_bowl.txt -text svneol=native#text/plain -res/cardsfolder/dust_corona.txt -text svneol=native#text/plain -res/cardsfolder/dust_elemental.txt svneol=native#text/plain -res/cardsfolder/dust_to_dust.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_armorer.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_armory.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_berserker.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_blastminer.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_bloodboiler.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_demolition_team.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_grunt.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_hold.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_lieutenant.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_miner.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_nomad.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_patrol.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_pony.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_ruins.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_soldier.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_song.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_strike_force.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_thaumaturgist.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_trader.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_vigilantes.txt svneol=native#text/plain -res/cardsfolder/dwarven_warriors.txt -text svneol=native#text/plain -res/cardsfolder/dwarven_weaponsmith.txt -text svneol=native#text/plain -res/cardsfolder/dying_wail.txt svneol=native#text/plain -res/cardsfolder/eager_cadet.txt -text svneol=native#text/plain -res/cardsfolder/early_frost.txt -text svneol=native#text/plain -res/cardsfolder/earnest_fellowship.txt -text svneol=native#text/plain -res/cardsfolder/earsplitting_rats.txt -text svneol=native#text/plain -res/cardsfolder/earth_elemental.txt -text svneol=native#text/plain -res/cardsfolder/earth_rift.txt -text svneol=native#text/plain -res/cardsfolder/earth_servant.txt -text svneol=native#text/plain -res/cardsfolder/earth_surge.txt -text svneol=native#text/plain -res/cardsfolder/earthbind.txt -text svneol=native#text/plain -res/cardsfolder/earthblighter.txt -text svneol=native#text/plain -res/cardsfolder/earthbrawn.txt svneol=native#text/plain -res/cardsfolder/earthcraft.txt -text svneol=native#text/plain -res/cardsfolder/earthen_goo.txt -text svneol=native#text/plain -res/cardsfolder/earthlink.txt -text svneol=native#text/plain -res/cardsfolder/earthquake.txt -text svneol=native#text/plain -res/cardsfolder/earthshaker.txt -text svneol=native#text/plain -res/cardsfolder/eastern_paladin.txt -text svneol=native#text/plain -res/cardsfolder/eater_of_days.txt -text svneol=native#text/plain -res/cardsfolder/ebon_dragon.txt -text svneol=native#text/plain -res/cardsfolder/ebon_drake.txt -text svneol=native#text/plain -res/cardsfolder/ebon_praetor.txt svneol=native#text/plain -res/cardsfolder/ebon_stronghold.txt -text svneol=native#text/plain -res/cardsfolder/ebony_horse.txt -text svneol=native#text/plain -res/cardsfolder/ebony_owl_netsuke.txt -text svneol=native#text/plain -res/cardsfolder/ebony_rhino.txt -text svneol=native#text/plain -res/cardsfolder/ebony_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/echo_mage.txt -text svneol=native#text/plain -res/cardsfolder/echo_tracer.txt -text svneol=native#text/plain -res/cardsfolder/echoing_courage.txt -text svneol=native#text/plain -res/cardsfolder/echoing_decay.txt -text svneol=native#text/plain -res/cardsfolder/echoing_truth.txt -text svneol=native#text/plain -res/cardsfolder/edge_of_autumn.txt svneol=native#text/plain -res/cardsfolder/edge_of_the_divinity.txt -text svneol=native#text/plain -res/cardsfolder/edgewalker.txt -text svneol=native#text/plain -res/cardsfolder/eel_umbra.txt -text svneol=native#text/plain -res/cardsfolder/eerie_procession.txt -text svneol=native#text/plain -res/cardsfolder/eiganjo_castle.txt -text svneol=native#text/plain -res/cardsfolder/eiganjo_free_riders.txt -text svneol=native#text/plain -res/cardsfolder/eightfold_maze.txt -text svneol=native#text/plain -res/cardsfolder/ekundu_griffin.txt -text svneol=native#text/plain -res/cardsfolder/el_hajjaj.txt -text svneol=native#text/plain -res/cardsfolder/eladamri_lord_of_leaves.txt -text svneol=native#text/plain -res/cardsfolder/eladamris_call.txt -text svneol=native#text/plain -res/cardsfolder/eladamris_vineyard.txt svneol=native#text/plain -res/cardsfolder/eland_umbra.txt -text svneol=native#text/plain -res/cardsfolder/elder_druid.txt -text svneol=native#text/plain -res/cardsfolder/elder_mastery.txt svneol=native#text/plain -res/cardsfolder/eldrazi_conscription.txt -text svneol=native#text/plain -res/cardsfolder/eldrazi_monument.txt -text svneol=native#text/plain -res/cardsfolder/electric_eel.txt svneol=native#text/plain -res/cardsfolder/electrolyze.txt -text svneol=native#text/plain -res/cardsfolder/electropotence.txt -text svneol=native#text/plain -res/cardsfolder/elemental_augury.txt -text svneol=native#text/plain -res/cardsfolder/elemental_mastery.txt svneol=native#text/plain -res/cardsfolder/elephant_ambush.txt -text svneol=native#text/plain -res/cardsfolder/elephant_graveyard.txt -text svneol=native#text/plain -res/cardsfolder/elephant_guide.txt svneol=native#text/plain -res/cardsfolder/elesh_norn_grand_cenobite.txt -text svneol=native#text/plain -res/cardsfolder/elf_replica.txt -text svneol=native#text/plain -res/cardsfolder/elfhame_palace.txt -text svneol=native#text/plain -res/cardsfolder/elite_archers.txt -text svneol=native#text/plain -res/cardsfolder/elite_cat_warrior.txt -text svneol=native#text/plain -res/cardsfolder/elite_javelineer.txt -text svneol=native#text/plain -res/cardsfolder/elite_vanguard.txt -text svneol=native#text/plain -res/cardsfolder/elixir_of_immortality.txt -text svneol=native#text/plain -res/cardsfolder/elixir_of_vitality.txt -text svneol=native#text/plain -res/cardsfolder/elspeth_knight_errant.txt -text svneol=native#text/plain -res/cardsfolder/elspeth_tirel.txt -text svneol=native#text/plain -res/cardsfolder/elven_cache.txt -text svneol=native#text/plain -res/cardsfolder/elven_fortress.txt -text svneol=native#text/plain -res/cardsfolder/elven_lyre.txt -text svneol=native#text/plain -res/cardsfolder/elven_palisade.txt -text svneol=native#text/plain -res/cardsfolder/elven_riders.txt -text svneol=native#text/plain -res/cardsfolder/elven_rite.txt svneol=native#text/plain -res/cardsfolder/elven_warhounds.txt -text svneol=native#text/plain -res/cardsfolder/elves_of_deep_shadow.txt -text svneol=native#text/plain -res/cardsfolder/elvish_aberration.txt -text svneol=native#text/plain -res/cardsfolder/elvish_archdruid.txt -text svneol=native#text/plain -res/cardsfolder/elvish_archers.txt -text svneol=native#text/plain -res/cardsfolder/elvish_bard.txt -text svneol=native#text/plain -res/cardsfolder/elvish_berserker.txt -text svneol=native#text/plain -res/cardsfolder/elvish_branchbender.txt -text svneol=native#text/plain -res/cardsfolder/elvish_champion.txt -text svneol=native#text/plain -res/cardsfolder/elvish_eulogist.txt -text svneol=native#text/plain -res/cardsfolder/elvish_farmer.txt -text svneol=native#text/plain -res/cardsfolder/elvish_fury.txt -text svneol=native#text/plain -res/cardsfolder/elvish_guidance.txt -text svneol=native#text/plain -res/cardsfolder/elvish_handservant.txt -text svneol=native#text/plain -res/cardsfolder/elvish_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/elvish_herder.txt -text svneol=native#text/plain -res/cardsfolder/elvish_hexhunter.txt -text svneol=native#text/plain -res/cardsfolder/elvish_hunter.txt -text svneol=native#text/plain -res/cardsfolder/elvish_lookout.txt -text svneol=native#text/plain -res/cardsfolder/elvish_lyrist.txt -text svneol=native#text/plain -res/cardsfolder/elvish_pathcutter.txt -text svneol=native#text/plain -res/cardsfolder/elvish_pioneer.txt -text svneol=native#text/plain -res/cardsfolder/elvish_piper.txt -text svneol=native#text/plain -res/cardsfolder/elvish_promenade.txt svneol=native#text/plain -res/cardsfolder/elvish_ranger.txt -text svneol=native#text/plain -res/cardsfolder/elvish_scout.txt svneol=native#text/plain -res/cardsfolder/elvish_scrapper.txt -text svneol=native#text/plain -res/cardsfolder/elvish_skysweeper.txt -text svneol=native#text/plain -res/cardsfolder/elvish_spirit_guide.txt -text svneol=native#text/plain -res/cardsfolder/elvish_vanguard.txt -text svneol=native#text/plain -res/cardsfolder/elvish_visionary.txt -text svneol=native#text/plain -res/cardsfolder/elvish_warrior.txt -text svneol=native#text/plain -res/cardsfolder/embargo.txt -text svneol=native#text/plain -res/cardsfolder/ember_fist_zubera.txt -text svneol=native#text/plain -res/cardsfolder/ember_hauler.txt -text svneol=native#text/plain -res/cardsfolder/ember_shot.txt -text svneol=native#text/plain -res/cardsfolder/ember_weaver.txt -text svneol=native#text/plain -res/cardsfolder/embermage_goblin.txt -text svneol=native#text/plain -res/cardsfolder/embersmith.txt -text svneol=native#text/plain -res/cardsfolder/emberstrike_duo.txt -text svneol=native#text/plain -res/cardsfolder/emberwilde_augur.txt -text svneol=native#text/plain -res/cardsfolder/emberwilde_caliph.txt svneol=native#text/plain -res/cardsfolder/emerald_dragonfly.txt -text svneol=native#text/plain -res/cardsfolder/emerald_medallion.txt -text svneol=native#text/plain -res/cardsfolder/emerald_oryx.txt -text svneol=native#text/plain -res/cardsfolder/emeria_angel.txt -text svneol=native#text/plain -res/cardsfolder/emeria_the_sky_ruin.txt -text svneol=native#text/plain -res/cardsfolder/emissary_of_despair.txt svneol=native#text/plain -res/cardsfolder/emissary_of_hope.txt svneol=native#text/plain -res/cardsfolder/emmessi_tome.txt -text svneol=native#text/plain -res/cardsfolder/emperor_crocodile.txt -text svneol=native#text/plain -res/cardsfolder/empress_galina.txt -text svneol=native#text/plain -res/cardsfolder/empty_shrine_kannushi.txt -text svneol=native#text/plain -res/cardsfolder/empty_the_catacombs.txt -text svneol=native#text/plain -res/cardsfolder/empty_the_warrens.txt -text svneol=native#text/plain -res/cardsfolder/empyrial_armor.txt -text svneol=native#text/plain -res/cardsfolder/empyrial_plate.txt -text svneol=native#text/plain -res/cardsfolder/emrakul_the_aeons_torn.txt -text svneol=native#text/plain -res/cardsfolder/emrakuls_hatcher.txt -text svneol=native#text/plain -res/cardsfolder/enatu_golem.txt -text svneol=native#text/plain -res/cardsfolder/enchanted_being.txt -text svneol=native#text/plain -res/cardsfolder/enchanted_evening.txt svneol=native#text/plain -res/cardsfolder/enchantresss_presence.txt -text svneol=native#text/plain -res/cardsfolder/enclave_cryptologist.txt -text svneol=native#text/plain -res/cardsfolder/enclave_elite.txt -text svneol=native#text/plain -res/cardsfolder/encroach.txt -text svneol=native#text/plain -res/cardsfolder/endbringers_revel.txt svneol=native#text/plain -res/cardsfolder/endless_cockroaches.txt -text svneol=native#text/plain -res/cardsfolder/enemy_of_the_guildpact.txt -text svneol=native#text/plain -res/cardsfolder/energizer.txt -text svneol=native#text/plain -res/cardsfolder/energy_arc.txt svneol=native#text/plain -res/cardsfolder/energy_bolt.txt svneol=native#text/plain -res/cardsfolder/energy_field.txt -text svneol=native#text/plain -res/cardsfolder/energy_flux.txt -text svneol=native#text/plain -res/cardsfolder/energy_storm.txt -text svneol=native#text/plain -res/cardsfolder/energy_tap.txt -text svneol=native#text/plain -res/cardsfolder/enervate.txt -text svneol=native#text/plain -res/cardsfolder/enfeeblement.txt -text svneol=native#text/plain -res/cardsfolder/engineered_plague.txt -text svneol=native#text/plain -res/cardsfolder/engulfing_flames.txt -text svneol=native#text/plain -res/cardsfolder/enigma_eidolon.txt svneol=native#text/plain -res/cardsfolder/enigma_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/enlightened_tutor.txt -text svneol=native#text/plain -res/cardsfolder/enlisted_wurm.txt -text svneol=native#text/plain -res/cardsfolder/enlistment_officer.txt -text svneol=native#text/plain -res/cardsfolder/enormous_baloth.txt -text svneol=native#text/plain -res/cardsfolder/enrage.txt -text svneol=native#text/plain -res/cardsfolder/enshrined_memories.txt svneol=native#text/plain -res/cardsfolder/enslave.txt svneol=native#text/plain -res/cardsfolder/enslaved_dwarf.txt -text svneol=native#text/plain -res/cardsfolder/enslaved_scout.txt -text svneol=native#text/plain -res/cardsfolder/ensnare.txt -text svneol=native#text/plain -res/cardsfolder/ensnaring_bridge.txt -text svneol=native#text/plain -res/cardsfolder/entangling_trap.txt -text svneol=native#text/plain -res/cardsfolder/entangling_vines.txt -text svneol=native#text/plain -res/cardsfolder/entomb.txt -text svneol=native#text/plain -res/cardsfolder/entropic_eidolon.txt svneol=native#text/plain -res/cardsfolder/entropic_specter.txt -text svneol=native#text/plain -res/cardsfolder/envelop.txt -text svneol=native#text/plain -res/cardsfolder/eon_hub.txt -text svneol=native#text/plain -res/cardsfolder/ephemeron.txt -text svneol=native#text/plain -res/cardsfolder/epic_proportions.txt -text svneol=native#text/plain -res/cardsfolder/epic_struggle.txt -text svneol=native#text/plain -res/cardsfolder/equilibrium.txt -text svneol=native#text/plain -res/cardsfolder/erase.txt -text svneol=native#text/plain -res/cardsfolder/erg_raiders.txt -text svneol=native#text/plain -res/cardsfolder/eron_the_relentless.txt -text svneol=native#text/plain -res/cardsfolder/errant_doomsayers.txt -text svneol=native#text/plain -res/cardsfolder/errant_ephemeron.txt -text svneol=native#text/plain -res/cardsfolder/erratic_explosion.txt -text svneol=native#text/plain -res/cardsfolder/erratic_portal.txt svneol=native#text/plain -res/cardsfolder/ertai_the_corrupted.txt -text svneol=native#text/plain -res/cardsfolder/ertai_wizard_adept.txt -text svneol=native#text/plain -res/cardsfolder/ertais_trickery.txt -text svneol=native#text/plain -res/cardsfolder/escape_artist.txt -text svneol=native#text/plain -res/cardsfolder/escape_routes.txt -text svneol=native#text/plain -res/cardsfolder/escaped_null.txt svneol=native#text/plain -res/cardsfolder/esper_battlemage.txt svneol=native#text/plain -res/cardsfolder/esper_charm.txt -text svneol=native#text/plain -res/cardsfolder/esper_cormorants.txt -text svneol=native#text/plain -res/cardsfolder/esper_panorama.txt -text svneol=native#text/plain -res/cardsfolder/esper_sojourners.txt -text svneol=native#text/plain -res/cardsfolder/esper_stormblade.txt -text svneol=native#text/plain -res/cardsfolder/esperzoa.txt svneol=native#text/plain -res/cardsfolder/essence_drain.txt -text svneol=native#text/plain -res/cardsfolder/essence_feed.txt -text svneol=native#text/plain -res/cardsfolder/essence_flare.txt svneol=native#text/plain -res/cardsfolder/essence_fracture.txt -text svneol=native#text/plain -res/cardsfolder/essence_scatter.txt -text svneol=native#text/plain -res/cardsfolder/essence_sliver.txt -text svneol=native#text/plain -res/cardsfolder/essence_warden.txt -text svneol=native#text/plain -res/cardsfolder/etched_champion.txt -text svneol=native#text/plain -res/cardsfolder/etched_monstrosity.txt svneol=native#text/plain -res/cardsfolder/etched_oracle.txt -text svneol=native#text/plain -res/cardsfolder/eternal_dragon.txt -text svneol=native#text/plain -res/cardsfolder/eternal_flame.txt -text svneol=native#text/plain -res/cardsfolder/eternal_warrior.txt -text svneol=native#text/plain -res/cardsfolder/eternal_witness.txt -text svneol=native#text/plain -res/cardsfolder/eternity_snare.txt -text svneol=native#text/plain -res/cardsfolder/eternity_vessel.txt -text svneol=native#text/plain -res/cardsfolder/ethercaste_knight.txt -text svneol=native#text/plain -res/cardsfolder/ethereal_champion.txt -text svneol=native#text/plain -res/cardsfolder/ethereal_usher.txt -text svneol=native#text/plain -res/cardsfolder/ethereal_whiskergill.txt -text svneol=native#text/plain -res/cardsfolder/etherium_abomination.txt -text svneol=native#text/plain -res/cardsfolder/etherium_astrolabe.txt -text svneol=native#text/plain -res/cardsfolder/etherium_sculptor.txt -text svneol=native#text/plain -res/cardsfolder/ethersworn_adjudicator.txt -text svneol=native#text/plain -res/cardsfolder/evacuation.txt -text svneol=native#text/plain -res/cardsfolder/evaporate.txt -text svneol=native#text/plain -res/cardsfolder/evasive_action.txt -text svneol=native#text/plain -res/cardsfolder/even_the_odds.txt svneol=native#text/plain -res/cardsfolder/everbark_shaman.txt svneol=native#text/plain -res/cardsfolder/everflowing_chalice.txt -text svneol=native#text/plain -res/cardsfolder/everglades.txt -text svneol=native#text/plain -res/cardsfolder/evil_eye_of_orms_by_gore.txt -text svneol=native#text/plain -res/cardsfolder/evil_eye_of_urborg.txt -text svneol=native#text/plain -res/cardsfolder/evil_presence.txt -text svneol=native#text/plain -res/cardsfolder/evincars_justice.txt -text svneol=native#text/plain -res/cardsfolder/eviscerator.txt -text svneol=native#text/plain -res/cardsfolder/evolution_charm.txt -text svneol=native#text/plain -res/cardsfolder/evolving_wilds.txt -text svneol=native#text/plain -res/cardsfolder/exalted_angel.txt -text svneol=native#text/plain -res/cardsfolder/excavation.txt svneol=native#text/plain -res/cardsfolder/excise.txt svneol=native#text/plain -res/cardsfolder/exclude.txt -text svneol=native#text/plain -res/cardsfolder/excommunicate.txt -text svneol=native#text/plain -res/cardsfolder/execute.txt -text svneol=native#text/plain -res/cardsfolder/executioners_capsule.txt -text svneol=native#text/plain -res/cardsfolder/exhaustion.txt -text svneol=native#text/plain -res/cardsfolder/exhume.txt -text svneol=native#text/plain -res/cardsfolder/exile.txt -text svneol=native#text/plain -res/cardsfolder/exile_into_darkness.txt svneol=native#text/plain -res/cardsfolder/exiled_boggart.txt -text svneol=native#text/plain -res/cardsfolder/exorcist.txt -text svneol=native#text/plain -res/cardsfolder/exoskeletal_armor.txt svneol=native#text/plain -res/cardsfolder/exotic_curse.txt -text svneol=native#text/plain -res/cardsfolder/exotic_disease.txt -text svneol=native#text/plain -res/cardsfolder/exotic_orchard.txt -text svneol=native#text/plain -res/cardsfolder/expedition_map.txt -text svneol=native#text/plain -res/cardsfolder/expendable_troops.txt -text svneol=native#text/plain -res/cardsfolder/exploding_borders.txt -text svneol=native#text/plain -res/cardsfolder/exploration.txt -text svneol=native#text/plain -res/cardsfolder/explore.txt -text svneol=native#text/plain -res/cardsfolder/explosive_growth.txt svneol=native#text/plain -res/cardsfolder/explosive_revelation.txt -text svneol=native#text/plain -res/cardsfolder/explosive_vegetation.txt -text svneol=native#text/plain -res/cardsfolder/expunge.txt -text svneol=native#text/plain -res/cardsfolder/exsanguinate.txt svneol=native#text/plain -res/cardsfolder/extinguish.txt -text svneol=native#text/plain -res/cardsfolder/extortion.txt -text svneol=native#text/plain -res/cardsfolder/extra_arms.txt svneol=native#text/plain -res/cardsfolder/extract.txt -text svneol=native#text/plain -res/cardsfolder/extractor_demon.txt -text svneol=native#text/plain -res/cardsfolder/extruder.txt -text svneol=native#text/plain -res/cardsfolder/exuberant_firestoker.txt -text svneol=native#text/plain -res/cardsfolder/eye_of_nowhere.txt -text svneol=native#text/plain -res/cardsfolder/eye_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/eye_of_ugin.txt -text svneol=native#text/plain -res/cardsfolder/eye_spy.txt svneol=native#text/plain -res/cardsfolder/eyeblights_ending.txt -text svneol=native#text/plain -res/cardsfolder/eyes_of_the_wisent.txt svneol=native#text/plain -res/cardsfolder/ezuri_renegade_leader.txt -text svneol=native#text/plain -res/cardsfolder/ezuris_archers.txt -text svneol=native#text/plain -res/cardsfolder/ezuris_brigade.txt -text svneol=native#text/plain -res/cardsfolder/fable_of_wolf_and_owl.txt -text svneol=native#text/plain -res/cardsfolder/fabricate.txt -text svneol=native#text/plain -res/cardsfolder/face_of_fear.txt -text svneol=native#text/plain -res/cardsfolder/faceless_butcher.txt -text svneol=native#text/plain -res/cardsfolder/faceless_devourer.txt -text svneol=native#text/plain -res/cardsfolder/facevaulter.txt -text svneol=native#text/plain -res/cardsfolder/fact_or_fiction.txt -text svneol=native#text/plain -res/cardsfolder/fade_from_memory.txt -text svneol=native#text/plain -res/cardsfolder/faerie_conclave.txt -text svneol=native#text/plain -res/cardsfolder/faerie_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/faerie_macabre.txt svneol=native#text/plain -res/cardsfolder/faerie_mechanist.txt -text svneol=native#text/plain -res/cardsfolder/faerie_noble.txt -text svneol=native#text/plain -res/cardsfolder/faerie_swarm.txt -text svneol=native#text/plain -res/cardsfolder/faerie_tauntings.txt svneol=native#text/plain -res/cardsfolder/faerie_trickery.txt -text svneol=native#text/plain -res/cardsfolder/faith_healer.txt -text svneol=native#text/plain -res/cardsfolder/fallen_angel.txt -text svneol=native#text/plain -res/cardsfolder/fallen_askari.txt -text svneol=native#text/plain -res/cardsfolder/fallen_cleric.txt -text svneol=native#text/plain -res/cardsfolder/fallen_ferromancer.txt svneol=native#text/plain -res/cardsfolder/fallen_ideal.txt -text svneol=native#text/plain -res/cardsfolder/fallow_earth.txt -text svneol=native#text/plain -res/cardsfolder/fallowsage.txt -text svneol=native#text/plain -res/cardsfolder/false_cure.txt svneol=native#text/plain -res/cardsfolder/false_defeat.txt -text svneol=native#text/plain -res/cardsfolder/false_demise.txt svneol=native#text/plain -res/cardsfolder/false_mourning.txt -text svneol=native#text/plain -res/cardsfolder/false_prophet.txt -text svneol=native#text/plain -res/cardsfolder/false_summoning.txt -text svneol=native#text/plain -res/cardsfolder/falter.txt -text svneol=native#text/plain -res/cardsfolder/familiar_ground.txt -text svneol=native#text/plain -res/cardsfolder/familiars_ruse.txt -text svneol=native#text/plain -res/cardsfolder/famine.txt -text svneol=native#text/plain -res/cardsfolder/fanatical_devotion.txt -text svneol=native#text/plain -res/cardsfolder/fanatical_fever.txt -text svneol=native#text/plain -res/cardsfolder/fang_skulkin.txt -text svneol=native#text/plain -res/cardsfolder/fangren_firstborn.txt -text svneol=native#text/plain -res/cardsfolder/fangren_hunter.txt -text svneol=native#text/plain -res/cardsfolder/fangren_marauder.txt -text svneol=native#text/plain -res/cardsfolder/fangren_pathcutter.txt svneol=native#text/plain -res/cardsfolder/fanning_the_flames.txt svneol=native#text/plain -res/cardsfolder/far_wanderings.txt svneol=native#text/plain -res/cardsfolder/farhaven_elf.txt -text svneol=native#text/plain -res/cardsfolder/farmstead.txt -text svneol=native#text/plain -res/cardsfolder/farrelite_priest.txt -text svneol=native#text/plain -res/cardsfolder/farseek.txt -text svneol=native#text/plain -res/cardsfolder/farsight_mask.txt -text svneol=native#text/plain -res/cardsfolder/fastbond.txt -text svneol=native#text/plain -res/cardsfolder/fatal_attraction.txt svneol=native#text/plain -res/cardsfolder/fatal_blow.txt -text svneol=native#text/plain -res/cardsfolder/fatal_frenzy.txt -text svneol=native#text/plain -res/cardsfolder/fatal_mutation.txt -text svneol=native#text/plain -res/cardsfolder/fatestitcher.txt svneol=native#text/plain -res/cardsfolder/fathom_seer.txt svneol=native#text/plain -res/cardsfolder/fault_line.txt -text svneol=native#text/plain -res/cardsfolder/fault_riders.txt svneol=native#text/plain -res/cardsfolder/faultgrinder.txt -text svneol=native#text/plain -res/cardsfolder/fauna_shaman.txt -text svneol=native#text/plain -res/cardsfolder/favor_of_the_mighty.txt svneol=native#text/plain -res/cardsfolder/favor_of_the_overbeing.txt -text svneol=native#text/plain -res/cardsfolder/favorable_destiny.txt svneol=native#text/plain -res/cardsfolder/fear.txt -text svneol=native#text/plain -res/cardsfolder/feast_of_blood.txt -text svneol=native#text/plain -res/cardsfolder/feast_of_flesh.txt -text svneol=native#text/plain -res/cardsfolder/feast_of_the_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/feast_of_worms.txt svneol=native#text/plain -res/cardsfolder/feast_or_famine.txt -text svneol=native#text/plain -res/cardsfolder/fecundity.txt -text svneol=native#text/plain -res/cardsfolder/feebleness.txt -text svneol=native#text/plain -res/cardsfolder/feedback.txt -text svneol=native#text/plain -res/cardsfolder/feedback_bolt.txt -text svneol=native#text/plain -res/cardsfolder/feeding_frenzy.txt -text svneol=native#text/plain -res/cardsfolder/feldons_cane.txt -text svneol=native#text/plain -res/cardsfolder/felidar_sovereign.txt -text svneol=native#text/plain -res/cardsfolder/fellwar_stone.txt -text svneol=native#text/plain -res/cardsfolder/femeref_archers.txt -text svneol=native#text/plain -res/cardsfolder/femeref_enchantress.txt -text svneol=native#text/plain -res/cardsfolder/femeref_healer.txt -text svneol=native#text/plain -res/cardsfolder/femeref_knight.txt -text svneol=native#text/plain -res/cardsfolder/femeref_scouts.txt -text svneol=native#text/plain -res/cardsfolder/fen_stalker.txt -text svneol=native#text/plain -res/cardsfolder/fencer_clique.txt -text svneol=native#text/plain -res/cardsfolder/fencers_magemark.txt -text svneol=native#text/plain -res/cardsfolder/fend_off.txt -text svneol=native#text/plain -res/cardsfolder/fendeep_summoner.txt svneol=native#text/plain -res/cardsfolder/feral_animist.txt -text svneol=native#text/plain -res/cardsfolder/feral_hydra.txt -text svneol=native#text/plain -res/cardsfolder/feral_instinct.txt -text svneol=native#text/plain -res/cardsfolder/feral_lightning.txt -text svneol=native#text/plain -res/cardsfolder/feral_shadow.txt -text svneol=native#text/plain -res/cardsfolder/feral_thallid.txt -text svneol=native#text/plain -res/cardsfolder/ferocious_charge.txt -text svneol=native#text/plain -res/cardsfolder/ferocity.txt -text svneol=native#text/plain -res/cardsfolder/ferozs_ban.txt -text svneol=native#text/plain -res/cardsfolder/ferrovore.txt -text svneol=native#text/plain -res/cardsfolder/fertilid.txt -text svneol=native#text/plain -res/cardsfolder/fervent_charge.txt -text svneol=native#text/plain -res/cardsfolder/fervent_denial.txt -text svneol=native#text/plain -res/cardsfolder/fervor.txt -text svneol=native#text/plain -res/cardsfolder/festercreep.txt -text svneol=native#text/plain -res/cardsfolder/festering_evil.txt -text svneol=native#text/plain -res/cardsfolder/festering_goblin.txt svneol=native#text/plain -res/cardsfolder/festering_march.txt svneol=native#text/plain -res/cardsfolder/festering_wound.txt -text svneol=native#text/plain -res/cardsfolder/festival.txt svneol=native#text/plain -res/cardsfolder/festival_of_trokin.txt -text svneol=native#text/plain -res/cardsfolder/fetid_heath.txt -text svneol=native#text/plain -res/cardsfolder/fetid_horror.txt -text svneol=native#text/plain -res/cardsfolder/feudkillers_verdict.txt -text svneol=native#text/plain -res/cardsfolder/fever_charm.txt -text svneol=native#text/plain -res/cardsfolder/fevered_convulsions.txt -text svneol=native#text/plain -res/cardsfolder/fevered_strength.txt -text svneol=native#text/plain -res/cardsfolder/fiddlehead_kami.txt -text svneol=native#text/plain -res/cardsfolder/field_marshal.txt -text svneol=native#text/plain -res/cardsfolder/field_of_souls.txt -text svneol=native#text/plain -res/cardsfolder/fieldmist_borderpost.txt -text svneol=native#text/plain -res/cardsfolder/fierce_empath.txt -text svneol=native#text/plain -res/cardsfolder/fiery_conclusion.txt -text svneol=native#text/plain -res/cardsfolder/fiery_fall.txt -text svneol=native#text/plain -res/cardsfolder/fiery_hellhound.txt -text svneol=native#text/plain -res/cardsfolder/fiery_mantle.txt -text svneol=native#text/plain -res/cardsfolder/fiery_temper.txt -text svneol=native#text/plain -res/cardsfolder/fight_to_the_death.txt -text svneol=native#text/plain -res/cardsfolder/fighting_drake.txt -text svneol=native#text/plain -res/cardsfolder/figure_of_destiny.txt -text svneol=native#text/plain -res/cardsfolder/filigree_angel.txt -text svneol=native#text/plain -res/cardsfolder/filigree_fracture.txt svneol=native#text/plain -res/cardsfolder/filigree_sages.txt -text svneol=native#text/plain -res/cardsfolder/fill_with_fright.txt -text svneol=native#text/plain -res/cardsfolder/filth.txt -text svneol=native#text/plain -res/cardsfolder/filthy_cur.txt -text svneol=native#text/plain -res/cardsfolder/final_judgment.txt -text svneol=native#text/plain -res/cardsfolder/final_revels.txt svneol=native#text/plain -res/cardsfolder/final_sting_faerie.txt -text svneol=native#text/plain -res/cardsfolder/final_strike.txt -text svneol=native#text/plain -res/cardsfolder/finest_hour.txt -text svneol=native#text/plain -res/cardsfolder/fire_ambush.txt -text svneol=native#text/plain -res/cardsfolder/fire_ants.txt -text svneol=native#text/plain -res/cardsfolder/fire_at_will.txt svneol=native#text/plain -res/cardsfolder/fire_belly_changeling.txt -text svneol=native#text/plain -res/cardsfolder/fire_bowman.txt -text svneol=native#text/plain -res/cardsfolder/fire_diamond.txt -text svneol=native#text/plain -res/cardsfolder/fire_dragon.txt -text svneol=native#text/plain -res/cardsfolder/fire_drake.txt -text svneol=native#text/plain -res/cardsfolder/fire_elemental.txt -text svneol=native#text/plain -res/cardsfolder/fire_field_ogre.txt -text svneol=native#text/plain -res/cardsfolder/fire_imp.txt -text svneol=native#text/plain -res/cardsfolder/fire_lit_thicket.txt -text svneol=native#text/plain -res/cardsfolder/fire_servant.txt svneol=native#text/plain -res/cardsfolder/fire_snake.txt svneol=native#text/plain -res/cardsfolder/fire_sprites.txt -text svneol=native#text/plain -res/cardsfolder/fire_tempest.txt -text svneol=native#text/plain -res/cardsfolder/fireball.txt -text svneol=native#text/plain -res/cardsfolder/fireblast.txt -text svneol=native#text/plain -res/cardsfolder/firebolt.txt -text svneol=native#text/plain -res/cardsfolder/firebreathing.txt -text svneol=native#text/plain -res/cardsfolder/firecat_blitz.txt svneol=native#text/plain -res/cardsfolder/firefly.txt -text svneol=native#text/plain -res/cardsfolder/firemane_angel.txt -text svneol=native#text/plain -res/cardsfolder/firemaw_kavu.txt -text svneol=native#text/plain -res/cardsfolder/fires_of_yavimaya.txt -text svneol=native#text/plain -res/cardsfolder/firescreamer.txt -text svneol=native#text/plain -res/cardsfolder/fireshrieker.txt -text svneol=native#text/plain -res/cardsfolder/fireslinger.txt -text svneol=native#text/plain -res/cardsfolder/firestorm.txt -text svneol=native#text/plain -res/cardsfolder/firestorm_hellkite.txt -text svneol=native#text/plain -res/cardsfolder/firewake_sliver.txt svneol=native#text/plain -res/cardsfolder/firewild_borderpost.txt -text svneol=native#text/plain -res/cardsfolder/first_volley.txt -text svneol=native#text/plain -res/cardsfolder/fishliver_oil.txt -text svneol=native#text/plain -res/cardsfolder/fissure.txt -text svneol=native#text/plain -res/cardsfolder/fissure_vent.txt svneol=native#text/plain -res/cardsfolder/fistful_of_force.txt svneol=native#text/plain -res/cardsfolder/fists_of_ironwood.txt -text svneol=native#text/plain -res/cardsfolder/fists_of_the_anvil.txt -text svneol=native#text/plain -res/cardsfolder/fists_of_the_demigod.txt -text svneol=native#text/plain -res/cardsfolder/fit_of_rage.txt -text svneol=native#text/plain -res/cardsfolder/flagstones_of_trokair.txt -text svneol=native#text/plain -res/cardsfolder/flailing_manticore.txt -text svneol=native#text/plain -res/cardsfolder/flailing_ogre.txt -text svneol=native#text/plain -res/cardsfolder/flailing_soldier.txt -text svneol=native#text/plain -res/cardsfolder/flame_burst.txt -text svneol=native#text/plain -res/cardsfolder/flame_elemental.txt -text svneol=native#text/plain -res/cardsfolder/flame_jab.txt -text svneol=native#text/plain -res/cardsfolder/flame_javelin.txt -text svneol=native#text/plain -res/cardsfolder/flame_jet.txt -text svneol=native#text/plain -res/cardsfolder/flame_kin_zealot.txt -text svneol=native#text/plain -res/cardsfolder/flame_rift.txt -text svneol=native#text/plain -res/cardsfolder/flame_slash.txt -text svneol=native#text/plain -res/cardsfolder/flame_spirit.txt -text svneol=native#text/plain -res/cardsfolder/flameblast_dragon.txt -text svneol=native#text/plain -res/cardsfolder/flameborn_hellion.txt -text svneol=native#text/plain -res/cardsfolder/flameborn_viron.txt svneol=native#text/plain -res/cardsfolder/flamebreak.txt -text svneol=native#text/plain -res/cardsfolder/flamecore_elemental.txt -text svneol=native#text/plain -res/cardsfolder/flamekin_brawler.txt -text svneol=native#text/plain -res/cardsfolder/flamekin_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/flamekin_spitfire.txt -text svneol=native#text/plain -res/cardsfolder/flameshot.txt svneol=native#text/plain -res/cardsfolder/flametongue_kavu.txt -text svneol=native#text/plain -res/cardsfolder/flamewave_invoker.txt -text svneol=native#text/plain -res/cardsfolder/flaming_sword.txt -text svneol=native#text/plain -res/cardsfolder/flanking_troops.txt -text svneol=native#text/plain -res/cardsfolder/flare.txt -text svneol=native#text/plain -res/cardsfolder/flaring_flame_kin.txt -text svneol=native#text/plain -res/cardsfolder/flash_counter.txt -text svneol=native#text/plain -res/cardsfolder/flash_flood.txt -text svneol=native#text/plain -res/cardsfolder/flash_of_defiance.txt -text svneol=native#text/plain -res/cardsfolder/flashfires.txt -text svneol=native#text/plain -res/cardsfolder/flashfreeze.txt -text svneol=native#text/plain -res/cardsfolder/flayed_nim.txt svneol=native#text/plain -res/cardsfolder/flayer_husk.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_djinn.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_dragon.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_griffin.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_imp.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_mawcor.txt -text svneol=native#text/plain -res/cardsfolder/fledgling_osprey.txt -text svneol=native#text/plain -res/cardsfolder/fleet_footed_monk.txt -text svneol=native#text/plain -res/cardsfolder/fleetfoot_panther.txt -text svneol=native#text/plain -res/cardsfolder/fleeting_aven.txt -text svneol=native#text/plain -res/cardsfolder/fleeting_distraction.txt -text svneol=native#text/plain -res/cardsfolder/fleeting_image.txt -text svneol=native#text/plain -res/cardsfolder/flensermite.txt -text svneol=native#text/plain -res/cardsfolder/flesh_allergy.txt -text svneol=native#text/plain -res/cardsfolder/flesh_eater_imp.txt -text svneol=native#text/plain -res/cardsfolder/fleshbag_marauder.txt -text svneol=native#text/plain -res/cardsfolder/fleshformer.txt -text svneol=native#text/plain -res/cardsfolder/fleshgrafter.txt -text svneol=native#text/plain -res/cardsfolder/fleshwrither.txt svneol=native#text/plain -res/cardsfolder/flicker.txt svneol=native#text/plain -res/cardsfolder/flickerwisp.txt -text svneol=native#text/plain -res/cardsfolder/flight.txt -text svneol=native#text/plain -res/cardsfolder/flight_of_fancy.txt -text svneol=native#text/plain -res/cardsfolder/flight_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/fling.txt -text svneol=native#text/plain -res/cardsfolder/flint_golem.txt svneol=native#text/plain -res/cardsfolder/floating_dream_zubera.txt -text svneol=native#text/plain -res/cardsfolder/flood.txt -text svneol=native#text/plain -res/cardsfolder/flood_plain.txt -text svneol=native#text/plain -res/cardsfolder/floodbringer.txt -text svneol=native#text/plain -res/cardsfolder/flooded_grove.txt -text svneol=native#text/plain -res/cardsfolder/flooded_shoreline.txt svneol=native#text/plain -res/cardsfolder/flooded_strand.txt -text svneol=native#text/plain -res/cardsfolder/floodwater_dam.txt -text svneol=native#text/plain -res/cardsfolder/flourishing_defenses.txt -text svneol=native#text/plain -res/cardsfolder/flow_of_ideas.txt -text svneol=native#text/plain -res/cardsfolder/flow_of_maggots.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_blade.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_charger.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_crusher.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_embrace.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_flood.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_giant.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_hellion.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_mauler.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_overseer.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_salamander.txt svneol=native#text/plain -res/cardsfolder/flowstone_sculpture.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_shambler.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_slide.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_strike.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_surge.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_thopter.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_wall.txt -text svneol=native#text/plain -res/cardsfolder/flowstone_wyvern.txt -text svneol=native#text/plain -res/cardsfolder/fluctuator.txt -text svneol=native#text/plain -res/cardsfolder/flurry_of_wings.txt -text svneol=native#text/plain -res/cardsfolder/flying_carpet.txt -text svneol=native#text/plain -res/cardsfolder/flying_men.txt -text svneol=native#text/plain -res/cardsfolder/fodder_cannon.txt -text svneol=native#text/plain -res/cardsfolder/fodder_launch.txt -text svneol=native#text/plain -res/cardsfolder/fog.txt -text svneol=native#text/plain -res/cardsfolder/fog_bank.txt -text svneol=native#text/plain -res/cardsfolder/fog_elemental.txt -text svneol=native#text/plain -res/cardsfolder/fog_of_gnats.txt -text svneol=native#text/plain -res/cardsfolder/folk_medicine.txt -text svneol=native#text/plain -res/cardsfolder/folk_of_an_havva.txt -text svneol=native#text/plain -res/cardsfolder/folk_of_the_pines.txt -text svneol=native#text/plain -res/cardsfolder/followed_footsteps.txt -text svneol=native#text/plain -res/cardsfolder/fomori_nomad.txt -text svneol=native#text/plain -res/cardsfolder/font_of_mythos.txt -text svneol=native#text/plain -res/cardsfolder/fools_demise.txt svneol=native#text/plain -res/cardsfolder/fools_tome.txt svneol=native#text/plain -res/cardsfolder/foot_soldiers.txt -text svneol=native#text/plain -res/cardsfolder/footbottom_feast.txt -text svneol=native#text/plain -res/cardsfolder/foothill_guide.txt -text svneol=native#text/plain -res/cardsfolder/footsteps_of_the_goryo.txt -text svneol=native#text/plain -res/cardsfolder/foratog.txt -text svneol=native#text/plain -res/cardsfolder/forbid.txt -text svneol=native#text/plain -res/cardsfolder/forbidden_lore.txt svneol=native#text/plain -res/cardsfolder/forbidden_orchard.txt -text svneol=native#text/plain -res/cardsfolder/forbidding_watchtower.txt -text svneol=native#text/plain -res/cardsfolder/force_of_nature.txt -text svneol=native#text/plain -res/cardsfolder/force_of_savagery.txt -text svneol=native#text/plain -res/cardsfolder/force_of_will.txt -text svneol=native#text/plain -res/cardsfolder/force_spike.txt -text svneol=native#text/plain -res/cardsfolder/force_void.txt -text svneol=native#text/plain -res/cardsfolder/forced_fruition.txt -text svneol=native#text/plain -res/cardsfolder/forced_march.txt -text svneol=native#text/plain -res/cardsfolder/forced_retreat.txt -text svneol=native#text/plain -res/cardsfolder/forced_worship.txt svneol=native#text/plain -res/cardsfolder/forcemage_advocate.txt svneol=native#text/plain -res/cardsfolder/foresee.txt -text svneol=native#text/plain -res/cardsfolder/foresight.txt -text svneol=native#text/plain -res/cardsfolder/forest.txt -text svneol=native#text/plain -res/cardsfolder/forest_bear.txt -text svneol=native#text/plain -res/cardsfolder/forethought_amulet.txt -text svneol=native#text/plain -res/cardsfolder/forfend.txt svneol=native#text/plain -res/cardsfolder/forge_armor.txt -text svneol=native#text/plain -res/cardsfolder/forgotten_ancient.txt -text svneol=native#text/plain -res/cardsfolder/forgotten_cave.txt -text svneol=native#text/plain -res/cardsfolder/forgotten_harvest.txt svneol=native#text/plain -res/cardsfolder/fork.txt -text svneol=native#text/plain -res/cardsfolder/forked_bolt.txt -text svneol=native#text/plain -res/cardsfolder/forked_branch_garami.txt -text svneol=native#text/plain -res/cardsfolder/form_of_the_dragon.txt -text svneol=native#text/plain -res/cardsfolder/forsaken_city.txt -text svneol=native#text/plain -res/cardsfolder/forsaken_wastes.txt -text svneol=native#text/plain -res/cardsfolder/fortify.txt -text svneol=native#text/plain -res/cardsfolder/fortitude.txt svneol=native#text/plain -res/cardsfolder/fortune_thief.txt -text svneol=native#text/plain -res/cardsfolder/foul_familiar.txt -text svneol=native#text/plain -res/cardsfolder/foul_imp.txt -text svneol=native#text/plain -res/cardsfolder/foul_presence.txt svneol=native#text/plain -res/cardsfolder/foul_spirit.txt svneol=native#text/plain -res/cardsfolder/fountain_of_youth.txt -text svneol=native#text/plain -res/cardsfolder/fountain_watch.txt -text svneol=native#text/plain -res/cardsfolder/foxfire.txt svneol=native#text/plain -res/cardsfolder/foxfire_oak.txt -text svneol=native#text/plain -res/cardsfolder/fracturing_gust.txt -text svneol=native#text/plain -res/cardsfolder/frantic_purification.txt -text svneol=native#text/plain -res/cardsfolder/frantic_salvage.txt -text svneol=native#text/plain -res/cardsfolder/frantic_search.txt -text svneol=native#text/plain -res/cardsfolder/frazzle.txt -text svneol=native#text/plain -res/cardsfolder/freed_from_the_real.txt -text svneol=native#text/plain -res/cardsfolder/freewind_equenaut.txt -text svneol=native#text/plain -res/cardsfolder/freewind_falcon.txt -text svneol=native#text/plain -res/cardsfolder/frenetic_ogre.txt -text svneol=native#text/plain -res/cardsfolder/frenetic_raptor.txt -text svneol=native#text/plain -res/cardsfolder/frenzied_tilling.txt -text svneol=native#text/plain -res/cardsfolder/fresh_meat.txt svneol=native#text/plain -res/cardsfolder/fresh_volunteers.txt -text svneol=native#text/plain -res/cardsfolder/freyalise_supplicant.txt -text svneol=native#text/plain -res/cardsfolder/freyalises_charm.txt -text svneol=native#text/plain -res/cardsfolder/freyalises_radiance.txt -text svneol=native#text/plain -res/cardsfolder/freyalises_winds.txt -text svneol=native#text/plain -res/cardsfolder/frightcrawler.txt -text svneol=native#text/plain -res/cardsfolder/frog_tongue.txt -text svneol=native#text/plain -res/cardsfolder/frogmite.txt -text svneol=native#text/plain -res/cardsfolder/frogtosser_banneret.txt -text svneol=native#text/plain -res/cardsfolder/frontier_guide.txt -text svneol=native#text/plain -res/cardsfolder/frontline_sage.txt -text svneol=native#text/plain -res/cardsfolder/frontline_strategist.txt svneol=native#text/plain -res/cardsfolder/frost_giant.txt -text svneol=native#text/plain -res/cardsfolder/frost_marsh.txt -text svneol=native#text/plain -res/cardsfolder/frost_ogre.txt -text svneol=native#text/plain -res/cardsfolder/frost_raptor.txt -text svneol=native#text/plain -res/cardsfolder/frost_titan.txt svneol=native#text/plain -res/cardsfolder/frostling.txt -text svneol=native#text/plain -res/cardsfolder/frostweb_spider.txt -text svneol=native#text/plain -res/cardsfolder/frostwind_invoker.txt -text svneol=native#text/plain -res/cardsfolder/frozen_aether.txt -text svneol=native#text/plain -res/cardsfolder/frozen_shade.txt -text svneol=native#text/plain -res/cardsfolder/frozen_solid.txt -text svneol=native#text/plain -res/cardsfolder/fruition.txt -text svneol=native#text/plain -res/cardsfolder/fuel_for_the_cause.txt -text svneol=native#text/plain -res/cardsfolder/fugitive_wizard.txt -text svneol=native#text/plain -res/cardsfolder/fugue.txt -text svneol=native#text/plain -res/cardsfolder/fulminator_mage.txt -text svneol=native#text/plain -res/cardsfolder/fume_spitter.txt -text svneol=native#text/plain -res/cardsfolder/fumiko_the_lowblood.txt svneol=native#text/plain -res/cardsfolder/funeral_charm.txt -text svneol=native#text/plain -res/cardsfolder/funeral_march.txt -text svneol=native#text/plain -res/cardsfolder/funeral_pyre.txt -text svneol=native#text/plain -res/cardsfolder/fungal_bloom.txt -text svneol=native#text/plain -res/cardsfolder/fungal_reaches.txt -text svneol=native#text/plain -res/cardsfolder/fungal_shambler.txt -text svneol=native#text/plain -res/cardsfolder/fungus_elemental.txt svneol=native#text/plain -res/cardsfolder/fungus_sliver.txt -text svneol=native#text/plain -res/cardsfolder/fungusaur.txt -text svneol=native#text/plain -res/cardsfolder/furious_assault.txt -text svneol=native#text/plain -res/cardsfolder/furnace_brood.txt -text svneol=native#text/plain -res/cardsfolder/furnace_celebration.txt -text svneol=native#text/plain -res/cardsfolder/furnace_of_rath.txt -text svneol=native#text/plain -res/cardsfolder/furnace_scamp.txt -text svneol=native#text/plain -res/cardsfolder/furnace_spirit.txt -text svneol=native#text/plain -res/cardsfolder/furnace_whelp.txt -text svneol=native#text/plain -res/cardsfolder/fury_sliver.txt -text svneol=native#text/plain -res/cardsfolder/fusion_elemental.txt -text svneol=native#text/plain -res/cardsfolder/fylamarid.txt -text svneol=native#text/plain -res/cardsfolder/fyndhorn_bow.txt -text svneol=native#text/plain -res/cardsfolder/fyndhorn_brownie.txt -text svneol=native#text/plain -res/cardsfolder/fyndhorn_elder.txt -text svneol=native#text/plain -res/cardsfolder/fyndhorn_elves.txt -text svneol=native#text/plain -res/cardsfolder/fyndhorn_pollen.txt -text svneol=native#text/plain -res/cardsfolder/gaddock_teeg.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_anthem.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_avenger.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_bounty.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_cradle.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_embrace.txt svneol=native#text/plain -res/cardsfolder/gaeas_herald.txt svneol=native#text/plain -res/cardsfolder/gaeas_might.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_revenge.txt -text svneol=native#text/plain -res/cardsfolder/gaeas_skyfolk.txt -text svneol=native#text/plain -res/cardsfolder/gainsay.txt -text svneol=native#text/plain -res/cardsfolder/gale_force.txt -text svneol=native#text/plain -res/cardsfolder/galepowder_mage.txt -text svneol=native#text/plain -res/cardsfolder/galinas_knight.txt -text svneol=native#text/plain -res/cardsfolder/gallantry.txt -text svneol=native#text/plain -res/cardsfolder/galvanic_arc.txt -text svneol=native#text/plain -res/cardsfolder/galvanic_blast.txt -text svneol=native#text/plain -res/cardsfolder/galvanic_key.txt -text svneol=native#text/plain -res/cardsfolder/gamble.txt -text svneol=native#text/plain -res/cardsfolder/game_trail_changeling.txt -text svneol=native#text/plain -res/cardsfolder/gang_of_elk.txt svneol=native#text/plain -res/cardsfolder/gangrenous_goliath.txt -text svneol=native#text/plain -res/cardsfolder/gangrenous_zombies.txt svneol=native#text/plain -res/cardsfolder/gargoyle_castle.txt -text svneol=native#text/plain -res/cardsfolder/garruk_wildspeaker.txt -text svneol=native#text/plain -res/cardsfolder/garruks_companion.txt -text svneol=native#text/plain -res/cardsfolder/garruks_packleader.txt svneol=native#text/plain -res/cardsfolder/garza_zol_plague_queen.txt -text svneol=native#text/plain -res/cardsfolder/gaseous_form.txt -text svneol=native#text/plain -res/cardsfolder/gate_hound.txt -text svneol=native#text/plain -res/cardsfolder/gate_to_phyrexia.txt -text svneol=native#text/plain -res/cardsfolder/gatekeeper_of_malakir.txt -text svneol=native#text/plain -res/cardsfolder/gathan_raiders.txt svneol=native#text/plain -res/cardsfolder/gatherer_of_graces.txt -text svneol=native#text/plain -res/cardsfolder/gauntlet_of_might.txt -text svneol=native#text/plain -res/cardsfolder/gaze_of_adamaro.txt -text svneol=native#text/plain -res/cardsfolder/gaze_of_justice.txt -text svneol=native#text/plain -res/cardsfolder/gelatinous_genesis.txt -text svneol=native#text/plain -res/cardsfolder/gelectrode.txt -text svneol=native#text/plain -res/cardsfolder/gelid_shackles.txt -text svneol=native#text/plain -res/cardsfolder/gemhide_sliver.txt -text svneol=native#text/plain -res/cardsfolder/gemini_engine.txt -text svneol=native#text/plain -res/cardsfolder/gempalm_avenger.txt -text svneol=native#text/plain -res/cardsfolder/gempalm_incinerator.txt -text svneol=native#text/plain -res/cardsfolder/gempalm_polluter.txt -text svneol=native#text/plain -res/cardsfolder/gempalm_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/gempalm_strider.txt -text svneol=native#text/plain -res/cardsfolder/gemstone_array.txt -text svneol=native#text/plain -res/cardsfolder/gemstone_mine.txt -text svneol=native#text/plain -res/cardsfolder/generals_kabuto.txt -text svneol=native#text/plain -res/cardsfolder/genesis.txt -text svneol=native#text/plain -res/cardsfolder/genesis_chamber.txt -text svneol=native#text/plain -res/cardsfolder/genesis_wave.txt svneol=native#text/plain -res/cardsfolder/genju_of_the_realm.txt svneol=native#text/plain -res/cardsfolder/geothermal_crevice.txt -text svneol=native#text/plain -res/cardsfolder/gerrards_battle_cry.txt -text svneol=native#text/plain -res/cardsfolder/gerrards_command.txt -text svneol=native#text/plain -res/cardsfolder/gerrards_irregulars.txt -text svneol=native#text/plain -res/cardsfolder/gerrards_verdict.txt -text svneol=native#text/plain -res/cardsfolder/gerrards_wisdom.txt -text svneol=native#text/plain -res/cardsfolder/geth_lord_of_the_vault.txt -text svneol=native#text/plain -res/cardsfolder/geths_grimoire.txt -text svneol=native#text/plain -res/cardsfolder/geths_verdict.txt svneol=native#text/plain -res/cardsfolder/geyser_glider.txt -text svneol=native#text/plain -res/cardsfolder/ghalmas_warden.txt -text svneol=native#text/plain -res/cardsfolder/ghastlord_of_fugue.txt -text svneol=native#text/plain -res/cardsfolder/ghastly_demise.txt -text svneol=native#text/plain -res/cardsfolder/ghitu_encampment.txt -text svneol=native#text/plain -res/cardsfolder/ghitu_fire_eater.txt -text svneol=native#text/plain -res/cardsfolder/ghitu_slinger.txt -text svneol=native#text/plain -res/cardsfolder/ghitu_war_cry.txt -text svneol=native#text/plain -res/cardsfolder/ghor_clan_bloodscale.txt -text svneol=native#text/plain -res/cardsfolder/ghor_clan_savage.txt -text svneol=native#text/plain -res/cardsfolder/ghost_hounds.txt svneol=native#text/plain -res/cardsfolder/ghost_lit_nourisher.txt -text svneol=native#text/plain -res/cardsfolder/ghost_lit_raider.txt -text svneol=native#text/plain -res/cardsfolder/ghost_lit_redeemer.txt -text svneol=native#text/plain -res/cardsfolder/ghost_lit_stalker.txt -text svneol=native#text/plain -res/cardsfolder/ghost_lit_warder.txt -text svneol=native#text/plain -res/cardsfolder/ghost_quarter.txt -text svneol=native#text/plain -res/cardsfolder/ghost_ship.txt -text svneol=native#text/plain -res/cardsfolder/ghost_tactician.txt -text svneol=native#text/plain -res/cardsfolder/ghost_town.txt -text svneol=native#text/plain -res/cardsfolder/ghost_warden.txt -text svneol=native#text/plain -res/cardsfolder/ghostfire.txt -text svneol=native#text/plain -res/cardsfolder/ghostflame_sliver.txt svneol=native#text/plain -res/cardsfolder/ghostly_changeling.txt -text svneol=native#text/plain -res/cardsfolder/ghostly_prison.txt -text svneol=native#text/plain -res/cardsfolder/ghostly_visit.txt -text svneol=native#text/plain -res/cardsfolder/ghostly_wings.txt svneol=native#text/plain -res/cardsfolder/ghosts_of_the_damned.txt svneol=native#text/plain -res/cardsfolder/ghostway.txt svneol=native#text/plain -res/cardsfolder/ghouls_feast.txt -text svneol=native#text/plain -res/cardsfolder/giant_badger.txt svneol=native#text/plain -res/cardsfolder/giant_cockroach.txt -text svneol=native#text/plain -res/cardsfolder/giant_crab.txt -text svneol=native#text/plain -res/cardsfolder/giant_dustwasp.txt -text svneol=native#text/plain -res/cardsfolder/giant_growth.txt -text svneol=native#text/plain -res/cardsfolder/giant_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/giant_mantis.txt -text svneol=native#text/plain -res/cardsfolder/giant_octopus.txt -text svneol=native#text/plain -res/cardsfolder/giant_scorpion.txt -text svneol=native#text/plain -res/cardsfolder/giant_shark.txt -text svneol=native#text/plain -res/cardsfolder/giant_solifuge.txt -text svneol=native#text/plain -res/cardsfolder/giant_spider.txt -text svneol=native#text/plain -res/cardsfolder/giant_strength.txt -text svneol=native#text/plain -res/cardsfolder/giant_tortoise.txt -text svneol=native#text/plain -res/cardsfolder/giant_trap_door_spider.txt -text svneol=native#text/plain -res/cardsfolder/giant_warthog.txt -text svneol=native#text/plain -res/cardsfolder/giants_ire.txt -text svneol=native#text/plain -res/cardsfolder/gibbering_hyenas.txt svneol=native#text/plain -res/cardsfolder/gibbering_kami.txt -text svneol=native#text/plain -res/cardsfolder/gift_of_estates.txt -text svneol=native#text/plain -res/cardsfolder/gift_of_granite.txt -text svneol=native#text/plain -res/cardsfolder/gift_of_the_deity.txt -text svneol=native#text/plain -res/cardsfolder/gift_of_the_woods.txt svneol=native#text/plain -res/cardsfolder/gigadrowse.txt svneol=native#text/plain -res/cardsfolder/gigantomancer.txt -text svneol=native#text/plain -res/cardsfolder/gigapede.txt -text svneol=native#text/plain -res/cardsfolder/gilded_lotus.txt -text svneol=native#text/plain -res/cardsfolder/gilder_bairn.txt -text svneol=native#text/plain -res/cardsfolder/gilt_leaf_archdruid.txt -text svneol=native#text/plain -res/cardsfolder/gilt_leaf_palace.txt -text svneol=native#text/plain -res/cardsfolder/gilt_leaf_seer.txt -text svneol=native#text/plain -res/cardsfolder/giltspire_avenger.txt -text svneol=native#text/plain -res/cardsfolder/gitaxian_probe.txt svneol=native#text/plain -res/cardsfolder/glacial_crevasses.txt -text svneol=native#text/plain -res/cardsfolder/glacial_fortress.txt -text svneol=native#text/plain -res/cardsfolder/glacial_wall.txt -text svneol=native#text/plain -res/cardsfolder/glaciers.txt -text svneol=native#text/plain -res/cardsfolder/glade_gnarr.txt -text svneol=native#text/plain -res/cardsfolder/glare_of_subdual.txt -text svneol=native#text/plain -res/cardsfolder/glarewielder.txt -text svneol=native#text/plain -res/cardsfolder/glass_golem.txt -text svneol=native#text/plain -res/cardsfolder/glassdust_hulk.txt -text svneol=native#text/plain -res/cardsfolder/glasses_of_urza.txt -text svneol=native#text/plain -res/cardsfolder/glaze_fiend.txt -text svneol=native#text/plain -res/cardsfolder/gleam_of_resistance.txt -text svneol=native#text/plain -res/cardsfolder/glen_elendra_archmage.txt -text svneol=native#text/plain -res/cardsfolder/glen_elendra_liege.txt -text svneol=native#text/plain -res/cardsfolder/glen_elendra_pranksters.txt svneol=native#text/plain -res/cardsfolder/glimmerdust_nap.txt -text svneol=native#text/plain -res/cardsfolder/glimmering_angel.txt -text svneol=native#text/plain -res/cardsfolder/glimmerpoint_stag.txt -text svneol=native#text/plain -res/cardsfolder/glimmerpost.txt -text svneol=native#text/plain -res/cardsfolder/glimmervoid.txt -text svneol=native#text/plain -res/cardsfolder/glimpse_of_nature.txt svneol=native#text/plain -res/cardsfolder/glimpse_the_unthinkable.txt -text svneol=native#text/plain -res/cardsfolder/glint_eye_nephilim.txt -text svneol=native#text/plain -res/cardsfolder/glint_hawk_idol.txt svneol=native#text/plain -res/cardsfolder/glintwing_invoker.txt -text svneol=native#text/plain -res/cardsfolder/glissa_the_traitor.txt -text svneol=native#text/plain -res/cardsfolder/glissas_courier.txt -text svneol=native#text/plain -res/cardsfolder/glissas_scorn.txt svneol=native#text/plain -res/cardsfolder/glistener_elf.txt svneol=native#text/plain -res/cardsfolder/glistening_oil.txt -text svneol=native#text/plain -res/cardsfolder/glitterfang.txt svneol=native#text/plain -res/cardsfolder/global_ruin.txt -text svneol=native#text/plain -res/cardsfolder/gloom.txt -text svneol=native#text/plain -res/cardsfolder/gloomdrifter.txt svneol=native#text/plain -res/cardsfolder/gloomhunter.txt -text svneol=native#text/plain -res/cardsfolder/gloomlance.txt svneol=native#text/plain -res/cardsfolder/gloomwidow.txt -text svneol=native#text/plain -res/cardsfolder/gloomwidows_feast.txt svneol=native#text/plain -res/cardsfolder/glorious_anthem.txt -text svneol=native#text/plain -res/cardsfolder/glorious_charge.txt -text svneol=native#text/plain -res/cardsfolder/glory.txt -text svneol=native#text/plain -res/cardsfolder/glory_of_warfare.txt svneol=native#text/plain -res/cardsfolder/glory_seeker.txt -text svneol=native#text/plain -res/cardsfolder/gloryscale_viashino.txt -text svneol=native#text/plain -res/cardsfolder/glowing_anemone.txt -text svneol=native#text/plain -res/cardsfolder/glowrider.txt -text svneol=native#text/plain -res/cardsfolder/gluttonous_slime.txt -text svneol=native#text/plain -res/cardsfolder/gluttonous_zombie.txt -text svneol=native#text/plain -res/cardsfolder/glyph_of_destruction.txt svneol=native#text/plain -res/cardsfolder/gnarled_effigy.txt -text svneol=native#text/plain -res/cardsfolder/gnarled_mass.txt -text svneol=native#text/plain -res/cardsfolder/gnarlid_pack.txt -text svneol=native#text/plain -res/cardsfolder/gnat_alley_creeper.txt -text svneol=native#text/plain -res/cardsfolder/gnat_miser.txt -text svneol=native#text/plain -res/cardsfolder/gnathosaur.txt -text svneol=native#text/plain -res/cardsfolder/go_for_the_throat.txt -text svneol=native#text/plain -res/cardsfolder/goatnapper.txt -text svneol=native#text/plain -res/cardsfolder/gobhobbler_rats.txt svneol=native#text/plain -res/cardsfolder/goblin_arsonist.txt -text svneol=native#text/plain -res/cardsfolder/goblin_artillery.txt -text svneol=native#text/plain -res/cardsfolder/goblin_assault.txt -text svneol=native#text/plain -res/cardsfolder/goblin_balloon_brigade.txt -text svneol=native#text/plain -res/cardsfolder/goblin_berserker.txt -text svneol=native#text/plain -res/cardsfolder/goblin_bombardment.txt -text svneol=native#text/plain -res/cardsfolder/goblin_brigand.txt -text svneol=native#text/plain -res/cardsfolder/goblin_bully.txt -text svneol=native#text/plain -res/cardsfolder/goblin_burrows.txt -text svneol=native#text/plain -res/cardsfolder/goblin_bushwhacker.txt -text svneol=native#text/plain -res/cardsfolder/goblin_cavaliers.txt -text svneol=native#text/plain -res/cardsfolder/goblin_caves.txt -text svneol=native#text/plain -res/cardsfolder/goblin_charbelcher.txt -text svneol=native#text/plain -res/cardsfolder/goblin_chariot.txt -text svneol=native#text/plain -res/cardsfolder/goblin_chieftain.txt -text svneol=native#text/plain -res/cardsfolder/goblin_chirurgeon.txt svneol=native#text/plain -res/cardsfolder/goblin_clearcutter.txt svneol=native#text/plain -res/cardsfolder/goblin_commando.txt -text svneol=native#text/plain -res/cardsfolder/goblin_deathraiders.txt -text svneol=native#text/plain -res/cardsfolder/goblin_digging_team.txt -text svneol=native#text/plain -res/cardsfolder/goblin_dirigible.txt -text svneol=native#text/plain -res/cardsfolder/goblin_dynamo.txt svneol=native#text/plain -res/cardsfolder/goblin_elite_infantry.txt svneol=native#text/plain -res/cardsfolder/goblin_firebug.txt svneol=native#text/plain -res/cardsfolder/goblin_firestarter.txt -text svneol=native#text/plain -res/cardsfolder/goblin_gardener.txt svneol=native#text/plain -res/cardsfolder/goblin_gaveleer.txt -text svneol=native#text/plain -res/cardsfolder/goblin_general.txt -text svneol=native#text/plain -res/cardsfolder/goblin_glider.txt -text svneol=native#text/plain -res/cardsfolder/goblin_goon.txt svneol=native#text/plain -res/cardsfolder/goblin_grenade.txt -text svneol=native#text/plain -res/cardsfolder/goblin_grenadiers.txt svneol=native#text/plain -res/cardsfolder/goblin_guide.txt -text svneol=native#text/plain -res/cardsfolder/goblin_hero.txt -text svneol=native#text/plain -res/cardsfolder/goblin_king.txt -text svneol=native#text/plain -res/cardsfolder/goblin_lackey.txt -text svneol=native#text/plain -res/cardsfolder/goblin_legionnaire.txt svneol=native#text/plain -res/cardsfolder/goblin_lookout.txt -text svneol=native#text/plain -res/cardsfolder/goblin_lore.txt -text svneol=native#text/plain -res/cardsfolder/goblin_marshal.txt -text svneol=native#text/plain -res/cardsfolder/goblin_masons.txt svneol=native#text/plain -res/cardsfolder/goblin_matron.txt -text svneol=native#text/plain -res/cardsfolder/goblin_medics.txt -text svneol=native#text/plain -res/cardsfolder/goblin_mountaineer.txt -text svneol=native#text/plain -res/cardsfolder/goblin_mutant.txt -text svneol=native#text/plain -res/cardsfolder/goblin_offensive.txt -text svneol=native#text/plain -res/cardsfolder/goblin_outlander.txt -text svneol=native#text/plain -res/cardsfolder/goblin_patrol.txt -text svneol=native#text/plain -res/cardsfolder/goblin_piker.txt -text svneol=native#text/plain -res/cardsfolder/goblin_piledriver.txt -text svneol=native#text/plain -res/cardsfolder/goblin_pyromancer.txt -text svneol=native#text/plain -res/cardsfolder/goblin_raider.txt -text svneol=native#text/plain -res/cardsfolder/goblin_razerunners.txt -text svneol=native#text/plain -res/cardsfolder/goblin_replica.txt -text svneol=native#text/plain -res/cardsfolder/goblin_rimerunner.txt -text svneol=native#text/plain -res/cardsfolder/goblin_ringleader.txt -text svneol=native#text/plain -res/cardsfolder/goblin_roughrider.txt -text svneol=native#text/plain -res/cardsfolder/goblin_ruinblaster.txt svneol=native#text/plain -res/cardsfolder/goblin_scouts.txt -text svneol=native#text/plain -res/cardsfolder/goblin_settler.txt -text svneol=native#text/plain -res/cardsfolder/goblin_sharpshooter.txt -text svneol=native#text/plain -res/cardsfolder/goblin_shortcutter.txt -text svneol=native#text/plain -res/cardsfolder/goblin_shrine.txt -text svneol=native#text/plain -res/cardsfolder/goblin_ski_patrol.txt -text svneol=native#text/plain -res/cardsfolder/goblin_sky_raider.txt -text svneol=native#text/plain -res/cardsfolder/goblin_skycutter.txt -text svneol=native#text/plain -res/cardsfolder/goblin_sledder.txt -text svneol=native#text/plain -res/cardsfolder/goblin_soothsayer.txt -text svneol=native#text/plain -res/cardsfolder/goblin_spelunkers.txt -text svneol=native#text/plain -res/cardsfolder/goblin_spy.txt -text svneol=native#text/plain -res/cardsfolder/goblin_striker.txt -text svneol=native#text/plain -res/cardsfolder/goblin_swine_rider.txt svneol=native#text/plain -res/cardsfolder/goblin_taskmaster.txt -text svneol=native#text/plain -res/cardsfolder/goblin_tinkerer.txt svneol=native#text/plain -res/cardsfolder/goblin_trenches.txt -text svneol=native#text/plain -res/cardsfolder/goblin_tunneler.txt -text svneol=native#text/plain -res/cardsfolder/goblin_turncoat.txt svneol=native#text/plain -res/cardsfolder/goblin_vandal.txt svneol=native#text/plain -res/cardsfolder/goblin_war_buggy.txt -text svneol=native#text/plain -res/cardsfolder/goblin_war_paint.txt -text svneol=native#text/plain -res/cardsfolder/goblin_war_strike.txt -text svneol=native#text/plain -res/cardsfolder/goblin_war_wagon.txt -text svneol=native#text/plain -res/cardsfolder/goblin_warchief.txt -text svneol=native#text/plain -res/cardsfolder/goblin_wardriver.txt -text svneol=native#text/plain -res/cardsfolder/goblin_warrens.txt -text svneol=native#text/plain -res/cardsfolder/goblin_wizard.txt svneol=native#text/plain -res/cardsfolder/godhead_of_awe.txt -text svneol=native#text/plain -res/cardsfolder/godless_shrine.txt -text svneol=native#text/plain -res/cardsfolder/godos_irregulars.txt svneol=native#text/plain -res/cardsfolder/gods_eye_gate_to_the_reikai.txt -text svneol=native#text/plain -res/cardsfolder/godsire.txt -text svneol=native#text/plain -res/cardsfolder/godtoucher.txt -text svneol=native#text/plain -res/cardsfolder/godtracker_of_jund.txt svneol=native#text/plain -res/cardsfolder/gold_myr.txt -text svneol=native#text/plain -res/cardsfolder/golden_bear.txt -text svneol=native#text/plain -res/cardsfolder/golden_urn.txt -text svneol=native#text/plain -res/cardsfolder/goldenglow_moth.txt -text svneol=native#text/plain -res/cardsfolder/goldmeadow_dodger.txt -text svneol=native#text/plain -res/cardsfolder/goldmeadow_harrier.txt -text svneol=native#text/plain -res/cardsfolder/goldmeadow_lookout.txt -text svneol=native#text/plain -res/cardsfolder/golem_artisan.txt -text svneol=native#text/plain -res/cardsfolder/golem_foundry.txt -text svneol=native#text/plain -res/cardsfolder/golems_heart.txt -text svneol=native#text/plain -res/cardsfolder/golgari_brownscale.txt svneol=native#text/plain -res/cardsfolder/golgari_germination.txt -text svneol=native#text/plain -res/cardsfolder/golgari_grave_troll.txt svneol=native#text/plain -res/cardsfolder/golgari_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/golgari_rot_farm.txt -text svneol=native#text/plain -res/cardsfolder/golgari_rotwurm.txt -text svneol=native#text/plain -res/cardsfolder/golgari_signet.txt -text svneol=native#text/plain -res/cardsfolder/golgari_thug.txt -text svneol=native#text/plain -res/cardsfolder/goliath_beetle.txt -text svneol=native#text/plain -res/cardsfolder/goliath_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/goliath_spider.txt -text svneol=native#text/plain -res/cardsfolder/gore_vassal.txt svneol=native#text/plain -res/cardsfolder/goretusk_firebeast.txt -text svneol=native#text/plain -res/cardsfolder/gorger_wurm.txt -text svneol=native#text/plain -res/cardsfolder/gorgon_flail.txt -text svneol=native#text/plain -res/cardsfolder/gorgon_recluse.txt -text svneol=native#text/plain -res/cardsfolder/gorilla_chieftain.txt -text svneol=native#text/plain -res/cardsfolder/gorilla_pack.txt -text svneol=native#text/plain -res/cardsfolder/gorilla_shaman.txt -text svneol=native#text/plain -res/cardsfolder/gorilla_warrior.txt -text svneol=native#text/plain -res/cardsfolder/gossamer_chains.txt svneol=native#text/plain -res/cardsfolder/gossamer_phantasm.txt -text svneol=native#text/plain -res/cardsfolder/gosta_dirk.txt -text svneol=native#text/plain -res/cardsfolder/graceful_adept.txt -text svneol=native#text/plain -res/cardsfolder/grafted_exoskeleton.txt svneol=native#text/plain -res/cardsfolder/grafted_skullcap.txt -text svneol=native#text/plain -res/cardsfolder/grafted_wargear.txt -text svneol=native#text/plain -res/cardsfolder/grand_arbiter_augustin_iv.txt -text svneol=native#text/plain -res/cardsfolder/grand_coliseum.txt -text svneol=native#text/plain -res/cardsfolder/grandmother_sengir.txt svneol=native#text/plain -res/cardsfolder/granger_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/granite_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/granite_grip.txt -text svneol=native#text/plain -res/cardsfolder/granite_shard.txt -text svneol=native#text/plain -res/cardsfolder/granulate.txt -text svneol=native#text/plain -res/cardsfolder/grapeshot.txt -text svneol=native#text/plain -res/cardsfolder/grapeshot_catapult.txt -text svneol=native#text/plain -res/cardsfolder/grappler_spider.txt -text svneol=native#text/plain -res/cardsfolder/grasp_of_darkness.txt -text svneol=native#text/plain -res/cardsfolder/grassland_crusader.txt -text svneol=native#text/plain -res/cardsfolder/grasslands.txt -text svneol=native#text/plain -res/cardsfolder/gratuitous_violence.txt svneol=native#text/plain -res/cardsfolder/grave_defiler.txt -text svneol=native#text/plain -res/cardsfolder/grave_pact.txt -text svneol=native#text/plain -res/cardsfolder/grave_robbers.txt -text svneol=native#text/plain -res/cardsfolder/grave_shell_scarab.txt -text svneol=native#text/plain -res/cardsfolder/grave_titan.txt -text svneol=native#text/plain -res/cardsfolder/gravebind.txt -text svneol=native#text/plain -res/cardsfolder/graveborn_muse.txt -text svneol=native#text/plain -res/cardsfolder/gravedigger.txt -text svneol=native#text/plain -res/cardsfolder/gravel_slinger.txt -text svneol=native#text/plain -res/cardsfolder/gravelgill_axeshark.txt -text svneol=native#text/plain -res/cardsfolder/gravelgill_duo.txt -text svneol=native#text/plain -res/cardsfolder/graven_cairns.txt -text svneol=native#text/plain -res/cardsfolder/gravespawn_sovereign.txt -text svneol=native#text/plain -res/cardsfolder/gravitational_shift.txt -text svneol=native#text/plain -res/cardsfolder/gray_ogre.txt -text svneol=native#text/plain -res/cardsfolder/graypelt_hunter.txt -text svneol=native#text/plain -res/cardsfolder/graypelt_refuge.txt -text svneol=native#text/plain -res/cardsfolder/grayscaled_gharial.txt -text svneol=native#text/plain -res/cardsfolder/grazing_gladehart.txt -text svneol=native#text/plain -res/cardsfolder/grazing_kelpie.txt svneol=native#text/plain -res/cardsfolder/great_defender.txt svneol=native#text/plain -res/cardsfolder/great_furnace.txt -text svneol=native#text/plain -res/cardsfolder/great_sable_stag.txt -text svneol=native#text/plain -res/cardsfolder/great_wall.txt -text svneol=native#text/plain -res/cardsfolder/great_whale.txt -text svneol=native#text/plain -res/cardsfolder/greatbow_doyen.txt -text svneol=native#text/plain -res/cardsfolder/greater_auramancy.txt -text svneol=native#text/plain -res/cardsfolder/greater_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/greater_forgeling.txt -text svneol=native#text/plain -res/cardsfolder/greater_good.txt -text svneol=native#text/plain -res/cardsfolder/greater_mossdog.txt -text svneol=native#text/plain -res/cardsfolder/greed.txt -text svneol=native#text/plain -res/cardsfolder/greel_mind_raker.txt -text svneol=native#text/plain -res/cardsfolder/greels_caress.txt -text svneol=native#text/plain -res/cardsfolder/green_mana_battery.txt -text svneol=native#text/plain -res/cardsfolder/green_scarab.txt -text svneol=native#text/plain -res/cardsfolder/green_suns_zenith.txt -text svneol=native#text/plain -res/cardsfolder/green_ward.txt -text svneol=native#text/plain -res/cardsfolder/greener_pastures.txt -text svneol=native#text/plain -res/cardsfolder/greenhilt_trainee.txt svneol=native#text/plain -res/cardsfolder/greenseeker.txt -text svneol=native#text/plain -res/cardsfolder/greenweaver_druid.txt -text svneol=native#text/plain -res/cardsfolder/gremlin_mine.txt svneol=native#text/plain -res/cardsfolder/griffin_canyon.txt svneol=native#text/plain -res/cardsfolder/griffin_guide.txt svneol=native#text/plain -res/cardsfolder/griffin_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/grim_affliction.txt -text svneol=native#text/plain -res/cardsfolder/grim_feast.txt svneol=native#text/plain -res/cardsfolder/grim_harvest.txt -text svneol=native#text/plain -res/cardsfolder/grim_lavamancer.txt svneol=native#text/plain -res/cardsfolder/grim_monolith.txt -text svneol=native#text/plain -res/cardsfolder/grim_poppet.txt -text svneol=native#text/plain -res/cardsfolder/grim_tutor.txt -text svneol=native#text/plain -res/cardsfolder/grimclaw_bats.txt svneol=native#text/plain -res/cardsfolder/grindclock.txt -text svneol=native#text/plain -res/cardsfolder/grinding_station.txt -text svneol=native#text/plain -res/cardsfolder/grindstone.txt -text svneol=native#text/plain -res/cardsfolder/grinning_demon.txt -text svneol=native#text/plain -res/cardsfolder/grinning_ignus.txt svneol=native#text/plain -res/cardsfolder/gristle_grinner.txt -text svneol=native#text/plain -res/cardsfolder/gristleback.txt -text svneol=native#text/plain -res/cardsfolder/grixis_battlemage.txt -text svneol=native#text/plain -res/cardsfolder/grixis_charm.txt -text svneol=native#text/plain -res/cardsfolder/grixis_grimblade.txt -text svneol=native#text/plain -res/cardsfolder/grixis_panorama.txt -text svneol=native#text/plain -res/cardsfolder/grixis_slavedriver.txt -text svneol=native#text/plain -res/cardsfolder/grixis_sojourners.txt -text svneol=native#text/plain -res/cardsfolder/grizzled_leotau.txt -text svneol=native#text/plain -res/cardsfolder/grizzled_wolverine.txt -text svneol=native#text/plain -res/cardsfolder/grizzly_bears.txt -text svneol=native#text/plain -res/cardsfolder/grizzly_fate.txt -text svneol=native#text/plain -res/cardsfolder/groffskithur.txt svneol=native#text/plain -res/cardsfolder/grollub.txt -text svneol=native#text/plain -res/cardsfolder/grotag_siege_runner.txt -text svneol=native#text/plain -res/cardsfolder/grotag_thrasher.txt svneol=native#text/plain -res/cardsfolder/grotesque_hybrid.txt -text svneol=native#text/plain -res/cardsfolder/ground_rift.txt -text svneol=native#text/plain -res/cardsfolder/groundbreaker.txt -text svneol=native#text/plain -res/cardsfolder/groundling_pouncer.txt -text svneol=native#text/plain -res/cardsfolder/groundskeeper.txt -text svneol=native#text/plain -res/cardsfolder/grove_of_the_burnwillows.txt -text svneol=native#text/plain -res/cardsfolder/growth_spasm.txt -text svneol=native#text/plain -res/cardsfolder/gruesome_encore.txt -text svneol=native#text/plain -res/cardsfolder/gruul_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/gruul_signet.txt -text svneol=native#text/plain -res/cardsfolder/gruul_turf.txt -text svneol=native#text/plain -res/cardsfolder/gruul_war_plow.txt svneol=native#text/plain -res/cardsfolder/guan_yu_sainted_warrior.txt -text svneol=native#text/plain -res/cardsfolder/guan_yus_1000_li_march.txt -text svneol=native#text/plain -res/cardsfolder/guard_duty.txt -text svneol=native#text/plain -res/cardsfolder/guard_gomazoa.txt -text svneol=native#text/plain -res/cardsfolder/guardian_idol.txt -text svneol=native#text/plain -res/cardsfolder/guardian_of_cloverdell.txt -text svneol=native#text/plain -res/cardsfolder/guardian_of_solitude.txt svneol=native#text/plain -res/cardsfolder/guardian_of_the_guildpact.txt -text svneol=native#text/plain -res/cardsfolder/guardian_seraph.txt -text svneol=native#text/plain -res/cardsfolder/guardian_zendikon.txt svneol=native#text/plain -res/cardsfolder/guardians_magemark.txt -text svneol=native#text/plain -res/cardsfolder/guardians_of_akrasa.txt -text svneol=native#text/plain -res/cardsfolder/guerrilla_tactics.txt svneol=native#text/plain -res/cardsfolder/guided_strike.txt -text svneol=native#text/plain -res/cardsfolder/guiltfeeder.txt -text svneol=native#text/plain -res/cardsfolder/guilty_conscience.txt -text svneol=native#text/plain -res/cardsfolder/guma.txt -text svneol=native#text/plain -res/cardsfolder/gush.txt -text svneol=native#text/plain -res/cardsfolder/gust_skimmer.txt -text svneol=native#text/plain -res/cardsfolder/gustrider_exuberant.txt svneol=native#text/plain -res/cardsfolder/gut_shot.txt svneol=native#text/plain -res/cardsfolder/gutless_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/guttural_response.txt -text svneol=native#text/plain -res/cardsfolder/gutwrencher_oni.txt -text svneol=native#text/plain -res/cardsfolder/guul_draz_assassin.txt -text svneol=native#text/plain -res/cardsfolder/guul_draz_specter.txt -text svneol=native#text/plain -res/cardsfolder/guul_draz_vampire.txt -text svneol=native#text/plain -res/cardsfolder/gwafa_hazid_profiteer.txt -text svneol=native#text/plain -res/cardsfolder/gwendlyn_di_corci.txt -text svneol=native#text/plain -res/cardsfolder/gwyllion_hedge_mage.txt svneol=native#text/plain -res/cardsfolder/haazda_exonerator.txt -text svneol=native#text/plain -res/cardsfolder/hada_freeblade.txt -text svneol=native#text/plain -res/cardsfolder/hada_spy_patrol.txt -text svneol=native#text/plain -res/cardsfolder/hag_hedge_mage.txt svneol=native#text/plain -res/cardsfolder/hagra_crocodile.txt -text svneol=native#text/plain -res/cardsfolder/hagra_diabolist.txt -text svneol=native#text/plain -res/cardsfolder/hail_storm.txt svneol=native#text/plain -res/cardsfolder/hair_strung_koto.txt -text svneol=native#text/plain -res/cardsfolder/halberdier.txt -text svneol=native#text/plain -res/cardsfolder/halcyon_glaze.txt -text svneol=native#text/plain -res/cardsfolder/halimar_depths.txt -text svneol=native#text/plain -res/cardsfolder/halimar_excavator.txt -text svneol=native#text/plain -res/cardsfolder/halimar_wavewatch.txt -text svneol=native#text/plain -res/cardsfolder/hallowed_burial.txt -text svneol=native#text/plain -res/cardsfolder/hallowed_fountain.txt -text svneol=native#text/plain -res/cardsfolder/hallowed_ground.txt -text svneol=native#text/plain -res/cardsfolder/halo_hunter.txt -text svneol=native#text/plain -res/cardsfolder/halt_order.txt -text svneol=native#text/plain -res/cardsfolder/hamletback_goliath.txt svneol=native#text/plain -res/cardsfolder/hammer_mage.txt -text svneol=native#text/plain -res/cardsfolder/hammer_of_bogardan.txt -text svneol=native#text/plain -res/cardsfolder/hammer_of_ruin.txt -text svneol=native#text/plain -res/cardsfolder/hammerfist_giant.txt -text svneol=native#text/plain -res/cardsfolder/hammerhead_shark.txt -text svneol=native#text/plain -res/cardsfolder/hammerheim_deadeye.txt -text svneol=native#text/plain -res/cardsfolder/hana_kami.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_cruelty.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_death.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_emrakul.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_honor.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_justice.txt -text svneol=native#text/plain -res/cardsfolder/hand_of_the_praetors.txt -text svneol=native#text/plain -res/cardsfolder/hanna_ships_navigator.txt -text svneol=native#text/plain -res/cardsfolder/hannas_custody.txt -text svneol=native#text/plain -res/cardsfolder/hapless_researcher.txt -text svneol=native#text/plain -res/cardsfolder/harabaz_druid.txt -text svneol=native#text/plain -res/cardsfolder/harbinger_of_night.txt svneol=native#text/plain -res/cardsfolder/harbinger_of_spring.txt -text svneol=native#text/plain -res/cardsfolder/harbor_guardian.txt -text svneol=native#text/plain -res/cardsfolder/harbor_serpent.txt -text svneol=native#text/plain -res/cardsfolder/harmattan_efreet.txt -text svneol=native#text/plain -res/cardsfolder/harmonic_convergence.txt -text svneol=native#text/plain -res/cardsfolder/harmonize.txt -text svneol=native#text/plain -res/cardsfolder/harpoon_sniper.txt -text svneol=native#text/plain -res/cardsfolder/harrier_griffin.txt -text svneol=native#text/plain -res/cardsfolder/harrow.txt -text svneol=native#text/plain -res/cardsfolder/haru_onna.txt -text svneol=native#text/plain -res/cardsfolder/harvest_gwyllion.txt -text svneol=native#text/plain -res/cardsfolder/harvester_druid.txt -text svneol=native#text/plain -res/cardsfolder/hasran_ogress.txt svneol=native#text/plain -res/cardsfolder/hatchet_bully.txt svneol=native#text/plain -res/cardsfolder/hatching_plans.txt -text svneol=native#text/plain -res/cardsfolder/hate_weaver.txt -text svneol=native#text/plain -res/cardsfolder/hateflayer.txt -text svneol=native#text/plain -res/cardsfolder/haunted_angel.txt -text svneol=native#text/plain -res/cardsfolder/haunted_cadaver.txt -text svneol=native#text/plain -res/cardsfolder/haunted_crossroads.txt -text svneol=native#text/plain -res/cardsfolder/haunting_apparition.txt svneol=native#text/plain -res/cardsfolder/haunting_echoes.txt -text svneol=native#text/plain -res/cardsfolder/haunting_hymn.txt -text svneol=native#text/plain -res/cardsfolder/haunting_misery.txt -text svneol=native#text/plain -res/cardsfolder/haunting_wind.txt svneol=native#text/plain -res/cardsfolder/havenwood_battleground.txt -text svneol=native#text/plain -res/cardsfolder/havenwood_wurm.txt -text svneol=native#text/plain -res/cardsfolder/havoc.txt -text svneol=native#text/plain -res/cardsfolder/havoc_demon.txt svneol=native#text/plain -res/cardsfolder/hawkeater_moth.txt -text svneol=native#text/plain -res/cardsfolder/haze_of_rage.txt -text svneol=native#text/plain -res/cardsfolder/hazerider_drake.txt -text svneol=native#text/plain -res/cardsfolder/hazy_homunculus.txt -text svneol=native#text/plain -res/cardsfolder/he_who_hungers.txt -text svneol=native#text/plain -res/cardsfolder/headhunter.txt -text svneol=native#text/plain -res/cardsfolder/headless_horseman.txt -text svneol=native#text/plain -res/cardsfolder/headlong_rush.txt -text svneol=native#text/plain -res/cardsfolder/headstone.txt -text svneol=native#text/plain -res/cardsfolder/heal.txt -text svneol=native#text/plain -res/cardsfolder/healing_leaves.txt -text svneol=native#text/plain -res/cardsfolder/healing_salve.txt -text svneol=native#text/plain -res/cardsfolder/heap_doll.txt -text svneol=native#text/plain -res/cardsfolder/heart_of_light.txt -text svneol=native#text/plain -res/cardsfolder/heart_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/heart_of_yavimaya.txt -text svneol=native#text/plain -res/cardsfolder/heart_sliver.txt -text svneol=native#text/plain -res/cardsfolder/heart_warden.txt -text svneol=native#text/plain -res/cardsfolder/hearth_charm.txt svneol=native#text/plain -res/cardsfolder/hearthcage_giant.txt -text svneol=native#text/plain -res/cardsfolder/hearthfire_hobgoblin.txt -text svneol=native#text/plain -res/cardsfolder/heartlash_cinder.txt svneol=native#text/plain -res/cardsfolder/heartless_hidetsugu.txt svneol=native#text/plain -res/cardsfolder/heartmender.txt -text svneol=native#text/plain -res/cardsfolder/heartstabber_mosquito.txt svneol=native#text/plain -res/cardsfolder/heartstone.txt -text svneol=native#text/plain -res/cardsfolder/heartwood_dryad.txt -text svneol=native#text/plain -res/cardsfolder/heartwood_shard.txt -text svneol=native#text/plain -res/cardsfolder/heartwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/heat_of_battle.txt -text svneol=native#text/plain -res/cardsfolder/heat_ray.txt -text svneol=native#text/plain -res/cardsfolder/heat_shimmer.txt svneol=native#text/plain -res/cardsfolder/heavens_gate.txt -text svneol=native#text/plain -res/cardsfolder/heavy_arbalest.txt svneol=native#text/plain -res/cardsfolder/heavy_ballista.txt -text svneol=native#text/plain -res/cardsfolder/hedge_troll.txt -text svneol=native#text/plain -res/cardsfolder/hedron_crab.txt -text svneol=native#text/plain -res/cardsfolder/hedron_matrix.txt -text svneol=native#text/plain -res/cardsfolder/hedron_rover.txt -text svneol=native#text/plain -res/cardsfolder/hedron_scrabbler.txt -text svneol=native#text/plain -res/cardsfolder/heedless_one.txt -text svneol=native#text/plain -res/cardsfolder/heidar_rimewind_master.txt -text svneol=native#text/plain -res/cardsfolder/heightened_awareness.txt svneol=native#text/plain -res/cardsfolder/helionaut.txt -text svneol=native#text/plain -res/cardsfolder/heliophial.txt -text svneol=native#text/plain -res/cardsfolder/helix_pinnacle.txt -text svneol=native#text/plain -res/cardsfolder/hell_bent_raider.txt -text svneol=native#text/plain -res/cardsfolder/hell_swarm.txt -text svneol=native#text/plain -res/cardsfolder/helldozer.txt -text svneol=native#text/plain -res/cardsfolder/hellfire.txt -text svneol=native#text/plain -res/cardsfolder/hellfire_mongrel.txt -text svneol=native#text/plain -res/cardsfolder/hellhole_rats.txt svneol=native#text/plain -res/cardsfolder/hellion_eruption.txt -text svneol=native#text/plain -res/cardsfolder/hellkite_igniter.txt -text svneol=native#text/plain -res/cardsfolder/hellkite_overlord.txt -text svneol=native#text/plain -res/cardsfolder/hells_caretaker.txt -text svneol=native#text/plain -res/cardsfolder/hells_thunder.txt -text svneol=native#text/plain -res/cardsfolder/hellspark_elemental.txt -text svneol=native#text/plain -res/cardsfolder/helm_of_awakening.txt -text svneol=native#text/plain -res/cardsfolder/helm_of_possession.txt -text svneol=native#text/plain -res/cardsfolder/helm_of_the_ghastlord.txt svneol=native#text/plain -res/cardsfolder/hematite_golem.txt -text svneol=native#text/plain -res/cardsfolder/hematite_talisman.txt -text svneol=native#text/plain -res/cardsfolder/henchfiend_of_ukor.txt -text svneol=native#text/plain -res/cardsfolder/henge_guardian.txt -text svneol=native#text/plain -res/cardsfolder/henge_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/herald_of_serra.txt -text svneol=native#text/plain -res/cardsfolder/herbal_poultice.txt -text svneol=native#text/plain -res/cardsfolder/herd_gnarr.txt -text svneol=native#text/plain -res/cardsfolder/heritage_druid.txt -text svneol=native#text/plain -res/cardsfolder/hermetic_study.txt -text svneol=native#text/plain -res/cardsfolder/hermit_druid.txt -text svneol=native#text/plain -res/cardsfolder/hero_of_bladehold.txt svneol=native#text/plain -res/cardsfolder/hero_of_oxid_ridge.txt svneol=native#text/plain -res/cardsfolder/heroes_remembered.txt -text svneol=native#text/plain -res/cardsfolder/heroes_reunion.txt -text svneol=native#text/plain -res/cardsfolder/heros_demise.txt -text svneol=native#text/plain -res/cardsfolder/heros_resolve.txt -text svneol=native#text/plain -res/cardsfolder/hex.txt -text svneol=native#text/plain -res/cardsfolder/hexplate_golem.txt -text svneol=native#text/plain -res/cardsfolder/hibernation.txt -text svneol=native#text/plain -res/cardsfolder/hibernation_sliver.txt svneol=native#text/plain -res/cardsfolder/hickory_woodlot.txt -text svneol=native#text/plain -res/cardsfolder/hidden_ancients.txt svneol=native#text/plain -res/cardsfolder/hidden_gibbons.txt svneol=native#text/plain -res/cardsfolder/hidden_guerrillas.txt svneol=native#text/plain -res/cardsfolder/hidden_herd.txt svneol=native#text/plain -res/cardsfolder/hidden_path.txt -text svneol=native#text/plain -res/cardsfolder/hidden_spider.txt svneol=native#text/plain -res/cardsfolder/hideous_end.txt -text svneol=native#text/plain -res/cardsfolder/hidetsugus_second_rite.txt -text svneol=native#text/plain -res/cardsfolder/high_market.txt -text svneol=native#text/plain -res/cardsfolder/high_seas.txt -text svneol=native#text/plain -res/cardsfolder/high_tide.txt -text svneol=native#text/plain -res/cardsfolder/highland_berserker.txt -text svneol=native#text/plain -res/cardsfolder/highland_giant.txt -text svneol=native#text/plain -res/cardsfolder/highland_weald.txt -text svneol=native#text/plain -res/cardsfolder/highway_robber.txt -text svneol=native#text/plain -res/cardsfolder/higure_the_still_wind.txt svneol=native#text/plain -res/cardsfolder/hill_giant.txt -text svneol=native#text/plain -res/cardsfolder/hillcomber_giant.txt -text svneol=native#text/plain -res/cardsfolder/hindering_light.txt -text svneol=native#text/plain -res/cardsfolder/hindering_touch.txt -text svneol=native#text/plain -res/cardsfolder/hired_giant.txt -text svneol=native#text/plain -res/cardsfolder/hisokas_defiance.txt -text svneol=native#text/plain -res/cardsfolder/hissing_iguanar.txt -text svneol=native#text/plain -res/cardsfolder/hissing_miasma.txt svneol=native#text/plain -res/cardsfolder/hivestone.txt svneol=native#text/plain -res/cardsfolder/hivis_of_the_scale.txt -text svneol=native#text/plain -res/cardsfolder/hoar_shade.txt -text svneol=native#text/plain -res/cardsfolder/hoard_smelter_dragon.txt -text svneol=native#text/plain -res/cardsfolder/hoarders_greed.txt svneol=native#text/plain -res/cardsfolder/hobble.txt -text svneol=native#text/plain -res/cardsfolder/hobgoblin_dragoon.txt -text svneol=native#text/plain -res/cardsfolder/hokori_dust_drinker.txt -text svneol=native#text/plain -res/cardsfolder/hold_the_line.txt svneol=native#text/plain -res/cardsfolder/hollow_dogs.txt -text svneol=native#text/plain -res/cardsfolder/hollow_trees.txt -text svneol=native#text/plain -res/cardsfolder/hollowborn_barghest.txt svneol=native#text/plain -res/cardsfolder/hollowsage.txt svneol=native#text/plain -res/cardsfolder/holy_armor.txt -text svneol=native#text/plain -res/cardsfolder/holy_day.txt -text svneol=native#text/plain -res/cardsfolder/holy_light.txt -text svneol=native#text/plain -res/cardsfolder/holy_strength.txt -text svneol=native#text/plain -res/cardsfolder/homarid.txt -text svneol=native#text/plain -res/cardsfolder/homarid_shaman.txt -text svneol=native#text/plain -res/cardsfolder/homarid_spawning_bed.txt svneol=native#text/plain -res/cardsfolder/homarid_warrior.txt svneol=native#text/plain -res/cardsfolder/honden_of_cleansing_fire.txt -text svneol=native#text/plain -res/cardsfolder/honden_of_infinite_rage.txt -text svneol=native#text/plain -res/cardsfolder/honden_of_lifes_web.txt -text svneol=native#text/plain -res/cardsfolder/honden_of_nights_reach.txt -text svneol=native#text/plain -res/cardsfolder/honden_of_seeing_winds.txt -text svneol=native#text/plain -res/cardsfolder/honor_guard.txt -text svneol=native#text/plain -res/cardsfolder/honor_of_the_pure.txt -text svneol=native#text/plain -res/cardsfolder/honor_worn_shaku.txt -text svneol=native#text/plain -res/cardsfolder/hooded_kavu.txt -text svneol=native#text/plain -res/cardsfolder/hoodwink.txt -text svneol=native#text/plain -res/cardsfolder/hoof_skulkin.txt svneol=native#text/plain -res/cardsfolder/hoofprints_of_the_stag.txt -text svneol=native#text/plain -res/cardsfolder/hope_and_glory.txt svneol=native#text/plain -res/cardsfolder/hope_charm.txt -text svneol=native#text/plain -res/cardsfolder/hopping_automaton.txt -text svneol=native#text/plain -res/cardsfolder/horde_of_notions.txt -text svneol=native#text/plain -res/cardsfolder/horizon_canopy.txt -text svneol=native#text/plain -res/cardsfolder/horizon_drake.txt -text svneol=native#text/plain -res/cardsfolder/horizon_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/horn_of_deafening.txt -text svneol=native#text/plain -res/cardsfolder/horn_of_greed.txt -text svneol=native#text/plain -res/cardsfolder/horn_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/horned_cheetah.txt -text svneol=native#text/plain -res/cardsfolder/horned_kavu.txt -text svneol=native#text/plain -res/cardsfolder/horned_sliver.txt -text svneol=native#text/plain -res/cardsfolder/horned_troll.txt -text svneol=native#text/plain -res/cardsfolder/horned_turtle.txt -text svneol=native#text/plain -res/cardsfolder/hornet_cannon.txt -text svneol=native#text/plain -res/cardsfolder/hornet_cobra.txt -text svneol=native#text/plain -res/cardsfolder/hornet_harasser.txt svneol=native#text/plain -res/cardsfolder/hornet_sting.txt -text svneol=native#text/plain -res/cardsfolder/horobi_deaths_wail.txt -text svneol=native#text/plain -res/cardsfolder/horrible_hordes.txt -text svneol=native#text/plain -res/cardsfolder/horrifying_revelation.txt -text svneol=native#text/plain -res/cardsfolder/horror_of_horrors.txt -text svneol=native#text/plain -res/cardsfolder/horseshoe_crab.txt -text svneol=native#text/plain -res/cardsfolder/hostile_realm.txt svneol=native#text/plain -res/cardsfolder/hoverguard_observer.txt -text svneol=native#text/plain -res/cardsfolder/hoverguard_sweepers.txt svneol=native#text/plain -res/cardsfolder/hovermyr.txt svneol=native#text/plain -res/cardsfolder/howl_from_beyond.txt -text svneol=native#text/plain -res/cardsfolder/howl_of_the_night_pack.txt -text svneol=native#text/plain -res/cardsfolder/howling_banshee.txt -text svneol=native#text/plain -res/cardsfolder/howling_fury.txt -text svneol=native#text/plain -res/cardsfolder/howling_gale.txt -text svneol=native#text/plain -res/cardsfolder/howling_mine.txt -text svneol=native#text/plain -res/cardsfolder/howling_wolf.txt -text svneol=native#text/plain -res/cardsfolder/hua_tuo_honored_physician.txt -text svneol=native#text/plain -res/cardsfolder/huang_zhong_shu_general.txt -text svneol=native#text/plain -res/cardsfolder/hulking_cyclops.txt -text svneol=native#text/plain -res/cardsfolder/hulking_goblin.txt -text svneol=native#text/plain -res/cardsfolder/hulking_ogre.txt -text svneol=native#text/plain -res/cardsfolder/hull_breach.txt svneol=native#text/plain -res/cardsfolder/hum_of_the_radix.txt -text svneol=native#text/plain -res/cardsfolder/humble_budoka.txt -text svneol=native#text/plain -res/cardsfolder/hunding_gjornersen.txt -text svneol=native#text/plain -res/cardsfolder/hundroog.txt -text svneol=native#text/plain -res/cardsfolder/hunger_of_the_nim.txt -text svneol=native#text/plain -res/cardsfolder/hungry_mist.txt -text svneol=native#text/plain -res/cardsfolder/hungry_spriggan.txt -text svneol=native#text/plain -res/cardsfolder/hunted_dragon.txt -text svneol=native#text/plain -res/cardsfolder/hunted_horror.txt -text svneol=native#text/plain -res/cardsfolder/hunted_lammasu.txt -text svneol=native#text/plain -res/cardsfolder/hunted_phantasm.txt -text svneol=native#text/plain -res/cardsfolder/hunted_troll.txt -text svneol=native#text/plain -res/cardsfolder/hunted_wumpus.txt -text svneol=native#text/plain -res/cardsfolder/hunting_cheetah.txt -text svneol=native#text/plain -res/cardsfolder/hunting_drake.txt -text svneol=native#text/plain -res/cardsfolder/hunting_grounds.txt -text svneol=native#text/plain -res/cardsfolder/hunting_moa.txt -text svneol=native#text/plain -res/cardsfolder/hunting_pack.txt -text svneol=native#text/plain -res/cardsfolder/hunting_triad.txt svneol=native#text/plain -res/cardsfolder/hurkyls_recall.txt -text svneol=native#text/plain -res/cardsfolder/hurloon_minotaur.txt -text svneol=native#text/plain -res/cardsfolder/hurloon_shaman.txt svneol=native#text/plain -res/cardsfolder/hurly_burly.txt svneol=native#text/plain -res/cardsfolder/hurr_jackal.txt -text svneol=native#text/plain -res/cardsfolder/hurricane.txt -text svneol=native#text/plain -res/cardsfolder/hush.txt -text svneol=native#text/plain -res/cardsfolder/hyalopterous_lemure.txt -text svneol=native#text/plain -res/cardsfolder/hydromorph_guardian.txt -text svneol=native#text/plain -res/cardsfolder/hydromorph_gull.txt -text svneol=native#text/plain -res/cardsfolder/hyena_umbra.txt -text svneol=native#text/plain -res/cardsfolder/hymn_of_rebirth.txt -text svneol=native#text/plain -res/cardsfolder/hymn_to_tourach.txt -text svneol=native#text/plain -res/cardsfolder/hyperion_blacksmith.txt -text svneol=native#text/plain -res/cardsfolder/hypervolt_grasp.txt -text svneol=native#text/plain -res/cardsfolder/hypnotic_specter.txt -text svneol=native#text/plain -res/cardsfolder/hypochondria.txt svneol=native#text/plain -res/cardsfolder/hystrodon.txt -text svneol=native#text/plain -res/cardsfolder/icatian_crier.txt -text svneol=native#text/plain -res/cardsfolder/icatian_javelineers.txt -text svneol=native#text/plain -res/cardsfolder/icatian_lieutenant.txt -text svneol=native#text/plain -res/cardsfolder/icatian_moneychanger.txt svneol=native#text/plain -res/cardsfolder/icatian_priest.txt -text svneol=native#text/plain -res/cardsfolder/icatian_scout.txt -text svneol=native#text/plain -res/cardsfolder/icatian_store.txt -text svneol=native#text/plain -res/cardsfolder/icatian_town.txt -text svneol=native#text/plain -res/cardsfolder/ice_cage.txt -text svneol=native#text/plain -res/cardsfolder/ice_storm.txt -text svneol=native#text/plain -res/cardsfolder/iceberg.txt svneol=native#text/plain -res/cardsfolder/icefall.txt -text svneol=native#text/plain -res/cardsfolder/icequake.txt svneol=native#text/plain -res/cardsfolder/ichneumon_druid.txt svneol=native#text/plain -res/cardsfolder/ichor_explosion.txt svneol=native#text/plain -res/cardsfolder/ichor_rats.txt -text svneol=native#text/plain -res/cardsfolder/ichor_slick.txt -text svneol=native#text/plain -res/cardsfolder/ichor_wellspring.txt -text svneol=native#text/plain -res/cardsfolder/ichorclaw_myr.txt -text svneol=native#text/plain -res/cardsfolder/ichorid.txt svneol=native#text/plain -res/cardsfolder/icy_manipulator.txt -text svneol=native#text/plain -res/cardsfolder/identity_crisis.txt -text svneol=native#text/plain -res/cardsfolder/idle_thoughts.txt svneol=native#text/plain -res/cardsfolder/idyllic_tutor.txt -text svneol=native#text/plain -res/cardsfolder/ifh_biff_efreet.txt -text svneol=native#text/plain -res/cardsfolder/igneous_golem.txt -text svneol=native#text/plain -res/cardsfolder/igneous_pouncer.txt -text svneol=native#text/plain -res/cardsfolder/ignite_disorder.txt -text svneol=native#text/plain -res/cardsfolder/ignite_memories.txt -text svneol=native#text/plain -res/cardsfolder/ihsans_shade.txt -text svneol=native#text/plain -res/cardsfolder/iizuka_the_ruthless.txt -text svneol=native#text/plain -res/cardsfolder/ikiral_outrider.txt -text svneol=native#text/plain -res/cardsfolder/ill_gotten_gains.txt svneol=native#text/plain -res/cardsfolder/illuminated_wings.txt svneol=native#text/plain -res/cardsfolder/illumination.txt -text svneol=native#text/plain -res/cardsfolder/illusionary_forces.txt -text svneol=native#text/plain -res/cardsfolder/illusionary_servant.txt -text svneol=native#text/plain -res/cardsfolder/illusionary_wall.txt -text svneol=native#text/plain -res/cardsfolder/illusions_of_grandeur.txt -text svneol=native#text/plain -res/cardsfolder/illusory_demon.txt -text svneol=native#text/plain -res/cardsfolder/imaginary_pet.txt -text svneol=native#text/plain -res/cardsfolder/imi_statue.txt -text svneol=native#text/plain -res/cardsfolder/immaculate_magistrate.txt -text svneol=native#text/plain -res/cardsfolder/immobilizing_ink.txt -text svneol=native#text/plain -res/cardsfolder/immolating_souleater.txt svneol=native#text/plain -res/cardsfolder/immolation.txt -text svneol=native#text/plain -res/cardsfolder/impaler_shrike.txt svneol=native#text/plain -res/cardsfolder/impending_disaster.txt svneol=native#text/plain -res/cardsfolder/imperial_edict.txt -text svneol=native#text/plain -res/cardsfolder/imperial_hellkite.txt -text svneol=native#text/plain -res/cardsfolder/imperial_recruiter.txt -text svneol=native#text/plain -res/cardsfolder/imperial_seal.txt -text svneol=native#text/plain -res/cardsfolder/imperiosaur.txt -text svneol=native#text/plain -res/cardsfolder/imperious_perfect.txt -text svneol=native#text/plain -res/cardsfolder/implements_of_sacrifice.txt -text svneol=native#text/plain -res/cardsfolder/implode.txt -text svneol=native#text/plain -res/cardsfolder/improvised_armor.txt -text svneol=native#text/plain -res/cardsfolder/impulse.txt -text svneol=native#text/plain -res/cardsfolder/in_the_web_of_war.txt svneol=native#text/plain -res/cardsfolder/incendiary.txt svneol=native#text/plain -res/cardsfolder/incendiary_command.txt -text svneol=native#text/plain -res/cardsfolder/incinerate.txt -text svneol=native#text/plain -res/cardsfolder/incurable_ogre.txt -text svneol=native#text/plain -res/cardsfolder/indebted_samurai.txt -text svneol=native#text/plain -res/cardsfolder/independent_troops.txt -text svneol=native#text/plain -res/cardsfolder/indestructible_aura.txt svneol=native#text/plain -res/cardsfolder/index.txt -text svneol=native#text/plain -res/cardsfolder/indigo_faerie.txt svneol=native#text/plain -res/cardsfolder/indomitable_ancients.txt -text svneol=native#text/plain -res/cardsfolder/indomitable_archangel.txt -text svneol=native#text/plain -res/cardsfolder/indomitable_will.txt -text svneol=native#text/plain -res/cardsfolder/indrik_stomphowler.txt -text svneol=native#text/plain -res/cardsfolder/inexorable_tide.txt -text svneol=native#text/plain -res/cardsfolder/infantry_veteran.txt -text svneol=native#text/plain -res/cardsfolder/infected_vermin.txt -text svneol=native#text/plain -res/cardsfolder/infectious_horror.txt -text svneol=native#text/plain -res/cardsfolder/infectious_host.txt svneol=native#text/plain -res/cardsfolder/infernal_caretaker.txt svneol=native#text/plain -res/cardsfolder/infernal_contract.txt -text svneol=native#text/plain -res/cardsfolder/infernal_kirin.txt -text svneol=native#text/plain -res/cardsfolder/infernal_medusa.txt -text svneol=native#text/plain -res/cardsfolder/infernal_tribute.txt -text svneol=native#text/plain -res/cardsfolder/inferno.txt -text svneol=native#text/plain -res/cardsfolder/inferno_titan.txt -text svneol=native#text/plain -res/cardsfolder/infest.txt svneol=native#text/plain -res/cardsfolder/infested_roothold.txt -text svneol=native#text/plain -res/cardsfolder/infiltrate.txt -text svneol=native#text/plain -res/cardsfolder/infiltration_lens.txt -text svneol=native#text/plain -res/cardsfolder/infiltrator_il_kor.txt -text svneol=native#text/plain -res/cardsfolder/inflame.txt svneol=native#text/plain -res/cardsfolder/information_dealer.txt -text svneol=native#text/plain -res/cardsfolder/infuse.txt -text svneol=native#text/plain -res/cardsfolder/ingenious_thief.txt svneol=native#text/plain -res/cardsfolder/ingot_chewer.txt -text svneol=native#text/plain -res/cardsfolder/inheritance.txt -text svneol=native#text/plain -res/cardsfolder/initiates_of_the_ebon_hand.txt -text svneol=native#text/plain -res/cardsfolder/ink_dissolver.txt -text svneol=native#text/plain -res/cardsfolder/ink_eyes_servant_of_oni.txt svneol=native#text/plain -res/cardsfolder/inkfathom_divers.txt -text svneol=native#text/plain -res/cardsfolder/inkfathom_infiltrator.txt -text svneol=native#text/plain -res/cardsfolder/inkmoth_nexus.txt svneol=native#text/plain -res/cardsfolder/inkwell_leviathan.txt -text svneol=native#text/plain -res/cardsfolder/inner_calm_outer_strength.txt -text svneol=native#text/plain -res/cardsfolder/inner_chamber_guard.txt -text svneol=native#text/plain -res/cardsfolder/inner_fire.txt svneol=native#text/plain -res/cardsfolder/inner_flame_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/innocence_kami.txt -text svneol=native#text/plain -res/cardsfolder/innocent_blood.txt -text svneol=native#text/plain -res/cardsfolder/inquisition_of_kozilek.txt -text svneol=native#text/plain -res/cardsfolder/insatiable_souleater.txt svneol=native#text/plain -res/cardsfolder/inside_out.txt -text svneol=native#text/plain -res/cardsfolder/insidious_bookworms.txt -text svneol=native#text/plain -res/cardsfolder/insight.txt -text svneol=native#text/plain -res/cardsfolder/insolence.txt -text svneol=native#text/plain -res/cardsfolder/inspiration.txt -text svneol=native#text/plain -res/cardsfolder/inspired_charge.txt -text svneol=native#text/plain -res/cardsfolder/inspired_sprite.txt -text svneol=native#text/plain -res/cardsfolder/inspirit.txt -text svneol=native#text/plain -res/cardsfolder/instill_energy.txt -text svneol=native#text/plain -res/cardsfolder/instill_furor.txt svneol=native#text/plain -res/cardsfolder/instill_infection.txt -text svneol=native#text/plain -res/cardsfolder/insurrection.txt -text svneol=native#text/plain -res/cardsfolder/intervene.txt -text svneol=native#text/plain -res/cardsfolder/intimidation.txt -text svneol=native#text/plain -res/cardsfolder/intimidator_initiate.txt svneol=native#text/plain -res/cardsfolder/into_the_core.txt -text svneol=native#text/plain -res/cardsfolder/into_the_north.txt -text svneol=native#text/plain -res/cardsfolder/into_the_roil.txt -text svneol=native#text/plain -res/cardsfolder/into_thin_air.txt -text svneol=native#text/plain -res/cardsfolder/intrepid_hero.txt -text svneol=native#text/plain -res/cardsfolder/intruder_alarm.txt -text svneol=native#text/plain -res/cardsfolder/intuition.txt -text svneol=native#text/plain -res/cardsfolder/inundate.txt -text svneol=native#text/plain -res/cardsfolder/invigorating_boon.txt -text svneol=native#text/plain -res/cardsfolder/invigorating_falls.txt -text svneol=native#text/plain -res/cardsfolder/invincible_hymn.txt -text svneol=native#text/plain -res/cardsfolder/inviolability.txt -text svneol=native#text/plain -res/cardsfolder/invisibility.txt -text svneol=native#text/plain -res/cardsfolder/invoke_the_firemind.txt svneol=native#text/plain -res/cardsfolder/iona_shield_of_emeria.txt -text svneol=native#text/plain -res/cardsfolder/ionas_judgment.txt -text svneol=native#text/plain -res/cardsfolder/ior_ruin_expedition.txt -text svneol=native#text/plain -res/cardsfolder/ire_of_kaminari.txt -text svneol=native#text/plain -res/cardsfolder/iridescent_angel.txt -text svneol=native#text/plain -res/cardsfolder/irini_sengir.txt -text svneol=native#text/plain -res/cardsfolder/iron_barb_hellion.txt -text svneol=native#text/plain -res/cardsfolder/iron_heart_chimera.txt svneol=native#text/plain -res/cardsfolder/iron_lance.txt -text svneol=native#text/plain -res/cardsfolder/iron_maiden.txt svneol=native#text/plain -res/cardsfolder/iron_myr.txt -text svneol=native#text/plain -res/cardsfolder/iron_star.txt -text svneol=native#text/plain -res/cardsfolder/iron_tusk_elephant.txt -text svneol=native#text/plain -res/cardsfolder/iron_will.txt -text svneol=native#text/plain -res/cardsfolder/ironclaw_buzzardiers.txt -text svneol=native#text/plain -res/cardsfolder/ironclaw_curse.txt -text svneol=native#text/plain -res/cardsfolder/ironclaw_orcs.txt -text svneol=native#text/plain -res/cardsfolder/ironhoof_ox.txt -text svneol=native#text/plain -res/cardsfolder/ironroot_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/ironshell_beetle.txt svneol=native#text/plain -res/cardsfolder/irradiate.txt -text svneol=native#text/plain -res/cardsfolder/irrigation_ditch.txt -text svneol=native#text/plain -res/cardsfolder/isamaru_hound_of_konda.txt -text svneol=native#text/plain -res/cardsfolder/isao_enlightened_bushi.txt -text svneol=native#text/plain -res/cardsfolder/ishi_ishi_akki_crackshot.txt svneol=native#text/plain -res/cardsfolder/island.txt -text svneol=native#text/plain -res/cardsfolder/island_fish_jasconius.txt -text svneol=native#text/plain -res/cardsfolder/island_of_wak_wak.txt -text svneol=native#text/plain -res/cardsfolder/isleback_spawn.txt -text svneol=native#text/plain -res/cardsfolder/isochron_scepter.txt -text svneol=native#text/plain -res/cardsfolder/isolation_cell.txt svneol=native#text/plain -res/cardsfolder/it_that_betrays.txt -text svneol=native#text/plain -res/cardsfolder/ith_high_arcanist.txt svneol=native#text/plain -res/cardsfolder/ivory_crane_netsuke.txt svneol=native#text/plain -res/cardsfolder/ivory_cup.txt -text svneol=native#text/plain -res/cardsfolder/ivory_giant.txt svneol=native#text/plain -res/cardsfolder/ivory_guardians.txt -text svneol=native#text/plain -res/cardsfolder/ivory_tower.txt -text svneol=native#text/plain -res/cardsfolder/ivy_dancer.txt -text svneol=native#text/plain -res/cardsfolder/ivy_elemental.txt -text svneol=native#text/plain -res/cardsfolder/iwamori_of_the_open_fist.txt -text svneol=native#text/plain -res/cardsfolder/ixidors_will.txt -text svneol=native#text/plain -res/cardsfolder/izzet_boilerworks.txt -text svneol=native#text/plain -res/cardsfolder/izzet_chronarch.txt -text svneol=native#text/plain -res/cardsfolder/izzet_signet.txt -text svneol=native#text/plain -res/cardsfolder/jabaris_banner.txt -text svneol=native#text/plain -res/cardsfolder/jace_beleren.txt -text svneol=native#text/plain -res/cardsfolder/jace_the_mind_sculptor.txt -text svneol=native#text/plain -res/cardsfolder/jaces_erasure.txt -text svneol=native#text/plain -res/cardsfolder/jaces_ingenuity.txt -text svneol=native#text/plain -res/cardsfolder/jackal_pup.txt -text svneol=native#text/plain -res/cardsfolder/jackalope_herd.txt -text svneol=native#text/plain -res/cardsfolder/jacques_le_vert.txt -text svneol=native#text/plain -res/cardsfolder/jade_idol.txt svneol=native#text/plain -res/cardsfolder/jade_leech.txt -text svneol=native#text/plain -res/cardsfolder/jade_statue.txt -text svneol=native#text/plain -res/cardsfolder/jagged_lightning.txt -text svneol=native#text/plain -res/cardsfolder/jagged_poppet.txt svneol=native#text/plain -res/cardsfolder/jagged_scar_archers.txt svneol=native#text/plain -res/cardsfolder/jagwasp_swarm.txt -text svneol=native#text/plain -res/cardsfolder/jalum_tome.txt -text svneol=native#text/plain -res/cardsfolder/jamuraan_lion.txt -text svneol=native#text/plain -res/cardsfolder/jandors_ring.txt -text svneol=native#text/plain -res/cardsfolder/jandors_saddlebags.txt -text svneol=native#text/plain -res/cardsfolder/jangling_automaton.txt svneol=native#text/plain -res/cardsfolder/jareth_leonine_titan.txt svneol=native#text/plain -res/cardsfolder/jasmine_boreal.txt -text svneol=native#text/plain -res/cardsfolder/jawbone_skulkin.txt svneol=native#text/plain -res/cardsfolder/jaya_ballard_task_mage.txt -text svneol=native#text/plain -res/cardsfolder/jayemdae_tome.txt -text svneol=native#text/plain -res/cardsfolder/jedit_ojanen.txt -text svneol=native#text/plain -res/cardsfolder/jedit_ojanen_of_efrava.txt -text svneol=native#text/plain -res/cardsfolder/jedits_dragoons.txt -text svneol=native#text/plain -res/cardsfolder/jenara_asura_of_war.txt -text svneol=native#text/plain -res/cardsfolder/jerrard_of_the_closed_fist.txt -text svneol=native#text/plain -res/cardsfolder/jeska_warrior_adept.txt -text svneol=native#text/plain -res/cardsfolder/jesters_cap.txt -text svneol=native#text/plain -res/cardsfolder/jet_medallion.txt -text svneol=native#text/plain -res/cardsfolder/jeweled_spirit.txt -text svneol=native#text/plain -res/cardsfolder/jhessian_infiltrator.txt -text svneol=native#text/plain -res/cardsfolder/jhessian_lookout.txt -text svneol=native#text/plain -res/cardsfolder/jhessian_zombies.txt -text svneol=native#text/plain -res/cardsfolder/jhoira_of_the_ghitu.txt -text svneol=native#text/plain -res/cardsfolder/jhoiras_toolbox.txt -text svneol=native#text/plain -res/cardsfolder/jhovall_queen.txt -text svneol=native#text/plain -res/cardsfolder/jhovall_rider.txt -text svneol=native#text/plain -res/cardsfolder/jin_gitaxias_core_augur.txt svneol=native#text/plain -res/cardsfolder/jiwari_the_earth_aflame.txt -text svneol=native#text/plain -res/cardsfolder/jodahs_avenger.txt -text svneol=native#text/plain -res/cardsfolder/join_the_ranks.txt -text svneol=native#text/plain -res/cardsfolder/joiner_adept.txt -text svneol=native#text/plain -res/cardsfolder/jokulhaups.txt -text svneol=native#text/plain -res/cardsfolder/jolraels_centaur.txt -text svneol=native#text/plain -res/cardsfolder/jolraels_favor.txt svneol=native#text/plain -res/cardsfolder/jolt.txt svneol=native#text/plain -res/cardsfolder/jolting_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/jor_kadeen_the_prevailer.txt -text svneol=native#text/plain -res/cardsfolder/joraga_bard.txt -text svneol=native#text/plain -res/cardsfolder/joraga_treespeaker.txt -text svneol=native#text/plain -res/cardsfolder/joraga_warcaller.txt -text svneol=native#text/plain -res/cardsfolder/journey_to_nowhere.txt -text svneol=native#text/plain -res/cardsfolder/journeyers_kite.txt -text svneol=native#text/plain -res/cardsfolder/joven.txt -text svneol=native#text/plain -res/cardsfolder/jovens_tools.txt -text svneol=native#text/plain -res/cardsfolder/jovial_evil.txt -text svneol=native#text/plain -res/cardsfolder/joyous_respite.txt -text svneol=native#text/plain -res/cardsfolder/judge_of_currents.txt -text svneol=native#text/plain -res/cardsfolder/jugan_the_rising_star.txt -text svneol=native#text/plain -res/cardsfolder/juggernaut.txt -text svneol=native#text/plain -res/cardsfolder/juju_bubble.txt -text svneol=native#text/plain -res/cardsfolder/jukai_messenger.txt -text svneol=native#text/plain -res/cardsfolder/jump.txt -text svneol=native#text/plain -res/cardsfolder/jund_battlemage.txt -text svneol=native#text/plain -res/cardsfolder/jund_charm.txt -text svneol=native#text/plain -res/cardsfolder/jund_hackblade.txt -text svneol=native#text/plain -res/cardsfolder/jund_panorama.txt -text svneol=native#text/plain -res/cardsfolder/jund_sojourners.txt svneol=native#text/plain -res/cardsfolder/jungle_barrier.txt -text svneol=native#text/plain -res/cardsfolder/jungle_basin.txt -text svneol=native#text/plain -res/cardsfolder/jungle_lion.txt -text svneol=native#text/plain -res/cardsfolder/jungle_patrol.txt svneol=native#text/plain -res/cardsfolder/jungle_shrine.txt -text svneol=native#text/plain -res/cardsfolder/jungle_troll.txt -text svneol=native#text/plain -res/cardsfolder/jungle_weaver.txt -text svneol=native#text/plain -res/cardsfolder/jungle_wurm.txt svneol=native#text/plain -res/cardsfolder/juniper_order_advocate.txt -text svneol=native#text/plain -res/cardsfolder/juniper_order_druid.txt -text svneol=native#text/plain -res/cardsfolder/juniper_order_ranger.txt -text svneol=native#text/plain -res/cardsfolder/junk_diver.txt -text svneol=native#text/plain -res/cardsfolder/junktroller.txt svneol=native#text/plain -res/cardsfolder/juntu_stakes.txt -text svneol=native#text/plain -res/cardsfolder/junun_efreet.txt -text svneol=native#text/plain -res/cardsfolder/just_fate.txt -text svneol=native#text/plain -res/cardsfolder/juvenile_gloomwidow.txt -text svneol=native#text/plain -res/cardsfolder/juzam_djinn.txt -text svneol=native#text/plain -res/cardsfolder/jwar_isle_refuge.txt -text svneol=native#text/plain -res/cardsfolder/jwari_scuttler.txt -text svneol=native#text/plain -res/cardsfolder/jwari_shapeshifter.txt svneol=native#text/plain -res/cardsfolder/kabira_crossroads.txt -text svneol=native#text/plain -res/cardsfolder/kabira_vindicator.txt svneol=native#text/plain -res/cardsfolder/kabuto_moth.txt -text svneol=native#text/plain -res/cardsfolder/kaervek_the_merciless.txt -text svneol=native#text/plain -res/cardsfolder/kaerveks_hex.txt svneol=native#text/plain -res/cardsfolder/kaerveks_spite.txt -text svneol=native#text/plain -res/cardsfolder/kaijin_of_the_vanishing_touch.txt -text svneol=native#text/plain -res/cardsfolder/kalastria_highborn.txt -text svneol=native#text/plain -res/cardsfolder/kaleidostone.txt -text svneol=native#text/plain -res/cardsfolder/kalonian_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/kamahl_fist_of_krosa.txt svneol=native#text/plain -res/cardsfolder/kamahl_pit_fighter.txt -text svneol=native#text/plain -res/cardsfolder/kamahls_desire.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_ancient_law.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_empty_graves.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_false_hope.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_fires_roar.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_lunacy.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_old_stone.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_tattered_shoji.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_the_crescent_moon.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_the_honored_dead.txt svneol=native#text/plain -res/cardsfolder/kami_of_the_hunt.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_the_palace_fields.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_the_tended_garden.txt -text svneol=native#text/plain -res/cardsfolder/kami_of_the_waning_moon.txt svneol=native#text/plain -res/cardsfolder/kami_of_twisted_reflection.txt svneol=native#text/plain -res/cardsfolder/karakas.txt -text svneol=native#text/plain -res/cardsfolder/kargan_dragonlord.txt -text svneol=native#text/plain -res/cardsfolder/karma.txt -text svneol=native#text/plain -res/cardsfolder/karmic_guide.txt -text svneol=native#text/plain -res/cardsfolder/karn_silver_golem.txt -text svneol=native#text/plain -res/cardsfolder/karns_touch.txt svneol=native#text/plain -res/cardsfolder/karoo.txt -text svneol=native#text/plain -res/cardsfolder/karoo_meerkat.txt -text svneol=native#text/plain -res/cardsfolder/karplusan_forest.txt -text svneol=native#text/plain -res/cardsfolder/karplusan_giant.txt -text svneol=native#text/plain -res/cardsfolder/karplusan_strider.txt -text svneol=native#text/plain -res/cardsfolder/karplusan_wolverine.txt -text svneol=native#text/plain -res/cardsfolder/karplusan_yeti.txt svneol=native#text/plain -res/cardsfolder/karstoderm.txt svneol=native#text/plain -res/cardsfolder/kashi_tribe_elite.txt -text svneol=native#text/plain -res/cardsfolder/kashi_tribe_reaver.txt -text svneol=native#text/plain -res/cardsfolder/kashi_tribe_warriors.txt -text svneol=native#text/plain -res/cardsfolder/kasimir_the_lone_wolf.txt -text svneol=native#text/plain -res/cardsfolder/kataki_wars_wage.txt -text svneol=native#text/plain -res/cardsfolder/kathari_bomber.txt -text svneol=native#text/plain -res/cardsfolder/kathari_remnant.txt -text svneol=native#text/plain -res/cardsfolder/kathari_screecher.txt -text svneol=native#text/plain -res/cardsfolder/kavu_aggressor.txt svneol=native#text/plain -res/cardsfolder/kavu_climber.txt -text svneol=native#text/plain -res/cardsfolder/kavu_glider.txt -text svneol=native#text/plain -res/cardsfolder/kavu_howler.txt svneol=native#text/plain -res/cardsfolder/kavu_lair.txt svneol=native#text/plain -res/cardsfolder/kavu_mauler.txt svneol=native#text/plain -res/cardsfolder/kavu_monarch.txt -text svneol=native#text/plain -res/cardsfolder/kavu_predator.txt svneol=native#text/plain -res/cardsfolder/kavu_runner.txt -text svneol=native#text/plain -res/cardsfolder/kavu_scout.txt -text svneol=native#text/plain -res/cardsfolder/kavu_titan.txt -text svneol=native#text/plain -res/cardsfolder/kaysa.txt -text svneol=native#text/plain -res/cardsfolder/kazandu_blademaster.txt -text svneol=native#text/plain -res/cardsfolder/kazandu_refuge.txt -text svneol=native#text/plain -res/cardsfolder/kazandu_tuskcaller.txt -text svneol=native#text/plain -res/cardsfolder/kazuul_warlord.txt -text svneol=native#text/plain -res/cardsfolder/kederekt_leviathan.txt svneol=native#text/plain -res/cardsfolder/kederekt_parasite.txt -text svneol=native#text/plain -res/cardsfolder/keen_eyed_archers.txt -text svneol=native#text/plain -res/cardsfolder/keen_sense.txt -text svneol=native#text/plain -res/cardsfolder/keeneye_aven.txt -text svneol=native#text/plain -res/cardsfolder/keening_banshee.txt -text svneol=native#text/plain -res/cardsfolder/keening_stone.txt -text svneol=native#text/plain -res/cardsfolder/keep_watch.txt svneol=native#text/plain -res/cardsfolder/keeper_of_kookus.txt -text svneol=native#text/plain -res/cardsfolder/keeper_of_the_nine_gales.txt -text svneol=native#text/plain -res/cardsfolder/keeper_of_tresserhorn.txt -text svneol=native#text/plain -res/cardsfolder/keepers_of_the_faith.txt -text svneol=native#text/plain -res/cardsfolder/kei_takahashi.txt -text svneol=native#text/plain -res/cardsfolder/keiga_the_tide_star.txt -text svneol=native#text/plain -res/cardsfolder/keldon_arsonist.txt svneol=native#text/plain -res/cardsfolder/keldon_battlewagon.txt svneol=native#text/plain -res/cardsfolder/keldon_berserker.txt svneol=native#text/plain -res/cardsfolder/keldon_champion.txt -text svneol=native#text/plain -res/cardsfolder/keldon_halberdier.txt -text svneol=native#text/plain -res/cardsfolder/keldon_mantle.txt svneol=native#text/plain -res/cardsfolder/keldon_marauders.txt -text svneol=native#text/plain -res/cardsfolder/keldon_megaliths.txt -text svneol=native#text/plain -res/cardsfolder/keldon_necropolis.txt -text svneol=native#text/plain -res/cardsfolder/keldon_vandals.txt -text svneol=native#text/plain -res/cardsfolder/keldon_warlord.txt -text svneol=native#text/plain -res/cardsfolder/kelinore_bat.txt -text svneol=native#text/plain -res/cardsfolder/kelsinko_ranger.txt -text svneol=native#text/plain -res/cardsfolder/kemba_kha_regent.txt -text svneol=native#text/plain -res/cardsfolder/kembas_skyguard.txt -text svneol=native#text/plain -res/cardsfolder/kemuri_onna.txt -text svneol=native#text/plain -res/cardsfolder/kezzerdrix.txt -text svneol=native#text/plain -res/cardsfolder/khabal_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/khalni_garden.txt -text svneol=native#text/plain -res/cardsfolder/khalni_gem.txt -text svneol=native#text/plain -res/cardsfolder/khalni_heart_expedition.txt -text svneol=native#text/plain -res/cardsfolder/khalni_hydra.txt -text svneol=native#text/plain -res/cardsfolder/kher_keep.txt -text svneol=native#text/plain -res/cardsfolder/kiki_jiki_mirror_breaker.txt -text svneol=native#text/plain -res/cardsfolder/kiku_nights_flower.txt -text svneol=native#text/plain -res/cardsfolder/kikus_shadow.txt -text svneol=native#text/plain -res/cardsfolder/killer_bees.txt -text svneol=native#text/plain -res/cardsfolder/killer_whale.txt -text svneol=native#text/plain -res/cardsfolder/kiln_fiend.txt svneol=native#text/plain -res/cardsfolder/kiln_walker.txt svneol=native#text/plain -res/cardsfolder/kindle.txt -text svneol=native#text/plain -res/cardsfolder/kindled_fury.txt -text svneol=native#text/plain -res/cardsfolder/king_cheetah.txt -text svneol=native#text/plain -res/cardsfolder/king_crab.txt -text svneol=native#text/plain -res/cardsfolder/king_suleiman.txt -text svneol=native#text/plain -res/cardsfolder/kingfisher.txt -text svneol=native#text/plain -res/cardsfolder/kings_assassin.txt -text svneol=native#text/plain -res/cardsfolder/kinsbaile_balloonist.txt -text svneol=native#text/plain -res/cardsfolder/kinsbaile_borderguard.txt -text svneol=native#text/plain -res/cardsfolder/kinsbaile_cavalier.txt -text svneol=native#text/plain -res/cardsfolder/kinsbaile_skirmisher.txt svneol=native#text/plain -res/cardsfolder/kird_ape.txt -text svneol=native#text/plain -res/cardsfolder/kiri_onna.txt -text svneol=native#text/plain -res/cardsfolder/kirtars_desire.txt -text svneol=native#text/plain -res/cardsfolder/kismet.txt -text svneol=native#text/plain -res/cardsfolder/kiss_of_death.txt -text svneol=native#text/plain -res/cardsfolder/kiss_of_the_amesha.txt -text svneol=native#text/plain -res/cardsfolder/kitchen_finks.txt -text svneol=native#text/plain -res/cardsfolder/kitesail.txt -text svneol=native#text/plain -res/cardsfolder/kitesail_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_daggerdare.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_greatheart.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_healer.txt svneol=native#text/plain -res/cardsfolder/kithkin_rabble.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_shielddare.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_spellduster.txt -text svneol=native#text/plain -res/cardsfolder/kithkin_zephyrnaut.txt -text svneol=native#text/plain -res/cardsfolder/kitsune_blademaster.txt -text svneol=native#text/plain -res/cardsfolder/kitsune_dawnblade.txt -text svneol=native#text/plain -res/cardsfolder/kitsune_diviner.txt -text svneol=native#text/plain -res/cardsfolder/kitsune_loreweaver.txt -text svneol=native#text/plain -res/cardsfolder/kitsune_riftwalker.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_dead.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_home_guard.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_javelineer.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_outpost.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_outrider.txt -text svneol=native#text/plain -res/cardsfolder/kjeldoran_war_cry.txt -text svneol=native#text/plain -res/cardsfolder/knight_captain_of_eos.txt -text svneol=native#text/plain -res/cardsfolder/knight_errant.txt -text svneol=native#text/plain -res/cardsfolder/knight_exemplar.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_cliffhaven.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_dawn.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_dusk.txt svneol=native#text/plain -res/cardsfolder/knight_of_meadowgrain.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_new_alara.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_stromgald.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_sursi.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_the_reliquary.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_the_skyward_eye.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_the_white_orchid.txt -text svneol=native#text/plain -res/cardsfolder/knight_of_valor.txt svneol=native#text/plain -res/cardsfolder/knighthood.txt -text svneol=native#text/plain -res/cardsfolder/knotvine_mystic.txt -text svneol=native#text/plain -res/cardsfolder/knotvine_paladin.txt -text svneol=native#text/plain -res/cardsfolder/knucklebone_witch.txt -text svneol=native#text/plain -res/cardsfolder/kobold_drill_sergeant.txt -text svneol=native#text/plain -res/cardsfolder/kobold_overlord.txt -text svneol=native#text/plain -res/cardsfolder/kobold_taskmaster.txt -text svneol=native#text/plain -res/cardsfolder/kobolds_of_kher_keep.txt -text svneol=native#text/plain -res/cardsfolder/kodama_of_the_center_tree.txt svneol=native#text/plain -res/cardsfolder/kodama_of_the_north_tree.txt -text svneol=native#text/plain -res/cardsfolder/kodama_of_the_south_tree.txt svneol=native#text/plain -res/cardsfolder/kodamas_reach.txt -text svneol=native#text/plain -res/cardsfolder/kokusho_the_evening_star.txt -text svneol=native#text/plain -res/cardsfolder/konda_lord_of_eiganjo.txt -text svneol=native#text/plain -res/cardsfolder/kondas_hatamoto.txt -text svneol=native#text/plain -res/cardsfolder/kongming_sleeping_dragon.txt -text svneol=native#text/plain -res/cardsfolder/kookus.txt -text svneol=native#text/plain -res/cardsfolder/kor_aeronaut.txt svneol=native#text/plain -res/cardsfolder/kor_cartographer.txt -text svneol=native#text/plain -res/cardsfolder/kor_duelist.txt -text svneol=native#text/plain -res/cardsfolder/kor_firewalker.txt -text svneol=native#text/plain -res/cardsfolder/kor_haven.txt -text svneol=native#text/plain -res/cardsfolder/kor_hookmaster.txt svneol=native#text/plain -res/cardsfolder/kor_line_slinger.txt -text svneol=native#text/plain -res/cardsfolder/kor_sanctifiers.txt svneol=native#text/plain -res/cardsfolder/kor_skyfisher.txt -text svneol=native#text/plain -res/cardsfolder/kor_spiritdancer.txt -text svneol=native#text/plain -res/cardsfolder/korlash_heir_to_blackblade.txt -text svneol=native#text/plain -res/cardsfolder/kormus_bell.txt -text svneol=native#text/plain -res/cardsfolder/koskun_keep.txt -text svneol=native#text/plain -res/cardsfolder/koth_of_the_hammer.txt -text svneol=native#text/plain -res/cardsfolder/koths_courier.txt -text svneol=native#text/plain -res/cardsfolder/kozilek_butcher_of_truth.txt -text svneol=native#text/plain -res/cardsfolder/kozileks_predator.txt -text svneol=native#text/plain -res/cardsfolder/kraken_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/krakens_eye.txt -text svneol=native#text/plain -res/cardsfolder/krakilin.txt -text svneol=native#text/plain -res/cardsfolder/kranioceros.txt -text svneol=native#text/plain -res/cardsfolder/krark_clan_engineers.txt -text svneol=native#text/plain -res/cardsfolder/krark_clan_grunt.txt svneol=native#text/plain -res/cardsfolder/krark_clan_ironworks.txt -text svneol=native#text/plain -res/cardsfolder/krark_clan_ogre.txt -text svneol=native#text/plain -res/cardsfolder/krark_clan_shaman.txt -text svneol=native#text/plain -res/cardsfolder/krark_clan_stoker.txt svneol=native#text/plain -res/cardsfolder/kresh_the_bloodbraided.txt -text svneol=native#text/plain -res/cardsfolder/kris_mage.txt -text svneol=native#text/plain -res/cardsfolder/krosan_archer.txt -text svneol=native#text/plain -res/cardsfolder/krosan_avenger.txt -text svneol=native#text/plain -res/cardsfolder/krosan_beast.txt -text svneol=native#text/plain -res/cardsfolder/krosan_cloudscraper.txt -text svneol=native#text/plain -res/cardsfolder/krosan_colossus.txt -text svneol=native#text/plain -res/cardsfolder/krosan_constrictor.txt -text svneol=native#text/plain -res/cardsfolder/krosan_grip.txt svneol=native#text/plain -res/cardsfolder/krosan_groundshaker.txt -text svneol=native#text/plain -res/cardsfolder/krosan_restorer.txt -text svneol=native#text/plain -res/cardsfolder/krosan_tusker.txt -text svneol=native#text/plain -res/cardsfolder/krosan_verge.txt -text svneol=native#text/plain -res/cardsfolder/krosan_warchief.txt -text svneol=native#text/plain -res/cardsfolder/krosan_wayfarer.txt svneol=native#text/plain -res/cardsfolder/krovikan_elementalist.txt -text svneol=native#text/plain -res/cardsfolder/krovikan_fetish.txt -text svneol=native#text/plain -res/cardsfolder/krovikan_horror.txt -text svneol=native#text/plain -res/cardsfolder/krovikan_mist.txt -text svneol=native#text/plain -res/cardsfolder/krovikan_rot.txt -text svneol=native#text/plain -res/cardsfolder/krovikan_scoundrel.txt -text svneol=native#text/plain -res/cardsfolder/kry_shield.txt svneol=native#text/plain -res/cardsfolder/kuldotha_flamefiend.txt svneol=native#text/plain -res/cardsfolder/kuldotha_forgemaster.txt -text svneol=native#text/plain -res/cardsfolder/kuldotha_phoenix.txt -text svneol=native#text/plain -res/cardsfolder/kuldotha_rebirth.txt -text svneol=native#text/plain -res/cardsfolder/kuldotha_ringleader.txt -text svneol=native#text/plain -res/cardsfolder/kulrath_knight.txt -text svneol=native#text/plain -res/cardsfolder/kurgadon.txt svneol=native#text/plain -res/cardsfolder/kuro_pitlord.txt -text svneol=native#text/plain -res/cardsfolder/kuros_taken.txt -text svneol=native#text/plain -res/cardsfolder/kyoki_sanitys_eclipse.txt -text svneol=native#text/plain -res/cardsfolder/kyren_glider.txt -text svneol=native#text/plain -res/cardsfolder/kyren_negotiations.txt -text svneol=native#text/plain -res/cardsfolder/kyren_sniper.txt -text svneol=native#text/plain -res/cardsfolder/lab_rats.txt -text svneol=native#text/plain -res/cardsfolder/labyrinth_minotaur.txt svneol=native#text/plain -res/cardsfolder/laccolith_grunt.txt svneol=native#text/plain -res/cardsfolder/laccolith_titan.txt svneol=native#text/plain -res/cardsfolder/laccolith_warrior.txt svneol=native#text/plain -res/cardsfolder/laccolith_whelp.txt svneol=native#text/plain -res/cardsfolder/lace_with_moonglove.txt -text svneol=native#text/plain -res/cardsfolder/lady_caleria.txt -text svneol=native#text/plain -res/cardsfolder/lady_evangela.txt -text svneol=native#text/plain -res/cardsfolder/lady_orca.txt -text svneol=native#text/plain -res/cardsfolder/lady_zhurong_warrior_queen.txt -text svneol=native#text/plain -res/cardsfolder/lagac_lizard.txt -text svneol=native#text/plain -res/cardsfolder/lake_of_the_dead.txt -text svneol=native#text/plain -res/cardsfolder/lance.txt -text svneol=native#text/plain -res/cardsfolder/land_cap.txt svneol=native#text/plain -res/cardsfolder/land_equilibrium.txt -text svneol=native#text/plain -res/cardsfolder/land_leeches.txt -text svneol=native#text/plain -res/cardsfolder/land_tax.txt -text svneol=native#text/plain -res/cardsfolder/landbind_ritual.txt -text svneol=native#text/plain -res/cardsfolder/lantern_kami.txt -text svneol=native#text/plain -res/cardsfolder/lantern_lit_graveyard.txt -text svneol=native#text/plain -res/cardsfolder/lapis_lazuli_talisman.txt -text svneol=native#text/plain -res/cardsfolder/lapse_of_certainty.txt -text svneol=native#text/plain -res/cardsfolder/laquatuss_champion.txt -text svneol=native#text/plain -res/cardsfolder/larceny.txt -text svneol=native#text/plain -res/cardsfolder/lash_out.txt svneol=native#text/plain -res/cardsfolder/lashknife_barrier.txt svneol=native#text/plain -res/cardsfolder/lashwrithe.txt -text svneol=native#text/plain -res/cardsfolder/last_breath.txt -text svneol=native#text/plain -res/cardsfolder/last_caress.txt -text svneol=native#text/plain -res/cardsfolder/last_gasp.txt -text svneol=native#text/plain -res/cardsfolder/last_kiss.txt -text svneol=native#text/plain -res/cardsfolder/last_laugh.txt -text svneol=native#text/plain -res/cardsfolder/last_stand.txt -text svneol=native#text/plain -res/cardsfolder/last_word.txt -text svneol=native#text/plain -res/cardsfolder/latulla_keldon_overseer.txt -text svneol=native#text/plain -res/cardsfolder/latullas_orders.txt svneol=native#text/plain -res/cardsfolder/launch.txt -text svneol=native#text/plain -res/cardsfolder/lava_axe.txt -text svneol=native#text/plain -res/cardsfolder/lava_dart.txt -text svneol=native#text/plain -res/cardsfolder/lava_flow.txt -text svneol=native#text/plain -res/cardsfolder/lava_hounds.txt -text svneol=native#text/plain -res/cardsfolder/lava_runner.txt -text svneol=native#text/plain -res/cardsfolder/lava_spike.txt -text svneol=native#text/plain -res/cardsfolder/lava_storm.txt -text svneol=native#text/plain -res/cardsfolder/lava_tubes.txt svneol=native#text/plain -res/cardsfolder/lava_zombie.txt -text svneol=native#text/plain -res/cardsfolder/lavaborn_muse.txt svneol=native#text/plain -res/cardsfolder/lavaclaw_reaches.txt -text svneol=native#text/plain -res/cardsfolder/lavacore_elemental.txt svneol=native#text/plain -res/cardsfolder/lavafume_invoker.txt -text svneol=native#text/plain -res/cardsfolder/lavalanche.txt -text svneol=native#text/plain -res/cardsfolder/lavamancers_skill.txt -text svneol=native#text/plain -res/cardsfolder/lawbringer.txt -text svneol=native#text/plain -res/cardsfolder/lay_bare.txt -text svneol=native#text/plain -res/cardsfolder/lay_of_the_land.txt -text svneol=native#text/plain -res/cardsfolder/lay_waste.txt -text svneol=native#text/plain -res/cardsfolder/lead_astray.txt -text svneol=native#text/plain -res/cardsfolder/lead_belly_chimera.txt svneol=native#text/plain -res/cardsfolder/lead_golem.txt -text svneol=native#text/plain -res/cardsfolder/lead_the_stampede.txt -text svneol=native#text/plain -res/cardsfolder/leaden_fists.txt -text svneol=native#text/plain -res/cardsfolder/leaden_myr.txt -text svneol=native#text/plain -res/cardsfolder/leaf_arrow.txt svneol=native#text/plain -res/cardsfolder/leaf_crowned_elder.txt -text svneol=native#text/plain -res/cardsfolder/leaf_dancer.txt -text svneol=native#text/plain -res/cardsfolder/leaf_gilder.txt -text svneol=native#text/plain -res/cardsfolder/leafdrake_roost.txt -text svneol=native#text/plain -res/cardsfolder/leap.txt -text svneol=native#text/plain -res/cardsfolder/leap_of_flame.txt svneol=native#text/plain -res/cardsfolder/leaping_lizard.txt -text svneol=native#text/plain -res/cardsfolder/leatherback_baloth.txt -text svneol=native#text/plain -res/cardsfolder/leeches.txt -text svneol=native#text/plain -res/cardsfolder/leechridden_swamp.txt svneol=native#text/plain -res/cardsfolder/leering_emblem.txt -text svneol=native#text/plain -res/cardsfolder/legacy_weapon.txt -text svneol=native#text/plain -res/cardsfolder/legacys_allure.txt -text svneol=native#text/plain -res/cardsfolder/legions_of_lim_dul.txt svneol=native#text/plain -res/cardsfolder/leonin_abunas.txt -text svneol=native#text/plain -res/cardsfolder/leonin_armorguard.txt -text svneol=native#text/plain -res/cardsfolder/leonin_battlemage.txt -text svneol=native#text/plain -res/cardsfolder/leonin_den_guard.txt -text svneol=native#text/plain -res/cardsfolder/leonin_elder.txt -text svneol=native#text/plain -res/cardsfolder/leonin_relic_warder.txt -text svneol=native#text/plain -res/cardsfolder/leonin_scimitar.txt -text svneol=native#text/plain -res/cardsfolder/leonin_skyhunter.txt -text svneol=native#text/plain -res/cardsfolder/leonin_squire.txt -text svneol=native#text/plain -res/cardsfolder/leonin_sun_standard.txt -text svneol=native#text/plain -res/cardsfolder/leshracs_rite.txt -text svneol=native#text/plain -res/cardsfolder/leshracs_sigil.txt svneol=native#text/plain -res/cardsfolder/lesser_gargadon.txt svneol=native#text/plain -res/cardsfolder/lethargy_trap.txt svneol=native#text/plain -res/cardsfolder/leveler.txt -text svneol=native#text/plain -res/cardsfolder/levitation.txt -text svneol=native#text/plain -res/cardsfolder/ley_druid.txt -text svneol=native#text/plain -res/cardsfolder/leyline_of_anticipation.txt svneol=native#text/plain -res/cardsfolder/leyline_of_lifeforce.txt svneol=native#text/plain -res/cardsfolder/leyline_of_lightning.txt svneol=native#text/plain -res/cardsfolder/leyline_of_punishment.txt -text svneol=native#text/plain -res/cardsfolder/leyline_of_singularity.txt -text svneol=native#text/plain -res/cardsfolder/leyline_of_the_meek.txt -text svneol=native#text/plain -res/cardsfolder/leyline_of_the_void.txt -text svneol=native#text/plain -res/cardsfolder/leyline_of_vitality.txt -text svneol=native#text/plain -res/cardsfolder/lhurgoyf.txt -text svneol=native#text/plain -res/cardsfolder/liability.txt -text svneol=native#text/plain -res/cardsfolder/liberated_dwarf.txt svneol=native#text/plain -res/cardsfolder/library_of_alexandria.txt -text svneol=native#text/plain -res/cardsfolder/lich.txt -text svneol=native#text/plain -res/cardsfolder/lich_lord_of_unx.txt -text svneol=native#text/plain -res/cardsfolder/lichenthrope.txt -text svneol=native#text/plain -res/cardsfolder/liege_of_the_axe.txt svneol=native#text/plain -res/cardsfolder/liege_of_the_pit.txt -text svneol=native#text/plain -res/cardsfolder/liege_of_the_tangle.txt -text svneol=native#text/plain -res/cardsfolder/lieutenant_kirtar.txt -text svneol=native#text/plain -res/cardsfolder/life_and_limb.txt svneol=native#text/plain -res/cardsfolder/life_burst.txt -text svneol=native#text/plain -res/cardsfolder/life_chisel.txt -text svneol=native#text/plain -res/cardsfolder/life_from_the_loam.txt -text svneol=native#text/plain -res/cardsfolder/lifeblood.txt -text svneol=native#text/plain -res/cardsfolder/lifeforce.txt -text svneol=native#text/plain -res/cardsfolder/lifegift.txt -text svneol=native#text/plain -res/cardsfolder/lifelink.txt -text svneol=native#text/plain -res/cardsfolder/lifes_finale.txt svneol=native#text/plain -res/cardsfolder/lifesmith.txt -text svneol=native#text/plain -res/cardsfolder/lifespark_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/lifespinner.txt -text svneol=native#text/plain -res/cardsfolder/lifetap.txt -text svneol=native#text/plain -res/cardsfolder/light_of_day.txt -text svneol=native#text/plain -res/cardsfolder/light_of_sanction.txt -text svneol=native#text/plain -res/cardsfolder/lightbringer.txt -text svneol=native#text/plain -res/cardsfolder/lighthouse_chronologist.txt -text svneol=native#text/plain -res/cardsfolder/lightkeeper_of_emeria.txt -text svneol=native#text/plain -res/cardsfolder/lightmine_field.txt svneol=native#text/plain -res/cardsfolder/lightning_angel.txt -text svneol=native#text/plain -res/cardsfolder/lightning_blast.txt -text svneol=native#text/plain -res/cardsfolder/lightning_blow.txt -text svneol=native#text/plain -res/cardsfolder/lightning_bolt.txt -text svneol=native#text/plain -res/cardsfolder/lightning_cloud.txt svneol=native#text/plain -res/cardsfolder/lightning_crafter.txt -text svneol=native#text/plain -res/cardsfolder/lightning_dragon.txt -text svneol=native#text/plain -res/cardsfolder/lightning_elemental.txt -text svneol=native#text/plain -res/cardsfolder/lightning_greaves.txt -text svneol=native#text/plain -res/cardsfolder/lightning_helix.txt -text svneol=native#text/plain -res/cardsfolder/lightning_hounds.txt -text svneol=native#text/plain -res/cardsfolder/lightning_reaver.txt -text svneol=native#text/plain -res/cardsfolder/lightning_rift.txt -text svneol=native#text/plain -res/cardsfolder/lightning_serpent.txt -text svneol=native#text/plain -res/cardsfolder/lightning_surge.txt -text svneol=native#text/plain -res/cardsfolder/lightning_talons.txt -text svneol=native#text/plain -res/cardsfolder/lightwielder_paladin.txt -text svneol=native#text/plain -res/cardsfolder/lignify.txt -text svneol=native#text/plain -res/cardsfolder/liliana_vess.txt -text svneol=native#text/plain -res/cardsfolder/lilianas_caress.txt -text svneol=native#text/plain -res/cardsfolder/lilianas_specter.txt -text svneol=native#text/plain -res/cardsfolder/lilting_refrain.txt -text svneol=native#text/plain -res/cardsfolder/lim_dul_the_necromancer.txt -text svneol=native#text/plain -res/cardsfolder/lim_duls_cohort.txt svneol=native#text/plain -res/cardsfolder/lim_duls_high_guard.txt -text svneol=native#text/plain -res/cardsfolder/limestone_golem.txt -text svneol=native#text/plain -res/cardsfolder/lin_sivvi_defiant_hero.txt -text svneol=native#text/plain -res/cardsfolder/lingering_death.txt svneol=native#text/plain -res/cardsfolder/lingering_mirage.txt -text svneol=native#text/plain -res/cardsfolder/lingering_tormentor.txt -text svneol=native#text/plain -res/cardsfolder/linvala_keeper_of_silence.txt -text svneol=native#text/plain -res/cardsfolder/lionheart_maverick.txt -text svneol=native#text/plain -res/cardsfolder/liquify.txt -text svneol=native#text/plain -res/cardsfolder/liquimetal_coating.txt -text svneol=native#text/plain -res/cardsfolder/lithatog.txt -text svneol=native#text/plain -res/cardsfolder/liu_bei_lord_of_shu.txt -text svneol=native#text/plain -res/cardsfolder/living_airship.txt -text svneol=native#text/plain -res/cardsfolder/living_armor.txt -text svneol=native#text/plain -res/cardsfolder/living_artifact.txt -text svneol=native#text/plain -res/cardsfolder/living_death.txt -text svneol=native#text/plain -res/cardsfolder/living_hive.txt svneol=native#text/plain -res/cardsfolder/living_lands.txt svneol=native#text/plain -res/cardsfolder/living_plane.txt svneol=native#text/plain -res/cardsfolder/living_wall.txt -text svneol=native#text/plain -res/cardsfolder/livonya_silone.txt -text svneol=native#text/plain -res/cardsfolder/lizard_warrior.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_augur.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_dead.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_druid.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_elite.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_elves.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_empath.txt svneol=native#text/plain -res/cardsfolder/llanowar_knight.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_mentor.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/llanowar_wastes.txt -text svneol=native#text/plain -res/cardsfolder/loam_dweller.txt -text svneol=native#text/plain -res/cardsfolder/loam_lion.txt -text svneol=native#text/plain -res/cardsfolder/loamdragger_giant.txt -text svneol=native#text/plain -res/cardsfolder/lobotomy.txt -text svneol=native#text/plain -res/cardsfolder/loch_korrigan.txt -text svneol=native#text/plain -res/cardsfolder/lockjaw_snapper.txt -text svneol=native#text/plain -res/cardsfolder/locust_miser.txt -text svneol=native#text/plain -res/cardsfolder/locust_swarm.txt -text svneol=native#text/plain -res/cardsfolder/lodestone_bauble.txt -text svneol=native#text/plain -res/cardsfolder/lodestone_golem.txt -text svneol=native#text/plain -res/cardsfolder/lodestone_myr.txt -text svneol=native#text/plain -res/cardsfolder/lone_missionary.txt -text svneol=native#text/plain -res/cardsfolder/lonely_sandbar.txt -text svneol=native#text/plain -res/cardsfolder/long_forgotten_gohei.txt -text svneol=native#text/plain -res/cardsfolder/long_term_plans.txt -text svneol=native#text/plain -res/cardsfolder/longbow_archer.txt -text svneol=native#text/plain -res/cardsfolder/looming_hoverguard.txt -text svneol=native#text/plain -res/cardsfolder/looming_shade.txt -text svneol=native#text/plain -res/cardsfolder/looter_il_kor.txt svneol=native#text/plain -res/cardsfolder/lord_magnus.txt -text svneol=native#text/plain -res/cardsfolder/lord_of_atlantis.txt -text svneol=native#text/plain -res/cardsfolder/lord_of_extinction.txt -text svneol=native#text/plain -res/cardsfolder/lord_of_shatterskull_pass.txt svneol=native#text/plain -res/cardsfolder/lord_of_the_pit.txt -text svneol=native#text/plain -res/cardsfolder/lord_of_the_undead.txt -text svneol=native#text/plain -res/cardsfolder/lord_of_tresserhorn.txt -text svneol=native#text/plain -res/cardsfolder/lore_broker.txt svneol=native#text/plain -res/cardsfolder/lorescale_coatl.txt -text svneol=native#text/plain -res/cardsfolder/lorthos_the_tidemaker.txt -text svneol=native#text/plain -res/cardsfolder/lose_hope.txt -text svneol=native#text/plain -res/cardsfolder/lost_auramancers.txt -text svneol=native#text/plain -res/cardsfolder/lost_hours.txt svneol=native#text/plain -res/cardsfolder/lost_leonin.txt svneol=native#text/plain -res/cardsfolder/lost_soul.txt -text svneol=native#text/plain -res/cardsfolder/lotus_bloom.txt -text svneol=native#text/plain -res/cardsfolder/lotus_blossom.txt -text svneol=native#text/plain -res/cardsfolder/lotus_cobra.txt -text svneol=native#text/plain -res/cardsfolder/lotus_guardian.txt -text svneol=native#text/plain -res/cardsfolder/lotus_petal.txt -text svneol=native#text/plain -res/cardsfolder/lotus_vale.txt -text svneol=native#text/plain -res/cardsfolder/lovisa_coldeyes.txt -text svneol=native#text/plain -res/cardsfolder/lowland_giant.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_anchorite.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_convert.txt svneol=native#text/plain -res/cardsfolder/loxodon_gatekeeper.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_hierarch.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_mender.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_mystic.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_partisan.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_punisher.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_stalwart.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_warhammer.txt -text svneol=native#text/plain -res/cardsfolder/loxodon_wayfarer.txt -text svneol=native#text/plain -res/cardsfolder/loyal_retainers.txt -text svneol=native#text/plain -res/cardsfolder/loyal_sentry.txt -text svneol=native#text/plain -res/cardsfolder/lu_bu_master_at_arms.txt -text svneol=native#text/plain -res/cardsfolder/lu_meng_wu_general.txt -text svneol=native#text/plain -res/cardsfolder/lu_su_wu_advisor.txt -text svneol=native#text/plain -res/cardsfolder/lu_xun_scholar_general.txt -text svneol=native#text/plain -res/cardsfolder/lucent_liminid.txt -text svneol=native#text/plain -res/cardsfolder/lull.txt -text svneol=native#text/plain -res/cardsfolder/lumbering_satyr.txt -text svneol=native#text/plain -res/cardsfolder/lumengrid_drake.txt -text svneol=native#text/plain -res/cardsfolder/lumengrid_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/lumengrid_warden.txt -text svneol=native#text/plain -res/cardsfolder/luminous_angel.txt -text svneol=native#text/plain -res/cardsfolder/luminous_wake.txt svneol=native#text/plain -res/cardsfolder/lunar_avenger.txt -text svneol=native#text/plain -res/cardsfolder/lunge.txt -text svneol=native#text/plain -res/cardsfolder/lunk_errant.txt svneol=native#text/plain -res/cardsfolder/lure.txt -text svneol=native#text/plain -res/cardsfolder/lurking_informant.txt -text svneol=native#text/plain -res/cardsfolder/lurking_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/lurking_predators.txt svneol=native#text/plain -res/cardsfolder/lurking_skirge.txt svneol=native#text/plain -res/cardsfolder/lush_growth.txt -text svneol=native#text/plain -res/cardsfolder/lust_for_war.txt svneol=native#text/plain -res/cardsfolder/lux_cannon.txt -text svneol=native#text/plain -res/cardsfolder/lymph_sliver.txt -text svneol=native#text/plain -res/cardsfolder/lynx.txt -text svneol=native#text/plain -res/cardsfolder/lys_alana_bowmaster.txt -text svneol=native#text/plain -res/cardsfolder/lys_alana_huntmaster.txt -text svneol=native#text/plain -res/cardsfolder/lyzolda_the_blood_witch.txt svneol=native#text/plain -res/cardsfolder/ma_chao_western_warrior.txt -text svneol=native#text/plain -res/cardsfolder/macabre_waltz.txt -text svneol=native#text/plain -res/cardsfolder/macetail_hystrodon.txt -text svneol=native#text/plain -res/cardsfolder/machinate.txt -text svneol=native#text/plain -res/cardsfolder/mad_auntie.txt -text svneol=native#text/plain -res/cardsfolder/maddening_wind.txt -text svneol=native#text/plain -res/cardsfolder/madrush_cyclops.txt -text svneol=native#text/plain -res/cardsfolder/maelstrom_nexus.txt -text svneol=native#text/plain -res/cardsfolder/maelstrom_pulse.txt -text svneol=native#text/plain -res/cardsfolder/maga_traitor_to_mortals.txt -text svneol=native#text/plain -res/cardsfolder/mage_il_vec.txt -text svneol=native#text/plain -res/cardsfolder/mage_slayer.txt -text svneol=native#text/plain -res/cardsfolder/magefire_wings.txt -text svneol=native#text/plain -res/cardsfolder/mages_guile.txt -text svneol=native#text/plain -res/cardsfolder/mageta_the_lion.txt -text svneol=native#text/plain -res/cardsfolder/magetas_boon.txt -text svneol=native#text/plain -res/cardsfolder/maggot_carrier.txt -text svneol=native#text/plain -res/cardsfolder/maggot_therapy.txt -text svneol=native#text/plain -res/cardsfolder/magister_sphinx.txt svneol=native#text/plain -res/cardsfolder/magistrates_scepter.txt -text svneol=native#text/plain -res/cardsfolder/magistrates_veto.txt -text svneol=native#text/plain -res/cardsfolder/magma_giant.txt -text svneol=native#text/plain -res/cardsfolder/magma_jet.txt -text svneol=native#text/plain -res/cardsfolder/magma_mine.txt -text svneol=native#text/plain -res/cardsfolder/magma_phoenix.txt svneol=native#text/plain -res/cardsfolder/magma_rift.txt -text svneol=native#text/plain -res/cardsfolder/magma_sliver.txt svneol=native#text/plain -res/cardsfolder/magma_spray.txt -text svneol=native#text/plain -res/cardsfolder/magma_vein.txt -text svneol=native#text/plain -res/cardsfolder/magmaw.txt svneol=native#text/plain -res/cardsfolder/magnetic_flux.txt -text svneol=native#text/plain -res/cardsfolder/magnetic_mine.txt -text svneol=native#text/plain -res/cardsfolder/magnify.txt -text svneol=native#text/plain -res/cardsfolder/magnigoth_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/magnivore.txt -text svneol=native#text/plain -res/cardsfolder/magosi_the_waterveil.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_abyss.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_bazaar.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_candelabra.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_coffers.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_disk.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_library.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_moat.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_moon.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_tabernacle.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_unseen.txt -text svneol=native#text/plain -res/cardsfolder/magus_of_the_vineyard.txt -text svneol=native#text/plain -res/cardsfolder/mahamoti_djinn.txt -text svneol=native#text/plain -res/cardsfolder/major_teroh.txt -text svneol=native#text/plain -res/cardsfolder/makindi_griffin.txt -text svneol=native#text/plain -res/cardsfolder/makindi_shieldmate.txt -text svneol=native#text/plain -res/cardsfolder/malach_of_the_dawn.txt -text svneol=native#text/plain -res/cardsfolder/malachite_golem.txt -text svneol=native#text/plain -res/cardsfolder/malachite_talisman.txt -text svneol=native#text/plain -res/cardsfolder/malakir_bloodwitch.txt -text svneol=native#text/plain -res/cardsfolder/malevolent_awakening.txt -text svneol=native#text/plain -res/cardsfolder/malicious_advice.txt -text svneol=native#text/plain -res/cardsfolder/malignant_growth.txt svneol=native#text/plain -res/cardsfolder/mammoth_umbra.txt -text svneol=native#text/plain -res/cardsfolder/man_o_war.txt -text svneol=native#text/plain -res/cardsfolder/mana_breach.txt -text svneol=native#text/plain -res/cardsfolder/mana_crypt.txt -text svneol=native#text/plain -res/cardsfolder/mana_cylix.txt -text svneol=native#text/plain -res/cardsfolder/mana_drain.txt -text svneol=native#text/plain -res/cardsfolder/mana_geyser.txt svneol=native#text/plain -res/cardsfolder/mana_leak.txt -text svneol=native#text/plain -res/cardsfolder/mana_matrix.txt -text svneol=native#text/plain -res/cardsfolder/mana_prism.txt -text svneol=native#text/plain -res/cardsfolder/mana_severance.txt -text svneol=native#text/plain -res/cardsfolder/mana_short.txt -text svneol=native#text/plain -res/cardsfolder/mana_tithe.txt -text svneol=native#text/plain -res/cardsfolder/mana_vault.txt -text svneol=native#text/plain -res/cardsfolder/mana_vortex.txt -text svneol=native#text/plain -res/cardsfolder/manabarbs.txt -text svneol=native#text/plain -res/cardsfolder/manabond.txt -text svneol=native#text/plain -res/cardsfolder/manacles_of_decay.txt -text svneol=native#text/plain -res/cardsfolder/manaforce_mace.txt -text svneol=native#text/plain -res/cardsfolder/manakin.txt -text svneol=native#text/plain -res/cardsfolder/manaplasm.txt -text svneol=native#text/plain -res/cardsfolder/mangara_of_corondor.txt -text svneol=native#text/plain -res/cardsfolder/maniacal_rage.txt -text svneol=native#text/plain -res/cardsfolder/manic_vandal.txt -text svneol=native#text/plain -res/cardsfolder/manipulate_fate.txt -text svneol=native#text/plain -res/cardsfolder/mannichi_the_fevered_dream.txt -text svneol=native#text/plain -res/cardsfolder/manta_ray.txt -text svneol=native#text/plain -res/cardsfolder/manta_riders.txt -text svneol=native#text/plain -res/cardsfolder/mantis_engine.txt -text svneol=native#text/plain -res/cardsfolder/mantle_of_leadership.txt svneol=native#text/plain -res/cardsfolder/marauding_knight.txt -text svneol=native#text/plain -res/cardsfolder/maraxus_of_keld.txt -text svneol=native#text/plain -res/cardsfolder/marble_chalice.txt -text svneol=native#text/plain -res/cardsfolder/marble_diamond.txt -text svneol=native#text/plain -res/cardsfolder/marble_titan.txt -text svneol=native#text/plain -res/cardsfolder/march_of_souls.txt -text svneol=native#text/plain -res/cardsfolder/march_of_the_machines.txt svneol=native#text/plain -res/cardsfolder/marhault_elsdragon.txt -text svneol=native#text/plain -res/cardsfolder/marisis_twinclaws.txt -text svneol=native#text/plain -res/cardsfolder/maritime_guard.txt -text svneol=native#text/plain -res/cardsfolder/marjhan.txt -text svneol=native#text/plain -res/cardsfolder/mark_of_asylum.txt -text svneol=native#text/plain -res/cardsfolder/mark_of_fury.txt svneol=native#text/plain -res/cardsfolder/mark_of_mutiny.txt -text svneol=native#text/plain -res/cardsfolder/mark_of_the_oni.txt -text svneol=native#text/plain -res/cardsfolder/marker_beetles.txt -text svneol=native#text/plain -res/cardsfolder/maro.txt -text svneol=native#text/plain -res/cardsfolder/marrow_gnawer.txt -text svneol=native#text/plain -res/cardsfolder/marrow_shards.txt svneol=native#text/plain -res/cardsfolder/marsh_boa.txt -text svneol=native#text/plain -res/cardsfolder/marsh_crocodile.txt -text svneol=native#text/plain -res/cardsfolder/marsh_flats.txt -text svneol=native#text/plain -res/cardsfolder/marsh_gas.txt -text svneol=native#text/plain -res/cardsfolder/marsh_goblins.txt -text svneol=native#text/plain -res/cardsfolder/marsh_lurker.txt -text svneol=native#text/plain -res/cardsfolder/marsh_threader.txt -text svneol=native#text/plain -res/cardsfolder/marsh_viper.txt -text svneol=native#text/plain -res/cardsfolder/marshaling_cry.txt -text svneol=native#text/plain -res/cardsfolder/marshals_anthem.txt -text svneol=native#text/plain -res/cardsfolder/marshdrinker_giant.txt svneol=native#text/plain -res/cardsfolder/martial_coup.txt -text svneol=native#text/plain -res/cardsfolder/marton_stromgald.txt svneol=native#text/plain -res/cardsfolder/martyred_rusalka.txt svneol=native#text/plain -res/cardsfolder/martyrs_tomb.txt -text svneol=native#text/plain -res/cardsfolder/masako_the_humorless.txt -text svneol=native#text/plain -res/cardsfolder/mask_of_intolerance.txt -text svneol=native#text/plain -res/cardsfolder/mask_of_law_and_grace.txt -text svneol=native#text/plain -res/cardsfolder/mask_of_memory.txt -text svneol=native#text/plain -res/cardsfolder/mask_of_riddles.txt -text svneol=native#text/plain -res/cardsfolder/masked_admirers.txt -text svneol=native#text/plain -res/cardsfolder/masked_gorgon.txt -text svneol=native#text/plain -res/cardsfolder/mass_calcify.txt -text svneol=native#text/plain -res/cardsfolder/mass_hysteria.txt -text svneol=native#text/plain -res/cardsfolder/mass_of_ghouls.txt -text svneol=native#text/plain -res/cardsfolder/massacre_wurm.txt -text svneol=native#text/plain -res/cardsfolder/master_decoy.txt -text svneol=native#text/plain -res/cardsfolder/master_healer.txt -text svneol=native#text/plain -res/cardsfolder/master_of_etherium.txt -text svneol=native#text/plain -res/cardsfolder/master_of_the_wild_hunt.txt -text svneol=native#text/plain -res/cardsfolder/master_splicer.txt -text svneol=native#text/plain -res/cardsfolder/master_transmuter.txt -text svneol=native#text/plain -res/cardsfolder/masters_call.txt -text svneol=native#text/plain -res/cardsfolder/masticore.txt -text svneol=native#text/plain -res/cardsfolder/masumaro_first_to_live.txt -text svneol=native#text/plain -res/cardsfolder/matca_rioters.txt -text svneol=native#text/plain -res/cardsfolder/matsu_tribe_birdstalker.txt -text svneol=native#text/plain -res/cardsfolder/matsu_tribe_sniper.txt svneol=native#text/plain -res/cardsfolder/maul_splicer.txt -text svneol=native#text/plain -res/cardsfolder/mawcor.txt -text svneol=native#text/plain -res/cardsfolder/mayael_the_anima.txt -text svneol=native#text/plain -res/cardsfolder/mayaels_aria.txt svneol=native#text/plain -res/cardsfolder/maze_of_ith.txt -text svneol=native#text/plain -res/cardsfolder/maze_of_shadows.txt -text svneol=native#text/plain -res/cardsfolder/meadowboon.txt -text svneol=native#text/plain -res/cardsfolder/meddling_mage.txt -text svneol=native#text/plain -res/cardsfolder/medicine_bag.txt -text svneol=native#text/plain -res/cardsfolder/meditate.txt svneol=native#text/plain -res/cardsfolder/meekstone.txt -text svneol=native#text/plain -res/cardsfolder/megatog.txt -text svneol=native#text/plain -res/cardsfolder/meglonoth.txt -text svneol=native#text/plain -res/cardsfolder/megrim.txt -text svneol=native#text/plain -res/cardsfolder/meishin_the_mind_cage.txt -text svneol=native#text/plain -res/cardsfolder/melancholy.txt -text svneol=native#text/plain -res/cardsfolder/melesse_spirit.txt -text svneol=native#text/plain -res/cardsfolder/meliras_keepers.txt svneol=native#text/plain -res/cardsfolder/meloku_the_clouded_mirror.txt -text svneol=native#text/plain -res/cardsfolder/melt_terrain.txt -text svneol=native#text/plain -res/cardsfolder/meltdown.txt -text svneol=native#text/plain -res/cardsfolder/memnarch.txt -text svneol=native#text/plain -res/cardsfolder/memnite.txt -text svneol=native#text/plain -res/cardsfolder/memory_erosion.txt -text svneol=native#text/plain -res/cardsfolder/memory_lapse.txt -text svneol=native#text/plain -res/cardsfolder/mending_hands.txt svneol=native#text/plain -res/cardsfolder/meng_huo_barbarian_king.txt -text svneol=native#text/plain -res/cardsfolder/meng_huos_horde.txt -text svneol=native#text/plain -res/cardsfolder/mental_discipline.txt -text svneol=native#text/plain -res/cardsfolder/mental_misstep.txt -text svneol=native#text/plain -res/cardsfolder/mental_note.txt -text svneol=native#text/plain -res/cardsfolder/mephidross_vampire.txt -text svneol=native#text/plain -res/cardsfolder/mephitic_ooze.txt -text svneol=native#text/plain -res/cardsfolder/mercenary_informer.txt svneol=native#text/plain -res/cardsfolder/merchant_of_secrets.txt -text svneol=native#text/plain -res/cardsfolder/merchant_scroll.txt -text svneol=native#text/plain -res/cardsfolder/merchant_ship.txt -text svneol=native#text/plain -res/cardsfolder/mercurial_kite.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_assassin.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_looter.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_observer.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_of_the_pearl_trident.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_seastalkers.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_seer.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_skyscout.txt svneol=native#text/plain -res/cardsfolder/merfolk_sovereign.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_thaumaturgist.txt -text svneol=native#text/plain -res/cardsfolder/merfolk_traders.txt svneol=native#text/plain -res/cardsfolder/merieke_ri_berit.txt -text svneol=native#text/plain -res/cardsfolder/merrow_commerce.txt -text svneol=native#text/plain -res/cardsfolder/merrow_grimeblotter.txt -text svneol=native#text/plain -res/cardsfolder/merrow_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/merrow_levitator.txt -text svneol=native#text/plain -res/cardsfolder/merrow_reejerey.txt svneol=native#text/plain -res/cardsfolder/merrow_wavebreakers.txt -text svneol=native#text/plain -res/cardsfolder/merrow_witsniper.txt svneol=native#text/plain -res/cardsfolder/mesa_enchantress.txt -text svneol=native#text/plain -res/cardsfolder/mesa_falcon.txt -text svneol=native#text/plain -res/cardsfolder/mesmeric_orb.txt -text svneol=native#text/plain -res/cardsfolder/mesmeric_trance.txt -text svneol=native#text/plain -res/cardsfolder/messenger_falcons.txt -text svneol=native#text/plain -res/cardsfolder/metal_fatigue.txt -text svneol=native#text/plain -res/cardsfolder/metallic_mastery.txt -text svneol=native#text/plain -res/cardsfolder/metallic_sliver.txt -text svneol=native#text/plain -res/cardsfolder/metallurgeon.txt -text svneol=native#text/plain -res/cardsfolder/metalworker.txt -text svneol=native#text/plain -res/cardsfolder/metamorphic_wurm.txt -text svneol=native#text/plain -res/cardsfolder/metathran_elite.txt -text svneol=native#text/plain -res/cardsfolder/metathran_soldier.txt -text svneol=native#text/plain -res/cardsfolder/metathran_transport.txt -text svneol=native#text/plain -res/cardsfolder/metathran_zombie.txt -text svneol=native#text/plain -res/cardsfolder/meteor_crater.txt -text svneol=native#text/plain -res/cardsfolder/meteor_storm.txt -text svneol=native#text/plain -res/cardsfolder/midnight_banshee.txt -text svneol=native#text/plain -res/cardsfolder/midnight_covenant.txt -text svneol=native#text/plain -res/cardsfolder/midsummer_revel.txt -text svneol=native#text/plain -res/cardsfolder/might_of_alara.txt -text svneol=native#text/plain -res/cardsfolder/might_of_oaks.txt -text svneol=native#text/plain -res/cardsfolder/might_of_the_masses.txt -text svneol=native#text/plain -res/cardsfolder/might_sliver.txt -text svneol=native#text/plain -res/cardsfolder/might_weaver.txt -text svneol=native#text/plain -res/cardsfolder/mightstone.txt -text svneol=native#text/plain -res/cardsfolder/mighty_emergence.txt -text svneol=native#text/plain -res/cardsfolder/mighty_leap.txt -text svneol=native#text/plain -res/cardsfolder/mijae_djinn.txt -text svneol=native#text/plain -res/cardsfolder/mikokoro_center_of_the_sea.txt -text svneol=native#text/plain -res/cardsfolder/militant_monk.txt svneol=native#text/plain -res/cardsfolder/millikin.txt svneol=native#text/plain -res/cardsfolder/millstone.txt -text svneol=native#text/plain -res/cardsfolder/minamo_school_at_waters_edge.txt -text svneol=native#text/plain -res/cardsfolder/minamo_scrollkeeper.txt -text svneol=native#text/plain -res/cardsfolder/minamo_sightbender.txt -text svneol=native#text/plain -res/cardsfolder/mind_burst.txt -text svneol=native#text/plain -res/cardsfolder/mind_control.txt -text svneol=native#text/plain -res/cardsfolder/mind_funeral.txt -text svneol=native#text/plain -res/cardsfolder/mind_games.txt -text svneol=native#text/plain -res/cardsfolder/mind_harness.txt -text svneol=native#text/plain -res/cardsfolder/mind_knives.txt -text svneol=native#text/plain -res/cardsfolder/mind_over_matter.txt -text svneol=native#text/plain -res/cardsfolder/mind_peel.txt -text svneol=native#text/plain -res/cardsfolder/mind_ravel.txt -text svneol=native#text/plain -res/cardsfolder/mind_rot.txt -text svneol=native#text/plain -res/cardsfolder/mind_shatter.txt -text svneol=native#text/plain -res/cardsfolder/mind_slash.txt -text svneol=native#text/plain -res/cardsfolder/mind_sludge.txt -text svneol=native#text/plain -res/cardsfolder/mind_spring.txt -text svneol=native#text/plain -res/cardsfolder/mind_stone.txt -text svneol=native#text/plain -res/cardsfolder/mind_swords.txt -text svneol=native#text/plain -res/cardsfolder/mind_twist.txt -text svneol=native#text/plain -res/cardsfolder/mind_warp.txt -text svneol=native#text/plain -res/cardsfolder/mindcrank.txt svneol=native#text/plain -res/cardsfolder/mindculling.txt svneol=native#text/plain -res/cardsfolder/mindlash_sliver.txt svneol=native#text/plain -res/cardsfolder/mindless_automaton.txt -text svneol=native#text/plain -res/cardsfolder/minds_desire.txt -text svneol=native#text/plain -res/cardsfolder/minds_eye.txt -text svneol=native#text/plain -res/cardsfolder/mindslicer.txt svneol=native#text/plain -res/cardsfolder/mindstab.txt -text svneol=native#text/plain -res/cardsfolder/mindstab_thrull.txt svneol=native#text/plain -res/cardsfolder/mindwarper.txt -text svneol=native#text/plain -res/cardsfolder/mindwhip_sliver.txt svneol=native#text/plain -res/cardsfolder/mindwrack_liege.txt -text svneol=native#text/plain -res/cardsfolder/mine_bearer.txt svneol=native#text/plain -res/cardsfolder/minion_of_tevesh_szat.txt svneol=native#text/plain -res/cardsfolder/minions_murmurs.txt svneol=native#text/plain -res/cardsfolder/minister_of_impediments.txt -text svneol=native#text/plain -res/cardsfolder/minotaur_explorer.txt -text svneol=native#text/plain -res/cardsfolder/minotaur_illusionist.txt -text svneol=native#text/plain -res/cardsfolder/minotaur_tactician.txt -text svneol=native#text/plain -res/cardsfolder/minotaur_warrior.txt -text svneol=native#text/plain -res/cardsfolder/miraculous_recovery.txt svneol=native#text/plain -res/cardsfolder/mirari.txt -text svneol=native#text/plain -res/cardsfolder/miraris_wake.txt -text svneol=native#text/plain -res/cardsfolder/mire_blight.txt -text svneol=native#text/plain -res/cardsfolder/mire_boa.txt -text svneol=native#text/plain -res/cardsfolder/mire_kavu.txt -text svneol=native#text/plain -res/cardsfolder/mire_shade.txt -text svneol=native#text/plain -res/cardsfolder/miren_the_moaning_well.txt -text svneol=native#text/plain -res/cardsfolder/mirozel.txt -text svneol=native#text/plain -res/cardsfolder/mirran_crusader.txt -text svneol=native#text/plain -res/cardsfolder/mirran_mettle.txt -text svneol=native#text/plain -res/cardsfolder/mirran_spy.txt -text svneol=native#text/plain -res/cardsfolder/mirri_cat_warrior.txt -text svneol=native#text/plain -res/cardsfolder/mirri_the_cursed.txt -text svneol=native#text/plain -res/cardsfolder/mirris_guile.txt svneol=native#text/plain -res/cardsfolder/mirrodins_core.txt svneol=native#text/plain -res/cardsfolder/mirror_entity.txt -text svneol=native#text/plain -res/cardsfolder/mirror_gallery.txt -text svneol=native#text/plain -res/cardsfolder/mirror_sigil_sergeant.txt -text svneol=native#text/plain -res/cardsfolder/mirror_universe.txt -text svneol=native#text/plain -res/cardsfolder/mirror_wall.txt svneol=native#text/plain -res/cardsfolder/mirrorworks.txt -text svneol=native#text/plain -res/cardsfolder/miscalculation.txt -text svneol=native#text/plain -res/cardsfolder/mischievous_poltergeist.txt -text svneol=native#text/plain -res/cardsfolder/misers_cage.txt svneol=native#text/plain -res/cardsfolder/misery_charm.txt -text svneol=native#text/plain -res/cardsfolder/misfortunes_gain.txt -text svneol=native#text/plain -res/cardsfolder/misguided_rage.txt -text svneol=native#text/plain -res/cardsfolder/mishra_artificer_prodigy.txt -text svneol=native#text/plain -res/cardsfolder/mishras_factory.txt -text svneol=native#text/plain -res/cardsfolder/mishras_groundbreaker.txt svneol=native#text/plain -res/cardsfolder/mishras_helix.txt -text svneol=native#text/plain -res/cardsfolder/misinformation.txt -text svneol=native#text/plain -res/cardsfolder/misshapen_fiend.txt -text svneol=native#text/plain -res/cardsfolder/mist_leopard.txt -text svneol=native#text/plain -res/cardsfolder/mistbind_clique.txt -text svneol=native#text/plain -res/cardsfolder/mistblade_shinobi.txt svneol=native#text/plain -res/cardsfolder/mistfolk.txt -text svneol=native#text/plain -res/cardsfolder/mistform_dreamer.txt svneol=native#text/plain -res/cardsfolder/mistform_mutant.txt svneol=native#text/plain -res/cardsfolder/mistform_shrieker.txt svneol=native#text/plain -res/cardsfolder/mistform_skyreaver.txt svneol=native#text/plain -res/cardsfolder/mistform_stalker.txt svneol=native#text/plain -res/cardsfolder/mistform_ultimus.txt -text svneol=native#text/plain -res/cardsfolder/mistmeadow_skulk.txt -text svneol=native#text/plain -res/cardsfolder/mistral_charger.txt -text svneol=native#text/plain -res/cardsfolder/mistveil_plains.txt -text svneol=native#text/plain -res/cardsfolder/mistvein_borderpost.txt -text svneol=native#text/plain -res/cardsfolder/misty_rainforest.txt -text svneol=native#text/plain -res/cardsfolder/mitotic_manipulation.txt svneol=native#text/plain -res/cardsfolder/mitotic_slime.txt svneol=native#text/plain -res/cardsfolder/mnemonic_nexus.txt -text svneol=native#text/plain -res/cardsfolder/mnemonic_sliver.txt svneol=native#text/plain -res/cardsfolder/mnemonic_wall.txt -text svneol=native#text/plain -res/cardsfolder/moaning_spirit.txt -text svneol=native#text/plain -res/cardsfolder/moat.txt -text svneol=native#text/plain -res/cardsfolder/mob_justice.txt -text svneol=native#text/plain -res/cardsfolder/mobile_fort.txt -text svneol=native#text/plain -res/cardsfolder/mobilization.txt -text svneol=native#text/plain -res/cardsfolder/mobilize.txt -text svneol=native#text/plain -res/cardsfolder/mogg_alarm.txt -text svneol=native#text/plain -res/cardsfolder/mogg_fanatic.txt -text svneol=native#text/plain -res/cardsfolder/mogg_hollows.txt -text svneol=native#text/plain -res/cardsfolder/mogg_jailer.txt -text svneol=native#text/plain -res/cardsfolder/mogg_maniac.txt svneol=native#text/plain -res/cardsfolder/mogg_raider.txt -text svneol=native#text/plain -res/cardsfolder/mogg_sentry.txt -text svneol=native#text/plain -res/cardsfolder/mogg_squad.txt -text svneol=native#text/plain -res/cardsfolder/mogg_war_marshal.txt -text svneol=native#text/plain -res/cardsfolder/moggcatcher.txt -text svneol=native#text/plain -res/cardsfolder/mold_adder.txt -text svneol=native#text/plain -res/cardsfolder/mold_shambler.txt svneol=native#text/plain -res/cardsfolder/molder_beast.txt -text svneol=native#text/plain -res/cardsfolder/molder_slug.txt -text svneol=native#text/plain -res/cardsfolder/moldervine_cloak.txt -text svneol=native#text/plain -res/cardsfolder/molimo_maro_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/molten_frame.txt -text svneol=native#text/plain -res/cardsfolder/molten_hydra.txt -text svneol=native#text/plain -res/cardsfolder/molten_psyche.txt -text svneol=native#text/plain -res/cardsfolder/molten_rain.txt -text svneol=native#text/plain -res/cardsfolder/molten_ravager.txt -text svneol=native#text/plain -res/cardsfolder/molten_slagheap.txt -text svneol=native#text/plain -res/cardsfolder/moltensteel_dragon.txt -text svneol=native#text/plain -res/cardsfolder/molting_harpy.txt -text svneol=native#text/plain -res/cardsfolder/molting_skin.txt -text svneol=native#text/plain -res/cardsfolder/momentary_blink.txt -text svneol=native#text/plain -res/cardsfolder/momentous_fall.txt -text svneol=native#text/plain -res/cardsfolder/moments_peace.txt -text svneol=native#text/plain -res/cardsfolder/momentum.txt -text svneol=native#text/plain -res/cardsfolder/momir_vig_simic_visionary.txt svneol=native#text/plain -res/cardsfolder/mongrel_pack.txt -text svneol=native#text/plain -res/cardsfolder/monk_idealist.txt -text svneol=native#text/plain -res/cardsfolder/monk_realist.txt -text svneol=native#text/plain -res/cardsfolder/monss_goblin_raiders.txt -text svneol=native#text/plain -res/cardsfolder/monstrify.txt -text svneol=native#text/plain -res/cardsfolder/monstrous_carabid.txt -text svneol=native#text/plain -res/cardsfolder/monstrous_growth.txt -text svneol=native#text/plain -res/cardsfolder/monstrous_hound.txt svneol=native#text/plain -res/cardsfolder/moon_sprite.txt -text svneol=native#text/plain -res/cardsfolder/moonglove_changeling.txt -text svneol=native#text/plain -res/cardsfolder/moonglove_extract.txt -text svneol=native#text/plain -res/cardsfolder/moonglove_winnower.txt -text svneol=native#text/plain -res/cardsfolder/moonlit_strider.txt -text svneol=native#text/plain -res/cardsfolder/moonlit_wake.txt -text svneol=native#text/plain -res/cardsfolder/moonwing_moth.txt -text svneol=native#text/plain -res/cardsfolder/moor_fiend.txt -text svneol=native#text/plain -res/cardsfolder/moorish_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/morale.txt svneol=native#text/plain -res/cardsfolder/morbid_bloom.txt -text svneol=native#text/plain -res/cardsfolder/morbid_hunger.txt -text svneol=native#text/plain -res/cardsfolder/morbid_plunder.txt -text svneol=native#text/plain -res/cardsfolder/mordant_dragon.txt svneol=native#text/plain -res/cardsfolder/morgue_theft.txt -text svneol=native#text/plain -res/cardsfolder/morgue_thrull.txt svneol=native#text/plain -res/cardsfolder/morgue_toad.txt -text svneol=native#text/plain -res/cardsfolder/moriok_reaver.txt -text svneol=native#text/plain -res/cardsfolder/moriok_replica.txt -text svneol=native#text/plain -res/cardsfolder/moriok_rigger.txt -text svneol=native#text/plain -res/cardsfolder/moriok_scavenger.txt -text svneol=native#text/plain -res/cardsfolder/morningtide.txt -text svneol=native#text/plain -res/cardsfolder/moroii.txt -text svneol=native#text/plain -res/cardsfolder/morphling.txt -text svneol=native#text/plain -res/cardsfolder/morsel_theft.txt -text svneol=native#text/plain -res/cardsfolder/morselhoarder.txt svneol=native#text/plain -res/cardsfolder/mortal_combat.txt -text svneol=native#text/plain -res/cardsfolder/mortal_wound.txt -text svneol=native#text/plain -res/cardsfolder/mortarpod.txt -text svneol=native#text/plain -res/cardsfolder/mortician_beetle.txt svneol=native#text/plain -res/cardsfolder/mortify.txt -text svneol=native#text/plain -res/cardsfolder/mortipede.txt -text svneol=native#text/plain -res/cardsfolder/mortiphobia.txt -text svneol=native#text/plain -res/cardsfolder/mortis_dogs.txt svneol=native#text/plain -res/cardsfolder/mortivore.txt -text svneol=native#text/plain -res/cardsfolder/mortuary.txt -text svneol=native#text/plain -res/cardsfolder/mosquito_guard.txt -text svneol=native#text/plain -res/cardsfolder/moss_diamond.txt -text svneol=native#text/plain -res/cardsfolder/moss_kami.txt -text svneol=native#text/plain -res/cardsfolder/moss_monster.txt -text svneol=native#text/plain -res/cardsfolder/mossdog.txt svneol=native#text/plain -res/cardsfolder/mossfire_egg.txt -text svneol=native#text/plain -res/cardsfolder/mossfire_valley.txt -text svneol=native#text/plain -res/cardsfolder/mosstodon.txt svneol=native#text/plain -res/cardsfolder/mother_of_runes.txt -text svneol=native#text/plain -res/cardsfolder/mothrider_samurai.txt -text svneol=native#text/plain -res/cardsfolder/mountain.txt -text svneol=native#text/plain -res/cardsfolder/mountain_bandit.txt -text svneol=native#text/plain -res/cardsfolder/mountain_goat.txt -text svneol=native#text/plain -res/cardsfolder/mountain_valley.txt -text svneol=native#text/plain -res/cardsfolder/mountain_yeti.txt -text svneol=native#text/plain -res/cardsfolder/mournful_zombie.txt -text svneol=native#text/plain -res/cardsfolder/mourning.txt -text svneol=native#text/plain -res/cardsfolder/mourning_thrull.txt -text svneol=native#text/plain -res/cardsfolder/mournwhelk.txt -text svneol=native#text/plain -res/cardsfolder/mouth_of_ronom.txt -text svneol=native#text/plain -res/cardsfolder/mox_diamond.txt -text svneol=native#text/plain -res/cardsfolder/mox_emerald.txt -text svneol=native#text/plain -res/cardsfolder/mox_jet.txt -text svneol=native#text/plain -res/cardsfolder/mox_opal.txt -text svneol=native#text/plain -res/cardsfolder/mox_pearl.txt -text svneol=native#text/plain -res/cardsfolder/mox_ruby.txt -text svneol=native#text/plain -res/cardsfolder/mox_sapphire.txt -text svneol=native#text/plain -res/cardsfolder/mtenda_griffin.txt svneol=native#text/plain -res/cardsfolder/mtenda_herder.txt -text svneol=native#text/plain -res/cardsfolder/muck_rats.txt -text svneol=native#text/plain -res/cardsfolder/mudbrawler_cohort.txt -text svneol=native#text/plain -res/cardsfolder/mudbrawler_raiders.txt -text svneol=native#text/plain -res/cardsfolder/mudbutton_clanger.txt -text svneol=native#text/plain -res/cardsfolder/mudbutton_torchrunner.txt -text svneol=native#text/plain -res/cardsfolder/muddle_the_mixture.txt -text svneol=native#text/plain -res/cardsfolder/mul_daya_channelers.txt -text svneol=native#text/plain -res/cardsfolder/mulch.txt svneol=native#text/plain -res/cardsfolder/mulldrifter.txt -text svneol=native#text/plain -res/cardsfolder/multani_maro_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/multanis_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/multanis_decree.txt -text svneol=native#text/plain -res/cardsfolder/mungha_wurm.txt -text svneol=native#text/plain -res/cardsfolder/muraganda_petroglyphs.txt -text svneol=native#text/plain -res/cardsfolder/murasa_pyromancer.txt -text svneol=native#text/plain -res/cardsfolder/murderous_redcap.txt -text svneol=native#text/plain -res/cardsfolder/murk_dwellers.txt svneol=native#text/plain -res/cardsfolder/murkfiend_liege.txt -text svneol=native#text/plain -res/cardsfolder/murmuring_bosk.txt -text svneol=native#text/plain -res/cardsfolder/muscle_burst.txt -text svneol=native#text/plain -res/cardsfolder/muscle_sliver.txt -text svneol=native#text/plain -res/cardsfolder/mutagenic_growth.txt svneol=native#text/plain -res/cardsfolder/mutavault.txt -text svneol=native#text/plain -res/cardsfolder/mutilate.txt -text svneol=native#text/plain -res/cardsfolder/muzzle.txt -text svneol=native#text/plain -res/cardsfolder/mwonvuli_acid_moss.txt -text svneol=native#text/plain -res/cardsfolder/mwonvuli_ooze.txt -text svneol=native#text/plain -res/cardsfolder/mycoid_shepherd.txt -text svneol=native#text/plain -res/cardsfolder/mycologist.txt -text svneol=native#text/plain -res/cardsfolder/mycoloth.txt -text svneol=native#text/plain -res/cardsfolder/mycosynth_fiend.txt svneol=native#text/plain -res/cardsfolder/mycosynth_golem.txt -text svneol=native#text/plain -res/cardsfolder/mycosynth_wellspring.txt -text svneol=native#text/plain -res/cardsfolder/myr_adapter.txt -text svneol=native#text/plain -res/cardsfolder/myr_enforcer.txt -text svneol=native#text/plain -res/cardsfolder/myr_galvanizer.txt -text svneol=native#text/plain -res/cardsfolder/myr_landshaper.txt -text svneol=native#text/plain -res/cardsfolder/myr_matrix.txt -text svneol=native#text/plain -res/cardsfolder/myr_moonvessel.txt -text svneol=native#text/plain -res/cardsfolder/myr_propagator.txt svneol=native#text/plain -res/cardsfolder/myr_quadropod.txt -text svneol=native#text/plain -res/cardsfolder/myr_retriever.txt -text svneol=native#text/plain -res/cardsfolder/myr_sire.txt -text svneol=native#text/plain -res/cardsfolder/myr_turbine.txt -text svneol=native#text/plain -res/cardsfolder/myrsmith.txt -text svneol=native#text/plain -res/cardsfolder/mystic_crusader.txt -text svneol=native#text/plain -res/cardsfolder/mystic_denial.txt -text svneol=native#text/plain -res/cardsfolder/mystic_enforcer.txt -text svneol=native#text/plain -res/cardsfolder/mystic_familiar.txt -text svneol=native#text/plain -res/cardsfolder/mystic_gate.txt -text svneol=native#text/plain -res/cardsfolder/mystic_melting.txt -text svneol=native#text/plain -res/cardsfolder/mystic_penitent.txt -text svneol=native#text/plain -res/cardsfolder/mystic_restraints.txt -text svneol=native#text/plain -res/cardsfolder/mystic_snake.txt -text svneol=native#text/plain -res/cardsfolder/mystic_speculation.txt -text svneol=native#text/plain -res/cardsfolder/mystic_visionary.txt -text svneol=native#text/plain -res/cardsfolder/mystic_zealot.txt -text svneol=native#text/plain -res/cardsfolder/mystical_tutor.txt -text svneol=native#text/plain -res/cardsfolder/mythic_proportions.txt -text svneol=native#text/plain -res/cardsfolder/nacatl_outlander.txt -text svneol=native#text/plain -res/cardsfolder/nacatl_savage.txt -text svneol=native#text/plain -res/cardsfolder/nacre_talisman.txt -text svneol=native#text/plain -res/cardsfolder/nagao_bound_by_honor.txt svneol=native#text/plain -res/cardsfolder/nameless_inversion.txt -text svneol=native#text/plain -res/cardsfolder/nameless_one.txt -text svneol=native#text/plain -res/cardsfolder/nameless_race.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_blightcutter.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_calmer.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_disciple.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_elder.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_husk.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_monastery.txt svneol=native#text/plain -res/cardsfolder/nantuko_shade.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_tracer.txt -text svneol=native#text/plain -res/cardsfolder/nantuko_vigilante.txt svneol=native#text/plain -res/cardsfolder/narcissism.txt -text svneol=native#text/plain -res/cardsfolder/narcolepsy.txt svneol=native#text/plain -res/cardsfolder/narcomoeba.txt svneol=native#text/plain -res/cardsfolder/narrow_escape.txt svneol=native#text/plain -res/cardsfolder/narwhal.txt -text svneol=native#text/plain -res/cardsfolder/nath_of_the_gilt_leaf.txt -text svneol=native#text/plain -res/cardsfolder/naths_buffoon.txt -text svneol=native#text/plain -res/cardsfolder/naths_elite.txt svneol=native#text/plain -res/cardsfolder/natural_affinity.txt svneol=native#text/plain -res/cardsfolder/natural_order.txt -text svneol=native#text/plain -res/cardsfolder/natural_selection.txt -text svneol=native#text/plain -res/cardsfolder/natural_spring.txt -text svneol=native#text/plain -res/cardsfolder/naturalize.txt -text svneol=native#text/plain -res/cardsfolder/natures_chosen.txt -text svneol=native#text/plain -res/cardsfolder/natures_claim.txt -text svneol=native#text/plain -res/cardsfolder/natures_cloak.txt -text svneol=native#text/plain -res/cardsfolder/natures_lore.txt -text svneol=native#text/plain -res/cardsfolder/natures_resurgence.txt -text svneol=native#text/plain -res/cardsfolder/natures_revolt.txt svneol=native#text/plain -res/cardsfolder/natures_ruin.txt -text svneol=native#text/plain -res/cardsfolder/natures_spiral.txt -text svneol=native#text/plain -res/cardsfolder/natures_wrath.txt svneol=native#text/plain -res/cardsfolder/nausea.txt -text svneol=native#text/plain -res/cardsfolder/naya_battlemage.txt -text svneol=native#text/plain -res/cardsfolder/naya_hushblade.txt -text svneol=native#text/plain -res/cardsfolder/naya_panorama.txt -text svneol=native#text/plain -res/cardsfolder/naya_sojourners.txt -text svneol=native#text/plain -res/cardsfolder/near_death_experience.txt -text svneol=native#text/plain -res/cardsfolder/nebuchadnezzar.txt svneol=native#text/plain -res/cardsfolder/neck_snap.txt -text svneol=native#text/plain -res/cardsfolder/necra_disciple.txt svneol=native#text/plain -res/cardsfolder/necratog.txt -text svneol=native#text/plain -res/cardsfolder/necrite.txt -text svneol=native#text/plain -res/cardsfolder/necrogen_censer.txt -text svneol=native#text/plain -res/cardsfolder/necrogen_mists.txt svneol=native#text/plain -res/cardsfolder/necrogen_scudder.txt -text svneol=native#text/plain -res/cardsfolder/necrogen_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/necrogenesis.txt -text svneol=native#text/plain -res/cardsfolder/necromantic_thirst.txt svneol=native#text/plain -res/cardsfolder/necropede.txt -text svneol=native#text/plain -res/cardsfolder/necroplasm.txt svneol=native#text/plain -res/cardsfolder/necropolis.txt svneol=native#text/plain -res/cardsfolder/necropotence.txt -text svneol=native#text/plain -res/cardsfolder/necropouncer.txt svneol=native#text/plain -res/cardsfolder/necrosavant.txt -text svneol=native#text/plain -res/cardsfolder/necroskitter.txt -text svneol=native#text/plain -res/cardsfolder/necrotic_sliver.txt -text svneol=native#text/plain -res/cardsfolder/need_for_speed.txt -text svneol=native#text/plain -res/cardsfolder/needle_specter.txt svneol=native#text/plain -res/cardsfolder/needle_storm.txt -text svneol=native#text/plain -res/cardsfolder/needlebug.txt -text svneol=native#text/plain -res/cardsfolder/needlepeak_spider.txt -text svneol=native#text/plain -res/cardsfolder/needleshot_gourna.txt -text svneol=native#text/plain -res/cardsfolder/nefashu.txt -text svneol=native#text/plain -res/cardsfolder/negate.txt -text svneol=native#text/plain -res/cardsfolder/nekrataal.txt -text svneol=native#text/plain -res/cardsfolder/nema_siltlurker.txt -text svneol=native#text/plain -res/cardsfolder/nemata_grove_guardian.txt -text svneol=native#text/plain -res/cardsfolder/nemesis_mask.txt -text svneol=native#text/plain -res/cardsfolder/nemesis_of_reason.txt -text svneol=native#text/plain -res/cardsfolder/nessian_courser.txt -text svneol=native#text/plain -res/cardsfolder/nest_invader.txt -text svneol=native#text/plain -res/cardsfolder/nested_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/nesting_wurm.txt -text svneol=native#text/plain -res/cardsfolder/nether_horror.txt -text svneol=native#text/plain -res/cardsfolder/nether_spirit.txt -text svneol=native#text/plain -res/cardsfolder/nether_traitor.txt -text svneol=native#text/plain -res/cardsfolder/nether_void.txt -text svneol=native#text/plain -res/cardsfolder/netherborn_phalanx.txt svneol=native#text/plain -res/cardsfolder/netter_en_dal.txt svneol=native#text/plain -res/cardsfolder/nettle_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/nettletooth_djinn.txt -text svneol=native#text/plain -res/cardsfolder/nettling_curse.txt svneol=native#text/plain -res/cardsfolder/neurok_commando.txt -text svneol=native#text/plain -res/cardsfolder/neurok_familiar.txt svneol=native#text/plain -res/cardsfolder/neurok_hoversail.txt -text svneol=native#text/plain -res/cardsfolder/neurok_invisimancer.txt -text svneol=native#text/plain -res/cardsfolder/neurok_prodigy.txt svneol=native#text/plain -res/cardsfolder/neurok_replica.txt svneol=native#text/plain -res/cardsfolder/neurok_spy.txt -text svneol=native#text/plain -res/cardsfolder/nevermaker.txt -text svneol=native#text/plain -res/cardsfolder/nevinyrrals_disk.txt -text svneol=native#text/plain -res/cardsfolder/new_benalia.txt svneol=native#text/plain -res/cardsfolder/nezumi_bone_reader.txt -text svneol=native#text/plain -res/cardsfolder/nezumi_cutthroat.txt -text svneol=native#text/plain -res/cardsfolder/nezumi_ronin.txt -text svneol=native#text/plain -res/cardsfolder/nezumi_shadow_watcher.txt -text svneol=native#text/plain -res/cardsfolder/niall_silvain.txt -text svneol=native#text/plain -res/cardsfolder/nicol_bolas.txt -text svneol=native#text/plain -res/cardsfolder/nicol_bolas_planeswalker.txt -text svneol=native#text/plain -res/cardsfolder/night_of_souls_betrayal.txt -text svneol=native#text/plain -res/cardsfolder/night_soil.txt -text svneol=native#text/plain -res/cardsfolder/nightcreep.txt -text svneol=native#text/plain -res/cardsfolder/nightguard_patrol.txt -text svneol=native#text/plain -res/cardsfolder/nighthaze.txt -text svneol=native#text/plain -res/cardsfolder/nightmare.txt -text svneol=native#text/plain -res/cardsfolder/nightmare_incursion.txt svneol=native#text/plain -res/cardsfolder/nightmare_lash.txt svneol=native#text/plain -res/cardsfolder/nightmare_void.txt -text svneol=native#text/plain -res/cardsfolder/nights_whisper.txt -text svneol=native#text/plain -res/cardsfolder/nightscape_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/nightscape_familiar.txt -text svneol=native#text/plain -res/cardsfolder/nightscape_master.txt -text svneol=native#text/plain -res/cardsfolder/nightshade_schemers.txt -text svneol=native#text/plain -res/cardsfolder/nightshade_stinger.txt -text svneol=native#text/plain -res/cardsfolder/nightsky_mimic.txt -text svneol=native#text/plain -res/cardsfolder/nightsoil_kami.txt -text svneol=native#text/plain -res/cardsfolder/nightstalker_engine.txt -text svneol=native#text/plain -res/cardsfolder/nightwind_glider.txt -text svneol=native#text/plain -res/cardsfolder/nightwing_shade.txt -text svneol=native#text/plain -res/cardsfolder/nihil_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/nihilistic_glee.txt svneol=native#text/plain -res/cardsfolder/nihilith.txt svneol=native#text/plain -res/cardsfolder/nikko_onna.txt -text svneol=native#text/plain -res/cardsfolder/nim_abomination.txt svneol=native#text/plain -res/cardsfolder/nim_devourer.txt svneol=native#text/plain -res/cardsfolder/nim_grotesque.txt -text svneol=native#text/plain -res/cardsfolder/nim_lasher.txt -text svneol=native#text/plain -res/cardsfolder/nim_replica.txt -text svneol=native#text/plain -res/cardsfolder/nim_shambler.txt -text svneol=native#text/plain -res/cardsfolder/nim_shrieker.txt -text svneol=native#text/plain -res/cardsfolder/nimana_sell_sword.txt -text svneol=native#text/plain -res/cardsfolder/nimble_mongoose.txt -text svneol=native#text/plain -res/cardsfolder/nimbus_maze.txt -text svneol=native#text/plain -res/cardsfolder/nimbus_wings.txt -text svneol=native#text/plain -res/cardsfolder/nine_ringed_bo.txt -text svneol=native#text/plain -res/cardsfolder/ninja_of_the_deep_hours.txt svneol=native#text/plain -res/cardsfolder/nip_gwyllion.txt -text svneol=native#text/plain -res/cardsfolder/nirkana_cutthroat.txt -text svneol=native#text/plain -res/cardsfolder/nirkana_revenant.txt -text svneol=native#text/plain -res/cardsfolder/nissa_revane.txt -text svneol=native#text/plain -res/cardsfolder/nissas_chosen.txt -text svneol=native#text/plain -res/cardsfolder/niv_mizzet_the_firemind.txt -text svneol=native#text/plain -res/cardsfolder/niveous_wisps.txt -text svneol=native#text/plain -res/cardsfolder/no_dachi.txt -text svneol=native#text/plain -res/cardsfolder/no_mercy.txt -text svneol=native#text/plain -res/cardsfolder/nobilis_of_war.txt -text svneol=native#text/plain -res/cardsfolder/noble_benefactor.txt svneol=native#text/plain -res/cardsfolder/noble_hierarch.txt -text svneol=native#text/plain -res/cardsfolder/noble_panther.txt -text svneol=native#text/plain -res/cardsfolder/noble_purpose.txt -text svneol=native#text/plain -res/cardsfolder/noble_stand.txt -text svneol=native#text/plain -res/cardsfolder/noble_steeds.txt -text svneol=native#text/plain -res/cardsfolder/noble_templar.txt -text svneol=native#text/plain -res/cardsfolder/noble_vestige.txt svneol=native#text/plain -res/cardsfolder/nocturnal_raid.txt -text svneol=native#text/plain -res/cardsfolder/noggle_bandit.txt -text svneol=native#text/plain -res/cardsfolder/noggle_bridgebreaker.txt -text svneol=native#text/plain -res/cardsfolder/noggle_hedge_mage.txt -text svneol=native#text/plain -res/cardsfolder/noggle_ransacker.txt -text svneol=native#text/plain -res/cardsfolder/nomad_stadium.txt svneol=native#text/plain -res/cardsfolder/nomadic_elf.txt -text svneol=native#text/plain -res/cardsfolder/northern_paladin.txt -text svneol=native#text/plain -res/cardsfolder/norwood_archers.txt -text svneol=native#text/plain -res/cardsfolder/norwood_priestess.txt -text svneol=native#text/plain -res/cardsfolder/norwood_ranger.txt -text svneol=native#text/plain -res/cardsfolder/norwood_riders.txt -text svneol=native#text/plain -res/cardsfolder/norwood_warrior.txt -text svneol=native#text/plain -res/cardsfolder/nosy_goblin.txt -text svneol=native#text/plain -res/cardsfolder/notorious_assassin.txt -text svneol=native#text/plain -res/cardsfolder/nourish.txt -text svneol=native#text/plain -res/cardsfolder/nourishing_shoal.txt -text svneol=native#text/plain -res/cardsfolder/nova_chaser.txt -text svneol=native#text/plain -res/cardsfolder/nova_cleric.txt -text svneol=native#text/plain -res/cardsfolder/novablast_wurm.txt -text svneol=native#text/plain -res/cardsfolder/novijen_heart_of_progress.txt -text svneol=native#text/plain -res/cardsfolder/noxious_field.txt svneol=native#text/plain -res/cardsfolder/noxious_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/noxious_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/noxious_revival.txt svneol=native#text/plain -res/cardsfolder/noxious_toad.txt svneol=native#text/plain -res/cardsfolder/nucklavee.txt -text svneol=native#text/plain -res/cardsfolder/null_brooch.txt -text svneol=native#text/plain -res/cardsfolder/null_champion.txt -text svneol=native#text/plain -res/cardsfolder/null_profusion.txt svneol=native#text/plain -res/cardsfolder/null_rod.txt svneol=native#text/plain -res/cardsfolder/nullmage_advocate.txt svneol=native#text/plain -res/cardsfolder/nullmage_shepherd.txt -text svneol=native#text/plain -res/cardsfolder/nulltread_gargantuan.txt -text svneol=native#text/plain -res/cardsfolder/numai_outcast.txt -text svneol=native#text/plain -res/cardsfolder/numot_the_devastator.txt svneol=native#text/plain -res/cardsfolder/nurturer_initiate.txt svneol=native#text/plain -res/cardsfolder/nut_collector.txt -text svneol=native#text/plain -res/cardsfolder/nyxathid.txt -text svneol=native#text/plain -res/cardsfolder/oaken_brawler.txt svneol=native#text/plain -res/cardsfolder/oakenform.txt -text svneol=native#text/plain -res/cardsfolder/oakgnarl_warrior.txt -text svneol=native#text/plain -res/cardsfolder/oasis.txt svneol=native#text/plain -res/cardsfolder/oath_of_druids.txt -text svneol=native#text/plain -res/cardsfolder/oath_of_ghouls.txt -text svneol=native#text/plain -res/cardsfolder/oathsworn_giant.txt -text svneol=native#text/plain -res/cardsfolder/ob_nixilis_the_fallen.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_alara.txt svneol=native#text/plain -res/cardsfolder/obelisk_of_bant.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_esper.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_grixis.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_jund.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_naya.txt -text svneol=native#text/plain -res/cardsfolder/obelisk_of_undoing.txt -text svneol=native#text/plain -res/cardsfolder/oblation.txt svneol=native#text/plain -res/cardsfolder/obliterate.txt -text svneol=native#text/plain -res/cardsfolder/oblivion_crown.txt -text svneol=native#text/plain -res/cardsfolder/oblivion_ring.txt -text svneol=native#text/plain -res/cardsfolder/oboro_breezecaller.txt -text svneol=native#text/plain -res/cardsfolder/oboro_palace_in_the_clouds.txt -text svneol=native#text/plain -res/cardsfolder/obsessive_search.txt -text svneol=native#text/plain -res/cardsfolder/obsianus_golem.txt -text svneol=native#text/plain -res/cardsfolder/obsidian_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/obsidian_fireheart.txt -text svneol=native#text/plain -res/cardsfolder/obsidian_giant.txt -text svneol=native#text/plain -res/cardsfolder/obstinate_baloth.txt -text svneol=native#text/plain -res/cardsfolder/ocular_halo.txt -text svneol=native#text/plain -res/cardsfolder/oculus.txt -text svneol=native#text/plain -res/cardsfolder/odious_trow.txt -text svneol=native#text/plain -res/cardsfolder/odylic_wraith.txt svneol=native#text/plain -res/cardsfolder/off_balance.txt svneol=native#text/plain -res/cardsfolder/offalsnout.txt -text svneol=native#text/plain -res/cardsfolder/offering_to_asha.txt -text svneol=native#text/plain -res/cardsfolder/ogre_arsonist.txt -text svneol=native#text/plain -res/cardsfolder/ogre_berserker.txt -text svneol=native#text/plain -res/cardsfolder/ogre_gatecrasher.txt -text svneol=native#text/plain -res/cardsfolder/ogre_menial.txt svneol=native#text/plain -res/cardsfolder/ogre_recluse.txt -text svneol=native#text/plain -res/cardsfolder/ogre_resister.txt -text svneol=native#text/plain -res/cardsfolder/ogre_sentry.txt -text svneol=native#text/plain -res/cardsfolder/ogre_shaman.txt -text svneol=native#text/plain -res/cardsfolder/ogre_taskmaster.txt -text svneol=native#text/plain -res/cardsfolder/ogre_warrior.txt -text svneol=native#text/plain -res/cardsfolder/ogres_cleaver.txt -text svneol=native#text/plain -res/cardsfolder/ohran_viper.txt -text svneol=native#text/plain -res/cardsfolder/okiba_gang_shinobi.txt svneol=native#text/plain -res/cardsfolder/okina_temple_to_the_grandfathers.txt -text svneol=native#text/plain -res/cardsfolder/old_ghastbark.txt -text svneol=native#text/plain -res/cardsfolder/old_man_of_the_sea.txt -text svneol=native#text/plain -res/cardsfolder/omega_myr.txt -text svneol=native#text/plain -res/cardsfolder/omen.txt -text svneol=native#text/plain -res/cardsfolder/omen_of_fire.txt svneol=native#text/plain -res/cardsfolder/omnath_locus_of_mana.txt -text svneol=native#text/plain -res/cardsfolder/omnibian.txt svneol=native#text/plain -res/cardsfolder/ondu_cleric.txt -text svneol=native#text/plain -res/cardsfolder/ondu_giant.txt -text svneol=native#text/plain -res/cardsfolder/one_dozen_eyes.txt svneol=native#text/plain -res/cardsfolder/one_with_nature.txt -text svneol=native#text/plain -res/cardsfolder/one_with_nothing.txt -text svneol=native#text/plain -res/cardsfolder/oni_of_wild_places.txt -text svneol=native#text/plain -res/cardsfolder/onslaught.txt -text svneol=native#text/plain -res/cardsfolder/onulet.txt -text svneol=native#text/plain -res/cardsfolder/onyx_goblet.txt -text svneol=native#text/plain -res/cardsfolder/onyx_talisman.txt -text svneol=native#text/plain -res/cardsfolder/oonas_gatewarden.txt -text svneol=native#text/plain -res/cardsfolder/oonas_grace.txt -text svneol=native#text/plain -res/cardsfolder/ooze_garden.txt svneol=native#text/plain -res/cardsfolder/opal_acrolith.txt -text svneol=native#text/plain -res/cardsfolder/opal_archangel.txt svneol=native#text/plain -res/cardsfolder/opal_caryatid.txt -text svneol=native#text/plain -res/cardsfolder/opal_champion.txt svneol=native#text/plain -res/cardsfolder/opal_gargoyle.txt svneol=native#text/plain -res/cardsfolder/opal_guardian.txt svneol=native#text/plain -res/cardsfolder/opalescence.txt svneol=native#text/plain -res/cardsfolder/opaline_bracers.txt -text svneol=native#text/plain -res/cardsfolder/ophidian.txt svneol=native#text/plain -res/cardsfolder/ophidian_eye.txt -text svneol=native#text/plain -res/cardsfolder/opportunist.txt -text svneol=native#text/plain -res/cardsfolder/opportunity.txt -text svneol=native#text/plain -res/cardsfolder/opposition.txt -text svneol=native#text/plain -res/cardsfolder/oppression.txt -text svneol=native#text/plain -res/cardsfolder/oppressive_will.txt -text svneol=native#text/plain -res/cardsfolder/opt.txt -text svneol=native#text/plain -res/cardsfolder/oracle_of_mul_daya.txt -text svneol=native#text/plain -res/cardsfolder/oracle_of_nectars.txt -text svneol=native#text/plain -res/cardsfolder/oran_rief_recluse.txt -text svneol=native#text/plain -res/cardsfolder/oran_rief_survivalist.txt -text svneol=native#text/plain -res/cardsfolder/oran_rief_the_vastwood.txt -text svneol=native#text/plain -res/cardsfolder/oraxid.txt -text svneol=native#text/plain -res/cardsfolder/orb_of_dreams.txt -text svneol=native#text/plain -res/cardsfolder/orbweaver_kumo.txt -text svneol=native#text/plain -res/cardsfolder/orc_general.txt -text svneol=native#text/plain -res/cardsfolder/orchard_warden.txt -text svneol=native#text/plain -res/cardsfolder/orcish_artillery.txt -text svneol=native#text/plain -res/cardsfolder/orcish_bloodpainter.txt -text svneol=native#text/plain -res/cardsfolder/orcish_cannonade.txt -text svneol=native#text/plain -res/cardsfolder/orcish_cannoneers.txt -text svneol=native#text/plain -res/cardsfolder/orcish_captain.txt svneol=native#text/plain -res/cardsfolder/orcish_healer.txt -text svneol=native#text/plain -res/cardsfolder/orcish_lumberjack.txt svneol=native#text/plain -res/cardsfolder/orcish_mechanics.txt -text svneol=native#text/plain -res/cardsfolder/orcish_oriflamme.txt -text svneol=native#text/plain -res/cardsfolder/orcish_settlers.txt -text svneol=native#text/plain -res/cardsfolder/orcish_spy.txt svneol=native#text/plain -res/cardsfolder/orcish_veteran.txt svneol=native#text/plain -res/cardsfolder/order_of_leitbur.txt -text svneol=native#text/plain -res/cardsfolder/order_of_the_ebon_hand.txt -text svneol=native#text/plain -res/cardsfolder/order_of_the_golden_cricket.txt -text svneol=native#text/plain -res/cardsfolder/order_of_the_sacred_bell.txt -text svneol=native#text/plain -res/cardsfolder/order_of_the_sacred_torch.txt -text svneol=native#text/plain -res/cardsfolder/order_of_the_white_shield.txt -text svneol=native#text/plain -res/cardsfolder/order_of_whiteclay.txt -text svneol=native#text/plain -res/cardsfolder/order_of_yawgmoth.txt -text svneol=native#text/plain -res/cardsfolder/ordered_migration.txt -text svneol=native#text/plain -res/cardsfolder/ordruun_commando.txt svneol=native#text/plain -res/cardsfolder/ore_gorger[!!-~].txt -text svneol=native#text/plain -res/cardsfolder/organ_grinder.txt -text svneol=native#text/plain -res/cardsfolder/orgg.txt -text svneol=native#text/plain -res/cardsfolder/origin_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/orim_samite_healer.txt svneol=native#text/plain -res/cardsfolder/orims_prayer.txt svneol=native#text/plain -res/cardsfolder/orims_thunder.txt -text svneol=native#text/plain -res/cardsfolder/ornithopter.txt -text svneol=native#text/plain -res/cardsfolder/orochi_hatchery.txt -text svneol=native#text/plain -res/cardsfolder/orochi_leafcaller.txt -text svneol=native#text/plain -res/cardsfolder/orochi_ranger.txt -text svneol=native#text/plain -res/cardsfolder/orochi_sustainer.txt -text svneol=native#text/plain -res/cardsfolder/oros_the_avenger.txt -text svneol=native#text/plain -res/cardsfolder/orzhov_basilica.txt -text svneol=native#text/plain -res/cardsfolder/orzhov_guildmage.txt svneol=native#text/plain -res/cardsfolder/orzhov_signet.txt -text svneol=native#text/plain -res/cardsfolder/orzhova_the_church_of_deals.txt -text svneol=native#text/plain -res/cardsfolder/ostiary_thrull.txt -text svneol=native#text/plain -res/cardsfolder/ostracize.txt -text svneol=native#text/plain -res/cardsfolder/otarian_juggernaut.txt -text svneol=native#text/plain -res/cardsfolder/otherworldly_journey.txt -text svneol=native#text/plain -res/cardsfolder/oubliette.txt -text svneol=native#text/plain -res/cardsfolder/oust.txt -text svneol=native#text/plain -res/cardsfolder/outbreak.txt svneol=native#text/plain -res/cardsfolder/outrage_shaman.txt -text svneol=native#text/plain -res/cardsfolder/outrider_of_jhess.txt -text svneol=native#text/plain -res/cardsfolder/overbeing_of_myth.txt -text svneol=native#text/plain -res/cardsfolder/overburden.txt -text svneol=native#text/plain -res/cardsfolder/overgrown_battlement.txt -text svneol=native#text/plain -res/cardsfolder/overgrown_estate.txt svneol=native#text/plain -res/cardsfolder/overgrown_tomb.txt -text svneol=native#text/plain -res/cardsfolder/overgrowth.txt -text svneol=native#text/plain -res/cardsfolder/override.txt -text svneol=native#text/plain -res/cardsfolder/overrule.txt -text svneol=native#text/plain -res/cardsfolder/overrun.txt -text svneol=native#text/plain -res/cardsfolder/oversold_cemetery.txt -text svneol=native#text/plain -res/cardsfolder/oversoul_of_dusk.txt -text svneol=native#text/plain -res/cardsfolder/overtaker.txt -text svneol=native#text/plain -res/cardsfolder/overwhelming_forces.txt -text svneol=native#text/plain -res/cardsfolder/overwhelming_intellect.txt -text svneol=native#text/plain -res/cardsfolder/overwhelming_stampede.txt -text svneol=native#text/plain -res/cardsfolder/owl_familiar.txt -text svneol=native#text/plain -res/cardsfolder/oxidda_daredevil.txt -text svneol=native#text/plain -res/cardsfolder/oxidda_golem.txt -text svneol=native#text/plain -res/cardsfolder/oxidda_scrapmelter.txt -text svneol=native#text/plain -res/cardsfolder/oxidize.txt -text svneol=native#text/plain -res/cardsfolder/oyobi_who_split_the_heavens.txt -text svneol=native#text/plain -res/cardsfolder/pacifism.txt -text svneol=native#text/plain -res/cardsfolder/pact_of_negation.txt -text svneol=native#text/plain -res/cardsfolder/pain_kami.txt svneol=native#text/plain -res/cardsfolder/pain_magnification.txt svneol=native#text/plain -res/cardsfolder/painful_memories.txt svneol=native#text/plain -res/cardsfolder/painsmith.txt -text svneol=native#text/plain -res/cardsfolder/painters_servant.txt -text svneol=native#text/plain -res/cardsfolder/painwracker_oni.txt -text svneol=native#text/plain -res/cardsfolder/paladin_en_vec.txt -text svneol=native#text/plain -res/cardsfolder/pale_bears.txt -text svneol=native#text/plain -res/cardsfolder/pale_recluse.txt -text svneol=native#text/plain -res/cardsfolder/paleoloth.txt -text svneol=native#text/plain -res/cardsfolder/palinchron.txt -text svneol=native#text/plain -res/cardsfolder/palladia_mors.txt -text svneol=native#text/plain -res/cardsfolder/palladium_myr.txt -text svneol=native#text/plain -res/cardsfolder/palliation_accord.txt svneol=native#text/plain -res/cardsfolder/pallid_mycoderm.txt -text svneol=native#text/plain -res/cardsfolder/pallimud.txt svneol=native#text/plain -res/cardsfolder/pang_tong_young_phoenix.txt -text svneol=native#text/plain -res/cardsfolder/pangosaur.txt -text svneol=native#text/plain -res/cardsfolder/panic.txt -text svneol=native#text/plain -res/cardsfolder/panic_attack.txt -text svneol=native#text/plain -res/cardsfolder/panic_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/panther_warriors.txt -text svneol=native#text/plain -res/cardsfolder/paperfin_rascal.txt svneol=native#text/plain -res/cardsfolder/paradigm_shift.txt svneol=native#text/plain -res/cardsfolder/paradise_mantle.txt -text svneol=native#text/plain -res/cardsfolder/paragon_of_the_amesha.txt -text svneol=native#text/plain -res/cardsfolder/parallax_dementia.txt -text svneol=native#text/plain -res/cardsfolder/parallax_inhibitor.txt -text svneol=native#text/plain -res/cardsfolder/parallax_tide.txt -text svneol=native#text/plain -res/cardsfolder/parallax_wave.txt -text svneol=native#text/plain -res/cardsfolder/parallel_evolution.txt -text svneol=native#text/plain -res/cardsfolder/paralyzing_grasp.txt -text svneol=native#text/plain -res/cardsfolder/parapet_watchers.txt -text svneol=native#text/plain -res/cardsfolder/parasitic_bond.txt -text svneol=native#text/plain -res/cardsfolder/parasitic_implant.txt -text svneol=native#text/plain -res/cardsfolder/parasitic_strix.txt -text svneol=native#text/plain -res/cardsfolder/parch.txt -text svneol=native#text/plain -res/cardsfolder/pardic_arsonist.txt svneol=native#text/plain -res/cardsfolder/pardic_collaborator.txt -text svneol=native#text/plain -res/cardsfolder/pardic_dragon.txt -text svneol=native#text/plain -res/cardsfolder/pardic_firecat.txt -text svneol=native#text/plain -res/cardsfolder/pardic_lancer.txt -text svneol=native#text/plain -res/cardsfolder/pardic_swordsmith.txt -text svneol=native#text/plain -res/cardsfolder/part_the_veil.txt svneol=native#text/plain -res/cardsfolder/part_water.txt svneol=native#text/plain -res/cardsfolder/patagia_golem.txt -text svneol=native#text/plain -res/cardsfolder/path_of_angers_flame.txt -text svneol=native#text/plain -res/cardsfolder/path_of_peace.txt -text svneol=native#text/plain -res/cardsfolder/path_to_exile.txt -text svneol=native#text/plain -res/cardsfolder/patriarchs_bidding.txt -text svneol=native#text/plain -res/cardsfolder/patrol_signaler.txt -text svneol=native#text/plain -res/cardsfolder/patron_of_the_wild.txt svneol=native#text/plain -res/cardsfolder/patron_wizard.txt -text svneol=native#text/plain -res/cardsfolder/pattern_of_rebirth.txt svneol=native#text/plain -res/cardsfolder/paupers_cage.txt svneol=native#text/plain -res/cardsfolder/pavel_maliki.txt -text svneol=native#text/plain -res/cardsfolder/pawn_of_ulamog.txt -text svneol=native#text/plain -res/cardsfolder/peace_and_quiet.txt -text svneol=native#text/plain -res/cardsfolder/peace_of_mind.txt -text svneol=native#text/plain -res/cardsfolder/peace_strider.txt -text svneol=native#text/plain -res/cardsfolder/peacekeeper.txt -text svneol=native#text/plain -res/cardsfolder/peach_garden_oath.txt -text svneol=native#text/plain -res/cardsfolder/pearl_dragon.txt -text svneol=native#text/plain -res/cardsfolder/pearl_medallion.txt -text svneol=native#text/plain -res/cardsfolder/pearled_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/peat_bog.txt -text svneol=native#text/plain -res/cardsfolder/peek.txt svneol=native#text/plain -res/cardsfolder/peel_from_reality.txt -text svneol=native#text/plain -res/cardsfolder/peer_through_depths.txt svneol=native#text/plain -res/cardsfolder/pegasus_charger.txt -text svneol=native#text/plain -res/cardsfolder/pegasus_refuge.txt -text svneol=native#text/plain -res/cardsfolder/pegasus_stampede.txt -text svneol=native#text/plain -res/cardsfolder/pelakka_wurm.txt -text svneol=native#text/plain -res/cardsfolder/pemmins_aura.txt -text svneol=native#text/plain -res/cardsfolder/pendelhaven.txt -text svneol=native#text/plain -res/cardsfolder/pendrell_drake.txt -text svneol=native#text/plain -res/cardsfolder/pendrell_mists.txt -text svneol=native#text/plain -res/cardsfolder/pennon_blade.txt -text svneol=native#text/plain -res/cardsfolder/pentad_prism.txt -text svneol=native#text/plain -res/cardsfolder/pentavus.txt -text svneol=native#text/plain -res/cardsfolder/penumbra_bobcat.txt -text svneol=native#text/plain -res/cardsfolder/penumbra_kavu.txt -text svneol=native#text/plain -res/cardsfolder/penumbra_spider.txt -text svneol=native#text/plain -res/cardsfolder/penumbra_wurm.txt -text svneol=native#text/plain -res/cardsfolder/people_of_the_woods.txt -text svneol=native#text/plain -res/cardsfolder/peppersmoke.txt -text svneol=native#text/plain -res/cardsfolder/peregrine_drake.txt -text svneol=native#text/plain -res/cardsfolder/peregrine_mask.txt -text svneol=native#text/plain -res/cardsfolder/perilous_forays.txt -text svneol=native#text/plain -res/cardsfolder/perilous_myr.txt -text svneol=native#text/plain -res/cardsfolder/perilous_research.txt -text svneol=native#text/plain -res/cardsfolder/perimeter_captain.txt -text svneol=native#text/plain -res/cardsfolder/perish.txt -text svneol=native#text/plain -res/cardsfolder/perish_the_thought.txt -text svneol=native#text/plain -res/cardsfolder/pernicious_deed.txt -text svneol=native#text/plain -res/cardsfolder/personal_tutor.txt -text svneol=native#text/plain -res/cardsfolder/persuasion.txt -text svneol=native#text/plain -res/cardsfolder/pestermite.txt -text svneol=native#text/plain -res/cardsfolder/pestilence.txt -text svneol=native#text/plain -res/cardsfolder/pestilence_demon.txt -text svneol=native#text/plain -res/cardsfolder/pestilence_rats.txt -text svneol=native#text/plain -res/cardsfolder/pestilent_kathari.txt -text svneol=native#text/plain -res/cardsfolder/pestilent_souleater.txt svneol=native#text/plain -res/cardsfolder/petradon.txt -text svneol=native#text/plain -res/cardsfolder/petrahydrox.txt -text svneol=native#text/plain -res/cardsfolder/petravark.txt -text svneol=native#text/plain -res/cardsfolder/petrified_field.txt svneol=native#text/plain -res/cardsfolder/pewter_golem.txt -text svneol=native#text/plain -res/cardsfolder/phantasmal_abomination.txt -text svneol=native#text/plain -res/cardsfolder/phantasmal_fiend.txt -text svneol=native#text/plain -res/cardsfolder/phantasmal_forces.txt -text svneol=native#text/plain -res/cardsfolder/phantasmal_terrain.txt -text svneol=native#text/plain -res/cardsfolder/phantatog.txt svneol=native#text/plain -res/cardsfolder/phantom_beast.txt -text svneol=native#text/plain -res/cardsfolder/phantom_centaur.txt -text svneol=native#text/plain -res/cardsfolder/phantom_flock.txt -text svneol=native#text/plain -res/cardsfolder/phantom_monster.txt -text svneol=native#text/plain -res/cardsfolder/phantom_nantuko.txt -text svneol=native#text/plain -res/cardsfolder/phantom_nishoba.txt -text svneol=native#text/plain -res/cardsfolder/phantom_nomad.txt -text svneol=native#text/plain -res/cardsfolder/phantom_tiger.txt -text svneol=native#text/plain -res/cardsfolder/phantom_warrior.txt -text svneol=native#text/plain -res/cardsfolder/phantom_whelp.txt svneol=native#text/plain -res/cardsfolder/phantom_wings.txt svneol=native#text/plain -res/cardsfolder/phantom_wurm.txt -text svneol=native#text/plain -res/cardsfolder/phelddagrif.txt -text svneol=native#text/plain -res/cardsfolder/phobian_phantasm.txt -text svneol=native#text/plain -res/cardsfolder/phylactery_lich.txt -text svneol=native#text/plain -res/cardsfolder/phyresis.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_altar.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_arena.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_battleflies.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_bloodstock.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_boon.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_broodlings.txt svneol=native#text/plain -res/cardsfolder/phyrexian_crusader.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_debaser.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_defiler.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_delver.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_denouncer.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_digester.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_dreadnought.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_driver.txt svneol=native#text/plain -res/cardsfolder/phyrexian_gargantua.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_hulk.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_hydra.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_ingester.txt svneol=native#text/plain -res/cardsfolder/phyrexian_ironfoot.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_juggernaut.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_lens.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_metamorph.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_monitor.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_negator.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_obliterator.txt svneol=native#text/plain -res/cardsfolder/phyrexian_plaguelord.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_processor.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_prowler.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_rager.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_rebirth.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_reclamation.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_scuta.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_snowcrusher.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_swarmlord.txt svneol=native#text/plain -res/cardsfolder/phyrexian_tower.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_tribute.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_tyranny.txt svneol=native#text/plain -res/cardsfolder/phyrexian_vatmother.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_vault.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_walker.txt -text svneol=native#text/plain -res/cardsfolder/phyrexian_war_beast.txt -text svneol=native#text/plain -res/cardsfolder/phyrexias_core.txt svneol=native#text/plain -res/cardsfolder/phytohydra.txt -text svneol=native#text/plain -res/cardsfolder/pianna_nomad_captain.txt -text svneol=native#text/plain -res/cardsfolder/pierce_strider.txt -text svneol=native#text/plain -res/cardsfolder/piety.txt -text svneol=native#text/plain -res/cardsfolder/pilgrims_eye.txt -text svneol=native#text/plain -res/cardsfolder/pili_pala.txt -text svneol=native#text/plain -res/cardsfolder/pillage.txt -text svneol=native#text/plain -res/cardsfolder/pillaging_horde.txt -text svneol=native#text/plain -res/cardsfolder/pillarfield_ox.txt -text svneol=native#text/plain -res/cardsfolder/pillory_of_the_sleepless.txt -text svneol=native#text/plain -res/cardsfolder/pincer_spider.txt svneol=native#text/plain -res/cardsfolder/pincher_beetles.txt -text svneol=native#text/plain -res/cardsfolder/pine_barrens.txt -text svneol=native#text/plain -res/cardsfolder/pinecrest_ridge.txt -text svneol=native#text/plain -res/cardsfolder/pinpoint_avalanche.txt -text svneol=native#text/plain -res/cardsfolder/pipers_melody.txt -text svneol=native#text/plain -res/cardsfolder/piracy_charm.txt -text svneol=native#text/plain -res/cardsfolder/piranha_marsh.txt -text svneol=native#text/plain -res/cardsfolder/pirate_ship.txt -text svneol=native#text/plain -res/cardsfolder/piston_sledge.txt svneol=native#text/plain -res/cardsfolder/pistus_strike.txt -text svneol=native#text/plain -res/cardsfolder/pit_imp.txt -text svneol=native#text/plain -res/cardsfolder/pit_keeper.txt svneol=native#text/plain -res/cardsfolder/pit_raptor.txt -text svneol=native#text/plain -res/cardsfolder/pit_scorpion.txt -text svneol=native#text/plain -res/cardsfolder/pit_trap.txt -text svneol=native#text/plain -res/cardsfolder/pitfall_trap.txt -text svneol=native#text/plain -res/cardsfolder/pith_driller.txt -text svneol=native#text/plain -res/cardsfolder/pithing_needle.txt -text svneol=native#text/plain -res/cardsfolder/pixie_queen.txt -text svneol=native#text/plain -res/cardsfolder/plague_beetle.txt -text svneol=native#text/plain -res/cardsfolder/plague_dogs.txt -text svneol=native#text/plain -res/cardsfolder/plague_fiend.txt svneol=native#text/plain -res/cardsfolder/plague_myr.txt -text svneol=native#text/plain -res/cardsfolder/plague_rats.txt -text svneol=native#text/plain -res/cardsfolder/plague_spitter.txt -text svneol=native#text/plain -res/cardsfolder/plague_spores.txt svneol=native#text/plain -res/cardsfolder/plague_stinger.txt -text svneol=native#text/plain -res/cardsfolder/plague_wind.txt -text svneol=native#text/plain -res/cardsfolder/plague_witch.txt -text svneol=native#text/plain -res/cardsfolder/plaguebearer.txt -text svneol=native#text/plain -res/cardsfolder/plagued_rusalka.txt -text svneol=native#text/plain -res/cardsfolder/plaguemaw_beast.txt -text svneol=native#text/plain -res/cardsfolder/plains.txt -text svneol=native#text/plain -res/cardsfolder/planar_birth.txt svneol=native#text/plain -res/cardsfolder/planar_cleansing.txt -text svneol=native#text/plain -res/cardsfolder/planar_collapse.txt -text svneol=native#text/plain -res/cardsfolder/planar_despair.txt -text svneol=native#text/plain -res/cardsfolder/planar_gate.txt -text svneol=native#text/plain -res/cardsfolder/planar_guide.txt -text svneol=native#text/plain -res/cardsfolder/planar_portal.txt -text svneol=native#text/plain -res/cardsfolder/planar_void.txt -text svneol=native#text/plain -res/cardsfolder/plasma_elemental.txt -text svneol=native#text/plain -res/cardsfolder/plateau.txt -text svneol=native#text/plain -res/cardsfolder/plated_geopede.txt -text svneol=native#text/plain -res/cardsfolder/plated_pegasus.txt -text svneol=native#text/plain -res/cardsfolder/plated_rootwalla.txt -text svneol=native#text/plain -res/cardsfolder/plated_seastrider.txt -text svneol=native#text/plain -res/cardsfolder/plated_slagwurm.txt -text svneol=native#text/plain -res/cardsfolder/plated_sliver.txt -text svneol=native#text/plain -res/cardsfolder/plated_spider.txt -text svneol=native#text/plain -res/cardsfolder/plated_wurm.txt -text svneol=native#text/plain -res/cardsfolder/platinum_angel.txt -text svneol=native#text/plain -res/cardsfolder/platinum_emperion.txt -text svneol=native#text/plain -res/cardsfolder/plover_knights.txt -text svneol=native#text/plain -res/cardsfolder/plow_under.txt -text svneol=native#text/plain -res/cardsfolder/plumes_of_peace.txt svneol=native#text/plain -res/cardsfolder/plumeveil.txt -text svneol=native#text/plain -res/cardsfolder/plummet.txt -text svneol=native#text/plain -res/cardsfolder/plunder.txt -text svneol=native#text/plain -res/cardsfolder/poison_arrow.txt -text svneol=native#text/plain -res/cardsfolder/poison_the_well.txt -text svneol=native#text/plain -res/cardsfolder/poisonbelly_ogre.txt svneol=native#text/plain -res/cardsfolder/political_trickery.txt -text svneol=native#text/plain -res/cardsfolder/pollen_lullaby.txt svneol=native#text/plain -res/cardsfolder/pollenbright_wings.txt -text svneol=native#text/plain -res/cardsfolder/polluted_bonds.txt -text svneol=native#text/plain -res/cardsfolder/polluted_delta.txt -text svneol=native#text/plain -res/cardsfolder/polluted_mire.txt -text svneol=native#text/plain -res/cardsfolder/ponder.txt -text svneol=native#text/plain -res/cardsfolder/pongify.txt -text svneol=native#text/plain -res/cardsfolder/pooling_venom.txt svneol=native#text/plain -res/cardsfolder/porcelain_legionnaire.txt -text svneol=native#text/plain -res/cardsfolder/porphyry_nodes.txt -text svneol=native#text/plain -res/cardsfolder/port_inspector.txt svneol=native#text/plain -res/cardsfolder/portcullis.txt -text svneol=native#text/plain -res/cardsfolder/portent.txt svneol=native#text/plain -res/cardsfolder/possessed_aven.txt -text svneol=native#text/plain -res/cardsfolder/possessed_barbarian.txt -text svneol=native#text/plain -res/cardsfolder/possessed_centaur.txt -text svneol=native#text/plain -res/cardsfolder/possessed_nomad.txt -text svneol=native#text/plain -res/cardsfolder/postmortem_lunge.txt -text svneol=native#text/plain -res/cardsfolder/poultice_sliver.txt -text svneol=native#text/plain -res/cardsfolder/pouncing_jaguar.txt -text svneol=native#text/plain -res/cardsfolder/powder_keg.txt -text svneol=native#text/plain -res/cardsfolder/power_armor.txt -text svneol=native#text/plain -res/cardsfolder/power_artifact.txt -text svneol=native#text/plain -res/cardsfolder/power_matrix.txt -text svneol=native#text/plain -res/cardsfolder/power_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/power_sink.txt -text svneol=native#text/plain -res/cardsfolder/power_surge.txt -text svneol=native#text/plain -res/cardsfolder/powerstone_minefield.txt svneol=native#text/plain -res/cardsfolder/pradesh_gypsies.txt -text svneol=native#text/plain -res/cardsfolder/praetors_counsel.txt svneol=native#text/plain -res/cardsfolder/precognition.txt svneol=native#text/plain -res/cardsfolder/predator_dragon.txt -text svneol=native#text/plain -res/cardsfolder/predator_flagship.txt -text svneol=native#text/plain -res/cardsfolder/predators_strike.txt -text svneol=native#text/plain -res/cardsfolder/predatory_advantage.txt -text svneol=native#text/plain -res/cardsfolder/predatory_hunger.txt -text svneol=native#text/plain -res/cardsfolder/predatory_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/preeminent_captain.txt -text svneol=native#text/plain -res/cardsfolder/preemptive_strike.txt -text svneol=native#text/plain -res/cardsfolder/preordain.txt -text svneol=native#text/plain -res/cardsfolder/presence_of_gond.txt -text svneol=native#text/plain -res/cardsfolder/presence_of_the_master.txt -text svneol=native#text/plain -res/cardsfolder/presence_of_the_wise.txt -text svneol=native#text/plain -res/cardsfolder/pretenders_claim.txt -text svneol=native#text/plain -res/cardsfolder/price_of_progress.txt -text svneol=native#text/plain -res/cardsfolder/prickly_boggart.txt -text svneol=native#text/plain -res/cardsfolder/pride_of_the_clouds.txt -text svneol=native#text/plain -res/cardsfolder/priest_of_gix.txt -text svneol=native#text/plain -res/cardsfolder/priest_of_titania.txt -text svneol=native#text/plain -res/cardsfolder/priest_of_urabrask.txt -text svneol=native#text/plain -res/cardsfolder/priest_of_yawgmoth.txt -text svneol=native#text/plain -res/cardsfolder/priests_of_norn.txt -text svneol=native#text/plain -res/cardsfolder/primal_bellow.txt -text svneol=native#text/plain -res/cardsfolder/primal_boost.txt -text svneol=native#text/plain -res/cardsfolder/primal_clay.txt -text svneol=native#text/plain -res/cardsfolder/primal_cocoon.txt svneol=native#text/plain -res/cardsfolder/primal_frenzy.txt -text svneol=native#text/plain -res/cardsfolder/primal_order.txt svneol=native#text/plain -res/cardsfolder/primal_plasma.txt -text svneol=native#text/plain -res/cardsfolder/primal_rage.txt -text svneol=native#text/plain -res/cardsfolder/primal_whisperer.txt -text svneol=native#text/plain -res/cardsfolder/primalcrux.txt -text svneol=native#text/plain -res/cardsfolder/primeval_shambler.txt -text svneol=native#text/plain -res/cardsfolder/primeval_titan.txt -text svneol=native#text/plain -res/cardsfolder/primoc_escapee.txt -text svneol=native#text/plain -res/cardsfolder/primordial_sage.txt -text svneol=native#text/plain -res/cardsfolder/princess_lucrezia.txt -text svneol=native#text/plain -res/cardsfolder/prismatic_lens.txt -text svneol=native#text/plain -res/cardsfolder/prismatic_omen.txt svneol=native#text/plain -res/cardsfolder/pristine_angel.txt -text svneol=native#text/plain -res/cardsfolder/pristine_talisman.txt svneol=native#text/plain -res/cardsfolder/privileged_position.txt -text svneol=native#text/plain -res/cardsfolder/prized_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/proclamation_of_rebirth.txt -text svneol=native#text/plain -res/cardsfolder/prodigal_pyromancer.txt -text svneol=native#text/plain -res/cardsfolder/prodigal_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/profane_command.txt svneol=native#text/plain -res/cardsfolder/profane_prayers.txt -text svneol=native#text/plain -res/cardsfolder/progenitus.txt -text svneol=native#text/plain -res/cardsfolder/promise_of_power.txt -text svneol=native#text/plain -res/cardsfolder/promised_kannushi.txt -text svneol=native#text/plain -res/cardsfolder/propaganda.txt -text svneol=native#text/plain -res/cardsfolder/proper_burial.txt -text svneol=native#text/plain -res/cardsfolder/prophetic_bolt.txt -text svneol=native#text/plain -res/cardsfolder/prophetic_prism.txt -text svneol=native#text/plain -res/cardsfolder/prosperity.txt -text svneol=native#text/plain -res/cardsfolder/protective_bubble.txt -text svneol=native#text/plain -res/cardsfolder/protomatter_powder.txt -text svneol=native#text/plain -res/cardsfolder/prototype_portal.txt svneol=native#text/plain -res/cardsfolder/provoke.txt svneol=native#text/plain -res/cardsfolder/prowess_of_the_fair.txt -text svneol=native#text/plain -res/cardsfolder/prowling_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/psionic_blast.txt -text svneol=native#text/plain -res/cardsfolder/psionic_entity.txt -text svneol=native#text/plain -res/cardsfolder/psionic_gift.txt -text svneol=native#text/plain -res/cardsfolder/psionic_sliver.txt -text svneol=native#text/plain -res/cardsfolder/psychatog.txt -text svneol=native#text/plain -res/cardsfolder/psychic_barrier.txt svneol=native#text/plain -res/cardsfolder/psychic_drain.txt -text svneol=native#text/plain -res/cardsfolder/psychic_membrane.txt -text svneol=native#text/plain -res/cardsfolder/psychic_purge.txt -text svneol=native#text/plain -res/cardsfolder/psychic_spear.txt -text svneol=native#text/plain -res/cardsfolder/psychic_surgery.txt svneol=native#text/plain -res/cardsfolder/psychic_venom.txt -text svneol=native#text/plain -res/cardsfolder/psychosis_crawler.txt -text svneol=native#text/plain -res/cardsfolder/psychotic_fury.txt svneol=native#text/plain -res/cardsfolder/psychotic_haze.txt -text svneol=native#text/plain -res/cardsfolder/psychotrope_thallid.txt -text svneol=native#text/plain -res/cardsfolder/pteron_ghost.txt -text svneol=native#text/plain -res/cardsfolder/puffer_extract.txt -text svneol=native#text/plain -res/cardsfolder/pull_under.txt -text svneol=native#text/plain -res/cardsfolder/pulling_teeth.txt -text svneol=native#text/plain -res/cardsfolder/pulsating_illusion.txt svneol=native#text/plain -res/cardsfolder/pulse_of_the_tangle.txt -text svneol=native#text/plain -res/cardsfolder/pulse_tracker.txt -text svneol=native#text/plain -res/cardsfolder/pulsemage_advocate.txt svneol=native#text/plain -res/cardsfolder/pulverize.txt -text svneol=native#text/plain -res/cardsfolder/puncture_blast.txt svneol=native#text/plain -res/cardsfolder/puncture_bolt.txt -text svneol=native#text/plain -res/cardsfolder/puncturing_light.txt -text svneol=native#text/plain -res/cardsfolder/punish_ignorance.txt -text svneol=native#text/plain -res/cardsfolder/punishing_fire.txt svneol=native#text/plain -res/cardsfolder/puppet_conjurer.txt -text svneol=native#text/plain -res/cardsfolder/puppet_strings.txt -text svneol=native#text/plain -res/cardsfolder/puppeteer.txt -text svneol=native#text/plain -res/cardsfolder/puppeteer_clique.txt -text svneol=native#text/plain -res/cardsfolder/purge.txt -text svneol=native#text/plain -res/cardsfolder/purify.txt -text svneol=native#text/plain -res/cardsfolder/purity.txt -text svneol=native#text/plain -res/cardsfolder/purraj_of_urborg.txt svneol=native#text/plain -res/cardsfolder/pus_kami.txt -text svneol=native#text/plain -res/cardsfolder/put_away.txt svneol=native#text/plain -res/cardsfolder/putrefaction.txt -text svneol=native#text/plain -res/cardsfolder/putrefax.txt -text svneol=native#text/plain -res/cardsfolder/putrefy.txt -text svneol=native#text/plain -res/cardsfolder/putrid_imp.txt -text svneol=native#text/plain -res/cardsfolder/putrid_leech.txt -text svneol=native#text/plain -res/cardsfolder/putrid_raptor.txt svneol=native#text/plain -res/cardsfolder/pygmy_allosaurus.txt -text svneol=native#text/plain -res/cardsfolder/pygmy_kavu.txt svneol=native#text/plain -res/cardsfolder/pygmy_pyrosaur.txt -text svneol=native#text/plain -res/cardsfolder/pygmy_razorback.txt -text svneol=native#text/plain -res/cardsfolder/pygmy_troll.txt -text svneol=native#text/plain -res/cardsfolder/pyknite.txt -text svneol=native#text/plain -res/cardsfolder/pyre_charger.txt -text svneol=native#text/plain -res/cardsfolder/pyre_zombie.txt -text svneol=native#text/plain -res/cardsfolder/pyretic_ritual.txt -text svneol=native#text/plain -res/cardsfolder/pyric_salamander.txt -text svneol=native#text/plain -res/cardsfolder/pyrite_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/pyroclasm.txt -text svneol=native#text/plain -res/cardsfolder/pyroclast_consul.txt -text svneol=native#text/plain -res/cardsfolder/pyrohemia.txt -text svneol=native#text/plain -res/cardsfolder/pyrokinesis.txt svneol=native#text/plain -res/cardsfolder/pyromancy.txt -text svneol=native#text/plain -res/cardsfolder/pyromania.txt -text svneol=native#text/plain -res/cardsfolder/pyromatics.txt svneol=native#text/plain -res/cardsfolder/pyrostatic_pillar.txt svneol=native#text/plain -res/cardsfolder/pyrotechnics.txt -text svneol=native#text/plain -res/cardsfolder/python.txt -text svneol=native#text/plain -res/cardsfolder/qasali_pridemage.txt -text svneol=native#text/plain -res/cardsfolder/quag_sickness.txt -text svneol=native#text/plain -res/cardsfolder/quag_vampires.txt -text svneol=native#text/plain -res/cardsfolder/quagmire.txt -text svneol=native#text/plain -res/cardsfolder/quagmire_druid.txt -text svneol=native#text/plain -res/cardsfolder/quagmire_lamprey.txt -text svneol=native#text/plain -res/cardsfolder/quagnoth.txt -text svneol=native#text/plain -res/cardsfolder/quest_for_ancient_secrets.txt -text svneol=native#text/plain -res/cardsfolder/quest_for_renewal.txt -text svneol=native#text/plain -res/cardsfolder/quest_for_the_gemblades.txt svneol=native#text/plain -res/cardsfolder/quest_for_the_goblin_lord.txt -text svneol=native#text/plain -res/cardsfolder/quest_for_the_gravelord.txt svneol=native#text/plain -res/cardsfolder/quest_for_the_nihil_stone.txt -text svneol=native#text/plain -res/cardsfolder/questing_phelddagrif.txt -text svneol=native#text/plain -res/cardsfolder/quick_sliver.txt -text svneol=native#text/plain -res/cardsfolder/quicksand.txt -text svneol=native#text/plain -res/cardsfolder/quicksilver_amulet.txt -text svneol=native#text/plain -res/cardsfolder/quicksilver_behemoth.txt svneol=native#text/plain -res/cardsfolder/quicksilver_dagger.txt -text svneol=native#text/plain -res/cardsfolder/quicksilver_gargantuan.txt svneol=native#text/plain -res/cardsfolder/quicksilver_geyser.txt -text svneol=native#text/plain -res/cardsfolder/quicksilver_wall.txt svneol=native#text/plain -res/cardsfolder/quiet_purity.txt -text svneol=native#text/plain -res/cardsfolder/quietus_spike.txt -text svneol=native#text/plain -res/cardsfolder/quill_slinger_boggart.txt svneol=native#text/plain -res/cardsfolder/quilled_slagwurm.txt -text svneol=native#text/plain -res/cardsfolder/quilled_sliver.txt svneol=native#text/plain -res/cardsfolder/quirion_druid.txt svneol=native#text/plain -res/cardsfolder/quirion_dryad.txt -text svneol=native#text/plain -res/cardsfolder/quirion_explorer.txt -text svneol=native#text/plain -res/cardsfolder/quirion_ranger.txt -text svneol=native#text/plain -res/cardsfolder/quirion_trailblazer.txt -text svneol=native#text/plain -res/cardsfolder/qumulox.txt -text svneol=native#text/plain -res/cardsfolder/rabble_rouser.txt -text svneol=native#text/plain -res/cardsfolder/rabid_elephant.txt -text svneol=native#text/plain -res/cardsfolder/rabid_rats.txt svneol=native#text/plain -res/cardsfolder/rabid_wolverines.txt -text svneol=native#text/plain -res/cardsfolder/rabid_wombat.txt -text svneol=native#text/plain -res/cardsfolder/rack_and_ruin.txt -text svneol=native#text/plain -res/cardsfolder/rackling.txt svneol=native#text/plain -res/cardsfolder/radha_heir_to_keld.txt -text svneol=native#text/plain -res/cardsfolder/radiant_archangel.txt -text svneol=native#text/plain -res/cardsfolder/radiant_essence.txt -text svneol=native#text/plain -res/cardsfolder/radiants_dragoons.txt -text svneol=native#text/plain -res/cardsfolder/radiants_judgment.txt -text svneol=native#text/plain -res/cardsfolder/radjan_spirit.txt -text svneol=native#text/plain -res/cardsfolder/rafiq_of_the_many.txt -text svneol=native#text/plain -res/cardsfolder/ragamuffyn.txt svneol=native#text/plain -res/cardsfolder/rage_extractor.txt -text svneol=native#text/plain -res/cardsfolder/rage_nimbus.txt -text svneol=native#text/plain -res/cardsfolder/rage_reflection.txt -text svneol=native#text/plain -res/cardsfolder/rage_weaver.txt -text svneol=native#text/plain -res/cardsfolder/ragged_veins.txt -text svneol=native#text/plain -res/cardsfolder/raging_bull.txt -text svneol=native#text/plain -res/cardsfolder/raging_cougar.txt -text svneol=native#text/plain -res/cardsfolder/raging_goblin.txt -text svneol=native#text/plain -res/cardsfolder/raging_gorilla.txt -text svneol=native#text/plain -res/cardsfolder/raging_kavu.txt -text svneol=native#text/plain -res/cardsfolder/raging_minotaur.txt -text svneol=native#text/plain -res/cardsfolder/raging_ravine.txt -text svneol=native#text/plain -res/cardsfolder/ragnar.txt -text svneol=native#text/plain -res/cardsfolder/raid_bombardment.txt svneol=native#text/plain -res/cardsfolder/raiding_nightstalker.txt -text svneol=native#text/plain -res/cardsfolder/rain_of_blades.txt -text svneol=native#text/plain -res/cardsfolder/rain_of_embers.txt -text svneol=native#text/plain -res/cardsfolder/rain_of_salt.txt -text svneol=native#text/plain -res/cardsfolder/rain_of_tears.txt -text svneol=native#text/plain -res/cardsfolder/rainbow_vale.txt -text svneol=native#text/plain -res/cardsfolder/raise_dead.txt -text svneol=native#text/plain -res/cardsfolder/raise_the_alarm.txt -text svneol=native#text/plain -res/cardsfolder/raka_disciple.txt svneol=native#text/plain -res/cardsfolder/rakdos_augermage.txt svneol=native#text/plain -res/cardsfolder/rakdos_carnarium.txt -text svneol=native#text/plain -res/cardsfolder/rakdos_guildmage.txt svneol=native#text/plain -res/cardsfolder/rakdos_ickspitter.txt -text svneol=native#text/plain -res/cardsfolder/rakdos_pit_dragon.txt -text svneol=native#text/plain -res/cardsfolder/rakdos_signet.txt -text svneol=native#text/plain -res/cardsfolder/rakdos_the_defiler.txt svneol=native#text/plain -res/cardsfolder/rakeclaw_gargantuan.txt svneol=native#text/plain -res/cardsfolder/raking_canopy.txt svneol=native#text/plain -res/cardsfolder/rakka_mar.txt -text svneol=native#text/plain -res/cardsfolder/raksha_golden_cub.txt -text svneol=native#text/plain -res/cardsfolder/rally.txt -text svneol=native#text/plain -res/cardsfolder/rally_the_forces.txt -text svneol=native#text/plain -res/cardsfolder/ramirez_depietro.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_captain.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_commander.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_lieutenant.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_rally.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_revivalist.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_sergeant.txt -text svneol=native#text/plain -res/cardsfolder/ramosian_sky_marshal.txt -text svneol=native#text/plain -res/cardsfolder/rampaging_baloths.txt -text svneol=native#text/plain -res/cardsfolder/rampant_growth.txt -text svneol=native#text/plain -res/cardsfolder/rampart_crawler.txt -text svneol=native#text/plain -res/cardsfolder/ramses_overdark.txt -text svneol=native#text/plain -res/cardsfolder/rancor.txt -text svneol=native#text/plain -res/cardsfolder/ranger_en_vec.txt -text svneol=native#text/plain -res/cardsfolder/ranger_of_eos.txt -text svneol=native#text/plain -res/cardsfolder/rank_and_file.txt -text svneol=native#text/plain -res/cardsfolder/ransack.txt svneol=native#text/plain -res/cardsfolder/rapacious_one.txt svneol=native#text/plain -res/cardsfolder/rappelling_scouts.txt -text svneol=native#text/plain -res/cardsfolder/rashida_scalebane.txt svneol=native#text/plain -res/cardsfolder/rashka_the_slayer.txt svneol=native#text/plain -res/cardsfolder/ratcatcher.txt -text svneol=native#text/plain -res/cardsfolder/ratchet_bomb.txt -text svneol=native#text/plain -res/cardsfolder/rathi_assassin.txt -text svneol=native#text/plain -res/cardsfolder/rathi_fiend.txt -text svneol=native#text/plain -res/cardsfolder/rathi_intimidator.txt -text svneol=native#text/plain -res/cardsfolder/rathi_trapper.txt -text svneol=native#text/plain -res/cardsfolder/raths_edge.txt -text svneol=native#text/plain -res/cardsfolder/rats_of_rath.txt -text svneol=native#text/plain -res/cardsfolder/rattleblaze_scarecrow.txt -text svneol=native#text/plain -res/cardsfolder/ravaged_highlands.txt -text svneol=native#text/plain -res/cardsfolder/ravages_of_war.txt -text svneol=native#text/plain -res/cardsfolder/ravaging_horde.txt -text svneol=native#text/plain -res/cardsfolder/ravaging_riftwurm.txt svneol=native#text/plain -res/cardsfolder/raven_familiar.txt svneol=native#text/plain -res/cardsfolder/raven_guild_initiate.txt svneol=native#text/plain -res/cardsfolder/raven_guild_master.txt -text svneol=native#text/plain -res/cardsfolder/ravenous_baboons.txt -text svneol=native#text/plain -res/cardsfolder/ravenous_baloth.txt -text svneol=native#text/plain -res/cardsfolder/ravenous_rats.txt -text svneol=native#text/plain -res/cardsfolder/ravenous_skirge.txt -text svneol=native#text/plain -res/cardsfolder/ravens_crime.txt svneol=native#text/plain -res/cardsfolder/ravens_run_dragoon.txt -text svneol=native#text/plain -res/cardsfolder/raving_oni_slave.txt -text svneol=native#text/plain -res/cardsfolder/ray_of_command.txt -text svneol=native#text/plain -res/cardsfolder/ray_of_distortion.txt -text svneol=native#text/plain -res/cardsfolder/ray_of_erasure.txt -text svneol=native#text/plain -res/cardsfolder/ray_of_revelation.txt -text svneol=native#text/plain -res/cardsfolder/raze.txt -text svneol=native#text/plain -res/cardsfolder/razing_snidd.txt -text svneol=native#text/plain -res/cardsfolder/razor_golem.txt -text svneol=native#text/plain -res/cardsfolder/razor_hippogriff.txt svneol=native#text/plain -res/cardsfolder/razor_pendulum.txt svneol=native#text/plain -res/cardsfolder/razor_swine.txt svneol=native#text/plain -res/cardsfolder/razorclaw_bear.txt svneol=native#text/plain -res/cardsfolder/razorfield_rhino.txt -text svneol=native#text/plain -res/cardsfolder/razorfield_thresher.txt -text svneol=native#text/plain -res/cardsfolder/razorfin_hunter.txt -text svneol=native#text/plain -res/cardsfolder/razorfoot_griffin.txt -text svneol=native#text/plain -res/cardsfolder/razorgrass_screen.txt svneol=native#text/plain -res/cardsfolder/razorjaw_oni.txt -text svneol=native#text/plain -res/cardsfolder/razortooth_rats.txt -text svneol=native#text/plain -res/cardsfolder/razorverge_thicket.txt -text svneol=native#text/plain -res/cardsfolder/reach_of_branches.txt -text svneol=native#text/plain -res/cardsfolder/reach_through_mists.txt -text svneol=native#text/plain -res/cardsfolder/reality_spasm.txt svneol=native#text/plain -res/cardsfolder/reality_strobe.txt svneol=native#text/plain -res/cardsfolder/reanimate.txt -text svneol=native#text/plain -res/cardsfolder/reap_and_sow.txt svneol=native#text/plain -res/cardsfolder/reaper_king.txt svneol=native#text/plain -res/cardsfolder/reaper_of_sheoldred.txt svneol=native#text/plain -res/cardsfolder/reaping_the_graves.txt -text svneol=native#text/plain -res/cardsfolder/reaping_the_rewards.txt -text svneol=native#text/plain -res/cardsfolder/reassembling_skeleton.txt -text svneol=native#text/plain -res/cardsfolder/rebel_informer.txt svneol=native#text/plain -res/cardsfolder/rebellion_of_the_flamekin.txt -text svneol=native#text/plain -res/cardsfolder/reborn_hope.txt -text svneol=native#text/plain -res/cardsfolder/rebuff_the_wicked.txt -text svneol=native#text/plain -res/cardsfolder/rebuild.txt -text svneol=native#text/plain -res/cardsfolder/rebuking_ceremony.txt svneol=native#text/plain -res/cardsfolder/recall.txt -text svneol=native#text/plain -res/cardsfolder/recantation.txt -text svneol=native#text/plain -res/cardsfolder/reciprocate.txt -text svneol=native#text/plain -res/cardsfolder/reckless_abandon.txt -text svneol=native#text/plain -res/cardsfolder/reckless_assault.txt -text svneol=native#text/plain -res/cardsfolder/reckless_charge.txt -text svneol=native#text/plain -res/cardsfolder/reckless_embermage.txt -text svneol=native#text/plain -res/cardsfolder/reckless_ogre.txt -text svneol=native#text/plain -res/cardsfolder/reckless_one.txt -text svneol=native#text/plain -res/cardsfolder/reckless_scholar.txt -text svneol=native#text/plain -res/cardsfolder/reckless_spite.txt -text svneol=native#text/plain -res/cardsfolder/reckless_wurm.txt -text svneol=native#text/plain -res/cardsfolder/reclaim.txt -text svneol=native#text/plain -res/cardsfolder/reclusive_wight.txt -text svneol=native#text/plain -res/cardsfolder/recoil.txt -text svneol=native#text/plain -res/cardsfolder/recollect.txt -text svneol=native#text/plain -res/cardsfolder/reconstruction.txt -text svneol=native#text/plain -res/cardsfolder/recover.txt -text svneol=native#text/plain -res/cardsfolder/recumbent_bliss.txt -text svneol=native#text/plain -res/cardsfolder/recuperate.txt svneol=native#text/plain -res/cardsfolder/recurring_nightmare.txt -text svneol=native#text/plain -res/cardsfolder/recycle.txt svneol=native#text/plain -res/cardsfolder/red_cliffs_armada.txt -text svneol=native#text/plain -res/cardsfolder/red_elemental_blast.txt -text svneol=native#text/plain -res/cardsfolder/red_mana_battery.txt -text svneol=native#text/plain -res/cardsfolder/red_scarab.txt svneol=native#text/plain -res/cardsfolder/red_suns_zenith.txt -text svneol=native#text/plain -res/cardsfolder/red_ward.txt -text svneol=native#text/plain -res/cardsfolder/redeem.txt svneol=native#text/plain -res/cardsfolder/reduce_to_dreams.txt -text svneol=native#text/plain -res/cardsfolder/redwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/reef_pirates.txt svneol=native#text/plain -res/cardsfolder/reflecting_pool.txt -text svneol=native#text/plain -res/cardsfolder/reflex_sliver.txt -text svneol=native#text/plain -res/cardsfolder/reflexes.txt -text svneol=native#text/plain -res/cardsfolder/refresh.txt -text svneol=native#text/plain -res/cardsfolder/regal_force.txt svneol=native#text/plain -res/cardsfolder/regal_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/regenerate.txt -text svneol=native#text/plain -res/cardsfolder/regeneration.txt -text svneol=native#text/plain -res/cardsfolder/regress.txt -text svneol=native#text/plain -res/cardsfolder/regrowth.txt -text svneol=native#text/plain -res/cardsfolder/reign_of_chaos.txt svneol=native#text/plain -res/cardsfolder/reinforced_bulwark.txt svneol=native#text/plain -res/cardsfolder/reinforcements.txt -text svneol=native#text/plain -res/cardsfolder/reiterate.txt -text svneol=native#text/plain -res/cardsfolder/reito_lantern.txt svneol=native#text/plain -res/cardsfolder/rejuvenate.txt -text svneol=native#text/plain -res/cardsfolder/rejuvenation_chamber.txt -text svneol=native#text/plain -res/cardsfolder/reki_the_history_of_kamigawa.txt -text svneol=native#text/plain -res/cardsfolder/rekindled_flame.txt svneol=native#text/plain -res/cardsfolder/reknit.txt svneol=native#text/plain -res/cardsfolder/relearn.txt -text svneol=native#text/plain -res/cardsfolder/release_the_ants.txt svneol=native#text/plain -res/cardsfolder/relentless_rats.txt -text svneol=native#text/plain -res/cardsfolder/relic_barrier.txt -text svneol=native#text/plain -res/cardsfolder/relic_crush.txt -text svneol=native#text/plain -res/cardsfolder/relic_of_progenitus.txt svneol=native#text/plain -res/cardsfolder/relic_putrescence.txt -text svneol=native#text/plain -res/cardsfolder/reliquary_monk.txt svneol=native#text/plain -res/cardsfolder/reliquary_tower.txt -text svneol=native#text/plain -res/cardsfolder/remand.txt -text svneol=native#text/plain -res/cardsfolder/reminisce.txt -text svneol=native#text/plain -res/cardsfolder/remote_farm.txt -text svneol=native#text/plain -res/cardsfolder/remote_isle.txt -text svneol=native#text/plain -res/cardsfolder/remove.txt -text svneol=native#text/plain -res/cardsfolder/remove_enchantments.txt svneol=native#text/plain -res/cardsfolder/remove_soul.txt -text svneol=native#text/plain -res/cardsfolder/rend_flesh.txt -text svneol=native#text/plain -res/cardsfolder/rend_spirit.txt -text svneol=native#text/plain -res/cardsfolder/rendclaw_trow.txt -text svneol=native#text/plain -res/cardsfolder/renegade_troops.txt -text svneol=native#text/plain -res/cardsfolder/renewal.txt -text svneol=native#text/plain -res/cardsfolder/renewed_faith.txt -text svneol=native#text/plain -res/cardsfolder/renewing_dawn.txt -text svneol=native#text/plain -res/cardsfolder/renewing_touch.txt -text svneol=native#text/plain -res/cardsfolder/reparations.txt svneol=native#text/plain -res/cardsfolder/repay_in_kind.txt -text svneol=native#text/plain -res/cardsfolder/repeal.txt -text svneol=native#text/plain -res/cardsfolder/repel.txt -text svneol=native#text/plain -res/cardsfolder/repel_the_darkness.txt -text svneol=native#text/plain -res/cardsfolder/repentance.txt svneol=native#text/plain -res/cardsfolder/repentant_blacksmith.txt -text svneol=native#text/plain -res/cardsfolder/repentant_vampire.txt -text svneol=native#text/plain -res/cardsfolder/repercussion.txt svneol=native#text/plain -res/cardsfolder/repopulate.txt svneol=native#text/plain -res/cardsfolder/reprisal.txt -text svneol=native#text/plain -res/cardsfolder/repulse.txt -text svneol=native#text/plain -res/cardsfolder/rescind.txt -text svneol=native#text/plain -res/cardsfolder/rescue.txt -text svneol=native#text/plain -res/cardsfolder/research_the_deep.txt -text svneol=native#text/plain -res/cardsfolder/reset.txt -text svneol=native#text/plain -res/cardsfolder/resilient_wanderer.txt -text svneol=native#text/plain -res/cardsfolder/resistance_fighter.txt svneol=native#text/plain -res/cardsfolder/resize.txt -text svneol=native#text/plain -res/cardsfolder/resounding_roar.txt svneol=native#text/plain -res/cardsfolder/resounding_scream.txt svneol=native#text/plain -res/cardsfolder/resounding_silence.txt -text svneol=native#text/plain -res/cardsfolder/resounding_thunder.txt svneol=native#text/plain -res/cardsfolder/resounding_wave.txt -text svneol=native#text/plain -res/cardsfolder/respite.txt -text svneol=native#text/plain -res/cardsfolder/resplendent_mentor.txt -text svneol=native#text/plain -res/cardsfolder/restless_apparition.txt -text svneol=native#text/plain -res/cardsfolder/restless_bones.txt -text svneol=native#text/plain -res/cardsfolder/restless_dead.txt -text svneol=native#text/plain -res/cardsfolder/resurrection.txt -text svneol=native#text/plain -res/cardsfolder/resuscitate.txt -text svneol=native#text/plain -res/cardsfolder/retaliate.txt -text svneol=native#text/plain -res/cardsfolder/retract.txt -text svneol=native#text/plain -res/cardsfolder/retribution_of_the_meek.txt -text svneol=native#text/plain -res/cardsfolder/retromancer.txt -text svneol=native#text/plain -res/cardsfolder/return_to_battle.txt -text svneol=native#text/plain -res/cardsfolder/return_to_dust.txt -text svneol=native#text/plain -res/cardsfolder/reveillark.txt -text svneol=native#text/plain -res/cardsfolder/reveille_squad.txt -text svneol=native#text/plain -res/cardsfolder/reveka_wizard_savant.txt svneol=native#text/plain -res/cardsfolder/revelsong_horn.txt -text svneol=native#text/plain -res/cardsfolder/revenant.txt -text svneol=native#text/plain -res/cardsfolder/reverberate.txt -text svneol=native#text/plain -res/cardsfolder/revered_dead.txt -text svneol=native#text/plain -res/cardsfolder/reverence.txt -text svneol=native#text/plain -res/cardsfolder/revive.txt -text svneol=native#text/plain -res/cardsfolder/revive_the_fallen.txt svneol=native#text/plain -res/cardsfolder/reviving_dose.txt -text svneol=native#text/plain -res/cardsfolder/revoke_existence.txt -text svneol=native#text/plain -res/cardsfolder/reward_the_faithful.txt svneol=native#text/plain -res/cardsfolder/rewind.txt svneol=native#text/plain -res/cardsfolder/reya_dawnbringer.txt -text svneol=native#text/plain -res/cardsfolder/rhox_bodyguard.txt -text svneol=native#text/plain -res/cardsfolder/rhox_brute.txt -text svneol=native#text/plain -res/cardsfolder/rhox_charger.txt -text svneol=native#text/plain -res/cardsfolder/rhox_meditant.txt -text svneol=native#text/plain -res/cardsfolder/rhox_pikemaster.txt -text svneol=native#text/plain -res/cardsfolder/rhox_war_monk.txt -text svneol=native#text/plain -res/cardsfolder/rhys_the_exiled.txt -text svneol=native#text/plain -res/cardsfolder/rhys_the_redeemed.txt -text svneol=native#text/plain -res/cardsfolder/rhystic_deluge.txt svneol=native#text/plain -res/cardsfolder/rhystic_study.txt svneol=native#text/plain -res/cardsfolder/rib_cage_spider.txt -text svneol=native#text/plain -res/cardsfolder/ribbons_of_the_reikai.txt -text svneol=native#text/plain -res/cardsfolder/riddlesmith.txt -text svneol=native#text/plain -res/cardsfolder/ridge_rannet.txt -text svneol=native#text/plain -res/cardsfolder/ridged_kusite.txt -text svneol=native#text/plain -res/cardsfolder/ridgeline_rager.txt -text svneol=native#text/plain -res/cardsfolder/ridgetop_raptor.txt -text svneol=native#text/plain -res/cardsfolder/riding_red_hare.txt -text svneol=native#text/plain -res/cardsfolder/riding_the_dilu_horse.txt -text svneol=native#text/plain -res/cardsfolder/rift_bolt.txt -text svneol=native#text/plain -res/cardsfolder/riftwing_cloudskate.txt -text svneol=native#text/plain -res/cardsfolder/righteous_avengers.txt -text svneol=native#text/plain -res/cardsfolder/righteous_cause.txt svneol=native#text/plain -res/cardsfolder/righteous_charge.txt -text svneol=native#text/plain -res/cardsfolder/righteous_fury.txt -text svneol=native#text/plain -res/cardsfolder/righteous_war.txt -text svneol=native#text/plain -res/cardsfolder/righteousness.txt -text svneol=native#text/plain -res/cardsfolder/rime_dryad.txt svneol=native#text/plain -res/cardsfolder/rimebound_dead.txt -text svneol=native#text/plain -res/cardsfolder/rimescale_dragon.txt -text svneol=native#text/plain -res/cardsfolder/rimewind_cryomancer.txt -text svneol=native#text/plain -res/cardsfolder/rimewind_taskmage.txt svneol=native#text/plain -res/cardsfolder/ring_of_gix.txt -text svneol=native#text/plain -res/cardsfolder/ring_of_immortals.txt -text svneol=native#text/plain -res/cardsfolder/ring_of_renewal.txt -text svneol=native#text/plain -res/cardsfolder/ringskipper.txt -text svneol=native#text/plain -res/cardsfolder/riot_spikes.txt -text svneol=native#text/plain -res/cardsfolder/rip_clan_crasher.txt -text svneol=native#text/plain -res/cardsfolder/riptide.txt -text svneol=native#text/plain -res/cardsfolder/riptide_biologist.txt -text svneol=native#text/plain -res/cardsfolder/riptide_crab.txt -text svneol=native#text/plain -res/cardsfolder/riptide_director.txt -text svneol=native#text/plain -res/cardsfolder/riptide_laboratory.txt -text svneol=native#text/plain -res/cardsfolder/riptide_pilferer.txt -text svneol=native#text/plain -res/cardsfolder/riptide_survivor.txt -text svneol=native#text/plain -res/cardsfolder/rise_from_the_grave.txt -text svneol=native#text/plain -res/cardsfolder/rise_of_the_hobgoblins.txt svneol=native#text/plain -res/cardsfolder/rishadan_airship.txt -text svneol=native#text/plain -res/cardsfolder/rishadan_brigand.txt svneol=native#text/plain -res/cardsfolder/rishadan_cutpurse.txt svneol=native#text/plain -res/cardsfolder/rishadan_footpad.txt svneol=native#text/plain -res/cardsfolder/rishadan_pawnshop.txt -text svneol=native#text/plain -res/cardsfolder/rishadan_port.txt -text svneol=native#text/plain -res/cardsfolder/rite_of_flame.txt -text svneol=native#text/plain -res/cardsfolder/rite_of_passage.txt -text svneol=native#text/plain -res/cardsfolder/rite_of_replication.txt -text svneol=native#text/plain -res/cardsfolder/rites_of_flourishing.txt -text svneol=native#text/plain -res/cardsfolder/rith_the_awakener.txt -text svneol=native#text/plain -res/cardsfolder/riths_attendant.txt -text svneol=native#text/plain -res/cardsfolder/riths_grove.txt -text svneol=native#text/plain -res/cardsfolder/ritual_of_restoration.txt -text svneol=native#text/plain -res/cardsfolder/ritual_of_steel.txt -text svneol=native#text/plain -res/cardsfolder/ritual_of_the_machine.txt -text svneol=native#text/plain -res/cardsfolder/riven_turnbull.txt -text svneol=native#text/plain -res/cardsfolder/river_bear.txt -text svneol=native#text/plain -res/cardsfolder/river_boa.txt -text svneol=native#text/plain -res/cardsfolder/river_delta.txt svneol=native#text/plain -res/cardsfolder/river_kaijin.txt -text svneol=native#text/plain -res/cardsfolder/river_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/riverfall_mimic.txt -text svneol=native#text/plain -res/cardsfolder/rix_maadi_dungeon_palace.txt -text svneol=native#text/plain -res/cardsfolder/roar_of_reclamation.txt svneol=native#text/plain -res/cardsfolder/roar_of_the_wurm.txt -text svneol=native#text/plain -res/cardsfolder/roaring_slagwurm.txt svneol=native#text/plain -res/cardsfolder/robber_fly.txt -text svneol=native#text/plain -res/cardsfolder/robe_of_mirrors.txt -text svneol=native#text/plain -res/cardsfolder/roc_egg.txt -text svneol=native#text/plain -res/cardsfolder/roc_hatchling.txt svneol=native#text/plain -res/cardsfolder/roc_of_kher_ridges.txt -text svneol=native#text/plain -res/cardsfolder/rock_badger.txt -text svneol=native#text/plain -res/cardsfolder/rock_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/rockcaster_platoon.txt -text svneol=native#text/plain -res/cardsfolder/rockshard_elemental.txt -text svneol=native#text/plain -res/cardsfolder/rockslide_ambush.txt -text svneol=native#text/plain -res/cardsfolder/rockslide_elemental.txt -text svneol=native#text/plain -res/cardsfolder/rocky_tar_pit.txt -text svneol=native#text/plain -res/cardsfolder/rod_of_ruin.txt -text svneol=native#text/plain -res/cardsfolder/rofellos_llanowar_emissary.txt -text svneol=native#text/plain -res/cardsfolder/rogue_kavu.txt -text svneol=native#text/plain -res/cardsfolder/roil_elemental.txt -text svneol=native#text/plain -res/cardsfolder/roiling_terrain.txt -text svneol=native#text/plain -res/cardsfolder/rolling_earthquake.txt -text svneol=native#text/plain -res/cardsfolder/rolling_stones.txt -text svneol=native#text/plain -res/cardsfolder/ronin_cavekeeper.txt -text svneol=native#text/plain -res/cardsfolder/ronin_cliffrider.txt -text svneol=native#text/plain -res/cardsfolder/ronin_houndmaster.txt -text svneol=native#text/plain -res/cardsfolder/ronom_hulk.txt -text svneol=native#text/plain -res/cardsfolder/ronom_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/roofstalker_wight.txt -text svneol=native#text/plain -res/cardsfolder/root_cage.txt -text svneol=native#text/plain -res/cardsfolder/root_elemental.txt svneol=native#text/plain -res/cardsfolder/root_maze.txt -text svneol=native#text/plain -res/cardsfolder/root_sliver.txt svneol=native#text/plain -res/cardsfolder/root_spider.txt svneol=native#text/plain -res/cardsfolder/rootbound_crag.txt -text svneol=native#text/plain -res/cardsfolder/rootbreaker_wurm.txt -text svneol=native#text/plain -res/cardsfolder/rootgrapple.txt svneol=native#text/plain -res/cardsfolder/rootrunner.txt -text svneol=native#text/plain -res/cardsfolder/roots.txt -text svneol=native#text/plain -res/cardsfolder/rootwalla.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_alligator.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_commando.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_depths.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_diver.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_hunter.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_mystic.txt -text svneol=native#text/plain -res/cardsfolder/rootwater_thief.txt -text svneol=native#text/plain -res/cardsfolder/rorix_bladewing.txt -text svneol=native#text/plain -res/cardsfolder/rot_wolf.txt -text svneol=native#text/plain -res/cardsfolder/roterothopter.txt -text svneol=native#text/plain -res/cardsfolder/rotlung_reanimator.txt -text svneol=native#text/plain -res/cardsfolder/rotted_hystrix.txt svneol=native#text/plain -res/cardsfolder/rotting_legion.txt -text svneol=native#text/plain -res/cardsfolder/rotting_rats.txt -text svneol=native#text/plain -res/cardsfolder/roughshod_mentor.txt -text svneol=native#text/plain -res/cardsfolder/rouse.txt -text svneol=native#text/plain -res/cardsfolder/rowan_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/royal_assassin.txt -text svneol=native#text/plain -res/cardsfolder/royal_decree.txt -text svneol=native#text/plain -res/cardsfolder/royal_falcon.txt -text svneol=native#text/plain -res/cardsfolder/royal_herbalist.txt svneol=native#text/plain -res/cardsfolder/royal_trooper.txt -text svneol=native#text/plain -res/cardsfolder/rubinia_soulsinger.txt -text svneol=native#text/plain -res/cardsfolder/ruby_leech.txt -text svneol=native#text/plain -res/cardsfolder/ruby_medallion.txt -text svneol=native#text/plain -res/cardsfolder/rugged_prairie.txt -text svneol=native#text/plain -res/cardsfolder/ruin_ghost.txt svneol=native#text/plain -res/cardsfolder/ruination.txt -text svneol=native#text/plain -res/cardsfolder/ruinous_minotaur.txt -text svneol=native#text/plain -res/cardsfolder/ruins_of_trokair.txt -text svneol=native#text/plain -res/cardsfolder/rukh_egg.txt -text svneol=native#text/plain -res/cardsfolder/rumbling_crescendo.txt -text svneol=native#text/plain -res/cardsfolder/rumbling_slum.txt -text svneol=native#text/plain -res/cardsfolder/rummaging_wizard.txt svneol=native#text/plain -res/cardsfolder/rune_cervin_rider.txt -text svneol=native#text/plain -res/cardsfolder/runeboggle.txt -text svneol=native#text/plain -res/cardsfolder/runeclaw_bear.txt -text svneol=native#text/plain -res/cardsfolder/runed_arch.txt svneol=native#text/plain -res/cardsfolder/runed_servitor.txt -text svneol=native#text/plain -res/cardsfolder/runed_stalactite.txt -text svneol=native#text/plain -res/cardsfolder/runes_of_the_deus.txt -text svneol=native#text/plain -res/cardsfolder/rupture.txt svneol=native#text/plain -res/cardsfolder/rush_of_knowledge.txt svneol=native#text/plain -res/cardsfolder/rushwood_dryad.txt -text svneol=native#text/plain -res/cardsfolder/rushwood_elemental.txt -text svneol=native#text/plain -res/cardsfolder/rushwood_herbalist.txt -text svneol=native#text/plain -res/cardsfolder/rusted_slasher.txt -text svneol=native#text/plain -res/cardsfolder/rustic_clachan.txt -text svneol=native#text/plain -res/cardsfolder/rusting_golem.txt svneol=native#text/plain -res/cardsfolder/rustrazor_butcher.txt -text svneol=native#text/plain -res/cardsfolder/rustspore_ram.txt -text svneol=native#text/plain -res/cardsfolder/ruthless_cullblade.txt -text svneol=native#text/plain -res/cardsfolder/ruthless_invasion.txt svneol=native#text/plain -res/cardsfolder/ryusei_the_falling_star.txt -text svneol=native#text/plain -res/cardsfolder/saber_ants.txt svneol=native#text/plain -res/cardsfolder/saberclaw_golem.txt -text svneol=native#text/plain -res/cardsfolder/sabertooth_alley_cat.txt -text svneol=native#text/plain -res/cardsfolder/sabertooth_nishoba.txt -text svneol=native#text/plain -res/cardsfolder/sabertooth_wyvern.txt -text svneol=native#text/plain -res/cardsfolder/sabretooth_tiger.txt -text svneol=native#text/plain -res/cardsfolder/sacellum_archers.txt -text svneol=native#text/plain -res/cardsfolder/sachi_daughter_of_seshiro.txt -text svneol=native#text/plain -res/cardsfolder/sacred_foundry.txt -text svneol=native#text/plain -res/cardsfolder/sacred_knight.txt -text svneol=native#text/plain -res/cardsfolder/sacred_nectar.txt -text svneol=native#text/plain -res/cardsfolder/sacred_prey.txt -text svneol=native#text/plain -res/cardsfolder/sacred_wolf.txt -text svneol=native#text/plain -res/cardsfolder/sacrifice.txt -text svneol=native#text/plain -res/cardsfolder/sadistic_augermage.txt svneol=native#text/plain -res/cardsfolder/sadistic_glee.txt svneol=native#text/plain -res/cardsfolder/sadistic_hypnotist.txt -text svneol=native#text/plain -res/cardsfolder/safehold_duo.txt -text svneol=native#text/plain -res/cardsfolder/safehold_elite.txt -text svneol=native#text/plain -res/cardsfolder/safehold_sentry.txt -text svneol=native#text/plain -res/cardsfolder/safewright_quest.txt -text svneol=native#text/plain -res/cardsfolder/sage_aven.txt -text svneol=native#text/plain -res/cardsfolder/sage_of_epityr.txt -text svneol=native#text/plain -res/cardsfolder/sage_of_lat_nam.txt -text svneol=native#text/plain -res/cardsfolder/sage_owl.txt -text svneol=native#text/plain -res/cardsfolder/sages_dousing.txt -text svneol=native#text/plain -res/cardsfolder/sages_knowledge.txt -text svneol=native#text/plain -res/cardsfolder/sailmonger.txt -text svneol=native#text/plain -res/cardsfolder/sakura_tribe_elder.txt -text svneol=native#text/plain -res/cardsfolder/sakura_tribe_scout.txt -text svneol=native#text/plain -res/cardsfolder/salt_flats.txt -text svneol=native#text/plain -res/cardsfolder/salt_marsh.txt -text svneol=native#text/plain -res/cardsfolder/saltblast.txt -text svneol=native#text/plain -res/cardsfolder/saltcrusted_steppe.txt -text svneol=native#text/plain -res/cardsfolder/saltfield_recluse.txt -text svneol=native#text/plain -res/cardsfolder/salvage.txt -text svneol=native#text/plain -res/cardsfolder/salvage_scout.txt -text svneol=native#text/plain -res/cardsfolder/salvage_slasher.txt -text svneol=native#text/plain -res/cardsfolder/salvage_titan.txt svneol=native#text/plain -res/cardsfolder/samite_archer.txt svneol=native#text/plain -res/cardsfolder/samite_healer.txt -text svneol=native#text/plain -res/cardsfolder/samurai_enforcers.txt -text svneol=native#text/plain -res/cardsfolder/sanctimony.txt -text svneol=native#text/plain -res/cardsfolder/sanctum_custodian.txt svneol=native#text/plain -res/cardsfolder/sanctum_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/sanctum_plowbeast.txt -text svneol=native#text/plain -res/cardsfolder/sand_silos.txt -text svneol=native#text/plain -res/cardsfolder/sandbar_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/sandbar_serpent.txt -text svneol=native#text/plain -res/cardsfolder/sandskin.txt -text svneol=native#text/plain -res/cardsfolder/sandsower.txt -text svneol=native#text/plain -res/cardsfolder/sandstone_needle.txt -text svneol=native#text/plain -res/cardsfolder/sandstone_warrior.txt -text svneol=native#text/plain -res/cardsfolder/sandstorm.txt -text svneol=native#text/plain -res/cardsfolder/sandstorm_eidolon.txt svneol=native#text/plain -res/cardsfolder/sangrite_backlash.txt -text svneol=native#text/plain -res/cardsfolder/sangrite_surge.txt -text svneol=native#text/plain -res/cardsfolder/sangromancer.txt -text svneol=native#text/plain -res/cardsfolder/sangrophage.txt -text svneol=native#text/plain -res/cardsfolder/sanguine_bond.txt -text svneol=native#text/plain -res/cardsfolder/sanguine_guard.txt -text svneol=native#text/plain -res/cardsfolder/sanguine_praetor.txt -text svneol=native#text/plain -res/cardsfolder/sanity_gnawers.txt -text svneol=native#text/plain -res/cardsfolder/sanity_grinding.txt -text svneol=native#text/plain -res/cardsfolder/sapling_of_colfenor.txt -text svneol=native#text/plain -res/cardsfolder/sapphire_leech.txt -text svneol=native#text/plain -res/cardsfolder/sapphire_medallion.txt -text svneol=native#text/plain -res/cardsfolder/saprazzan_bailiff.txt svneol=native#text/plain -res/cardsfolder/saprazzan_heir.txt -text svneol=native#text/plain -res/cardsfolder/saprazzan_raider.txt -text svneol=native#text/plain -res/cardsfolder/saprazzan_skerry.txt -text svneol=native#text/plain -res/cardsfolder/sapseep_forest.txt -text svneol=native#text/plain -res/cardsfolder/sarcatog.txt svneol=native#text/plain -res/cardsfolder/sarcomancy.txt -text svneol=native#text/plain -res/cardsfolder/sarcomite_myr.txt -text svneol=native#text/plain -res/cardsfolder/sarkhan_the_mad.txt -text svneol=native#text/plain -res/cardsfolder/sarkhan_vol.txt -text svneol=native#text/plain -res/cardsfolder/sarpadian_empires_vol_vii.txt -text svneol=native#text/plain -res/cardsfolder/savage_conception.txt svneol=native#text/plain -res/cardsfolder/savage_firecat.txt -text svneol=native#text/plain -res/cardsfolder/savage_gorilla.txt svneol=native#text/plain -res/cardsfolder/savage_hunger.txt -text svneol=native#text/plain -res/cardsfolder/savage_lands.txt -text svneol=native#text/plain -res/cardsfolder/savage_silhouette.txt svneol=native#text/plain -res/cardsfolder/savage_thallid.txt svneol=native#text/plain -res/cardsfolder/savage_twister.txt -text svneol=native#text/plain -res/cardsfolder/savannah.txt -text svneol=native#text/plain -res/cardsfolder/savannah_lions.txt -text svneol=native#text/plain -res/cardsfolder/savra_queen_of_the_golgari.txt -text svneol=native#text/plain -res/cardsfolder/sawback_manticore.txt svneol=native#text/plain -res/cardsfolder/sawtooth_loon.txt -text svneol=native#text/plain -res/cardsfolder/sawtooth_thresher.txt -text svneol=native#text/plain -res/cardsfolder/scab_clan_mauler.txt -text svneol=native#text/plain -res/cardsfolder/scabland.txt -text svneol=native#text/plain -res/cardsfolder/scald.txt svneol=native#text/plain -res/cardsfolder/scalding_salamander.txt -text svneol=native#text/plain -res/cardsfolder/scalding_tarn.txt -text svneol=native#text/plain -res/cardsfolder/scale_of_chiss_goria.txt -text svneol=native#text/plain -res/cardsfolder/scalebanes_elite.txt -text svneol=native#text/plain -res/cardsfolder/scaled_hulk.txt -text svneol=native#text/plain -res/cardsfolder/scaled_wurm.txt -text svneol=native#text/plain -res/cardsfolder/scalpelexis.txt -text svneol=native#text/plain -res/cardsfolder/scandalmonger.txt -text svneol=native#text/plain -res/cardsfolder/scapegoat.txt svneol=native#text/plain -res/cardsfolder/scar.txt -text svneol=native#text/plain -res/cardsfolder/scarblade_elite.txt -text svneol=native#text/plain -res/cardsfolder/scare_tactics.txt -text svneol=native#text/plain -res/cardsfolder/scarecrone.txt -text svneol=native#text/plain -res/cardsfolder/scarland_thrinax.txt -text svneol=native#text/plain -res/cardsfolder/scarred_vinebreeder.txt -text svneol=native#text/plain -res/cardsfolder/scarscale_ritual.txt svneol=native#text/plain -res/cardsfolder/scarwood_bandits.txt svneol=native#text/plain -res/cardsfolder/scarwood_goblins.txt -text svneol=native#text/plain -res/cardsfolder/scarwood_hag.txt -text svneol=native#text/plain -res/cardsfolder/scarwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/scathe_zombies.txt -text svneol=native#text/plain -res/cardsfolder/scattershot.txt -text svneol=native#text/plain -res/cardsfolder/scattershot_archer.txt -text svneol=native#text/plain -res/cardsfolder/scavenged_weaponry.txt -text svneol=native#text/plain -res/cardsfolder/scavenger_drake.txt -text svneol=native#text/plain -res/cardsfolder/scavenger_folk.txt -text svneol=native#text/plain -res/cardsfolder/scavenging_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/scavenging_scarab.txt -text svneol=native#text/plain -res/cardsfolder/scepter_of_dominance.txt -text svneol=native#text/plain -res/cardsfolder/scepter_of_fugue.txt -text svneol=native#text/plain -res/cardsfolder/scepter_of_insight.txt -text svneol=native#text/plain -res/cardsfolder/school_of_piranha.txt -text svneol=native#text/plain -res/cardsfolder/school_of_the_unseen.txt -text svneol=native#text/plain -res/cardsfolder/scion_of_darkness.txt svneol=native#text/plain -res/cardsfolder/scion_of_oona.txt -text svneol=native#text/plain -res/cardsfolder/scion_of_the_wild.txt -text svneol=native#text/plain -res/cardsfolder/scorched_ruins.txt -text svneol=native#text/plain -res/cardsfolder/scorched_rusalka.txt -text svneol=native#text/plain -res/cardsfolder/scorching_missile.txt -text svneol=native#text/plain -res/cardsfolder/scorching_spear.txt -text svneol=native#text/plain -res/cardsfolder/scorching_winds.txt svneol=native#text/plain -res/cardsfolder/scoria_cat.txt -text svneol=native#text/plain -res/cardsfolder/scoria_elemental.txt -text svneol=native#text/plain -res/cardsfolder/scoria_wurm.txt -text svneol=native#text/plain -res/cardsfolder/scornful_aether_lich.txt -text svneol=native#text/plain -res/cardsfolder/scornful_egotist.txt -text svneol=native#text/plain -res/cardsfolder/scourge_devil.txt -text svneol=native#text/plain -res/cardsfolder/scourge_of_kher_ridges.txt -text svneol=native#text/plain -res/cardsfolder/scourge_of_numai.txt -text svneol=native#text/plain -res/cardsfolder/scourge_of_the_nobilis.txt svneol=native#text/plain -res/cardsfolder/scourge_servant.txt -text svneol=native#text/plain -res/cardsfolder/scourglass.txt -text svneol=native#text/plain -res/cardsfolder/scragnoth.txt -text svneol=native#text/plain -res/cardsfolder/scrap.txt -text svneol=native#text/plain -res/cardsfolder/scrapbasket.txt -text svneol=native#text/plain -res/cardsfolder/scrapdiver_serpent.txt -text svneol=native#text/plain -res/cardsfolder/scrapheap.txt -text svneol=native#text/plain -res/cardsfolder/scrapyard_salvo.txt svneol=native#text/plain -res/cardsfolder/screaming_fury.txt -text svneol=native#text/plain -res/cardsfolder/screaming_seahawk.txt -text svneol=native#text/plain -res/cardsfolder/screams_of_the_damned.txt svneol=native#text/plain -res/cardsfolder/screeching_buzzard.txt -text svneol=native#text/plain -res/cardsfolder/screeching_drake.txt svneol=native#text/plain -res/cardsfolder/screeching_harpy.txt -text svneol=native#text/plain -res/cardsfolder/screeching_silcaw.txt -text svneol=native#text/plain -res/cardsfolder/screeching_sliver.txt svneol=native#text/plain -res/cardsfolder/scrivener.txt -text svneol=native#text/plain -res/cardsfolder/scroll_rack.txt -text svneol=native#text/plain -res/cardsfolder/scroll_thief.txt -text svneol=native#text/plain -res/cardsfolder/scrubland.txt -text svneol=native#text/plain -res/cardsfolder/scryb_ranger.txt -text svneol=native#text/plain -res/cardsfolder/scryb_sprites.txt -text svneol=native#text/plain -res/cardsfolder/scrying_sheets.txt -text svneol=native#text/plain -res/cardsfolder/sculpting_steel.txt -text svneol=native#text/plain -res/cardsfolder/scute_mob.txt -text svneol=native#text/plain -res/cardsfolder/scuttling_death.txt svneol=native#text/plain -res/cardsfolder/scuzzback_marauders.txt -text svneol=native#text/plain -res/cardsfolder/scuzzback_scrapper.txt -text svneol=native#text/plain -res/cardsfolder/sea_drake.txt svneol=native#text/plain -res/cardsfolder/sea_eagle.txt -text svneol=native#text/plain -res/cardsfolder/sea_gate_loremaster.txt -text svneol=native#text/plain -res/cardsfolder/sea_gate_oracle.txt -text svneol=native#text/plain -res/cardsfolder/sea_kings_blessing.txt -text svneol=native#text/plain -res/cardsfolder/sea_monster.txt -text svneol=native#text/plain -res/cardsfolder/sea_scryer.txt -text svneol=native#text/plain -res/cardsfolder/sea_serpent.txt -text svneol=native#text/plain -res/cardsfolder/sea_spirit.txt -text svneol=native#text/plain -res/cardsfolder/sea_sprite.txt -text svneol=native#text/plain -res/cardsfolder/seachrome_coast.txt -text svneol=native#text/plain -res/cardsfolder/seafloor_debris.txt -text svneol=native#text/plain -res/cardsfolder/seahunter.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_cleansing.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_doom.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_primordium.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_removal.txt -text svneol=native#text/plain -res/cardsfolder/seal_of_strength.txt -text svneol=native#text/plain -res/cardsfolder/search_for_tomorrow.txt -text svneol=native#text/plain -res/cardsfolder/searing_flesh.txt -text svneol=native#text/plain -res/cardsfolder/searing_meditation.txt -text svneol=native#text/plain -res/cardsfolder/searing_touch.txt svneol=native#text/plain -res/cardsfolder/searing_wind.txt -text svneol=native#text/plain -res/cardsfolder/seas_claim.txt -text svneol=native#text/plain -res/cardsfolder/seascape_aerialist.txt -text svneol=native#text/plain -res/cardsfolder/seashell_cameo.txt -text svneol=native#text/plain -res/cardsfolder/seaside_citadel.txt -text svneol=native#text/plain -res/cardsfolder/seaside_haven.txt -text svneol=native#text/plain -res/cardsfolder/seasinger.txt -text svneol=native#text/plain -res/cardsfolder/seasoned_marshal.txt -text svneol=native#text/plain -res/cardsfolder/seat_of_the_synod.txt -text svneol=native#text/plain -res/cardsfolder/secluded_glen.txt -text svneol=native#text/plain -res/cardsfolder/secluded_steppe.txt -text svneol=native#text/plain -res/cardsfolder/second_chance.txt svneol=native#text/plain -res/cardsfolder/second_sight.txt svneol=native#text/plain -res/cardsfolder/second_thoughts.txt -text svneol=native#text/plain -res/cardsfolder/second_wind.txt svneol=native#text/plain -res/cardsfolder/security_detail.txt -text svneol=native#text/plain -res/cardsfolder/sedge_troll.txt -text svneol=native#text/plain -res/cardsfolder/sedraxis_alchemist.txt -text svneol=native#text/plain -res/cardsfolder/sedraxis_specter.txt -text svneol=native#text/plain -res/cardsfolder/see_beyond.txt -text svneol=native#text/plain -res/cardsfolder/seed_the_land.txt -text svneol=native#text/plain -res/cardsfolder/seedborn_muse.txt -text svneol=native#text/plain -res/cardsfolder/seedcradle_witch.txt -text svneol=native#text/plain -res/cardsfolder/seedguide_ash.txt svneol=native#text/plain -res/cardsfolder/seeds_of_strength.txt svneol=native#text/plain -res/cardsfolder/seek_the_horizon.txt -text svneol=native#text/plain -res/cardsfolder/seeker.txt -text svneol=native#text/plain -res/cardsfolder/seeker_of_skybreak.txt -text svneol=native#text/plain -res/cardsfolder/seers_sundial.txt -text svneol=native#text/plain -res/cardsfolder/seething_anger.txt svneol=native#text/plain -res/cardsfolder/seething_pathblazer.txt -text svneol=native#text/plain -res/cardsfolder/seething_song.txt -text svneol=native#text/plain -res/cardsfolder/segmented_wurm.txt svneol=native#text/plain -res/cardsfolder/segovian_leviathan.txt -text svneol=native#text/plain -res/cardsfolder/seismic_assault.txt -text svneol=native#text/plain -res/cardsfolder/seismic_mage.txt -text svneol=native#text/plain -res/cardsfolder/seismic_shudder.txt -text svneol=native#text/plain -res/cardsfolder/seismic_spike.txt -text svneol=native#text/plain -res/cardsfolder/seismic_strike.txt -text svneol=native#text/plain -res/cardsfolder/seizan_perverter_of_truth.txt -text svneol=native#text/plain -res/cardsfolder/seize_the_initiative.txt -text svneol=native#text/plain -res/cardsfolder/seizures.txt svneol=native#text/plain -res/cardsfolder/sejiri_merfolk.txt -text svneol=native#text/plain -res/cardsfolder/sejiri_refuge.txt -text svneol=native#text/plain -res/cardsfolder/sejiri_steppe.txt -text svneol=native#text/plain -res/cardsfolder/sekkuar_deathkeeper.txt -text svneol=native#text/plain -res/cardsfolder/selenia_dark_angel.txt -text svneol=native#text/plain -res/cardsfolder/selesnya_evangel.txt -text svneol=native#text/plain -res/cardsfolder/selesnya_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/selesnya_sanctuary.txt -text svneol=native#text/plain -res/cardsfolder/selesnya_signet.txt -text svneol=native#text/plain -res/cardsfolder/selfless_exorcist.txt -text svneol=native#text/plain -res/cardsfolder/selkie_hedge_mage.txt -text svneol=native#text/plain -res/cardsfolder/sell_sword_brute.txt -text svneol=native#text/plain -res/cardsfolder/sengir_autocrat.txt -text svneol=native#text/plain -res/cardsfolder/sengir_bats.txt -text svneol=native#text/plain -res/cardsfolder/sengir_vampire.txt -text svneol=native#text/plain -res/cardsfolder/sensation_gorger.txt -text svneol=native#text/plain -res/cardsfolder/sensei_golden_tail.txt -text svneol=native#text/plain -res/cardsfolder/senseis_divining_top.txt -text svneol=native#text/plain -res/cardsfolder/sensor_splicer.txt -text svneol=native#text/plain -res/cardsfolder/sentinels_of_glen_elendra.txt -text svneol=native#text/plain -res/cardsfolder/septic_rats.txt -text svneol=native#text/plain -res/cardsfolder/serendib_efreet.txt -text svneol=native#text/plain -res/cardsfolder/serendib_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/serene_heart.txt -text svneol=native#text/plain -res/cardsfolder/serene_offering.txt -text svneol=native#text/plain -res/cardsfolder/serene_sunset.txt svneol=native#text/plain -res/cardsfolder/serenity.txt -text svneol=native#text/plain -res/cardsfolder/serpent_assassin.txt -text svneol=native#text/plain -res/cardsfolder/serpent_generator.txt -text svneol=native#text/plain -res/cardsfolder/serpent_of_the_endless_sea.txt -text svneol=native#text/plain -res/cardsfolder/serpent_skin.txt svneol=native#text/plain -res/cardsfolder/serpent_warrior.txt -text svneol=native#text/plain -res/cardsfolder/serpentine_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/serpentine_kavu.txt -text svneol=native#text/plain -res/cardsfolder/serra_advocate.txt svneol=native#text/plain -res/cardsfolder/serra_angel.txt -text svneol=native#text/plain -res/cardsfolder/serra_ascendant.txt -text svneol=native#text/plain -res/cardsfolder/serra_avatar.txt -text svneol=native#text/plain -res/cardsfolder/serra_avenger.txt -text svneol=native#text/plain -res/cardsfolder/serra_aviary.txt -text svneol=native#text/plain -res/cardsfolder/serra_inquisitors.txt svneol=native#text/plain -res/cardsfolder/serra_sphinx.txt -text svneol=native#text/plain -res/cardsfolder/serra_zealot.txt -text svneol=native#text/plain -res/cardsfolder/serras_blessing.txt -text svneol=native#text/plain -res/cardsfolder/serras_boon.txt -text svneol=native#text/plain -res/cardsfolder/serras_embrace.txt -text svneol=native#text/plain -res/cardsfolder/serras_liturgy.txt -text svneol=native#text/plain -res/cardsfolder/serras_sanctum.txt -text svneol=native#text/plain -res/cardsfolder/serrated_arrows.txt svneol=native#text/plain -res/cardsfolder/serrated_biskelion.txt -text svneol=native#text/plain -res/cardsfolder/serum_raker.txt -text svneol=native#text/plain -res/cardsfolder/serum_tank.txt -text svneol=native#text/plain -res/cardsfolder/serum_visions.txt -text svneol=native#text/plain -res/cardsfolder/servant_of_volrath.txt svneol=native#text/plain -res/cardsfolder/seshiro_the_anointed.txt -text svneol=native#text/plain -res/cardsfolder/seton_krosan_protector.txt -text svneol=native#text/plain -res/cardsfolder/setons_desire.txt -text svneol=native#text/plain -res/cardsfolder/setons_scout.txt -text svneol=native#text/plain -res/cardsfolder/sever_soul.txt -text svneol=native#text/plain -res/cardsfolder/severed_legion.txt -text svneol=native#text/plain -res/cardsfolder/sewer_rats.txt svneol=native#text/plain -res/cardsfolder/sewerdreg.txt -text svneol=native#text/plain -res/cardsfolder/sewn_eye_drake.txt -text svneol=native#text/plain -res/cardsfolder/shackles.txt svneol=native#text/plain -res/cardsfolder/shade_of_trokair.txt -text svneol=native#text/plain -res/cardsfolder/shades_form.txt -text svneol=native#text/plain -res/cardsfolder/shadow_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/shadow_lance.txt -text svneol=native#text/plain -res/cardsfolder/shadow_rider.txt -text svneol=native#text/plain -res/cardsfolder/shadow_rift.txt -text svneol=native#text/plain -res/cardsfolder/shadow_sliver.txt -text svneol=native#text/plain -res/cardsfolder/shadowblood_egg.txt -text svneol=native#text/plain -res/cardsfolder/shadowblood_ridge.txt -text svneol=native#text/plain -res/cardsfolder/shadowfeed.txt -text svneol=native#text/plain -res/cardsfolder/shadowmage_infiltrator.txt -text svneol=native#text/plain -res/cardsfolder/shadowstorm.txt -text svneol=native#text/plain -res/cardsfolder/shaleskin_bruiser.txt svneol=native#text/plain -res/cardsfolder/shaleskin_plower.txt svneol=native#text/plain -res/cardsfolder/shambling_remains.txt -text svneol=native#text/plain -res/cardsfolder/shambling_shell.txt -text svneol=native#text/plain -res/cardsfolder/shambling_strider.txt -text svneol=native#text/plain -res/cardsfolder/shanodin_dryads.txt -text svneol=native#text/plain -res/cardsfolder/shaper_guildmage.txt -text svneol=native#text/plain -res/cardsfolder/shapeshifter.txt -text svneol=native#text/plain -res/cardsfolder/shard_convergence.txt -text svneol=native#text/plain -res/cardsfolder/shard_phoenix.txt -text svneol=native#text/plain -res/cardsfolder/shard_volley.txt -text svneol=native#text/plain -res/cardsfolder/sharding_sphinx.txt svneol=native#text/plain -res/cardsfolder/shared_discovery.txt -text svneol=native#text/plain -res/cardsfolder/shared_triumph.txt -text svneol=native#text/plain -res/cardsfolder/sharuum_the_hegemon.txt -text svneol=native#text/plain -res/cardsfolder/shatter.txt -text svneol=native#text/plain -res/cardsfolder/shattered_angel.txt svneol=native#text/plain -res/cardsfolder/shattered_crypt.txt svneol=native#text/plain -res/cardsfolder/shattered_dreams.txt -text svneol=native#text/plain -res/cardsfolder/shattering_pulse.txt -text svneol=native#text/plain -res/cardsfolder/shattering_spree.txt svneol=native#text/plain -res/cardsfolder/shatterskull_giant.txt -text svneol=native#text/plain -res/cardsfolder/shatterstorm.txt -text svneol=native#text/plain -res/cardsfolder/shauku_endbringer.txt -text svneol=native#text/plain -res/cardsfolder/shaukus_minion.txt -text svneol=native#text/plain -res/cardsfolder/shell_skulkin.txt -text svneol=native#text/plain -res/cardsfolder/sheltered_valley.txt -text svneol=native#text/plain -res/cardsfolder/sheltering_prayers.txt svneol=native#text/plain -res/cardsfolder/sheoldred_whispering_one.txt -text svneol=native#text/plain -res/cardsfolder/shepherd_of_rot.txt -text svneol=native#text/plain -res/cardsfolder/shepherd_of_the_lost.txt -text svneol=native#text/plain -res/cardsfolder/shield_mate.txt -text svneol=native#text/plain -res/cardsfolder/shield_of_duty_and_reason.txt -text svneol=native#text/plain -res/cardsfolder/shield_of_kaldra.txt -text svneol=native#text/plain -res/cardsfolder/shield_of_the_ages.txt svneol=native#text/plain -res/cardsfolder/shield_of_the_oversoul.txt -text svneol=native#text/plain -res/cardsfolder/shield_sphere.txt -text svneol=native#text/plain -res/cardsfolder/shield_wall.txt -text svneol=native#text/plain -res/cardsfolder/shielding_plax.txt -text svneol=native#text/plain -res/cardsfolder/shieldmates_blessing.txt svneol=native#text/plain -res/cardsfolder/shifting_sliver.txt svneol=native#text/plain -res/cardsfolder/shifting_wall.txt -text svneol=native#text/plain -res/cardsfolder/shimmer_myr.txt -text svneol=native#text/plain -res/cardsfolder/shimmering_barrier.txt -text svneol=native#text/plain -res/cardsfolder/shimmering_grotto.txt -text svneol=native#text/plain -res/cardsfolder/shimmering_wings.txt svneol=native#text/plain -res/cardsfolder/shinen_of_fears_chill.txt -text svneol=native#text/plain -res/cardsfolder/shinen_of_lifes_roar.txt -text svneol=native#text/plain -res/cardsfolder/shinen_of_stars_light.txt -text svneol=native#text/plain -res/cardsfolder/shinka_gatekeeper.txt -text svneol=native#text/plain -res/cardsfolder/shinka_the_bloodsoaked_keep.txt svneol=native#text/plain -res/cardsfolder/shivan_dragon.txt -text svneol=native#text/plain -res/cardsfolder/shivan_emissary.txt -text svneol=native#text/plain -res/cardsfolder/shivan_gorge.txt svneol=native#text/plain -res/cardsfolder/shivan_harvest.txt -text svneol=native#text/plain -res/cardsfolder/shivan_hellkite.txt -text svneol=native#text/plain -res/cardsfolder/shivan_meteor.txt -text svneol=native#text/plain -res/cardsfolder/shivan_oasis.txt -text svneol=native#text/plain -res/cardsfolder/shivan_phoenix.txt -text svneol=native#text/plain -res/cardsfolder/shivan_raptor.txt -text svneol=native#text/plain -res/cardsfolder/shivan_reef.txt -text svneol=native#text/plain -res/cardsfolder/shivan_wurm.txt -text svneol=native#text/plain -res/cardsfolder/shivan_zombie.txt -text svneol=native#text/plain -res/cardsfolder/shivs_embrace.txt -text svneol=native#text/plain -res/cardsfolder/shizo_deaths_storehouse.txt -text svneol=native#text/plain -res/cardsfolder/shock.txt -text svneol=native#text/plain -res/cardsfolder/shock_troops.txt -text svneol=native#text/plain -res/cardsfolder/shore_snapper.txt -text svneol=native#text/plain -res/cardsfolder/shorecrasher_mimic.txt -text svneol=native#text/plain -res/cardsfolder/shoreline_raider.txt -text svneol=native#text/plain -res/cardsfolder/shoreline_ranger.txt -text svneol=native#text/plain -res/cardsfolder/shoreline_salvager.txt -text svneol=native#text/plain -res/cardsfolder/show_and_tell.txt -text svneol=native#text/plain -res/cardsfolder/shower_of_sparks.txt -text svneol=native#text/plain -res/cardsfolder/shrapnel_blast.txt -text svneol=native#text/plain -res/cardsfolder/shriek_of_dread.txt -text svneol=native#text/plain -res/cardsfolder/shriek_raptor.txt svneol=native#text/plain -res/cardsfolder/shriekhorn.txt -text svneol=native#text/plain -res/cardsfolder/shrieking_drake.txt -text svneol=native#text/plain -res/cardsfolder/shrieking_mogg.txt svneol=native#text/plain -res/cardsfolder/shrieking_specter.txt -text svneol=native#text/plain -res/cardsfolder/shriekmaw.txt -text svneol=native#text/plain -res/cardsfolder/shrine_of_boundless_growth.txt svneol=native#text/plain -res/cardsfolder/shrine_of_burning_rage.txt svneol=native#text/plain -res/cardsfolder/shrine_of_limitless_power.txt svneol=native#text/plain -res/cardsfolder/shrine_of_loyal_legions.txt svneol=native#text/plain -res/cardsfolder/shrine_of_piercing_vision.txt -text svneol=native#text/plain -res/cardsfolder/shrink.txt -text svneol=native#text/plain -res/cardsfolder/shrivel.txt svneol=native#text/plain -res/cardsfolder/shriveling_rot.txt -text svneol=native#text/plain -res/cardsfolder/shu_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/shu_elite_companions.txt -text svneol=native#text/plain -res/cardsfolder/shu_elite_infantry.txt -text svneol=native#text/plain -res/cardsfolder/shu_farmer.txt -text svneol=native#text/plain -res/cardsfolder/shu_foot_soldiers.txt -text svneol=native#text/plain -res/cardsfolder/shu_general.txt -text svneol=native#text/plain -res/cardsfolder/shu_grain_caravan.txt -text svneol=native#text/plain -res/cardsfolder/shu_soldier_farmers.txt -text svneol=native#text/plain -res/cardsfolder/shuko.txt -text svneol=native#text/plain -res/cardsfolder/sibilant_spirit.txt -text svneol=native#text/plain -res/cardsfolder/sick_and_tired.txt svneol=native#text/plain -res/cardsfolder/sicken.txt -text svneol=native#text/plain -res/cardsfolder/sickening_shoal.txt -text svneol=native#text/plain -res/cardsfolder/sickle_ripper.txt -text svneol=native#text/plain -res/cardsfolder/sickleslicer.txt svneol=native#text/plain -res/cardsfolder/sidar_jabari.txt svneol=native#text/plain -res/cardsfolder/sidewinder_sliver.txt -text svneol=native#text/plain -res/cardsfolder/siege_gang_commander.txt -text svneol=native#text/plain -res/cardsfolder/siege_mastodon.txt -text svneol=native#text/plain -res/cardsfolder/siege_of_towers.txt svneol=native#text/plain -res/cardsfolder/sift.txt -text svneol=native#text/plain -res/cardsfolder/sighted_caste_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/sigil_blessing.txt -text svneol=native#text/plain -res/cardsfolder/sigil_captain.txt -text svneol=native#text/plain -res/cardsfolder/sigil_of_the_empty_throne.txt -text svneol=native#text/plain -res/cardsfolder/sigil_of_the_nayan_gods.txt -text svneol=native#text/plain -res/cardsfolder/sigil_of_the_new_dawn.txt -text svneol=native#text/plain -res/cardsfolder/sigil_tracer.txt svneol=native#text/plain -res/cardsfolder/sigiled_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/sigiled_paladin.txt -text svneol=native#text/plain -res/cardsfolder/sign_in_blood.txt -text svneol=native#text/plain -res/cardsfolder/signal_pest.txt -text svneol=native#text/plain -res/cardsfolder/silent_arbiter.txt -text svneol=native#text/plain -res/cardsfolder/silent_attendant.txt -text svneol=native#text/plain -res/cardsfolder/silent_chant_zubera.txt -text svneol=native#text/plain -res/cardsfolder/silent_specter.txt -text svneol=native#text/plain -res/cardsfolder/silhana_ledgewalker.txt -text svneol=native#text/plain -res/cardsfolder/silk_net.txt -text svneol=native#text/plain -res/cardsfolder/silkbind_faerie.txt -text svneol=native#text/plain -res/cardsfolder/silkenfist_fighter.txt -text svneol=native#text/plain -res/cardsfolder/silkenfist_order.txt -text svneol=native#text/plain -res/cardsfolder/silklash_spider.txt -text svneol=native#text/plain -res/cardsfolder/silkwing_scout.txt svneol=native#text/plain -res/cardsfolder/silt_crawler.txt svneol=native#text/plain -res/cardsfolder/silver_drake.txt -text svneol=native#text/plain -res/cardsfolder/silver_erne.txt -text svneol=native#text/plain -res/cardsfolder/silver_knight.txt -text svneol=native#text/plain -res/cardsfolder/silver_myr.txt -text svneol=native#text/plain -res/cardsfolder/silver_seraph.txt -text svneol=native#text/plain -res/cardsfolder/silverback_ape.txt -text svneol=native#text/plain -res/cardsfolder/silvercoat_lion.txt -text svneol=native#text/plain -res/cardsfolder/silverglade_elemental.txt -text svneol=native#text/plain -res/cardsfolder/silverglade_pathfinder.txt -text svneol=native#text/plain -res/cardsfolder/silverskin_armor.txt svneol=native#text/plain -res/cardsfolder/silverstorm_samurai.txt -text svneol=native#text/plain -res/cardsfolder/silvos_rogue_elemental.txt -text svneol=native#text/plain -res/cardsfolder/sima_yi_wei_field_marshal.txt -text svneol=native#text/plain -res/cardsfolder/simian_grunts.txt -text svneol=native#text/plain -res/cardsfolder/simian_spirit_guide.txt -text svneol=native#text/plain -res/cardsfolder/simic_growth_chamber.txt -text svneol=native#text/plain -res/cardsfolder/simic_ragworm.txt -text svneol=native#text/plain -res/cardsfolder/simic_signet.txt -text svneol=native#text/plain -res/cardsfolder/simic_sky_swallower.txt -text svneol=native#text/plain -res/cardsfolder/simplify.txt -text svneol=native#text/plain -res/cardsfolder/sinew_sliver.txt -text svneol=native#text/plain -res/cardsfolder/singe_mind_ogre.txt -text svneol=native#text/plain -res/cardsfolder/singing_tree.txt -text svneol=native#text/plain -res/cardsfolder/sinkhole.txt -text svneol=native#text/plain -res/cardsfolder/sinking_feeling.txt svneol=native#text/plain -res/cardsfolder/sir_shandlar_of_eberyn.txt -text svneol=native#text/plain -res/cardsfolder/sire_of_the_storm.txt -text svneol=native#text/plain -res/cardsfolder/sirens_call.txt -text svneol=native#text/plain -res/cardsfolder/sisays_ring.txt -text svneol=native#text/plain -res/cardsfolder/sisters_of_the_flame.txt -text svneol=native#text/plain -res/cardsfolder/sivitri_scarzam.txt -text svneol=native#text/plain -res/cardsfolder/sizzle.txt -text svneol=native#text/plain -res/cardsfolder/skarrg_the_rage_pits.txt -text svneol=native#text/plain -res/cardsfolder/skarrgan_pit_skulk.txt -text svneol=native#text/plain -res/cardsfolder/skarrgan_skybreaker.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_changeling.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_crocodile.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_kathari.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_snake.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_vampire.txt -text svneol=native#text/plain -res/cardsfolder/skeletal_wurm.txt -text svneol=native#text/plain -res/cardsfolder/skeleton_ship.txt -text svneol=native#text/plain -res/cardsfolder/skinrender.txt -text svneol=native#text/plain -res/cardsfolder/skinthinner.txt svneol=native#text/plain -res/cardsfolder/skinwing.txt -text svneol=native#text/plain -res/cardsfolder/skirge_familiar.txt -text svneol=native#text/plain -res/cardsfolder/skirk_fire_marshal.txt -text svneol=native#text/plain -res/cardsfolder/skirk_marauder.txt svneol=native#text/plain -res/cardsfolder/skirk_outrider.txt -text svneol=native#text/plain -res/cardsfolder/skirk_prospector.txt -text svneol=native#text/plain -res/cardsfolder/skirk_ridge_exhumer.txt -text svneol=native#text/plain -res/cardsfolder/skirk_shaman.txt -text svneol=native#text/plain -res/cardsfolder/skirk_volcanist.txt -text svneol=native#text/plain -res/cardsfolder/skithiryx_the_blight_dragon.txt -text svneol=native#text/plain -res/cardsfolder/skitter_of_lizards.txt -text svneol=native#text/plain -res/cardsfolder/skittering_horror.txt -text svneol=native#text/plain -res/cardsfolder/skittering_invasion.txt -text svneol=native#text/plain -res/cardsfolder/skittering_skirge.txt -text svneol=native#text/plain -res/cardsfolder/skittish_kavu.txt -text svneol=native#text/plain -res/cardsfolder/skizzik.txt -text svneol=native#text/plain -res/cardsfolder/skred.txt -text svneol=native#text/plain -res/cardsfolder/skulking_fugitive.txt -text svneol=native#text/plain -res/cardsfolder/skulking_ghost.txt -text svneol=native#text/plain -res/cardsfolder/skulking_knight.txt -text svneol=native#text/plain -res/cardsfolder/skull_catapult.txt -text svneol=native#text/plain -res/cardsfolder/skull_collector.txt -text svneol=native#text/plain -res/cardsfolder/skull_fracture.txt -text svneol=native#text/plain -res/cardsfolder/skull_of_orm.txt -text svneol=native#text/plain -res/cardsfolder/skull_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/skullclamp.txt -text svneol=native#text/plain -res/cardsfolder/skullmead_cauldron.txt svneol=native#text/plain -res/cardsfolder/skullmulcher.txt -text svneol=native#text/plain -res/cardsfolder/skullsnatcher.txt svneol=native#text/plain -res/cardsfolder/skulltap.txt -text svneol=native#text/plain -res/cardsfolder/sky_diamond.txt -text svneol=native#text/plain -res/cardsfolder/sky_eel_school.txt -text svneol=native#text/plain -res/cardsfolder/sky_hussar.txt -text svneol=native#text/plain -res/cardsfolder/sky_ruin_drake.txt -text svneol=native#text/plain -res/cardsfolder/sky_spirit.txt -text svneol=native#text/plain -res/cardsfolder/sky_swallower.txt -text svneol=native#text/plain -res/cardsfolder/sky_weaver.txt -text svneol=native#text/plain -res/cardsfolder/skycloud_egg.txt -text svneol=native#text/plain -res/cardsfolder/skycloud_expanse.txt -text svneol=native#text/plain -res/cardsfolder/skyhunter_cub.txt -text svneol=native#text/plain -res/cardsfolder/skyhunter_patrol.txt -text svneol=native#text/plain -res/cardsfolder/skyhunter_prowler.txt -text svneol=native#text/plain -res/cardsfolder/skyhunter_skirmisher.txt -text svneol=native#text/plain -res/cardsfolder/skyknight_legionnaire.txt -text svneol=native#text/plain -res/cardsfolder/skyreach_manta.txt -text svneol=native#text/plain -res/cardsfolder/skyrider_trainee.txt -text svneol=native#text/plain -res/cardsfolder/skyscribing.txt svneol=native#text/plain -res/cardsfolder/skyshaper.txt -text svneol=native#text/plain -res/cardsfolder/skyshooter.txt svneol=native#text/plain -res/cardsfolder/skyshroud_archer.txt svneol=native#text/plain -res/cardsfolder/skyshroud_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_claim.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_elf.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_elite.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_falcon.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_forest.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_poacher.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_ridgeback.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_troll.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_troopers.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_vampire.txt -text svneol=native#text/plain -res/cardsfolder/skyshroud_war_beast.txt svneol=native#text/plain -res/cardsfolder/skyward_eye_prophets.txt svneol=native#text/plain -res/cardsfolder/skywatcher_adept.txt -text svneol=native#text/plain -res/cardsfolder/skywing_aven.txt -text svneol=native#text/plain -res/cardsfolder/slag_fiend.txt -text svneol=native#text/plain -res/cardsfolder/slagstorm.txt -text svneol=native#text/plain -res/cardsfolder/slagwurm_armor.txt -text svneol=native#text/plain -res/cardsfolder/slash_panther.txt svneol=native#text/plain -res/cardsfolder/slashing_tiger.txt svneol=native#text/plain -res/cardsfolder/slate_of_ancestry.txt -text svneol=native#text/plain -res/cardsfolder/slaughter.txt -text svneol=native#text/plain -res/cardsfolder/slaughter_cry.txt -text svneol=native#text/plain -res/cardsfolder/slaughterhouse_bouncer.txt -text svneol=native#text/plain -res/cardsfolder/slave_of_bolas.txt -text svneol=native#text/plain -res/cardsfolder/slavering_nulls.txt -text svneol=native#text/plain -res/cardsfolder/slay.txt -text svneol=native#text/plain -res/cardsfolder/sleeper_agent.txt -text svneol=native#text/plain -res/cardsfolder/sleepers_guile.txt -text svneol=native#text/plain -res/cardsfolder/sleepers_robe.txt -text svneol=native#text/plain -res/cardsfolder/sleeping_potion.txt svneol=native#text/plain -res/cardsfolder/sleight_of_hand.txt -text svneol=native#text/plain -res/cardsfolder/slice_and_dice.txt -text svneol=native#text/plain -res/cardsfolder/slice_in_twain.txt -text svneol=native#text/plain -res/cardsfolder/slingbow_trap.txt svneol=native#text/plain -res/cardsfolder/slingshot_goblin.txt -text svneol=native#text/plain -res/cardsfolder/slinking_giant.txt -text svneol=native#text/plain -res/cardsfolder/slinking_serpent.txt -text svneol=native#text/plain -res/cardsfolder/slinking_skirge.txt -text svneol=native#text/plain -res/cardsfolder/slippery_bogle.txt -text svneol=native#text/plain -res/cardsfolder/slippery_karst.txt -text svneol=native#text/plain -res/cardsfolder/slipstream_eel.txt -text svneol=native#text/plain -res/cardsfolder/slipstream_serpent.txt -text svneol=native#text/plain -res/cardsfolder/sliptide_serpent.txt -text svneol=native#text/plain -res/cardsfolder/slith_ascendant.txt -text svneol=native#text/plain -res/cardsfolder/slith_bloodletter.txt -text svneol=native#text/plain -res/cardsfolder/slith_firewalker.txt -text svneol=native#text/plain -res/cardsfolder/slith_predator.txt -text svneol=native#text/plain -res/cardsfolder/slith_strider.txt -text svneol=native#text/plain -res/cardsfolder/slithering_shade.txt svneol=native#text/plain -res/cardsfolder/slithery_stalker.txt -text svneol=native#text/plain -res/cardsfolder/sliver_legion.txt -text svneol=native#text/plain -res/cardsfolder/sliver_overlord.txt -text svneol=native#text/plain -res/cardsfolder/sliver_queen.txt -text svneol=native#text/plain -res/cardsfolder/sliversmith.txt -text svneol=native#text/plain -res/cardsfolder/slobad_goblin_tinkerer.txt svneol=native#text/plain -res/cardsfolder/slow_motion.txt -text svneol=native#text/plain -res/cardsfolder/sludge_strider.txt -text svneol=native#text/plain -res/cardsfolder/sluggishness.txt -text svneol=native#text/plain -res/cardsfolder/slumbering_tora.txt -text svneol=native#text/plain -res/cardsfolder/smallpox.txt -text svneol=native#text/plain -res/cardsfolder/smash.txt -text svneol=native#text/plain -res/cardsfolder/smash_to_smithereens.txt -text svneol=native#text/plain -res/cardsfolder/smite.txt -text svneol=native#text/plain -res/cardsfolder/smogsteed_rider.txt svneol=native#text/plain -res/cardsfolder/smoke.txt -text svneol=native#text/plain -res/cardsfolder/smokespew_invoker.txt -text svneol=native#text/plain -res/cardsfolder/smokestack.txt -text svneol=native#text/plain -res/cardsfolder/smolder_initiate.txt svneol=native#text/plain -res/cardsfolder/smoldering_butcher.txt -text svneol=native#text/plain -res/cardsfolder/smoldering_crater.txt -text svneol=native#text/plain -res/cardsfolder/smoldering_spires.txt svneol=native#text/plain -res/cardsfolder/smother.txt -text svneol=native#text/plain -res/cardsfolder/snake_basket.txt -text svneol=native#text/plain -res/cardsfolder/snake_cult_initiation.txt -text svneol=native#text/plain -res/cardsfolder/snake_pit.txt -text svneol=native#text/plain -res/cardsfolder/snake_umbra.txt -text svneol=native#text/plain -res/cardsfolder/snap.txt -text svneol=native#text/plain -res/cardsfolder/snapback.txt -text svneol=native#text/plain -res/cardsfolder/snapping_creeper.txt svneol=native#text/plain -res/cardsfolder/snapping_drake.txt -text svneol=native#text/plain -res/cardsfolder/snapsail_glider.txt -text svneol=native#text/plain -res/cardsfolder/snarling_undorak.txt svneol=native#text/plain -res/cardsfolder/sneaky_homunculus.txt -text svneol=native#text/plain -res/cardsfolder/snorting_gahr.txt -text svneol=native#text/plain -res/cardsfolder/snow_covered_forest.txt -text svneol=native#text/plain -res/cardsfolder/snow_covered_island.txt -text svneol=native#text/plain -res/cardsfolder/snow_covered_mountain.txt -text svneol=native#text/plain -res/cardsfolder/snow_covered_plains.txt -text svneol=native#text/plain -res/cardsfolder/snow_covered_swamp.txt -text svneol=native#text/plain -res/cardsfolder/snow_devil.txt -text svneol=native#text/plain -res/cardsfolder/snow_fortress.txt svneol=native#text/plain -res/cardsfolder/snow_hound.txt svneol=native#text/plain -res/cardsfolder/snuff_out.txt svneol=native#text/plain -res/cardsfolder/soaring_hope.txt svneol=native#text/plain -res/cardsfolder/soaring_seacliff.txt svneol=native#text/plain -res/cardsfolder/soilshaper.txt svneol=native#text/plain -res/cardsfolder/sokenzan_bruiser.txt -text svneol=native#text/plain -res/cardsfolder/sol_ring.txt -text svneol=native#text/plain -res/cardsfolder/solar_blast.txt -text svneol=native#text/plain -res/cardsfolder/solar_tide.txt -text svneol=native#text/plain -res/cardsfolder/solarion.txt svneol=native#text/plain -res/cardsfolder/soldevi_adnate.txt -text svneol=native#text/plain -res/cardsfolder/soldevi_digger.txt -text svneol=native#text/plain -res/cardsfolder/soldevi_excavations.txt svneol=native#text/plain -res/cardsfolder/soldevi_heretic.txt -text svneol=native#text/plain -res/cardsfolder/soldevi_sage.txt svneol=native#text/plain -res/cardsfolder/soldevi_simulacrum.txt -text svneol=native#text/plain -res/cardsfolder/soldevi_steam_beast.txt -text svneol=native#text/plain -res/cardsfolder/soldier_of_fortune.txt svneol=native#text/plain -res/cardsfolder/soldier_replica.txt -text svneol=native#text/plain -res/cardsfolder/solemn_offering.txt -text svneol=native#text/plain -res/cardsfolder/solemn_simulacrum.txt -text svneol=native#text/plain -res/cardsfolder/solidarity.txt -text svneol=native#text/plain -res/cardsfolder/soliton.txt -text svneol=native#text/plain -res/cardsfolder/solkanar_the_swamp_king.txt -text svneol=native#text/plain -res/cardsfolder/soltari_champion.txt -text svneol=native#text/plain -res/cardsfolder/soltari_crusader.txt -text svneol=native#text/plain -res/cardsfolder/soltari_emissary.txt -text svneol=native#text/plain -res/cardsfolder/soltari_foot_soldier.txt -text svneol=native#text/plain -res/cardsfolder/soltari_lancer.txt -text svneol=native#text/plain -res/cardsfolder/soltari_monk.txt -text svneol=native#text/plain -res/cardsfolder/soltari_priest.txt -text svneol=native#text/plain -res/cardsfolder/soltari_trooper.txt -text svneol=native#text/plain -res/cardsfolder/somber_hoverguard.txt -text svneol=native#text/plain -res/cardsfolder/somnomancer.txt -text svneol=native#text/plain -res/cardsfolder/song_of_serenity.txt -text svneol=native#text/plain -res/cardsfolder/songs_of_the_damned.txt -text svneol=native#text/plain -res/cardsfolder/songstitcher.txt svneol=native#text/plain -res/cardsfolder/sonic_burst.txt -text svneol=native#text/plain -res/cardsfolder/sonic_seizure.txt -text svneol=native#text/plain -res/cardsfolder/soot_imp.txt svneol=native#text/plain -res/cardsfolder/sootfeather_flock.txt -text svneol=native#text/plain -res/cardsfolder/soothing_balm.txt -text svneol=native#text/plain -res/cardsfolder/sootstoke_kindler.txt -text svneol=native#text/plain -res/cardsfolder/sootwalkers.txt -text svneol=native#text/plain -res/cardsfolder/soratami_cloudskater.txt -text svneol=native#text/plain -res/cardsfolder/soratami_mindsweeper.txt -text svneol=native#text/plain -res/cardsfolder/soratami_mirror_guard.txt svneol=native#text/plain -res/cardsfolder/soratami_mirror_mage.txt svneol=native#text/plain -res/cardsfolder/soratami_rainshaper.txt svneol=native#text/plain -res/cardsfolder/soratami_savant.txt -text svneol=native#text/plain -res/cardsfolder/sorcerers_strongbox.txt -text svneol=native#text/plain -res/cardsfolder/sorceress_queen.txt -text svneol=native#text/plain -res/cardsfolder/sorcerous_sight.txt svneol=native#text/plain -res/cardsfolder/sosuke_son_of_seshiro.txt -text svneol=native#text/plain -res/cardsfolder/sosukes_summons.txt -text svneol=native#text/plain -res/cardsfolder/soul_barrier.txt svneol=native#text/plain -res/cardsfolder/soul_bleed.txt -text svneol=native#text/plain -res/cardsfolder/soul_channeling.txt svneol=native#text/plain -res/cardsfolder/soul_collector.txt svneol=native#text/plain -res/cardsfolder/soul_exchange.txt svneol=native#text/plain -res/cardsfolder/soul_feast.txt -text svneol=native#text/plain -res/cardsfolder/soul_foundry.txt svneol=native#text/plain -res/cardsfolder/soul_kiss.txt -text svneol=native#text/plain -res/cardsfolder/soul_link.txt svneol=native#text/plain -res/cardsfolder/soul_manipulation.txt -text svneol=native#text/plain -res/cardsfolder/soul_net.txt -text svneol=native#text/plain -res/cardsfolder/soul_of_magma.txt -text svneol=native#text/plain -res/cardsfolder/soul_parry.txt -text svneol=native#text/plain -res/cardsfolder/soul_rend.txt svneol=native#text/plain -res/cardsfolder/soul_scourge.txt -text svneol=native#text/plain -res/cardsfolder/soul_shepherd.txt svneol=native#text/plain -res/cardsfolder/soul_shred.txt -text svneol=native#text/plain -res/cardsfolder/soul_snuffers.txt -text svneol=native#text/plain -res/cardsfolder/soul_spike.txt -text svneol=native#text/plain -res/cardsfolder/soul_stair_expedition.txt -text svneol=native#text/plain -res/cardsfolder/soul_warden.txt -text svneol=native#text/plain -res/cardsfolder/soulbound_guardians.txt -text svneol=native#text/plain -res/cardsfolder/soulcatcher.txt -text svneol=native#text/plain -res/cardsfolder/soulcatchers_aerie.txt -text svneol=native#text/plain -res/cardsfolder/souldrinker.txt -text svneol=native#text/plain -res/cardsfolder/soulless_one.txt svneol=native#text/plain -res/cardsfolder/soulquake.txt svneol=native#text/plain -res/cardsfolder/souls_attendant.txt -text svneol=native#text/plain -res/cardsfolder/souls_might.txt -text svneol=native#text/plain -res/cardsfolder/souls_of_the_faultless.txt svneol=native#text/plain -res/cardsfolder/soulscour.txt -text svneol=native#text/plain -res/cardsfolder/soulsurge_elemental.txt -text svneol=native#text/plain -res/cardsfolder/soulsworn_jury.txt svneol=native#text/plain -res/cardsfolder/soultether_golem.txt -text svneol=native#text/plain -res/cardsfolder/sound_the_call.txt -text svneol=native#text/plain -res/cardsfolder/southern_elephant.txt -text svneol=native#text/plain -res/cardsfolder/southern_paladin.txt -text svneol=native#text/plain -res/cardsfolder/sovereigns_of_lost_alara.txt -text svneol=native#text/plain -res/cardsfolder/sower_of_temptation.txt -text svneol=native#text/plain -res/cardsfolder/spark_elemental.txt -text svneol=native#text/plain -res/cardsfolder/spark_spray.txt -text svneol=native#text/plain -res/cardsfolder/sparkcaster.txt -text svneol=native#text/plain -res/cardsfolder/sparkmage_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/sparksmith.txt -text svneol=native#text/plain -res/cardsfolder/sparkspitter.txt -text svneol=native#text/plain -res/cardsfolder/sparring_golem.txt -text svneol=native#text/plain -res/cardsfolder/spawning_breath.txt -text svneol=native#text/plain -res/cardsfolder/spawning_pit.txt svneol=native#text/plain -res/cardsfolder/spawning_pool.txt -text svneol=native#text/plain -res/cardsfolder/spawnwrithe.txt -text svneol=native#text/plain -res/cardsfolder/spearbreaker_behemoth.txt -text svneol=native#text/plain -res/cardsfolder/specters_shroud.txt -text svneol=native#text/plain -res/cardsfolder/specters_wail.txt -text svneol=native#text/plain -res/cardsfolder/spectral_bears.txt -text svneol=native#text/plain -res/cardsfolder/spectral_cloak.txt -text svneol=native#text/plain -res/cardsfolder/spectral_force.txt -text svneol=native#text/plain -res/cardsfolder/spectral_guardian.txt -text svneol=native#text/plain -res/cardsfolder/spectral_lynx.txt -text svneol=native#text/plain -res/cardsfolder/spectral_procession.txt -text svneol=native#text/plain -res/cardsfolder/spectral_searchlight.txt -text svneol=native#text/plain -res/cardsfolder/spectral_shield.txt svneol=native#text/plain -res/cardsfolder/spectral_sliver.txt svneol=native#text/plain -res/cardsfolder/spell_blast.txt svneol=native#text/plain -res/cardsfolder/spell_burst.txt svneol=native#text/plain -res/cardsfolder/spell_contortion.txt -text svneol=native#text/plain -res/cardsfolder/spell_pierce.txt -text svneol=native#text/plain -res/cardsfolder/spell_snare.txt -text svneol=native#text/plain -res/cardsfolder/spell_snip.txt -text svneol=native#text/plain -res/cardsfolder/spell_syphon.txt -text svneol=native#text/plain -res/cardsfolder/spellbane_centaur.txt -text svneol=native#text/plain -res/cardsfolder/spellbook.txt -text svneol=native#text/plain -res/cardsfolder/spellbreaker_behemoth.txt svneol=native#text/plain -res/cardsfolder/spellgorger_barbarian.txt svneol=native#text/plain -res/cardsfolder/spellshock.txt -text svneol=native#text/plain -res/cardsfolder/spellstutter_sprite.txt svneol=native#text/plain -res/cardsfolder/sphere_of_duty.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_grace.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_law.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_purity.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_reason.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_resistance.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_the_suns.txt -text svneol=native#text/plain -res/cardsfolder/sphere_of_truth.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_bone_wand.txt svneol=native#text/plain -res/cardsfolder/sphinx_of_jwar_isle.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_of_lost_truths.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_of_magosi.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_of_the_steel_wind.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_sovereign.txt -text svneol=native#text/plain -res/cardsfolder/sphinx_summoner.txt -text svneol=native#text/plain -res/cardsfolder/spider_umbra.txt -text svneol=native#text/plain -res/cardsfolder/spidersilk_armor.txt -text svneol=native#text/plain -res/cardsfolder/spidersilk_net.txt -text svneol=native#text/plain -res/cardsfolder/spiderwig_boggart.txt svneol=native#text/plain -res/cardsfolder/spike_breeder.txt -text svneol=native#text/plain -res/cardsfolder/spike_colony.txt -text svneol=native#text/plain -res/cardsfolder/spike_drone.txt -text svneol=native#text/plain -res/cardsfolder/spike_feeder.txt -text svneol=native#text/plain -res/cardsfolder/spike_hatcher.txt -text svneol=native#text/plain -res/cardsfolder/spike_soldier.txt svneol=native#text/plain -res/cardsfolder/spike_tiller.txt svneol=native#text/plain -res/cardsfolder/spike_weaver.txt -text svneol=native#text/plain -res/cardsfolder/spike_worker.txt -text svneol=native#text/plain -res/cardsfolder/spikeshot_elder.txt -text svneol=native#text/plain -res/cardsfolder/spikeshot_goblin.txt -text svneol=native#text/plain -res/cardsfolder/spiketail_drake.txt -text svneol=native#text/plain -res/cardsfolder/spiketail_drakeling.txt -text svneol=native#text/plain -res/cardsfolder/spiketail_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/spin_into_myth.txt -text svneol=native#text/plain -res/cardsfolder/spinal_graft.txt -text svneol=native#text/plain -res/cardsfolder/spinal_villain.txt -text svneol=native#text/plain -res/cardsfolder/spincrusher.txt -text svneol=native#text/plain -res/cardsfolder/spindrift_drake.txt -text svneol=native#text/plain -res/cardsfolder/spine_of_ish_sah.txt -text svneol=native#text/plain -res/cardsfolder/spined_basher.txt -text svneol=native#text/plain -res/cardsfolder/spined_fluke.txt -text svneol=native#text/plain -res/cardsfolder/spined_sliver.txt -text svneol=native#text/plain -res/cardsfolder/spined_thopter.txt svneol=native#text/plain -res/cardsfolder/spined_wurm.txt -text svneol=native#text/plain -res/cardsfolder/spineless_thug.txt -text svneol=native#text/plain -res/cardsfolder/spinneret_sliver.txt -text svneol=native#text/plain -res/cardsfolder/spiraling_duelist.txt -text svneol=native#text/plain -res/cardsfolder/spiraling_embers.txt -text svneol=native#text/plain -res/cardsfolder/spire_barrage.txt -text svneol=native#text/plain -res/cardsfolder/spire_golem.txt -text svneol=native#text/plain -res/cardsfolder/spire_monitor.txt -text svneol=native#text/plain -res/cardsfolder/spire_owl.txt -text svneol=native#text/plain -res/cardsfolder/spire_serpent.txt -text svneol=native#text/plain -res/cardsfolder/spirit_cairn.txt svneol=native#text/plain -res/cardsfolder/spirit_en_dal.txt -text svneol=native#text/plain -res/cardsfolder/spirit_link.txt -text svneol=native#text/plain -res/cardsfolder/spirit_loop.txt -text svneol=native#text/plain -res/cardsfolder/spirit_of_resistance.txt -text svneol=native#text/plain -res/cardsfolder/spirit_of_the_night.txt -text svneol=native#text/plain -res/cardsfolder/spirit_shackle.txt -text svneol=native#text/plain -res/cardsfolder/spirit_weaver.txt -text svneol=native#text/plain -res/cardsfolder/spiritmonger.txt -text svneol=native#text/plain -res/cardsfolder/spiritual_asylum.txt svneol=native#text/plain -res/cardsfolder/spiritual_guardian.txt -text svneol=native#text/plain -res/cardsfolder/spitebellows.txt -text svneol=native#text/plain -res/cardsfolder/spiteflame_witch.txt -text svneol=native#text/plain -res/cardsfolder/spiteful_bully.txt svneol=native#text/plain -res/cardsfolder/spiteful_visions.txt -text svneol=native#text/plain -res/cardsfolder/spitemare.txt svneol=native#text/plain -res/cardsfolder/spitfire_handler.txt -text svneol=native#text/plain -res/cardsfolder/spitting_drake.txt -text svneol=native#text/plain -res/cardsfolder/spitting_earth.txt -text svneol=native#text/plain -res/cardsfolder/spitting_gourna.txt -text svneol=native#text/plain -res/cardsfolder/spitting_hydra.txt -text svneol=native#text/plain -res/cardsfolder/spitting_image.txt svneol=native#text/plain -res/cardsfolder/spitting_sliver.txt -text svneol=native#text/plain -res/cardsfolder/spitting_spider.txt -text svneol=native#text/plain -res/cardsfolder/splinter_twin.txt svneol=native#text/plain -res/cardsfolder/split_tail_miko.txt svneol=native#text/plain -res/cardsfolder/splitting_headache.txt -text svneol=native#text/plain -res/cardsfolder/spoils_of_victory.txt -text svneol=native#text/plain -res/cardsfolder/spontaneous_combustion.txt svneol=native#text/plain -res/cardsfolder/spontaneous_generation.txt -text svneol=native#text/plain -res/cardsfolder/spore_burst.txt -text svneol=native#text/plain -res/cardsfolder/spore_cloud.txt svneol=native#text/plain -res/cardsfolder/spore_flower.txt -text svneol=native#text/plain -res/cardsfolder/spore_frog.txt -text svneol=native#text/plain -res/cardsfolder/sporecap_spider.txt -text svneol=native#text/plain -res/cardsfolder/sporesower_thallid.txt -text svneol=native#text/plain -res/cardsfolder/sporoloth_ancient.txt -text svneol=native#text/plain -res/cardsfolder/spotted_griffin.txt -text svneol=native#text/plain -res/cardsfolder/spread_the_sickness.txt -text svneol=native#text/plain -res/cardsfolder/spreading_seas.txt -text svneol=native#text/plain -res/cardsfolder/spring_cleaning.txt svneol=native#text/plain -res/cardsfolder/spring_of_eternal_peace.txt -text svneol=native#text/plain -res/cardsfolder/springing_tiger.txt -text svneol=native#text/plain -res/cardsfolder/springjack_knight.txt -text svneol=native#text/plain -res/cardsfolder/springjack_shepherd.txt -text svneol=native#text/plain -res/cardsfolder/springleaf_drum.txt svneol=native#text/plain -res/cardsfolder/sprite_noble.txt svneol=native#text/plain -res/cardsfolder/sprout.txt -text svneol=native#text/plain -res/cardsfolder/sprout_swarm.txt -text svneol=native#text/plain -res/cardsfolder/sprouting_phytohydra.txt -text svneol=native#text/plain -res/cardsfolder/sprouting_thrinax.txt -text svneol=native#text/plain -res/cardsfolder/sprouting_vines.txt -text svneol=native#text/plain -res/cardsfolder/spur_grappler.txt -text svneol=native#text/plain -res/cardsfolder/spurnmage_advocate.txt svneol=native#text/plain -res/cardsfolder/spurred_wolverine.txt -text svneol=native#text/plain -res/cardsfolder/squadron_hawk.txt -text svneol=native#text/plain -res/cardsfolder/squall.txt -text svneol=native#text/plain -res/cardsfolder/squall_drifter.txt -text svneol=native#text/plain -res/cardsfolder/squall_line.txt -text svneol=native#text/plain -res/cardsfolder/squallmonger.txt -text svneol=native#text/plain -res/cardsfolder/squandered_resources.txt -text svneol=native#text/plain -res/cardsfolder/squeaking_pie_grubfellows.txt -text svneol=native#text/plain -res/cardsfolder/squee_goblin_nabob.txt -text svneol=native#text/plain -res/cardsfolder/squees_embrace.txt -text svneol=native#text/plain -res/cardsfolder/squees_toy.txt svneol=native#text/plain -res/cardsfolder/squeeze.txt -text svneol=native#text/plain -res/cardsfolder/squelch.txt -text svneol=native#text/plain -res/cardsfolder/squire.txt -text svneol=native#text/plain -res/cardsfolder/squirming_mass.txt -text svneol=native#text/plain -res/cardsfolder/squirrel_mob.txt -text svneol=native#text/plain -res/cardsfolder/squirrel_nest.txt -text svneol=native#text/plain -res/cardsfolder/squirrel_wrangler.txt -text svneol=native#text/plain -res/cardsfolder/stabbing_pain.txt -text svneol=native#text/plain -res/cardsfolder/stabilizer.txt svneol=native#text/plain -res/cardsfolder/staff_of_domination.txt -text svneol=native#text/plain -res/cardsfolder/staff_of_the_ages.txt -text svneol=native#text/plain -res/cardsfolder/staff_of_zegon.txt -text svneol=native#text/plain -res/cardsfolder/stag_beetle.txt svneol=native#text/plain -res/cardsfolder/stalker_hag.txt -text svneol=native#text/plain -res/cardsfolder/stalking_assassin.txt -text svneol=native#text/plain -res/cardsfolder/stalking_bloodsucker.txt -text svneol=native#text/plain -res/cardsfolder/stalking_stones.txt -text svneol=native#text/plain -res/cardsfolder/stalking_tiger.txt -text svneol=native#text/plain -res/cardsfolder/stalking_vengeance.txt svneol=native#text/plain -res/cardsfolder/stalwart_shield_bearers.txt -text svneol=native#text/plain -res/cardsfolder/stampede.txt svneol=native#text/plain -res/cardsfolder/stampede_driver.txt -text svneol=native#text/plain -res/cardsfolder/stampeding_rhino.txt -text svneol=native#text/plain -res/cardsfolder/stampeding_serow.txt -text svneol=native#text/plain -res/cardsfolder/stampeding_wildebeests.txt -text svneol=native#text/plain -res/cardsfolder/stand_firm.txt -text svneol=native#text/plain -res/cardsfolder/standing_stones.txt -text svneol=native#text/plain -res/cardsfolder/standing_troops.txt -text svneol=native#text/plain -res/cardsfolder/standstill.txt -text svneol=native#text/plain -res/cardsfolder/stangg.txt -text svneol=native#text/plain -res/cardsfolder/star_compass.txt -text svneol=native#text/plain -res/cardsfolder/starlight.txt -text svneol=native#text/plain -res/cardsfolder/starlight_invoker.txt -text svneol=native#text/plain -res/cardsfolder/starlit_angel.txt -text svneol=native#text/plain -res/cardsfolder/starlit_sanctum.txt -text svneol=native#text/plain -res/cardsfolder/starstorm.txt -text svneol=native#text/plain -res/cardsfolder/starved_rusalka.txt svneol=native#text/plain -res/cardsfolder/stasis.txt -text svneol=native#text/plain -res/cardsfolder/statecraft.txt -text svneol=native#text/plain -res/cardsfolder/staunch_defenders.txt -text svneol=native#text/plain -res/cardsfolder/steadfast_guard.txt -text svneol=native#text/plain -res/cardsfolder/steadfastness.txt -text svneol=native#text/plain -res/cardsfolder/steady_progress.txt -text svneol=native#text/plain -res/cardsfolder/steal_artifact.txt -text svneol=native#text/plain -res/cardsfolder/steam_blast.txt -text svneol=native#text/plain -res/cardsfolder/steam_catapult.txt -text svneol=native#text/plain -res/cardsfolder/steam_frigate.txt -text svneol=native#text/plain -res/cardsfolder/steam_spitter.txt -text svneol=native#text/plain -res/cardsfolder/steam_vents.txt -text svneol=native#text/plain -res/cardsfolder/steamclaw.txt -text svneol=native#text/plain -res/cardsfolder/steel_leaf_paladin.txt -text svneol=native#text/plain -res/cardsfolder/steel_of_the_godhead.txt -text svneol=native#text/plain -res/cardsfolder/steel_overseer.txt -text svneol=native#text/plain -res/cardsfolder/steel_sabotage.txt -text svneol=native#text/plain -res/cardsfolder/steel_wall.txt -text svneol=native#text/plain -res/cardsfolder/steelclad_serpent.txt svneol=native#text/plain -res/cardsfolder/steelshaper_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/steelshapers_gift.txt -text svneol=native#text/plain -res/cardsfolder/steely_resolve.txt -text svneol=native#text/plain -res/cardsfolder/stench_of_decay.txt -text svneol=native#text/plain -res/cardsfolder/stenchskipper.txt -text svneol=native#text/plain -res/cardsfolder/steppe_lynx.txt -text svneol=native#text/plain -res/cardsfolder/sterling_grove.txt -text svneol=native#text/plain -res/cardsfolder/stern_judge.txt -text svneol=native#text/plain -res/cardsfolder/stern_marshal.txt -text svneol=native#text/plain -res/cardsfolder/stern_proctor.txt -text svneol=native#text/plain -res/cardsfolder/steward_of_valeron.txt -text svneol=native#text/plain -res/cardsfolder/stifle.txt -text svneol=native#text/plain -res/cardsfolder/still_life.txt -text svneol=native#text/plain -res/cardsfolder/stillmoon_cavalier.txt -text svneol=native#text/plain -res/cardsfolder/stinging_barrier.txt -text svneol=native#text/plain -res/cardsfolder/stingscourger.txt -text svneol=native#text/plain -res/cardsfolder/stinkdrinker_daredevil.txt -text svneol=native#text/plain -res/cardsfolder/stinkweed_imp.txt -text svneol=native#text/plain -res/cardsfolder/stir_the_grave.txt -text svneol=native#text/plain -res/cardsfolder/stirring_wildwood.txt -text svneol=native#text/plain -res/cardsfolder/stitch_in_time.txt -text svneol=native#text/plain -res/cardsfolder/stitch_together.txt -text svneol=native#text/plain -res/cardsfolder/stoic_angel.txt -text svneol=native#text/plain -res/cardsfolder/stoic_champion.txt -text svneol=native#text/plain -res/cardsfolder/stoic_ephemera.txt svneol=native#text/plain -res/cardsfolder/stoic_rebuttal.txt svneol=native#text/plain -res/cardsfolder/stolen_grain.txt -text svneol=native#text/plain -res/cardsfolder/stomp_and_howl.txt -text svneol=native#text/plain -res/cardsfolder/stomper_cub.txt -text svneol=native#text/plain -res/cardsfolder/stomping_ground.txt -text svneol=native#text/plain -res/cardsfolder/stone_calendar.txt -text svneol=native#text/plain -res/cardsfolder/stone_catapult.txt svneol=native#text/plain -res/cardsfolder/stone_giant.txt -text svneol=native#text/plain -res/cardsfolder/stone_golem.txt -text svneol=native#text/plain -res/cardsfolder/stone_kavu.txt -text svneol=native#text/plain -res/cardsfolder/stone_rain.txt -text svneol=native#text/plain -res/cardsfolder/stone_seeder_hierophant.txt -text svneol=native#text/plain -res/cardsfolder/stone_spirit.txt -text svneol=native#text/plain -res/cardsfolder/stone_throwing_devils.txt -text svneol=native#text/plain -res/cardsfolder/stone_tongue_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/stonebrow_krosan_hero.txt -text svneol=native#text/plain -res/cardsfolder/stonecloaker.txt -text svneol=native#text/plain -res/cardsfolder/stoneforge_mystic.txt -text svneol=native#text/plain -res/cardsfolder/stonehands.txt -text svneol=native#text/plain -res/cardsfolder/stonewood_invocation.txt svneol=native#text/plain -res/cardsfolder/stonewood_invoker.txt -text svneol=native#text/plain -res/cardsfolder/stonework_puma.txt -text svneol=native#text/plain -res/cardsfolder/stonybrook_angler.txt -text svneol=native#text/plain -res/cardsfolder/stonybrook_banneret.txt -text svneol=native#text/plain -res/cardsfolder/stonybrook_schoolmaster.txt -text svneol=native#text/plain -res/cardsfolder/storm_cauldron.txt -text svneol=native#text/plain -res/cardsfolder/storm_crow.txt -text svneol=native#text/plain -res/cardsfolder/storm_elemental.txt svneol=native#text/plain -res/cardsfolder/storm_entity.txt -text svneol=native#text/plain -res/cardsfolder/storm_front.txt -text svneol=native#text/plain -res/cardsfolder/storm_herd.txt -text svneol=native#text/plain -res/cardsfolder/storm_seeker.txt -text svneol=native#text/plain -res/cardsfolder/storm_shaman.txt -text svneol=native#text/plain -res/cardsfolder/storm_spirit.txt -text svneol=native#text/plain -res/cardsfolder/storm_world.txt -text svneol=native#text/plain -res/cardsfolder/stormbind.txt -text svneol=native#text/plain -res/cardsfolder/stormcallers_boon.txt -text svneol=native#text/plain -res/cardsfolder/stormcloud_djinn.txt -text svneol=native#text/plain -res/cardsfolder/stormfront_pegasus.txt -text svneol=native#text/plain -res/cardsfolder/stormfront_riders.txt -text svneol=native#text/plain -res/cardsfolder/stormscale_anarch.txt -text svneol=native#text/plain -res/cardsfolder/stormscape_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/stormscape_familiar.txt -text svneol=native#text/plain -res/cardsfolder/stormscape_master.txt -text svneol=native#text/plain -res/cardsfolder/stormtide_leviathan.txt svneol=native#text/plain -res/cardsfolder/stormwatch_eagle.txt svneol=native#text/plain -res/cardsfolder/strafe.txt -text svneol=native#text/plain -res/cardsfolder/strands_of_night.txt -text svneol=native#text/plain -res/cardsfolder/strands_of_undeath.txt svneol=native#text/plain -res/cardsfolder/strandwalker.txt -text svneol=native#text/plain -res/cardsfolder/strangling_soot.txt -text svneol=native#text/plain -res/cardsfolder/stratadon.txt -text svneol=native#text/plain -res/cardsfolder/strategic_planning.txt svneol=native#text/plain -res/cardsfolder/stratozeppelid.txt -text svneol=native#text/plain -res/cardsfolder/straw_golem.txt svneol=native#text/plain -res/cardsfolder/straw_soldiers.txt -text svneol=native#text/plain -res/cardsfolder/stream_hopper.txt -text svneol=native#text/plain -res/cardsfolder/stream_of_acid.txt -text svneol=native#text/plain -res/cardsfolder/stream_of_life.txt -text svneol=native#text/plain -res/cardsfolder/stream_of_unconsciousness.txt -text svneol=native#text/plain -res/cardsfolder/street_wraith.txt -text svneol=native#text/plain -res/cardsfolder/streetbreaker_wurm.txt -text svneol=native#text/plain -res/cardsfolder/strength_of_cedars.txt -text svneol=native#text/plain -res/cardsfolder/strength_of_isolation.txt -text svneol=native#text/plain -res/cardsfolder/strength_of_lunacy.txt -text svneol=native#text/plain -res/cardsfolder/strength_of_night.txt -text svneol=native#text/plain -res/cardsfolder/strength_of_unity.txt -text svneol=native#text/plain -res/cardsfolder/strider_harness.txt -text svneol=native#text/plain -res/cardsfolder/strip_mine.txt -text svneol=native#text/plain -res/cardsfolder/striped_bears.txt -text svneol=native#text/plain -res/cardsfolder/stroke_of_genius.txt -text svneol=native#text/plain -res/cardsfolder/stromgald_cabal.txt svneol=native#text/plain -res/cardsfolder/stromgald_crusader.txt -text svneol=native#text/plain -res/cardsfolder/strongarm_thug.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_assassin.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_biologist.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_discipline.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_machinist.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_rats.txt svneol=native#text/plain -res/cardsfolder/stronghold_taskmaster.txt -text svneol=native#text/plain -res/cardsfolder/stronghold_zeppelin.txt -text svneol=native#text/plain -res/cardsfolder/student_of_warfare.txt -text svneol=native#text/plain -res/cardsfolder/stuffy_doll.txt -text svneol=native#text/plain -res/cardsfolder/stun.txt -text svneol=native#text/plain -res/cardsfolder/stun_sniper.txt -text svneol=native#text/plain -res/cardsfolder/stunted_growth.txt -text svneol=native#text/plain -res/cardsfolder/stupefying_touch.txt svneol=native#text/plain -res/cardsfolder/stupor.txt -text svneol=native#text/plain -res/cardsfolder/sturdy_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/su_chi.txt -text svneol=native#text/plain -res/cardsfolder/subterranean_shambler.txt svneol=native#text/plain -res/cardsfolder/subterranean_spirit.txt -text svneol=native#text/plain -res/cardsfolder/subversion.txt -text svneol=native#text/plain -res/cardsfolder/sudden_death.txt svneol=native#text/plain -res/cardsfolder/sudden_impact.txt -text svneol=native#text/plain -res/cardsfolder/sudden_strength.txt -text svneol=native#text/plain -res/cardsfolder/suffer_the_past.txt -text svneol=native#text/plain -res/cardsfolder/suffocating_blast.txt svneol=native#text/plain -res/cardsfolder/suicidal_charge.txt -text svneol=native#text/plain -res/cardsfolder/suleimans_legacy.txt svneol=native#text/plain -res/cardsfolder/sulfur_elemental.txt -text svneol=native#text/plain -res/cardsfolder/sulfur_vent.txt -text svneol=native#text/plain -res/cardsfolder/sulfuric_vapors.txt svneol=native#text/plain -res/cardsfolder/sulfuric_vortex.txt -text svneol=native#text/plain -res/cardsfolder/sulfurous_blast.txt -text svneol=native#text/plain -res/cardsfolder/sulfurous_springs.txt -text svneol=native#text/plain -res/cardsfolder/summer_bloom.txt -text svneol=native#text/plain -res/cardsfolder/summon_the_school.txt -text svneol=native#text/plain -res/cardsfolder/summoners_bane.txt -text svneol=native#text/plain -res/cardsfolder/summoning_station.txt -text svneol=native#text/plain -res/cardsfolder/sun_ce_young_conquerer.txt -text svneol=native#text/plain -res/cardsfolder/sun_clasp.txt svneol=native#text/plain -res/cardsfolder/sun_quan_lord_of_wu.txt -text svneol=native#text/plain -res/cardsfolder/sun_titan.txt -text svneol=native#text/plain -res/cardsfolder/sunastian_falconer.txt -text svneol=native#text/plain -res/cardsfolder/sunbeam_spellbomb.txt -text svneol=native#text/plain -res/cardsfolder/sunblast_angel.txt -text svneol=native#text/plain -res/cardsfolder/suncrusher.txt -text svneol=native#text/plain -res/cardsfolder/sunder.txt -text svneol=native#text/plain -res/cardsfolder/sunder_from_within.txt -text svneol=native#text/plain -res/cardsfolder/sunfire_balm.txt svneol=native#text/plain -res/cardsfolder/sunflare_shaman.txt -text svneol=native#text/plain -res/cardsfolder/sunglasses_of_urza.txt -text svneol=native#text/plain -res/cardsfolder/sungrass_egg.txt -text svneol=native#text/plain -res/cardsfolder/sungrass_prairie.txt -text svneol=native#text/plain -res/cardsfolder/sunhome_enforcer.txt -text svneol=native#text/plain -res/cardsfolder/sunhome_fortress_of_the_legion.txt -text svneol=native#text/plain -res/cardsfolder/sunken_city.txt -text svneol=native#text/plain -res/cardsfolder/sunken_field.txt svneol=native#text/plain -res/cardsfolder/sunken_hope.txt svneol=native#text/plain -res/cardsfolder/sunken_ruins.txt -text svneol=native#text/plain -res/cardsfolder/sunlance.txt -text svneol=native#text/plain -res/cardsfolder/sunpetal_grove.txt -text svneol=native#text/plain -res/cardsfolder/sunrise_sovereign.txt -text svneol=native#text/plain -res/cardsfolder/suns_bounty.txt -text svneol=native#text/plain -res/cardsfolder/sunscape_familiar.txt -text svneol=native#text/plain -res/cardsfolder/sunscape_master.txt -text svneol=native#text/plain -res/cardsfolder/sunscour.txt -text svneol=native#text/plain -res/cardsfolder/sunseed_nurturer.txt -text svneol=native#text/plain -res/cardsfolder/sunspear_shikari.txt -text svneol=native#text/plain -res/cardsfolder/sunspring_expedition.txt -text svneol=native#text/plain -res/cardsfolder/sunstone.txt -text svneol=native#text/plain -res/cardsfolder/sunstrike_legionnaire.txt svneol=native#text/plain -res/cardsfolder/suntail_hawk.txt -text svneol=native#text/plain -res/cardsfolder/suntouched_myr.txt -text svneol=native#text/plain -res/cardsfolder/sunweb.txt -text svneol=native#text/plain -res/cardsfolder/supreme_exemplar.txt -text svneol=native#text/plain -res/cardsfolder/supreme_inquisitor.txt -text svneol=native#text/plain -res/cardsfolder/suqata_assassin.txt -text svneol=native#text/plain -res/cardsfolder/suqata_firewalker.txt svneol=native#text/plain -res/cardsfolder/suqata_lancer.txt -text svneol=native#text/plain -res/cardsfolder/surge_node.txt -text svneol=native#text/plain -res/cardsfolder/surge_of_strength.txt -text svneol=native#text/plain -res/cardsfolder/surge_of_thoughtweft.txt -text svneol=native#text/plain -res/cardsfolder/surging_aether.txt -text svneol=native#text/plain -res/cardsfolder/surging_dementia.txt -text svneol=native#text/plain -res/cardsfolder/surging_flame.txt -text svneol=native#text/plain -res/cardsfolder/surging_might.txt -text svneol=native#text/plain -res/cardsfolder/surging_sentinels.txt -text svneol=native#text/plain -res/cardsfolder/surrakar_banisher.txt -text svneol=native#text/plain -res/cardsfolder/surrakar_marauder.txt -text svneol=native#text/plain -res/cardsfolder/surrakar_spellblade.txt svneol=native#text/plain -res/cardsfolder/surveilling_sprite.txt -text svneol=native#text/plain -res/cardsfolder/survival_of_the_fittest.txt -text svneol=native#text/plain -res/cardsfolder/sustainer_of_the_realm.txt -text svneol=native#text/plain -res/cardsfolder/sustaining_spirit.txt -text svneol=native#text/plain -res/cardsfolder/sustenance.txt -text svneol=native#text/plain -res/cardsfolder/suture_priest.txt svneol=native#text/plain -res/cardsfolder/suture_spirit.txt -text svneol=native#text/plain -res/cardsfolder/sutured_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/svogthos_the_restless_tomb.txt -text svneol=native#text/plain -res/cardsfolder/svyelunite_priest.txt -text svneol=native#text/plain -res/cardsfolder/svyelunite_temple.txt -text svneol=native#text/plain -res/cardsfolder/swallowing_plague.txt -text svneol=native#text/plain -res/cardsfolder/swamp.txt -text svneol=native#text/plain -res/cardsfolder/swamp_mosquito.txt -text svneol=native#text/plain -res/cardsfolder/swans_of_bryn_argoll.txt -text svneol=native#text/plain -res/cardsfolder/swarm_of_rats.txt -text svneol=native#text/plain -res/cardsfolder/swarmyard.txt -text svneol=native#text/plain -res/cardsfolder/swat.txt -text svneol=native#text/plain -res/cardsfolder/sway_of_the_stars.txt -text svneol=native#text/plain -res/cardsfolder/swelter.txt -text svneol=native#text/plain -res/cardsfolder/swift_maneuver.txt svneol=native#text/plain -res/cardsfolder/swirling_sandstorm.txt -text svneol=native#text/plain -res/cardsfolder/sword_dancer.txt svneol=native#text/plain -res/cardsfolder/sword_of_body_and_mind.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_feast_and_famine.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_fire_and_ice.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_kaldra.txt svneol=native#text/plain -res/cardsfolder/sword_of_light_and_shadow.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_the_chosen.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_the_meek.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_the_paruns.txt svneol=native#text/plain -res/cardsfolder/sword_of_vengeance.txt -text svneol=native#text/plain -res/cardsfolder/sword_of_war_and_peace.txt svneol=native#text/plain -res/cardsfolder/swords_to_plowshares.txt -text svneol=native#text/plain -res/cardsfolder/sygg_river_guide.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_bounty.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_echoes.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_library.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_messenger.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_might.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_paradise.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_ranger.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_safekeeper.txt svneol=native#text/plain -res/cardsfolder/sylvan_scrying.txt -text svneol=native#text/plain -res/cardsfolder/sylvan_tutor.txt -text svneol=native#text/plain -res/cardsfolder/sylvok_explorer.txt -text svneol=native#text/plain -res/cardsfolder/sylvok_lifestaff.txt -text svneol=native#text/plain -res/cardsfolder/sylvok_replica.txt -text svneol=native#text/plain -res/cardsfolder/symbiosis.txt -text svneol=native#text/plain -res/cardsfolder/symbiotic_beast.txt -text svneol=native#text/plain -res/cardsfolder/symbiotic_deployment.txt svneol=native#text/plain -res/cardsfolder/symbiotic_elf.txt -text svneol=native#text/plain -res/cardsfolder/symbiotic_wurm.txt -text svneol=native#text/plain -res/cardsfolder/symbol_of_unsummoning.txt -text svneol=native#text/plain -res/cardsfolder/synapse_sliver.txt -text svneol=native#text/plain -res/cardsfolder/synchronous_sliver.txt -text svneol=native#text/plain -res/cardsfolder/syncopate.txt -text svneol=native#text/plain -res/cardsfolder/synod_artificer.txt svneol=native#text/plain -res/cardsfolder/synod_sanctum.txt -text svneol=native#text/plain -res/cardsfolder/syphon_life.txt -text svneol=native#text/plain -res/cardsfolder/syphon_soul.txt svneol=native#text/plain -res/cardsfolder/szadek_lord_of_secrets.txt svneol=native#text/plain -res/cardsfolder/tablet_of_epityr.txt -text svneol=native#text/plain -res/cardsfolder/tahngarth_talruum_hero.txt svneol=native#text/plain -res/cardsfolder/tahngarths_rage.txt -text svneol=native#text/plain -res/cardsfolder/taiga.txt -text svneol=native#text/plain -res/cardsfolder/tainted_aether.txt svneol=native#text/plain -res/cardsfolder/tainted_field.txt -text svneol=native#text/plain -res/cardsfolder/tainted_isle.txt -text svneol=native#text/plain -res/cardsfolder/tainted_peak.txt -text svneol=native#text/plain -res/cardsfolder/tainted_strike.txt -text svneol=native#text/plain -res/cardsfolder/tainted_well.txt -text svneol=native#text/plain -res/cardsfolder/tainted_wood.txt -text svneol=native#text/plain -res/cardsfolder/taj_nar_swordsmith.txt svneol=native#text/plain -res/cardsfolder/tajuru_archer.txt -text svneol=native#text/plain -res/cardsfolder/take_possession.txt -text svneol=native#text/plain -res/cardsfolder/takenos_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/takenuma_bleeder.txt -text svneol=native#text/plain -res/cardsfolder/talas_air_ship.txt -text svneol=native#text/plain -res/cardsfolder/talas_explorer.txt svneol=native#text/plain -res/cardsfolder/talas_merchant.txt -text svneol=native#text/plain -res/cardsfolder/talas_researcher.txt -text svneol=native#text/plain -res/cardsfolder/talas_scout.txt -text svneol=native#text/plain -res/cardsfolder/talas_warrior.txt -text svneol=native#text/plain -res/cardsfolder/talisman_of_dominance.txt -text svneol=native#text/plain -res/cardsfolder/talisman_of_impulse.txt -text svneol=native#text/plain -res/cardsfolder/talisman_of_indulgence.txt -text svneol=native#text/plain -res/cardsfolder/talisman_of_progress.txt -text svneol=native#text/plain -res/cardsfolder/talisman_of_unity.txt -text svneol=native#text/plain -res/cardsfolder/tallowisp.txt svneol=native#text/plain -res/cardsfolder/talon_sliver.txt -text svneol=native#text/plain -res/cardsfolder/talon_trooper.txt -text svneol=native#text/plain -res/cardsfolder/talonrend.txt -text svneol=native#text/plain -res/cardsfolder/talruum_champion.txt svneol=native#text/plain -res/cardsfolder/talruum_minotaur.txt -text svneol=native#text/plain -res/cardsfolder/talus_paladin.txt -text svneol=native#text/plain -res/cardsfolder/tamanoa.txt svneol=native#text/plain -res/cardsfolder/tangle_asp.txt -text svneol=native#text/plain -res/cardsfolder/tangle_golem.txt -text svneol=native#text/plain -res/cardsfolder/tangle_hulk.txt -text svneol=native#text/plain -res/cardsfolder/tangle_mantis.txt -text svneol=native#text/plain -res/cardsfolder/tangle_spider.txt -text svneol=native#text/plain -res/cardsfolder/tangle_wire.txt -text svneol=native#text/plain -res/cardsfolder/tanglebloom.txt -text svneol=native#text/plain -res/cardsfolder/tangleroot.txt svneol=native#text/plain -res/cardsfolder/tanglewalker.txt svneol=native#text/plain -res/cardsfolder/taoist_hermit.txt -text svneol=native#text/plain -res/cardsfolder/taoist_mystic.txt -text svneol=native#text/plain -res/cardsfolder/tar_pit_warrior.txt -text svneol=native#text/plain -res/cardsfolder/tar_pitcher.txt -text svneol=native#text/plain -res/cardsfolder/tarfire.txt -text svneol=native#text/plain -res/cardsfolder/tarmogoyf.txt -text svneol=native#text/plain -res/cardsfolder/tarnished_citadel.txt -text svneol=native#text/plain -res/cardsfolder/tarox_bladewing.txt -text svneol=native#text/plain -res/cardsfolder/tarpan.txt -text svneol=native#text/plain -res/cardsfolder/task_force.txt -text svneol=native#text/plain -res/cardsfolder/task_mage_assembly.txt -text svneol=native#text/plain -res/cardsfolder/taste_for_mayhem.txt -text svneol=native#text/plain -res/cardsfolder/tattered_drake.txt -text svneol=native#text/plain -res/cardsfolder/tatterkite.txt svneol=native#text/plain -res/cardsfolder/tattermunge_duo.txt -text svneol=native#text/plain -res/cardsfolder/tattermunge_maniac.txt -text svneol=native#text/plain -res/cardsfolder/tattermunge_witch.txt svneol=native#text/plain -res/cardsfolder/taunting_challenge.txt -text svneol=native#text/plain -res/cardsfolder/taunting_elf.txt -text svneol=native#text/plain -res/cardsfolder/taurean_mauler.txt -text svneol=native#text/plain -res/cardsfolder/tawnoss_wand.txt -text svneol=native#text/plain -res/cardsfolder/teardrop_kami.txt -text svneol=native#text/plain -res/cardsfolder/tears_of_rage.txt -text svneol=native#text/plain -res/cardsfolder/tectonic_break.txt -text svneol=native#text/plain -res/cardsfolder/tectonic_edge.txt -text svneol=native#text/plain -res/cardsfolder/tectonic_fiend.txt -text svneol=native#text/plain -res/cardsfolder/tectonic_instability.txt -text svneol=native#text/plain -res/cardsfolder/teekas_dragon.txt -text svneol=native#text/plain -res/cardsfolder/teetering_peaks.txt svneol=native#text/plain -res/cardsfolder/teferis_puzzle_box.txt -text svneol=native#text/plain -res/cardsfolder/teferis_response.txt -text svneol=native#text/plain -res/cardsfolder/tek.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_archers.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_chosen.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_defiance.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_exile.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_fallen.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_justice.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_lifebreather.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_outrider.txt -text svneol=native#text/plain -res/cardsfolder/tel_jilad_wolf.txt svneol=native#text/plain -res/cardsfolder/telekinetic_bonds.txt svneol=native#text/plain -res/cardsfolder/telekinetic_sliver.txt -text svneol=native#text/plain -res/cardsfolder/telepathic_spies.txt svneol=native#text/plain -res/cardsfolder/telethopter.txt svneol=native#text/plain -res/cardsfolder/telimtor.txt svneol=native#text/plain -res/cardsfolder/telimtors_darts.txt -text svneol=native#text/plain -res/cardsfolder/telimtors_edict.txt -text svneol=native#text/plain -res/cardsfolder/teller_of_tales.txt svneol=native#text/plain -res/cardsfolder/telling_time.txt -text svneol=native#text/plain -res/cardsfolder/tempered_steel.txt -text svneol=native#text/plain -res/cardsfolder/tempest_drake.txt -text svneol=native#text/plain -res/cardsfolder/tempest_of_light.txt -text svneol=native#text/plain -res/cardsfolder/tempest_owl.txt -text svneol=native#text/plain -res/cardsfolder/temple_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/temple_bell.txt -text svneol=native#text/plain -res/cardsfolder/temple_elder.txt -text svneol=native#text/plain -res/cardsfolder/temple_garden.txt -text svneol=native#text/plain -res/cardsfolder/temple_of_the_false_god.txt -text svneol=native#text/plain -res/cardsfolder/temporal_adept.txt -text svneol=native#text/plain -res/cardsfolder/temporal_aperture.txt -text svneol=native#text/plain -res/cardsfolder/temporal_eddy.txt -text svneol=native#text/plain -res/cardsfolder/temporal_fissure.txt -text svneol=native#text/plain -res/cardsfolder/temporal_isolation.txt -text svneol=native#text/plain -res/cardsfolder/temporal_manipulation.txt -text svneol=native#text/plain -res/cardsfolder/temporal_spring.txt -text svneol=native#text/plain -res/cardsfolder/temporary_insanity.txt -text svneol=native#text/plain -res/cardsfolder/tempting_wurm.txt -text svneol=native#text/plain -res/cardsfolder/tendo_ice_bridge.txt -text svneol=native#text/plain -res/cardsfolder/tendrils_of_agony.txt -text svneol=native#text/plain -res/cardsfolder/tendrils_of_corruption.txt -text svneol=native#text/plain -res/cardsfolder/tendrils_of_despair.txt -text svneol=native#text/plain -res/cardsfolder/teneb_the_harvester.txt svneol=native#text/plain -res/cardsfolder/tenza_godos_maul.txt -text svneol=native#text/plain -res/cardsfolder/tephraderm.txt svneol=native#text/plain -res/cardsfolder/terashis_cry.txt -text svneol=native#text/plain -res/cardsfolder/terashis_grasp.txt -text svneol=native#text/plain -res/cardsfolder/terashis_verdict.txt -text svneol=native#text/plain -res/cardsfolder/terminal_moraine.txt -text svneol=native#text/plain -res/cardsfolder/terminate.txt -text svneol=native#text/plain -res/cardsfolder/terohs_faithful.txt -text svneol=native#text/plain -res/cardsfolder/terohs_vanguard.txt -text svneol=native#text/plain -res/cardsfolder/terra_eternal.txt -text svneol=native#text/plain -res/cardsfolder/terra_stomper.txt -text svneol=native#text/plain -res/cardsfolder/terrain_generator.txt svneol=native#text/plain -res/cardsfolder/terramorphic_expanse.txt -text svneol=native#text/plain -res/cardsfolder/terravore.txt -text svneol=native#text/plain -res/cardsfolder/territorial_baloth.txt -text svneol=native#text/plain -res/cardsfolder/terror.txt -text svneol=native#text/plain -res/cardsfolder/test_of_endurance.txt -text svneol=native#text/plain -res/cardsfolder/testament_of_faith.txt -text svneol=native#text/plain -res/cardsfolder/tethered_griffin.txt -text svneol=native#text/plain -res/cardsfolder/tethered_skirge.txt svneol=native#text/plain -res/cardsfolder/tetsuo_umezawa.txt -text svneol=native#text/plain -res/cardsfolder/teysa_orzhov_scion.txt -text svneol=native#text/plain -res/cardsfolder/tezzeret_agent_of_bolas.txt svneol=native#text/plain -res/cardsfolder/tezzeret_the_seeker.txt -text svneol=native#text/plain -res/cardsfolder/tezzerets_gambit.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_deceiver.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_drifters.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_lowlands.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_mistfolk.txt svneol=native#text/plain -res/cardsfolder/thalakos_scout.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_seer.txt -text svneol=native#text/plain -res/cardsfolder/thalakos_sentry.txt -text svneol=native#text/plain -res/cardsfolder/thallid.txt -text svneol=native#text/plain -res/cardsfolder/thallid_devourer.txt -text svneol=native#text/plain -res/cardsfolder/thallid_germinator.txt -text svneol=native#text/plain -res/cardsfolder/thallid_shell_dweller.txt -text svneol=native#text/plain -res/cardsfolder/that_which_was_taken.txt -text svneol=native#text/plain -res/cardsfolder/thaumatog.txt -text svneol=native#text/plain -res/cardsfolder/thawing_glaciers.txt svneol=native#text/plain -res/cardsfolder/the_abyss.txt -text svneol=native#text/plain -res/cardsfolder/the_brute.txt svneol=native#text/plain -res/cardsfolder/the_hive.txt -text svneol=native#text/plain -res/cardsfolder/the_lady_of_the_mountain.txt -text svneol=native#text/plain -res/cardsfolder/the_rack.txt -text svneol=native#text/plain -res/cardsfolder/the_tabernacle_at_pendrell_vale.txt -text svneol=native#text/plain -res/cardsfolder/the_unspeakable.txt -text svneol=native#text/plain -res/cardsfolder/theft_of_dreams.txt -text svneol=native#text/plain -res/cardsfolder/thelonite_hermit.txt -text svneol=native#text/plain -res/cardsfolder/thermal_blast.txt -text svneol=native#text/plain -res/cardsfolder/thermal_glider.txt -text svneol=native#text/plain -res/cardsfolder/thermal_navigator.txt svneol=native#text/plain -res/cardsfolder/thermokarst.txt svneol=native#text/plain -res/cardsfolder/thermopod.txt svneol=native#text/plain -res/cardsfolder/thicket_basilisk.txt -text svneol=native#text/plain -res/cardsfolder/thief_of_hope.txt -text svneol=native#text/plain -res/cardsfolder/thieving_magpie.txt -text svneol=native#text/plain -res/cardsfolder/think_tank.txt -text svneol=native#text/plain -res/cardsfolder/think_twice.txt -text svneol=native#text/plain -res/cardsfolder/thirst.txt -text svneol=native#text/plain -res/cardsfolder/thirst_for_knowledge.txt -text svneol=native#text/plain -res/cardsfolder/thistledown_duo.txt -text svneol=native#text/plain -res/cardsfolder/thistledown_liege.txt -text svneol=native#text/plain -res/cardsfolder/thopter_assembly.txt -text svneol=native#text/plain -res/cardsfolder/thopter_foundry.txt -text svneol=native#text/plain -res/cardsfolder/thopter_squadron.txt -text svneol=native#text/plain -res/cardsfolder/thorn_of_amethyst.txt -text svneol=native#text/plain -res/cardsfolder/thorn_thallid.txt -text svneol=native#text/plain -res/cardsfolder/thorn_thrash_viashino.txt -text svneol=native#text/plain -res/cardsfolder/thornling.txt -text svneol=native#text/plain -res/cardsfolder/thornscape_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/thornscape_familiar.txt -text svneol=native#text/plain -res/cardsfolder/thornscape_master.txt -text svneol=native#text/plain -res/cardsfolder/thorntooth_witch.txt -text svneol=native#text/plain -res/cardsfolder/thornwatch_scarecrow.txt -text svneol=native#text/plain -res/cardsfolder/thornweald_archer.txt -text svneol=native#text/plain -res/cardsfolder/thornwind_faeries.txt -text svneol=native#text/plain -res/cardsfolder/thought_courier.txt -text svneol=native#text/plain -res/cardsfolder/thought_devourer.txt -text svneol=native#text/plain -res/cardsfolder/thought_eater.txt -text svneol=native#text/plain -res/cardsfolder/thought_nibbler.txt -text svneol=native#text/plain -res/cardsfolder/thoughtbind.txt -text svneol=native#text/plain -res/cardsfolder/thoughtcast.txt -text svneol=native#text/plain -res/cardsfolder/thoughtcutter_agent.txt -text svneol=native#text/plain -res/cardsfolder/thoughtleech.txt -text svneol=native#text/plain -res/cardsfolder/thoughtpicker_witch.txt -text svneol=native#text/plain -res/cardsfolder/thoughtseize.txt -text svneol=native#text/plain -res/cardsfolder/thoughtweft_gambit.txt svneol=native#text/plain -res/cardsfolder/thousand_legged_kami.txt -text svneol=native#text/plain -res/cardsfolder/thran_dynamo.txt -text svneol=native#text/plain -res/cardsfolder/thran_forge.txt svneol=native#text/plain -res/cardsfolder/thran_foundry.txt -text svneol=native#text/plain -res/cardsfolder/thran_golem.txt -text svneol=native#text/plain -res/cardsfolder/thran_lens.txt svneol=native#text/plain -res/cardsfolder/thran_quarry.txt -text svneol=native#text/plain -res/cardsfolder/thran_war_machine.txt -text svneol=native#text/plain -res/cardsfolder/thrashing_mudspawn.txt -text svneol=native#text/plain -res/cardsfolder/thrashing_wumpus.txt -text svneol=native#text/plain -res/cardsfolder/thraximundar.txt svneol=native#text/plain -res/cardsfolder/threads_of_disloyalty.txt -text svneol=native#text/plain -res/cardsfolder/threaten.txt -text svneol=native#text/plain -res/cardsfolder/three_tragedies.txt -text svneol=native#text/plain -res/cardsfolder/three_visits.txt -text svneol=native#text/plain -res/cardsfolder/thresher_beast.txt svneol=native#text/plain -res/cardsfolder/thrill_of_the_hunt.txt -text svneol=native#text/plain -res/cardsfolder/thriss_nantuko_primus.txt -text svneol=native#text/plain -res/cardsfolder/thrive.txt svneol=native#text/plain -res/cardsfolder/throat_slitter.txt svneol=native#text/plain -res/cardsfolder/throne_of_bone.txt -text svneol=native#text/plain -res/cardsfolder/throne_of_geth.txt -text svneol=native#text/plain -res/cardsfolder/thrull_champion.txt -text svneol=native#text/plain -res/cardsfolder/thrull_surgeon.txt -text svneol=native#text/plain -res/cardsfolder/thrumming_stone.txt -text svneol=native#text/plain -res/cardsfolder/thrummingbird.txt -text svneol=native#text/plain -res/cardsfolder/thrun_the_last_troll.txt -text svneol=native#text/plain -res/cardsfolder/thunder_dragon.txt -text svneol=native#text/plain -res/cardsfolder/thunder_of_hooves.txt -text svneol=native#text/plain -res/cardsfolder/thunder_spirit.txt -text svneol=native#text/plain -res/cardsfolder/thunder_strike.txt -text svneol=native#text/plain -res/cardsfolder/thunder_thrash_elder.txt -text svneol=native#text/plain -res/cardsfolder/thunder_wall.txt -text svneol=native#text/plain -res/cardsfolder/thunderblust.txt svneol=native#text/plain -res/cardsfolder/thunderbolt.txt svneol=native#text/plain -res/cardsfolder/thunderclap.txt -text svneol=native#text/plain -res/cardsfolder/thundercloud_elemental.txt svneol=native#text/plain -res/cardsfolder/thundercloud_shaman.txt svneol=native#text/plain -res/cardsfolder/thunderheads.txt svneol=native#text/plain -res/cardsfolder/thundering_giant.txt -text svneol=native#text/plain -res/cardsfolder/thundering_tanadon.txt svneol=native#text/plain -res/cardsfolder/thundermare.txt -text svneol=native#text/plain -res/cardsfolder/thunderscape_apprentice.txt -text svneol=native#text/plain -res/cardsfolder/thunderscape_familiar.txt -text svneol=native#text/plain -res/cardsfolder/thunderscape_master.txt -text svneol=native#text/plain -res/cardsfolder/thundersong_trumpeter.txt svneol=native#text/plain -res/cardsfolder/thwart.txt -text svneol=native#text/plain -res/cardsfolder/tibor_and_lumia.txt -text svneol=native#text/plain -res/cardsfolder/ticking_gnomes.txt -text svneol=native#text/plain -res/cardsfolder/tidal_bore.txt svneol=native#text/plain -res/cardsfolder/tidal_control.txt -text svneol=native#text/plain -res/cardsfolder/tidal_courier.txt -text svneol=native#text/plain -res/cardsfolder/tidal_kraken.txt -text svneol=native#text/plain -res/cardsfolder/tidal_surge.txt -text svneol=native#text/plain -res/cardsfolder/tidal_wave.txt -text svneol=native#text/plain -res/cardsfolder/tideforce_elemental.txt svneol=native#text/plain -res/cardsfolder/tidehollow_sculler.txt -text svneol=native#text/plain -res/cardsfolder/tidehollow_strix.txt -text svneol=native#text/plain -res/cardsfolder/tidespout_tyrant.txt svneol=native#text/plain -res/cardsfolder/tidings.txt -text svneol=native#text/plain -res/cardsfolder/tiger_claws.txt -text svneol=native#text/plain -res/cardsfolder/tigereye_cameo.txt -text svneol=native#text/plain -res/cardsfolder/tilling_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/timber_protector.txt -text svneol=native#text/plain -res/cardsfolder/timberland_ruins.txt -text svneol=native#text/plain -res/cardsfolder/timberline_ridge.txt svneol=native#text/plain -res/cardsfolder/timbermare.txt -text svneol=native#text/plain -res/cardsfolder/timbermaw_larva.txt -text svneol=native#text/plain -res/cardsfolder/timberwatch_elf.txt -text svneol=native#text/plain -res/cardsfolder/time_bomb.txt -text svneol=native#text/plain -res/cardsfolder/time_ebb.txt -text svneol=native#text/plain -res/cardsfolder/time_elemental.txt -text svneol=native#text/plain -res/cardsfolder/time_of_heroes.txt -text svneol=native#text/plain -res/cardsfolder/time_of_need.txt -text svneol=native#text/plain -res/cardsfolder/time_reversal.txt -text svneol=native#text/plain -res/cardsfolder/time_sieve.txt -text svneol=native#text/plain -res/cardsfolder/time_spiral.txt svneol=native#text/plain -res/cardsfolder/time_stretch.txt -text svneol=native#text/plain -res/cardsfolder/time_vault.txt -text svneol=native#text/plain -res/cardsfolder/time_walk.txt -text svneol=native#text/plain -res/cardsfolder/time_warp.txt -text svneol=native#text/plain -res/cardsfolder/timetwister.txt -text svneol=native#text/plain -res/cardsfolder/timid_drake.txt -text svneol=native#text/plain -res/cardsfolder/tin_wing_chimera.txt svneol=native#text/plain -res/cardsfolder/tinder_farm.txt -text svneol=native#text/plain -res/cardsfolder/tinder_wall.txt svneol=native#text/plain -res/cardsfolder/tine_shrike.txt -text svneol=native#text/plain -res/cardsfolder/tinker.txt -text svneol=native#text/plain -res/cardsfolder/tireless_missionaries.txt -text svneol=native#text/plain -res/cardsfolder/tireless_tribe.txt -text svneol=native#text/plain -res/cardsfolder/titan_forge.txt -text svneol=native#text/plain -res/cardsfolder/titanias_boon.txt -text svneol=native#text/plain -res/cardsfolder/titanias_chosen.txt -text svneol=native#text/plain -res/cardsfolder/titanias_song.txt -text svneol=native#text/plain -res/cardsfolder/titanic_bulvox.txt -text svneol=native#text/plain -res/cardsfolder/titanic_ultimatum.txt -text svneol=native#text/plain -res/cardsfolder/titanium_golem.txt -text svneol=native#text/plain -res/cardsfolder/titans_revenge.txt -text svneol=native#text/plain -res/cardsfolder/tithe.txt -text svneol=native#text/plain -res/cardsfolder/tivadar_of_thorn.txt -text svneol=native#text/plain -res/cardsfolder/tivadars_crusade.txt -text svneol=native#text/plain -res/cardsfolder/to_arms.txt -text svneol=native#text/plain -res/cardsfolder/tobias_andrion.txt -text svneol=native#text/plain -res/cardsfolder/toil_to_renown.txt svneol=native#text/plain -res/cardsfolder/toils_of_night_and_day.txt svneol=native#text/plain -res/cardsfolder/tolaria_west.txt -text svneol=native#text/plain -res/cardsfolder/tolarian_academy.txt -text svneol=native#text/plain -res/cardsfolder/tolarian_emissary.txt -text svneol=native#text/plain -res/cardsfolder/tolarian_entrancer.txt svneol=native#text/plain -res/cardsfolder/tolarian_serpent.txt -text svneol=native#text/plain -res/cardsfolder/tolsimir_wolfblood.txt -text svneol=native#text/plain -res/cardsfolder/tomb_of_urami.txt svneol=native#text/plain -res/cardsfolder/tome_scour.txt -text svneol=native#text/plain -res/cardsfolder/tonic_peddler.txt -text svneol=native#text/plain -res/cardsfolder/tooth_of_chiss_goria.txt -text svneol=native#text/plain -res/cardsfolder/tooth_of_ramos.txt -text svneol=native#text/plain -res/cardsfolder/topan_ascetic.txt -text svneol=native#text/plain -res/cardsfolder/tor_giant.txt -text svneol=native#text/plain -res/cardsfolder/tor_wauki.txt -text svneol=native#text/plain -res/cardsfolder/torch_drake.txt -text svneol=native#text/plain -res/cardsfolder/torch_slinger.txt -text svneol=native#text/plain -res/cardsfolder/torch_song.txt -text svneol=native#text/plain -res/cardsfolder/torii_watchward.txt -text svneol=native#text/plain -res/cardsfolder/torment.txt -text svneol=native#text/plain -res/cardsfolder/tormented_angel.txt -text svneol=native#text/plain -res/cardsfolder/tormods_crypt.txt -text svneol=native#text/plain -res/cardsfolder/torpor_dust.txt -text svneol=native#text/plain -res/cardsfolder/torrent_of_fire.txt svneol=native#text/plain -res/cardsfolder/torsten_von_ursus.txt -text svneol=native#text/plain -res/cardsfolder/tortoise_formation.txt -text svneol=native#text/plain -res/cardsfolder/torture.txt -text svneol=native#text/plain -res/cardsfolder/tortured_existence.txt -text svneol=native#text/plain -res/cardsfolder/totem_guide_hartebeest.txt -text svneol=native#text/plain -res/cardsfolder/totem_speaker.txt -text svneol=native#text/plain -res/cardsfolder/touch_of_brilliance.txt -text svneol=native#text/plain -res/cardsfolder/touch_of_darkness.txt -text svneol=native#text/plain -res/cardsfolder/touch_of_death.txt svneol=native#text/plain -res/cardsfolder/touch_of_invisibility.txt -text svneol=native#text/plain -res/cardsfolder/touchstone.txt -text svneol=native#text/plain -res/cardsfolder/tower_drake.txt -text svneol=native#text/plain -res/cardsfolder/tower_gargoyle.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_calamities.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_champions.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_coireall.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_eons.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_fortunes.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_murmurs.txt -text svneol=native#text/plain -res/cardsfolder/tower_of_the_magistrate.txt -text svneol=native#text/plain -res/cardsfolder/towering_baloth.txt -text svneol=native#text/plain -res/cardsfolder/toxic_iguanar.txt -text svneol=native#text/plain -res/cardsfolder/toxic_nim.txt -text svneol=native#text/plain -res/cardsfolder/toxin_sliver.txt -text svneol=native#text/plain -res/cardsfolder/toymaker.txt svneol=native#text/plain -res/cardsfolder/tracker.txt svneol=native#text/plain -res/cardsfolder/trade_caravan.txt svneol=native#text/plain -res/cardsfolder/trade_routes.txt svneol=native#text/plain -res/cardsfolder/tradewind_rider.txt -text svneol=native#text/plain -res/cardsfolder/tragic_poet.txt -text svneol=native#text/plain -res/cardsfolder/trailblazer.txt -text svneol=native#text/plain -res/cardsfolder/trailblazers_boots.txt -text svneol=native#text/plain -res/cardsfolder/trained_armodon.txt -text svneol=native#text/plain -res/cardsfolder/trained_cheetah.txt svneol=native#text/plain -res/cardsfolder/trained_jackal.txt -text svneol=native#text/plain -res/cardsfolder/trained_orgg.txt -text svneol=native#text/plain -res/cardsfolder/trained_pronghorn.txt svneol=native#text/plain -res/cardsfolder/training_drone.txt -text svneol=native#text/plain -res/cardsfolder/training_grounds.txt -text svneol=native#text/plain -res/cardsfolder/traitorous_instinct.txt svneol=native#text/plain -res/cardsfolder/tranquil_domain.txt -text svneol=native#text/plain -res/cardsfolder/tranquil_garden.txt -text svneol=native#text/plain -res/cardsfolder/tranquil_grove.txt -text svneol=native#text/plain -res/cardsfolder/tranquil_path.txt -text svneol=native#text/plain -res/cardsfolder/tranquil_thicket.txt -text svneol=native#text/plain -res/cardsfolder/tranquility.txt -text svneol=native#text/plain -res/cardsfolder/transcendent_master.txt -text svneol=native#text/plain -res/cardsfolder/transguild_courier.txt -text svneol=native#text/plain -res/cardsfolder/transluminant.txt -text svneol=native#text/plain -res/cardsfolder/transmutation.txt -text svneol=native#text/plain -res/cardsfolder/trap_digger.txt svneol=native#text/plain -res/cardsfolder/trapjaw_kelpie.txt -text svneol=native#text/plain -res/cardsfolder/trapmakers_snare.txt -text svneol=native#text/plain -res/cardsfolder/traproot_kami.txt -text svneol=native#text/plain -res/cardsfolder/trash_for_treasure.txt -text svneol=native#text/plain -res/cardsfolder/traumatic_visions.txt -text svneol=native#text/plain -res/cardsfolder/traumatize.txt -text svneol=native#text/plain -res/cardsfolder/treacherous_link.txt svneol=native#text/plain -res/cardsfolder/treachery.txt -text svneol=native#text/plain -res/cardsfolder/treasure_hunter.txt -text svneol=native#text/plain -res/cardsfolder/treasure_mage.txt -text svneol=native#text/plain -res/cardsfolder/treasure_trove.txt -text svneol=native#text/plain -res/cardsfolder/tree_monkey.txt -text svneol=native#text/plain -res/cardsfolder/tree_of_tales.txt -text svneol=native#text/plain -res/cardsfolder/treefolk_harbinger.txt -text svneol=native#text/plain -res/cardsfolder/treefolk_seedlings.txt -text svneol=native#text/plain -res/cardsfolder/treespring_lorian.txt -text svneol=native#text/plain -res/cardsfolder/treetop_bracers.txt -text svneol=native#text/plain -res/cardsfolder/treetop_rangers.txt -text svneol=native#text/plain -res/cardsfolder/treetop_scout.txt -text svneol=native#text/plain -res/cardsfolder/treetop_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/treetop_village.txt -text svneol=native#text/plain -res/cardsfolder/tremble.txt -text svneol=native#text/plain -res/cardsfolder/tremor.txt -text svneol=native#text/plain -res/cardsfolder/trench_wurm.txt -text svneol=native#text/plain -res/cardsfolder/trenching_steed.txt svneol=native#text/plain -res/cardsfolder/trespassing_souleater.txt svneol=native#text/plain -res/cardsfolder/tresserhorn_sinks.txt -text svneol=native#text/plain -res/cardsfolder/tresserhorn_skyknight.txt -text svneol=native#text/plain -res/cardsfolder/treva_the_renewer.txt -text svneol=native#text/plain -res/cardsfolder/trevas_attendant.txt -text svneol=native#text/plain -res/cardsfolder/trevas_charm.txt svneol=native#text/plain -res/cardsfolder/trevas_ruins.txt -text svneol=native#text/plain -res/cardsfolder/triangle_of_war.txt svneol=native#text/plain -res/cardsfolder/tribal_flames.txt -text svneol=native#text/plain -res/cardsfolder/tribal_forcemage.txt -text svneol=native#text/plain -res/cardsfolder/tribal_golem.txt svneol=native#text/plain -res/cardsfolder/trickster_mage.txt -text svneol=native#text/plain -res/cardsfolder/triclopean_sight.txt svneol=native#text/plain -res/cardsfolder/trigon_of_corruption.txt -text svneol=native#text/plain -res/cardsfolder/trigon_of_infestation.txt -text svneol=native#text/plain -res/cardsfolder/trigon_of_mending.txt -text svneol=native#text/plain -res/cardsfolder/trigon_of_rage.txt -text svneol=native#text/plain -res/cardsfolder/trigon_of_thought.txt -text svneol=native#text/plain -res/cardsfolder/trinket_mage.txt -text svneol=native#text/plain -res/cardsfolder/trip_noose.txt -text svneol=native#text/plain -res/cardsfolder/trip_wire.txt -text svneol=native#text/plain -res/cardsfolder/triskelavus.txt -text svneol=native#text/plain -res/cardsfolder/triskelion.txt -text svneol=native#text/plain -res/cardsfolder/triumph_of_the_hordes.txt -text svneol=native#text/plain -res/cardsfolder/trokin_high_guard.txt -text svneol=native#text/plain -res/cardsfolder/troll_ascetic.txt -text svneol=native#text/plain -res/cardsfolder/troll_horn_cameo.txt -text svneol=native#text/plain -res/cardsfolder/trolls_of_tel_jilad.txt -text svneol=native#text/plain -res/cardsfolder/tromp_the_domains.txt -text svneol=native#text/plain -res/cardsfolder/tropical_island.txt -text svneol=native#text/plain -res/cardsfolder/tropical_storm.txt svneol=native#text/plain -res/cardsfolder/troublesome_spirit.txt -text svneol=native#text/plain -res/cardsfolder/true_conviction.txt -text svneol=native#text/plain -res/cardsfolder/trumpet_blast.txt -text svneol=native#text/plain -res/cardsfolder/trusted_advisor.txt -text svneol=native#text/plain -res/cardsfolder/trusty_machete.txt -text svneol=native#text/plain -res/cardsfolder/trygon_predator.txt -text svneol=native#text/plain -res/cardsfolder/tsabo_tavoc.txt -text svneol=native#text/plain -res/cardsfolder/tsunami.txt -text svneol=native#text/plain -res/cardsfolder/tukatongue_thallid.txt -text svneol=native#text/plain -res/cardsfolder/tuknir_deathlock.txt -text svneol=native#text/plain -res/cardsfolder/tuktuk_grunts.txt -text svneol=native#text/plain -res/cardsfolder/tuktuk_the_explorer.txt -text svneol=native#text/plain -res/cardsfolder/tumble_magnet.txt -text svneol=native#text/plain -res/cardsfolder/tundra.txt -text svneol=native#text/plain -res/cardsfolder/tundra_wolves.txt -text svneol=native#text/plain -res/cardsfolder/tunnel.txt -text svneol=native#text/plain -res/cardsfolder/tunneler_wurm.txt svneol=native#text/plain -res/cardsfolder/turn_aside.txt -text svneol=native#text/plain -res/cardsfolder/turn_the_tide.txt -text svneol=native#text/plain -res/cardsfolder/turn_to_dust.txt -text svneol=native#text/plain -res/cardsfolder/turn_to_mist.txt -text svneol=native#text/plain -res/cardsfolder/turn_to_slag.txt svneol=native#text/plain -res/cardsfolder/turnabout.txt svneol=native#text/plain -res/cardsfolder/turntimber_grove.txt svneol=native#text/plain -res/cardsfolder/turntimber_ranger.txt -text svneol=native#text/plain -res/cardsfolder/turtleshell_changeling.txt -text svneol=native#text/plain -res/cardsfolder/twiddle.txt -text svneol=native#text/plain -res/cardsfolder/twigwalker.txt -text svneol=native#text/plain -res/cardsfolder/twilight_drover.txt -text svneol=native#text/plain -res/cardsfolder/twilight_mire.txt -text svneol=native#text/plain -res/cardsfolder/twinblade_slasher.txt -text svneol=native#text/plain -res/cardsfolder/twincast.txt -text svneol=native#text/plain -res/cardsfolder/twisted_abomination.txt -text svneol=native#text/plain -res/cardsfolder/twisted_experiment.txt -text svneol=native#text/plain -res/cardsfolder/twisted_image.txt -text svneol=native#text/plain -res/cardsfolder/twitch.txt -text svneol=native#text/plain -res/cardsfolder/typhoon.txt -text svneol=native#text/plain -res/cardsfolder/tyrranax.txt -text svneol=native#text/plain -res/cardsfolder/uktabi_drake.txt -text svneol=native#text/plain -res/cardsfolder/uktabi_efreet.txt -text svneol=native#text/plain -res/cardsfolder/uktabi_faerie.txt -text svneol=native#text/plain -res/cardsfolder/uktabi_orangutan.txt -text svneol=native#text/plain -res/cardsfolder/uktabi_wildcats.txt -text svneol=native#text/plain -res/cardsfolder/ulamog_the_infinite_gyre.txt -text svneol=native#text/plain -res/cardsfolder/ulamogs_crusher.txt -text svneol=native#text/plain -res/cardsfolder/umara_raptor.txt -text svneol=native#text/plain -res/cardsfolder/umbra_stalker.txt -text svneol=native#text/plain -res/cardsfolder/umbral_mantle.txt -text svneol=native#text/plain -res/cardsfolder/umezawas_jitte.txt -text svneol=native#text/plain -res/cardsfolder/unbender_tine.txt -text svneol=native#text/plain -res/cardsfolder/unburden.txt -text svneol=native#text/plain -res/cardsfolder/uncle_istvan.txt -text svneol=native#text/plain -res/cardsfolder/uncontrollable_anger.txt -text svneol=native#text/plain -res/cardsfolder/undead_gladiator.txt -text svneol=native#text/plain -res/cardsfolder/undead_leotau.txt -text svneol=native#text/plain -res/cardsfolder/undead_slayer.txt -text svneol=native#text/plain -res/cardsfolder/undead_warchief.txt -text svneol=native#text/plain -res/cardsfolder/undercity_shade.txt -text svneol=native#text/plain -res/cardsfolder/underground_river.txt -text svneol=native#text/plain -res/cardsfolder/underground_sea.txt -text svneol=native#text/plain -res/cardsfolder/undergrowth.txt -text svneol=native#text/plain -res/cardsfolder/undermine.txt -text svneol=native#text/plain -res/cardsfolder/undertaker.txt -text svneol=native#text/plain -res/cardsfolder/undertow.txt -text svneol=native#text/plain -res/cardsfolder/underworld_dreams.txt -text svneol=native#text/plain -res/cardsfolder/undiscovered_paradise.txt -text svneol=native#text/plain -res/cardsfolder/undo.txt -text svneol=native#text/plain -res/cardsfolder/undying_beast.txt -text svneol=native#text/plain -res/cardsfolder/undying_rage.txt -text svneol=native#text/plain -res/cardsfolder/unearth.txt -text svneol=native#text/plain -res/cardsfolder/unearthly_blizzard.txt -text svneol=native#text/plain -res/cardsfolder/unfulfilled_desires.txt -text svneol=native#text/plain -res/cardsfolder/unhinge.txt -text svneol=native#text/plain -res/cardsfolder/unholy_grotto.txt -text svneol=native#text/plain -res/cardsfolder/unholy_strength.txt -text svneol=native#text/plain -res/cardsfolder/unifying_theory.txt svneol=native#text/plain -res/cardsfolder/unlikely_alliance.txt -text svneol=native#text/plain -res/cardsfolder/unliving_psychopath.txt svneol=native#text/plain -res/cardsfolder/unmake.txt -text svneol=native#text/plain -res/cardsfolder/unmask.txt -text svneol=native#text/plain -res/cardsfolder/unnatural_predation.txt -text svneol=native#text/plain -res/cardsfolder/unnatural_speed.txt -text svneol=native#text/plain -res/cardsfolder/unnerve.txt -text svneol=native#text/plain -res/cardsfolder/unquestioned_authority.txt -text svneol=native#text/plain -res/cardsfolder/unseen_walker.txt -text svneol=native#text/plain -res/cardsfolder/unspeakable_symbol.txt -text svneol=native#text/plain -res/cardsfolder/unstable_hulk.txt svneol=native#text/plain -res/cardsfolder/unstable_mutation.txt -text svneol=native#text/plain -res/cardsfolder/unsummon.txt -text svneol=native#text/plain -res/cardsfolder/untamed_might.txt -text svneol=native#text/plain -res/cardsfolder/untamed_wilds.txt -text svneol=native#text/plain -res/cardsfolder/unwilling_recruit.txt -text svneol=native#text/plain -res/cardsfolder/unwinding_clock.txt -text svneol=native#text/plain -res/cardsfolder/unworthy_dead.txt -text svneol=native#text/plain -res/cardsfolder/unyaro_bee_sting.txt -text svneol=native#text/plain -res/cardsfolder/unyaro_bees.txt -text svneol=native#text/plain -res/cardsfolder/unyaro_griffin.txt svneol=native#text/plain -res/cardsfolder/updraft.txt -text svneol=native#text/plain -res/cardsfolder/upheaval.txt -text svneol=native#text/plain -res/cardsfolder/uproot.txt -text svneol=native#text/plain -res/cardsfolder/upwelling.txt -text svneol=native#text/plain -res/cardsfolder/ur_drago.txt -text svneol=native#text/plain -res/cardsfolder/ur_golems_eye.txt -text svneol=native#text/plain -res/cardsfolder/urabrask_the_hidden.txt svneol=native#text/plain -res/cardsfolder/urborg_drake.txt -text svneol=native#text/plain -res/cardsfolder/urborg_elf.txt -text svneol=native#text/plain -res/cardsfolder/urborg_emissary.txt -text svneol=native#text/plain -res/cardsfolder/urborg_justice.txt svneol=native#text/plain -res/cardsfolder/urborg_mindsucker.txt -text svneol=native#text/plain -res/cardsfolder/urborg_phantom.txt -text svneol=native#text/plain -res/cardsfolder/urborg_shambler.txt -text svneol=native#text/plain -res/cardsfolder/urborg_skeleton.txt svneol=native#text/plain -res/cardsfolder/urborg_stalker.txt svneol=native#text/plain -res/cardsfolder/urborg_syphon_mage.txt -text svneol=native#text/plain -res/cardsfolder/urborg_tomb_of_yawgmoth.txt svneol=native#text/plain -res/cardsfolder/urborg_uprising.txt -text svneol=native#text/plain -res/cardsfolder/urborg_volcano.txt -text svneol=native#text/plain -res/cardsfolder/uril_the_miststalker.txt -text svneol=native#text/plain -res/cardsfolder/ursapine.txt -text svneol=native#text/plain -res/cardsfolder/urzas_armor.txt -text svneol=native#text/plain -res/cardsfolder/urzas_blueprints.txt -text svneol=native#text/plain -res/cardsfolder/urzas_chalice.txt -text svneol=native#text/plain -res/cardsfolder/urzas_factory.txt -text svneol=native#text/plain -res/cardsfolder/urzas_guilt.txt svneol=native#text/plain -res/cardsfolder/urzas_mine.txt -text svneol=native#text/plain -res/cardsfolder/urzas_power_plant.txt -text svneol=native#text/plain -res/cardsfolder/urzas_rage.txt -text svneol=native#text/plain -res/cardsfolder/urzas_tower.txt -text svneol=native#text/plain -res/cardsfolder/uthden_troll.txt -text svneol=native#text/plain -res/cardsfolder/utopia_mycon.txt -text svneol=native#text/plain -res/cardsfolder/utopia_tree.txt -text svneol=native#text/plain -res/cardsfolder/utopia_vow.txt -text svneol=native#text/plain -res/cardsfolder/utvara_scalper.txt -text svneol=native#text/plain -res/cardsfolder/uyo_silent_prophet.txt svneol=native#text/plain -res/cardsfolder/vacuumelt.txt svneol=native#text/plain -res/cardsfolder/vaevictis_asmadi.txt -text svneol=native#text/plain -res/cardsfolder/vagrant_plowbeasts.txt -text svneol=native#text/plain -res/cardsfolder/valakut_fireboar.txt svneol=native#text/plain -res/cardsfolder/valakut_the_molten_pinnacle.txt -text svneol=native#text/plain -res/cardsfolder/valeron_outlander.txt -text svneol=native#text/plain -res/cardsfolder/valiant_guard.txt -text svneol=native#text/plain -res/cardsfolder/valley_rannet.txt -text svneol=native#text/plain -res/cardsfolder/valor.txt -text svneol=native#text/plain -res/cardsfolder/valorous_charge.txt -text svneol=native#text/plain -res/cardsfolder/vampire_aristocrat.txt -text svneol=native#text/plain -res/cardsfolder/vampire_bats.txt -text svneol=native#text/plain -res/cardsfolder/vampire_hexmage.txt -text svneol=native#text/plain -res/cardsfolder/vampire_hounds.txt -text svneol=native#text/plain -res/cardsfolder/vampire_lacerator.txt -text svneol=native#text/plain -res/cardsfolder/vampire_nighthawk.txt -text svneol=native#text/plain -res/cardsfolder/vampire_nocturnus.txt -text svneol=native#text/plain -res/cardsfolder/vampires_bite.txt svneol=native#text/plain -res/cardsfolder/vampiric_dragon.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_embrace.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_feast.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_link.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_sliver.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_spirit.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_touch.txt -text svneol=native#text/plain -res/cardsfolder/vampiric_tutor.txt -text svneol=native#text/plain -res/cardsfolder/vampirism.txt -text svneol=native#text/plain -res/cardsfolder/vanquish.txt -text svneol=native#text/plain -res/cardsfolder/vapor_snag.txt -text svneol=native#text/plain -res/cardsfolder/varchilds_crusader.txt -text svneol=native#text/plain -res/cardsfolder/vastwood_animist.txt -text svneol=native#text/plain -res/cardsfolder/vastwood_gorger.txt -text svneol=native#text/plain -res/cardsfolder/vastwood_zendikon.txt svneol=native#text/plain -res/cardsfolder/vault_of_whispers.txt -text svneol=native#text/plain -res/cardsfolder/vault_skirge.txt svneol=native#text/plain -res/cardsfolder/vault_skyward.txt -text svneol=native#text/plain -res/cardsfolder/vec_townships.txt -text svneol=native#text/plain -res/cardsfolder/vectis_agents.txt -text svneol=native#text/plain -res/cardsfolder/vectis_silencers.txt -text svneol=native#text/plain -res/cardsfolder/vector_asp.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_aethermage.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_anatomist.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_archmage.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_certarch.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_dismisser.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_entrancer.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_heretic.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_infuser.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_mastermind.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_orrery.txt svneol=native#text/plain -res/cardsfolder/vedalken_outlander.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_plotter.txt -text svneol=native#text/plain -res/cardsfolder/vedalken_shackles.txt -text svneol=native#text/plain -res/cardsfolder/veil_of_birds.txt -text svneol=native#text/plain -res/cardsfolder/veiled_apparition.txt -text svneol=native#text/plain -res/cardsfolder/vein_drinker.txt svneol=native#text/plain -res/cardsfolder/veinfire_borderpost.txt -text svneol=native#text/plain -res/cardsfolder/veldrane_of_sengir.txt -text svneol=native#text/plain -res/cardsfolder/veldt.txt svneol=native#text/plain -res/cardsfolder/venarian_gold.txt svneol=native#text/plain -res/cardsfolder/vendetta.txt -text svneol=native#text/plain -res/cardsfolder/vendilion_clique.txt -text svneol=native#text/plain -res/cardsfolder/venerable_kumo.txt -text svneol=native#text/plain -res/cardsfolder/venerable_monk.txt -text svneol=native#text/plain -res/cardsfolder/venerated_teacher.txt -text svneol=native#text/plain -res/cardsfolder/vengeance.txt -text svneol=native#text/plain -res/cardsfolder/vengeful_dead.txt -text svneol=native#text/plain -res/cardsfolder/vengeful_dreams.txt -text svneol=native#text/plain -res/cardsfolder/vengeful_firebrand.txt -text svneol=native#text/plain -res/cardsfolder/vengevine.txt -text svneol=native#text/plain -res/cardsfolder/venomous_dragonfly.txt -text svneol=native#text/plain -res/cardsfolder/venomous_vines.txt -text svneol=native#text/plain -res/cardsfolder/venomspout_brackus.txt -text svneol=native#text/plain -res/cardsfolder/venser_the_sojourner.txt -text svneol=native#text/plain -res/cardsfolder/vensers_journal.txt -text svneol=native#text/plain -res/cardsfolder/vensers_sliver.txt -text svneol=native#text/plain -res/cardsfolder/vent_sentinel.txt -text svneol=native#text/plain -res/cardsfolder/verdant_catacombs.txt -text svneol=native#text/plain -res/cardsfolder/verdant_eidolon.txt svneol=native#text/plain -res/cardsfolder/verdant_field.txt svneol=native#text/plain -res/cardsfolder/verdant_force.txt -text svneol=native#text/plain -res/cardsfolder/verdant_touch.txt -text svneol=native#text/plain -res/cardsfolder/verdigris.txt -text svneol=native#text/plain -res/cardsfolder/verduran_emissary.txt -text svneol=native#text/plain -res/cardsfolder/verduran_enchantress.txt -text svneol=native#text/plain -res/cardsfolder/vermiculos.txt -text svneol=native#text/plain -res/cardsfolder/vernal_bloom.txt -text svneol=native#text/plain -res/cardsfolder/vernal_equinox.txt svneol=native#text/plain -res/cardsfolder/vertigo_spawn.txt svneol=native#text/plain -res/cardsfolder/vesper_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/vesuvan_doppelganger.txt -text svneol=native#text/plain -res/cardsfolder/veteran_armorer.txt -text svneol=native#text/plain -res/cardsfolder/veteran_armorsmith.txt -text svneol=native#text/plain -res/cardsfolder/veteran_brawlers.txt svneol=native#text/plain -res/cardsfolder/veteran_cavalier.txt -text svneol=native#text/plain -res/cardsfolder/veteran_explorer.txt svneol=native#text/plain -res/cardsfolder/veteran_of_the_depths.txt -text svneol=native#text/plain -res/cardsfolder/veteran_swordsmith.txt -text svneol=native#text/plain -res/cardsfolder/veterans_reflexes.txt -text svneol=native#text/plain -res/cardsfolder/vex.txt -text svneol=native#text/plain -res/cardsfolder/vexing_beetle.txt -text svneol=native#text/plain -res/cardsfolder/viashino_bladescout.txt svneol=native#text/plain -res/cardsfolder/viashino_cutthroat.txt -text svneol=native#text/plain -res/cardsfolder/viashino_fangtail.txt -text svneol=native#text/plain -res/cardsfolder/viashino_grappler.txt -text svneol=native#text/plain -res/cardsfolder/viashino_heretic.txt -text svneol=native#text/plain -res/cardsfolder/viashino_outrider.txt -text svneol=native#text/plain -res/cardsfolder/viashino_sandscout.txt -text svneol=native#text/plain -res/cardsfolder/viashino_sandstalker.txt -text svneol=native#text/plain -res/cardsfolder/viashino_skeleton.txt -text svneol=native#text/plain -res/cardsfolder/viashino_slasher.txt -text svneol=native#text/plain -res/cardsfolder/viashino_slaughtermaster.txt -text svneol=native#text/plain -res/cardsfolder/viashino_spearhunter.txt -text svneol=native#text/plain -res/cardsfolder/viashino_warrior.txt -text svneol=native#text/plain -res/cardsfolder/viashino_weaponsmith.txt -text svneol=native#text/plain -res/cardsfolder/viashivan_dragon.txt -text svneol=native#text/plain -res/cardsfolder/vibrating_sphere.txt svneol=native#text/plain -res/cardsfolder/vicious_hunger.txt -text svneol=native#text/plain -res/cardsfolder/vicious_kavu.txt -text svneol=native#text/plain -res/cardsfolder/victorious_destruction.txt -text svneol=native#text/plain -res/cardsfolder/victorys_herald.txt -text svneol=native#text/plain -res/cardsfolder/victual_sliver.txt svneol=native#text/plain -res/cardsfolder/vigean_intuition.txt svneol=native#text/plain -res/cardsfolder/vigil_for_the_lost.txt -text svneol=native#text/plain -res/cardsfolder/vigilance.txt -text svneol=native#text/plain -res/cardsfolder/vigilant_drake.txt -text svneol=native#text/plain -res/cardsfolder/vigilant_martyr.txt -text svneol=native#text/plain -res/cardsfolder/vigilant_sentry.txt svneol=native#text/plain -res/cardsfolder/vile_deacon.txt svneol=native#text/plain -res/cardsfolder/vile_requiem.txt -text svneol=native#text/plain -res/cardsfolder/village_elder.txt -text svneol=native#text/plain -res/cardsfolder/villainous_ogre.txt -text svneol=native#text/plain -res/cardsfolder/vindicate.txt -text svneol=native#text/plain -res/cardsfolder/vindictive_mob.txt -text svneol=native#text/plain -res/cardsfolder/vine_dryad.txt -text svneol=native#text/plain -res/cardsfolder/vine_trellis.txt -text svneol=native#text/plain -res/cardsfolder/vinelasher_kudzu.txt -text svneol=native#text/plain -res/cardsfolder/vines_of_vastwood.txt -text svneol=native#text/plain -res/cardsfolder/vintara_snapper.txt -text svneol=native#text/plain -res/cardsfolder/violent_outburst.txt -text svneol=native#text/plain -res/cardsfolder/violent_ultimatum.txt -text svneol=native#text/plain -res/cardsfolder/violet_pall.txt -text svneol=native#text/plain -res/cardsfolder/viral_drake.txt -text svneol=native#text/plain -res/cardsfolder/viridescent_wisps.txt -text svneol=native#text/plain -res/cardsfolder/viridian_acolyte.txt -text svneol=native#text/plain -res/cardsfolder/viridian_betrayers.txt svneol=native#text/plain -res/cardsfolder/viridian_claw.txt -text svneol=native#text/plain -res/cardsfolder/viridian_corrupter.txt -text svneol=native#text/plain -res/cardsfolder/viridian_emissary.txt -text svneol=native#text/plain -res/cardsfolder/viridian_harvest.txt -text svneol=native#text/plain -res/cardsfolder/viridian_joiner.txt -text svneol=native#text/plain -res/cardsfolder/viridian_longbow.txt -text svneol=native#text/plain -res/cardsfolder/viridian_lorebearers.txt -text svneol=native#text/plain -res/cardsfolder/viridian_revel.txt -text svneol=native#text/plain -res/cardsfolder/viridian_scout.txt svneol=native#text/plain -res/cardsfolder/viridian_shaman.txt -text svneol=native#text/plain -res/cardsfolder/viridian_zealot.txt -text svneol=native#text/plain -res/cardsfolder/virtues_ruin.txt -text svneol=native#text/plain -res/cardsfolder/virtuous_charge.txt -text svneol=native#text/plain -res/cardsfolder/virulent_sliver.txt -text svneol=native#text/plain -res/cardsfolder/virulent_wound.txt -text svneol=native#text/plain -res/cardsfolder/visara_the_dreadful.txt -text svneol=native#text/plain -res/cardsfolder/viscera_dragger.txt -text svneol=native#text/plain -res/cardsfolder/viscera_seer.txt -text svneol=native#text/plain -res/cardsfolder/viscerid_armor.txt -text svneol=native#text/plain -res/cardsfolder/viscerid_deepwalker.txt -text svneol=native#text/plain -res/cardsfolder/viscid_lemures.txt -text svneol=native#text/plain -res/cardsfolder/viseling.txt svneol=native#text/plain -res/cardsfolder/vision_skeins.txt -text svneol=native#text/plain -res/cardsfolder/visions.txt -text svneol=native#text/plain -res/cardsfolder/vital_splicer.txt -text svneol=native#text/plain -res/cardsfolder/vital_surge.txt -text svneol=native#text/plain -res/cardsfolder/vitality_charm.txt svneol=native#text/plain -res/cardsfolder/vitalize.txt -text svneol=native#text/plain -res/cardsfolder/vitalizing_cascade.txt -text svneol=native#text/plain -res/cardsfolder/vitalizing_wind.txt -text svneol=native#text/plain -res/cardsfolder/vitaspore_thallid.txt -text svneol=native#text/plain -res/cardsfolder/vithian_renegades.txt -text svneol=native#text/plain -res/cardsfolder/vithian_stinger.txt -text svneol=native#text/plain -res/cardsfolder/vitu_ghazi_the_city_tree.txt -text svneol=native#text/plain -res/cardsfolder/vivid_crag.txt -text svneol=native#text/plain -res/cardsfolder/vivid_creek.txt -text svneol=native#text/plain -res/cardsfolder/vivid_grove.txt -text svneol=native#text/plain -res/cardsfolder/vivid_marsh.txt -text svneol=native#text/plain -res/cardsfolder/vivid_meadow.txt -text svneol=native#text/plain -res/cardsfolder/vivify.txt -text svneol=native#text/plain -res/cardsfolder/vivisection.txt -text svneol=native#text/plain -res/cardsfolder/vizzerdrix.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_hypnotist.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_knights.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_mage.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_merchant.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_serpent.txt svneol=native#text/plain -res/cardsfolder/vodalian_soldiers.txt -text svneol=native#text/plain -res/cardsfolder/vodalian_zombie.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_duty.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_grace.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_law.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_reason.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_the_woods.txt -text svneol=native#text/plain -res/cardsfolder/voice_of_truth.txt -text svneol=native#text/plain -res/cardsfolder/voices_from_the_void.txt -text svneol=native#text/plain -res/cardsfolder/voidmage_prodigy.txt -text svneol=native#text/plain -res/cardsfolder/voidslime.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_awakening.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_dragon.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_eruption.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_fallout.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_geyser.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_hammer.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_island.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_spray.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_strength.txt -text svneol=native#text/plain -res/cardsfolder/volcanic_submersion.txt -text svneol=native#text/plain -res/cardsfolder/volcano_imp.txt -text svneol=native#text/plain -res/cardsfolder/volition_reins.txt -text svneol=native#text/plain -res/cardsfolder/volrath_the_fallen.txt svneol=native#text/plain -res/cardsfolder/volraths_dungeon.txt -text svneol=native#text/plain -res/cardsfolder/volraths_gardens.txt -text svneol=native#text/plain -res/cardsfolder/volraths_stronghold.txt -text svneol=native#text/plain -res/cardsfolder/volt_charge.txt -text svneol=native#text/plain -res/cardsfolder/voltaic_construct.txt -text svneol=native#text/plain -res/cardsfolder/voltaic_key.txt -text svneol=native#text/plain -res/cardsfolder/volunteer_militia.txt -text svneol=native#text/plain -res/cardsfolder/voracious_cobra.txt -text svneol=native#text/plain -res/cardsfolder/voracious_hatchling.txt -text svneol=native#text/plain -res/cardsfolder/vorinclex_voice_of_hunger.txt svneol=native#text/plain -res/cardsfolder/vorosh_the_hunter.txt -text svneol=native#text/plain -res/cardsfolder/vorrac_battlehorns.txt -text svneol=native#text/plain -res/cardsfolder/votary_of_the_conclave.txt -text svneol=native#text/plain -res/cardsfolder/voyager_drake.txt svneol=native#text/plain -res/cardsfolder/vug_lizard.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_battlegear.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_berserker.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_gauntlets.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_heartstoker.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_morningstar.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_refugee.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_replica.txt -text svneol=native#text/plain -res/cardsfolder/vulshok_sorcerer.txt -text svneol=native#text/plain -res/cardsfolder/vulturous_zombie.txt -text svneol=native#text/plain -res/cardsfolder/wail_of_the_nim.txt svneol=native#text/plain -res/cardsfolder/waiting_in_the_weeds.txt svneol=native#text/plain -res/cardsfolder/wake_of_vultures.txt svneol=native#text/plain -res/cardsfolder/wake_thrasher.txt -text svneol=native#text/plain -res/cardsfolder/wakestone_gargoyle.txt svneol=native#text/plain -res/cardsfolder/waking_nightmare.txt -text svneol=native#text/plain -res/cardsfolder/walker_of_secret_ways.txt -text svneol=native#text/plain -res/cardsfolder/walker_of_the_grove.txt -text svneol=native#text/plain -res/cardsfolder/walking_archive.txt -text svneol=native#text/plain -res/cardsfolder/walking_atlas.txt svneol=native#text/plain -res/cardsfolder/walking_dead.txt -text svneol=native#text/plain -res/cardsfolder/walking_desecration.txt svneol=native#text/plain -res/cardsfolder/walking_dream.txt -text svneol=native#text/plain -res/cardsfolder/walking_wall.txt svneol=native#text/plain -res/cardsfolder/wall_of_air.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_blood.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_blossoms.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_bone.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_brambles.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_denial.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_diffusion.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_distortion.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_earth.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_essence.txt svneol=native#text/plain -res/cardsfolder/wall_of_faith.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_fire.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_frost.txt svneol=native#text/plain -res/cardsfolder/wall_of_granite.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_heat.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_hope.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_ice.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_junk.txt svneol=native#text/plain -res/cardsfolder/wall_of_kelp.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_lava.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_light.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_mulch.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_omens.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_opposition.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_pine_needles.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_putrid_flesh.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_razors.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_resistance.txt svneol=native#text/plain -res/cardsfolder/wall_of_reverence.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_roots.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_souls.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_spears.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_stone.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_swords.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_tanglecord.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_tears.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_tombstones.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_vines.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_water.txt -text svneol=native#text/plain -res/cardsfolder/wall_of_wonder.txt svneol=native#text/plain -res/cardsfolder/wall_of_wood.txt -text svneol=native#text/plain -res/cardsfolder/wallop.txt -text svneol=native#text/plain -res/cardsfolder/wand_of_the_elements.txt -text svneol=native#text/plain -res/cardsfolder/wanderbrine_rootcutters.txt -text svneol=native#text/plain -res/cardsfolder/wanderers_twig.txt -text svneol=native#text/plain -res/cardsfolder/wanderguard_sentry.txt svneol=native#text/plain -res/cardsfolder/wandering_goblins.txt -text svneol=native#text/plain -res/cardsfolder/wandering_graybeard.txt -text svneol=native#text/plain -res/cardsfolder/wandering_ones.txt -text svneol=native#text/plain -res/cardsfolder/wandering_stream.txt -text svneol=native#text/plain -res/cardsfolder/wanderlust.txt -text svneol=native#text/plain -res/cardsfolder/wanderwine_hub.txt -text svneol=native#text/plain -res/cardsfolder/wanderwine_prophets.txt svneol=native#text/plain -res/cardsfolder/waning_wurm.txt -text svneol=native#text/plain -res/cardsfolder/war_chariot.txt -text svneol=native#text/plain -res/cardsfolder/war_dance.txt -text svneol=native#text/plain -res/cardsfolder/war_mammoth.txt -text svneol=native#text/plain -res/cardsfolder/war_priest_of_thune.txt -text svneol=native#text/plain -res/cardsfolder/war_report.txt -text svneol=native#text/plain -res/cardsfolder/war_spike_changeling.txt -text svneol=native#text/plain -res/cardsfolder/war_torch_goblin.txt -text svneol=native#text/plain -res/cardsfolder/warbreak_trumpeter.txt svneol=native#text/plain -res/cardsfolder/wargate.txt svneol=native#text/plain -res/cardsfolder/warlords_axe.txt -text svneol=native#text/plain -res/cardsfolder/warmonger.txt -text svneol=native#text/plain -res/cardsfolder/warmongers_chariot.txt svneol=native#text/plain -res/cardsfolder/warmth.txt -text svneol=native#text/plain -res/cardsfolder/warning.txt -text svneol=native#text/plain -res/cardsfolder/warp_artifact.txt -text svneol=native#text/plain -res/cardsfolder/warpath.txt -text svneol=native#text/plain -res/cardsfolder/warpath_ghoul.txt -text svneol=native#text/plain -res/cardsfolder/warped_devotion.txt -text svneol=native#text/plain -res/cardsfolder/warped_researcher.txt -text svneol=native#text/plain -res/cardsfolder/warren_instigator.txt -text svneol=native#text/plain -res/cardsfolder/warren_scourge_elf.txt -text svneol=native#text/plain -res/cardsfolder/warrior_angel.txt -text svneol=native#text/plain -res/cardsfolder/warriors_charge.txt -text svneol=native#text/plain -res/cardsfolder/warriors_honor.txt -text svneol=native#text/plain -res/cardsfolder/warthog.txt -text svneol=native#text/plain -res/cardsfolder/wasp_lancer.txt -text svneol=native#text/plain -res/cardsfolder/waste_away.txt -text svneol=native#text/plain -res/cardsfolder/wasteland.txt -text svneol=native#text/plain -res/cardsfolder/watcher_sliver.txt -text svneol=native#text/plain -res/cardsfolder/watchwing_scarecrow.txt -text svneol=native#text/plain -res/cardsfolder/watchwolf.txt -text svneol=native#text/plain -res/cardsfolder/water_elemental.txt -text svneol=native#text/plain -res/cardsfolder/water_servant.txt -text svneol=native#text/plain -res/cardsfolder/water_wurm.txt -text svneol=native#text/plain -res/cardsfolder/waterfront_bouncer.txt -text svneol=native#text/plain -res/cardsfolder/waterspout_elemental.txt -text svneol=native#text/plain -res/cardsfolder/waterspout_weavers.txt -text svneol=native#text/plain -res/cardsfolder/waterveil_cavern.txt -text svneol=native#text/plain -res/cardsfolder/watery_grave.txt -text svneol=native#text/plain -res/cardsfolder/wave_elemental.txt -text svneol=native#text/plain -res/cardsfolder/wave_of_indifference.txt svneol=native#text/plain -res/cardsfolder/wave_of_terror.txt -text svneol=native#text/plain -res/cardsfolder/waveskimmer_aven.txt -text svneol=native#text/plain -res/cardsfolder/wayfarers_bauble.txt svneol=native#text/plain -res/cardsfolder/wayfaring_giant.txt -text svneol=native#text/plain -res/cardsfolder/waylay.txt -text svneol=native#text/plain -res/cardsfolder/wayward_soul.txt -text svneol=native#text/plain -res/cardsfolder/weakness.txt -text svneol=native#text/plain -res/cardsfolder/weakstone.txt -text svneol=native#text/plain -res/cardsfolder/weathered_wayfarer.txt -text svneol=native#text/plain -res/cardsfolder/weatherseed_elf.txt -text svneol=native#text/plain -res/cardsfolder/weatherseed_faeries.txt -text svneol=native#text/plain -res/cardsfolder/weatherseed_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/web.txt -text svneol=native#text/plain -res/cardsfolder/wee_dragonauts.txt -text svneol=native#text/plain -res/cardsfolder/weed_pruner_poplar.txt svneol=native#text/plain -res/cardsfolder/wei_ambush_force.txt -text svneol=native#text/plain -res/cardsfolder/wei_elite_companions.txt -text svneol=native#text/plain -res/cardsfolder/wei_infantry.txt -text svneol=native#text/plain -res/cardsfolder/wei_night_raiders.txt -text svneol=native#text/plain -res/cardsfolder/wei_scout.txt -text svneol=native#text/plain -res/cardsfolder/wei_strike_force.txt -text svneol=native#text/plain -res/cardsfolder/weirding_shaman.txt -text svneol=native#text/plain -res/cardsfolder/welding_jar.txt -text svneol=native#text/plain -res/cardsfolder/welkin_guide.txt -text svneol=native#text/plain -res/cardsfolder/welkin_hawk.txt svneol=native#text/plain -res/cardsfolder/welkin_tern.txt -text svneol=native#text/plain -res/cardsfolder/well_laid_plans.txt -text svneol=native#text/plain -res/cardsfolder/well_of_discovery.txt -text svneol=native#text/plain -res/cardsfolder/well_of_life.txt -text svneol=native#text/plain -res/cardsfolder/wellspring.txt -text svneol=native#text/plain -res/cardsfolder/wellwisher.txt -text svneol=native#text/plain -res/cardsfolder/werebear.txt -text svneol=native#text/plain -res/cardsfolder/western_paladin.txt -text svneol=native#text/plain -res/cardsfolder/whalebone_glider.txt svneol=native#text/plain -res/cardsfolder/wheel_and_deal.txt -text svneol=native#text/plain -res/cardsfolder/wheel_of_fortune.txt -text svneol=native#text/plain -res/cardsfolder/wheel_of_torture.txt -text svneol=native#text/plain -res/cardsfolder/where_ancients_tread.txt -text svneol=native#text/plain -res/cardsfolder/whetstone.txt svneol=native#text/plain -res/cardsfolder/whetwheel.txt -text svneol=native#text/plain -res/cardsfolder/whimwader.txt -text svneol=native#text/plain -res/cardsfolder/whip_sergeant.txt -text svneol=native#text/plain -res/cardsfolder/whip_silk.txt -text svneol=native#text/plain -res/cardsfolder/whip_spine_drake.txt -text svneol=native#text/plain -res/cardsfolder/whipcorder.txt -text svneol=native#text/plain -res/cardsfolder/whipflare.txt -text svneol=native#text/plain -res/cardsfolder/whipstitched_zombie.txt -text svneol=native#text/plain -res/cardsfolder/whiptail_moloch.txt -text svneol=native#text/plain -res/cardsfolder/whiptail_wurm.txt -text svneol=native#text/plain -res/cardsfolder/whiptongue_frog.txt -text svneol=native#text/plain -res/cardsfolder/whirling_catapult.txt svneol=native#text/plain -res/cardsfolder/whirling_dervish.txt -text svneol=native#text/plain -res/cardsfolder/whirlpool_drake.txt svneol=native#text/plain -res/cardsfolder/whirlpool_rider.txt -text svneol=native#text/plain -res/cardsfolder/whirlwind.txt -text svneol=native#text/plain -res/cardsfolder/whispering_shade.txt -text svneol=native#text/plain -res/cardsfolder/whispering_specter.txt -text svneol=native#text/plain -res/cardsfolder/whispers_of_the_muse.txt -text svneol=native#text/plain -res/cardsfolder/whispersilk_cloak.txt -text svneol=native#text/plain -res/cardsfolder/white_knight.txt -text svneol=native#text/plain -res/cardsfolder/white_mana_battery.txt -text svneol=native#text/plain -res/cardsfolder/white_scarab.txt svneol=native#text/plain -res/cardsfolder/white_shield_crusader.txt -text svneol=native#text/plain -res/cardsfolder/white_suns_zenith.txt -text svneol=native#text/plain -res/cardsfolder/white_ward.txt -text svneol=native#text/plain -res/cardsfolder/whitemane_lion.txt -text svneol=native#text/plain -res/cardsfolder/whitesuns_passage.txt -text svneol=native#text/plain -res/cardsfolder/wicked_pact.txt -text svneol=native#text/plain -res/cardsfolder/wicked_reward.txt -text svneol=native#text/plain -res/cardsfolder/wicker_warcrawler.txt svneol=native#text/plain -res/cardsfolder/wickerbough_elder.txt -text svneol=native#text/plain -res/cardsfolder/wielding_the_green_dragon.txt -text svneol=native#text/plain -res/cardsfolder/wild_aesthir.txt -text svneol=native#text/plain -res/cardsfolder/wild_cantor.txt -text svneol=native#text/plain -res/cardsfolder/wild_colos.txt -text svneol=native#text/plain -res/cardsfolder/wild_elephant.txt -text svneol=native#text/plain -res/cardsfolder/wild_griffin.txt -text svneol=native#text/plain -res/cardsfolder/wild_growth.txt -text svneol=native#text/plain -res/cardsfolder/wild_jhovall.txt -text svneol=native#text/plain -res/cardsfolder/wild_leotau.txt -text svneol=native#text/plain -res/cardsfolder/wild_mongrel.txt -text svneol=native#text/plain -res/cardsfolder/wild_nacatl.txt -text svneol=native#text/plain -res/cardsfolder/wild_ox.txt -text svneol=native#text/plain -res/cardsfolder/wild_research.txt svneol=native#text/plain -res/cardsfolder/wild_wurm.txt -text svneol=native#text/plain -res/cardsfolder/wilderness_elemental.txt -text svneol=native#text/plain -res/cardsfolder/wilderness_hypnotist.txt -text svneol=native#text/plain -res/cardsfolder/wildfield_borderpost.txt -text svneol=native#text/plain -res/cardsfolder/wildfire.txt -text svneol=native#text/plain -res/cardsfolder/wildfire_emissary.txt -text svneol=native#text/plain -res/cardsfolder/wildheart_invoker.txt -text svneol=native#text/plain -res/cardsfolder/wildsize.txt -text svneol=native#text/plain -res/cardsfolder/wildslayer_elves.txt -text svneol=native#text/plain -res/cardsfolder/will_o_the_wisp.txt -text svneol=native#text/plain -res/cardsfolder/willow_dryad.txt -text svneol=native#text/plain -res/cardsfolder/willow_elf.txt -text svneol=native#text/plain -res/cardsfolder/willow_faerie.txt -text svneol=native#text/plain -res/cardsfolder/willow_priestess.txt -text svneol=native#text/plain -res/cardsfolder/willow_satyr.txt -text svneol=native#text/plain -res/cardsfolder/wilt_leaf_cavaliers.txt -text svneol=native#text/plain -res/cardsfolder/wilt_leaf_liege.txt -text svneol=native#text/plain -res/cardsfolder/wind_dancer.txt -text svneol=native#text/plain -res/cardsfolder/wind_drake.txt -text svneol=native#text/plain -res/cardsfolder/wind_sail.txt -text svneol=native#text/plain -res/cardsfolder/wind_shear.txt -text svneol=native#text/plain -res/cardsfolder/wind_zendikon.txt svneol=native#text/plain -res/cardsfolder/windborn_muse.txt -text svneol=native#text/plain -res/cardsfolder/windborne_charge.txt -text svneol=native#text/plain -res/cardsfolder/windbrisk_raptor.txt -text svneol=native#text/plain -res/cardsfolder/windfall.txt -text svneol=native#text/plain -res/cardsfolder/winding_wurm.txt -text svneol=native#text/plain -res/cardsfolder/windreaper_falcon.txt -text svneol=native#text/plain -res/cardsfolder/windreaver.txt -text svneol=native#text/plain -res/cardsfolder/windrider_eel.txt -text svneol=native#text/plain -res/cardsfolder/winds_of_change.txt -text svneol=native#text/plain -res/cardsfolder/winds_of_rath.txt -text svneol=native#text/plain -res/cardsfolder/windscouter.txt -text svneol=native#text/plain -res/cardsfolder/windseeker_centaur.txt -text svneol=native#text/plain -res/cardsfolder/windstorm.txt -text svneol=native#text/plain -res/cardsfolder/windswept_heath.txt -text svneol=native#text/plain -res/cardsfolder/windwright_mage.txt -text svneol=native#text/plain -res/cardsfolder/wing_puncture.txt svneol=native#text/plain -res/cardsfolder/wing_shards.txt -text svneol=native#text/plain -res/cardsfolder/wing_snare.txt -text svneol=native#text/plain -res/cardsfolder/wing_splicer.txt -text svneol=native#text/plain -res/cardsfolder/wing_storm.txt svneol=native#text/plain -res/cardsfolder/wingbeat_warrior.txt svneol=native#text/plain -res/cardsfolder/winged_coatl.txt -text svneol=native#text/plain -res/cardsfolder/winged_sliver.txt -text svneol=native#text/plain -res/cardsfolder/wingrattle_scarecrow.txt -text svneol=native#text/plain -res/cardsfolder/wings_of_aesthir.txt -text svneol=native#text/plain -res/cardsfolder/wings_of_hope.txt -text svneol=native#text/plain -res/cardsfolder/wings_of_velis_vel.txt -text svneol=native#text/plain -res/cardsfolder/winnower_patrol.txt -text svneol=native#text/plain -res/cardsfolder/winter_orb.txt -text svneol=native#text/plain -res/cardsfolder/winter_sky.txt -text svneol=native#text/plain -res/cardsfolder/wintermoon_mesa.txt -text svneol=native#text/plain -res/cardsfolder/winters_grasp.txt -text svneol=native#text/plain -res/cardsfolder/winters_night.txt -text svneol=native#text/plain -res/cardsfolder/wipe_away.txt svneol=native#text/plain -res/cardsfolder/wipe_clean.txt -text svneol=native#text/plain -res/cardsfolder/wirecat.txt -text svneol=native#text/plain -res/cardsfolder/wirefly_hive.txt svneol=native#text/plain -res/cardsfolder/wirewood_channeler.txt svneol=native#text/plain -res/cardsfolder/wirewood_elf.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_guardian.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_herald.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_hivemaster.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_lodge.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_pride.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_savage.txt -text svneol=native#text/plain -res/cardsfolder/wirewood_symbiote.txt -text svneol=native#text/plain -res/cardsfolder/wispmare.txt -text svneol=native#text/plain -res/cardsfolder/wistful_selkie.txt -text svneol=native#text/plain -res/cardsfolder/wistful_thinking.txt -text svneol=native#text/plain -res/cardsfolder/witch_hunter.txt -text svneol=native#text/plain -res/cardsfolder/witch_maw_nephilim.txt -text svneol=native#text/plain -res/cardsfolder/witchs_mist.txt -text svneol=native#text/plain -res/cardsfolder/withered_wretch.txt -text svneol=native#text/plain -res/cardsfolder/withering_boon.txt -text svneol=native#text/plain -res/cardsfolder/withering_gaze.txt -text svneol=native#text/plain -res/cardsfolder/withering_hex.txt svneol=native#text/plain -res/cardsfolder/withstand.txt -text svneol=native#text/plain -res/cardsfolder/withstand_death.txt -text svneol=native#text/plain -res/cardsfolder/wits_end.txt -text svneol=native#text/plain -res/cardsfolder/wizard_mentor.txt -text svneol=native#text/plain -res/cardsfolder/wizard_replica.txt -text svneol=native#text/plain -res/cardsfolder/wizards_school.txt -text svneol=native#text/plain -res/cardsfolder/wizened_cenn.txt -text svneol=native#text/plain -res/cardsfolder/woebearer.txt svneol=native#text/plain -res/cardsfolder/wojek_embermage.txt -text svneol=native#text/plain -res/cardsfolder/wolf_skull_shaman.txt -text svneol=native#text/plain -res/cardsfolder/wolfbriar_elemental.txt -text svneol=native#text/plain -res/cardsfolder/wolverine_pack.txt -text svneol=native#text/plain -res/cardsfolder/wonder.txt -text svneol=native#text/plain -res/cardsfolder/wood_elves.txt -text svneol=native#text/plain -res/cardsfolder/woodcloaker.txt svneol=native#text/plain -res/cardsfolder/wooded_bastion.txt -text svneol=native#text/plain -res/cardsfolder/wooded_foothills.txt -text svneol=native#text/plain -res/cardsfolder/wooden_sphere.txt -text svneol=native#text/plain -res/cardsfolder/woodfall_primus.txt -text svneol=native#text/plain -res/cardsfolder/woodland_changeling.txt -text svneol=native#text/plain -res/cardsfolder/woodland_druid.txt -text svneol=native#text/plain -res/cardsfolder/woodland_guidance.txt svneol=native#text/plain -res/cardsfolder/woodlurker_mimic.txt -text svneol=native#text/plain -res/cardsfolder/woodripper.txt -text svneol=native#text/plain -res/cardsfolder/woodwraith_corrupter.txt -text svneol=native#text/plain -res/cardsfolder/woodwraith_strangler.txt -text svneol=native#text/plain -res/cardsfolder/woolly_mammoths.txt -text svneol=native#text/plain -res/cardsfolder/woolly_spider.txt -text svneol=native#text/plain -res/cardsfolder/woolly_thoctar.txt -text svneol=native#text/plain -res/cardsfolder/word_of_binding.txt svneol=native#text/plain -res/cardsfolder/word_of_blasting.txt svneol=native#text/plain -res/cardsfolder/word_of_seizing.txt -text svneol=native#text/plain -res/cardsfolder/words_of_wisdom.txt -text svneol=native#text/plain -res/cardsfolder/workhorse.txt -text svneol=native#text/plain -res/cardsfolder/worldgorger_dragon.txt svneol=native#text/plain -res/cardsfolder/worldly_counsel.txt -text svneol=native#text/plain -res/cardsfolder/worldly_tutor.txt -text svneol=native#text/plain -res/cardsfolder/worldslayer.txt -text svneol=native#text/plain -res/cardsfolder/worm_harvest.txt svneol=native#text/plain -res/cardsfolder/wormfang_behemoth.txt svneol=native#text/plain -res/cardsfolder/wormfang_drake.txt -text svneol=native#text/plain -res/cardsfolder/wormfang_manta.txt svneol=native#text/plain -res/cardsfolder/wormfang_newt.txt svneol=native#text/plain -res/cardsfolder/wormfang_turtle.txt svneol=native#text/plain -res/cardsfolder/wormwood_dryad.txt -text svneol=native#text/plain -res/cardsfolder/wormwood_treefolk.txt -text svneol=native#text/plain -res/cardsfolder/worn_powerstone.txt -text svneol=native#text/plain -res/cardsfolder/worry_beads.txt svneol=native#text/plain -res/cardsfolder/worship.txt -text svneol=native#text/plain -res/cardsfolder/wort_boggart_auntie.txt -text svneol=native#text/plain -res/cardsfolder/wrap_in_flames.txt svneol=native#text/plain -res/cardsfolder/wrap_in_vigor.txt -text svneol=native#text/plain -res/cardsfolder/wrath_of_god.txt -text svneol=native#text/plain -res/cardsfolder/wrath_of_marit_lage.txt -text svneol=native#text/plain -res/cardsfolder/wreak_havoc.txt -text svneol=native#text/plain -res/cardsfolder/wrecking_ball.txt -text svneol=native#text/plain -res/cardsfolder/wrench_mind.txt -text svneol=native#text/plain -res/cardsfolder/wrens_run_packmaster.txt -text svneol=native#text/plain -res/cardsfolder/wretched_anurid.txt -text svneol=native#text/plain -res/cardsfolder/wu_admiral.txt -text svneol=native#text/plain -res/cardsfolder/wu_elite_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/wu_infantry.txt -text svneol=native#text/plain -res/cardsfolder/wu_light_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/wu_longbowman.txt -text svneol=native#text/plain -res/cardsfolder/wu_scout.txt svneol=native#text/plain -res/cardsfolder/wu_spy.txt svneol=native#text/plain -res/cardsfolder/wu_warship.txt -text svneol=native#text/plain -res/cardsfolder/wurmcoil_engine.txt -text svneol=native#text/plain -res/cardsfolder/wurms_tooth.txt -text svneol=native#text/plain -res/cardsfolder/wurmskin_forger.txt -text svneol=native#text/plain -res/cardsfolder/wydwen_the_biting_gale.txt -text svneol=native#text/plain -res/cardsfolder/wyluli_wolf.txt -text svneol=native#text/plain -res/cardsfolder/xanthic_statue.txt -text svneol=native#text/plain -res/cardsfolder/xenograft.txt -text svneol=native#text/plain -res/cardsfolder/xiahou_dun_the_one_eyed.txt -text svneol=native#text/plain -res/cardsfolder/xira_arien.txt -text svneol=native#text/plain -res/cardsfolder/xun_yu_wei_advisor.txt -text svneol=native#text/plain -res/cardsfolder/yamabushis_flame.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_ancients.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_ants.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_barbarian.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_coast.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_elder.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_enchantress.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_gnats.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_granger.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_hollow.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_kavu.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_scion.txt -text svneol=native#text/plain -res/cardsfolder/yavimaya_wurm.txt -text svneol=native#text/plain -res/cardsfolder/yavimayas_embrace.txt -text svneol=native#text/plain -res/cardsfolder/yawgmoth_demon.txt -text svneol=native#text/plain -res/cardsfolder/yawgmoths_bargain.txt -text svneol=native#text/plain -res/cardsfolder/yawgmoths_edict.txt -text svneol=native#text/plain -res/cardsfolder/yawning_fissure.txt -text svneol=native#text/plain -res/cardsfolder/yellow_scarves_cavalry.txt -text svneol=native#text/plain -res/cardsfolder/yellow_scarves_general.txt -text svneol=native#text/plain -res/cardsfolder/yellow_scarves_troops.txt -text svneol=native#text/plain -res/cardsfolder/yoke_of_the_damned.txt svneol=native#text/plain -res/cardsfolder/yoked_plowbeast.txt -text svneol=native#text/plain -res/cardsfolder/yomiji_who_bars_the_way.txt -text svneol=native#text/plain -res/cardsfolder/yore_tiller_nephilim.txt -text svneol=native#text/plain -res/cardsfolder/yosei_the_morning_star.txt -text svneol=native#text/plain -res/cardsfolder/yotian_soldier.txt -text svneol=native#text/plain -res/cardsfolder/young_wei_recruits.txt -text svneol=native#text/plain -res/cardsfolder/youthful_knight.txt -text svneol=native#text/plain -res/cardsfolder/yuan_shao_the_indecisive.txt -text svneol=native#text/plain -res/cardsfolder/yuan_shaos_infantry.txt -text svneol=native#text/plain -res/cardsfolder/yuki_onna.txt -text svneol=native#text/plain -res/cardsfolder/zap.txt -text svneol=native#text/plain -res/cardsfolder/zealots_en_dal.txt svneol=native#text/plain -res/cardsfolder/zealous_guardian.txt -text svneol=native#text/plain -res/cardsfolder/zealous_persecution.txt -text svneol=native#text/plain -res/cardsfolder/zebra_unicorn.txt -text svneol=native#text/plain -res/cardsfolder/zektar_shrine_expedition.txt -text svneol=native#text/plain -res/cardsfolder/zendikar_farguide.txt -text svneol=native#text/plain -res/cardsfolder/zephid.txt -text svneol=native#text/plain -res/cardsfolder/zephids_embrace.txt -text svneol=native#text/plain -res/cardsfolder/zephyr_falcon.txt -text svneol=native#text/plain -res/cardsfolder/zephyr_net.txt -text svneol=native#text/plain -res/cardsfolder/zephyr_spirit.txt -text svneol=native#text/plain -res/cardsfolder/zephyr_sprite.txt -text svneol=native#text/plain -res/cardsfolder/zhalfirin_commander.txt -text svneol=native#text/plain -res/cardsfolder/zhalfirin_knight.txt -text svneol=native#text/plain -res/cardsfolder/zhang_fei_fierce_warrior.txt -text svneol=native#text/plain -res/cardsfolder/zhang_he_wei_general.txt -text svneol=native#text/plain -res/cardsfolder/zhang_liao_hero_of_hefei.txt -text svneol=native#text/plain -res/cardsfolder/zhao_zilong_tiger_general.txt -text svneol=native#text/plain -res/cardsfolder/zhou_yu_chief_commander.txt -text svneol=native#text/plain -res/cardsfolder/zhuge_jin_wu_strategist.txt -text svneol=native#text/plain -res/cardsfolder/zirilan_of_the_claw.txt -text svneol=native#text/plain -res/cardsfolder/zo_zu_the_punisher.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_dog.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_dragon.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_goat.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_horse.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_monkey.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_ox.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_pig.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_rabbit.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_rat.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_rooster.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_snake.txt -text svneol=native#text/plain -res/cardsfolder/zodiac_tiger.txt -text svneol=native#text/plain -res/cardsfolder/zoetic_cavern.txt -text svneol=native#text/plain -res/cardsfolder/zof_shade.txt -text svneol=native#text/plain -res/cardsfolder/zombie_cannibal.txt svneol=native#text/plain -res/cardsfolder/zombie_cutthroat.txt svneol=native#text/plain -res/cardsfolder/zombie_goliath.txt -text svneol=native#text/plain -res/cardsfolder/zombie_infestation.txt -text svneol=native#text/plain -res/cardsfolder/zombie_master.txt svneol=native#text/plain -res/cardsfolder/zombie_mob.txt -text svneol=native#text/plain -res/cardsfolder/zombie_musher.txt svneol=native#text/plain -res/cardsfolder/zombie_outlander.txt -text svneol=native#text/plain -res/cardsfolder/zombie_trailblazer.txt svneol=native#text/plain -res/cardsfolder/zombify.txt -text svneol=native#text/plain -res/cardsfolder/zoologist.txt svneol=native#text/plain -res/cardsfolder/zuberi_golden_feather.txt -text svneol=native#text/plain -res/cardsfolder/zulaport_enforcer.txt -text svneol=native#text/plain -res/cardsfolder/zuo_ci_the_mocking_sage.txt -text svneol=native#text/plain -res/cardsfolder/zur_the_enchanter.txt -text svneol=native#text/plain -res/cardsfolder/zuran_enchanter.txt -text svneol=native#text/plain -res/cardsfolder/zuran_orb.txt -text svneol=native#text/plain -res/cardsfolder/zuran_spellcaster.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 @@ -8534,15 +188,6 @@ 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/lib/google-collections-1.0.jar -text svneol=unset#unset -res/lib/java-image-scaling-0.8.4.jar -text svneol=unset#unset -res/lib/jl1.0.1.jar -text svneol=unset#unset -res/lib/miglayout-3.7.3.1-swing.jar -text svneol=unset#unset -res/lib/napkinlaf-1.2.jar -text svneol=unset#unset -res/lib/nimrodlf.jar -text svneol=unset#unset -res/lib/substance.jar -text svneol=unset#unset -res/lib/xpp3_min-1.1.4c.jar -text svneol=unset#unset -res/lib/xstream-1.3.1.jar -text svneol=unset#unset 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 @@ -8636,7 +281,6 @@ 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[!!-~]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 @@ -8950,69 +594,63 @@ 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 -text 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 -text 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/com/cloudgarden/layout/AnchorConstraint.java -text svneol=native#text/plain -src/com/cloudgarden/layout/AnchorLayout.java -text svneol=native#text/plain -src/com/esotericsoftware/minlog/Log.java svneol=native#text/plain -src/forge/AIPlayer.java -text svneol=native#text/plain +src/forge/AIPlayer.java svneol=native#text/plain src/forge/AllZone.java svneol=native#text/plain -src/forge/AllZoneUtil.java -text svneol=native#text/plain -src/forge/Base64Coder.java -text 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/BoosterPack.java svneol=native#text/plain src/forge/ButtonUtil.java svneol=native#text/plain -src/forge/Card.java -text svneol=native#text/plain +src/forge/Card.java svneol=native#text/plain src/forge/CardContainer.java svneol=native#text/plain -src/forge/CardFilter.java -text svneol=native#text/plain -src/forge/CardList.java -text 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 -text svneol=native#text/plain -src/forge/CardShopTableModel.java -text svneol=native#text/plain -src/forge/CardUtil.java svneol=native#text/plain -src/forge/Card_Color.java -text svneol=native#text/plain -src/forge/Color.java -text 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 -text 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 -text 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 -text 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 -text 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 -text 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 -text 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 -text svneol=native#text/plain -src/forge/GUI_Filter.java -text svneol=native#text/plain -src/forge/GUI_ImportPicture.java -text svneol=native#text/plain -src/forge/GUI_Quest_Filter.java -text 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 -text svneol=native#text/plain -src/forge/GuiDisplay2.java svneol=native#text/plain -src/forge/GuiDisplay3.java 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 @@ -9020,23 +658,19 @@ 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.java svneol=native#text/plain -src/forge/Gui_DownloadPictures_LQ.java -text svneol=native#text/plain -src/forge/Gui_DownloadPrices.java -text svneol=native#text/plain -src/forge/Gui_DownloadSetPictures_LQ.java -text svneol=native#text/plain -src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java -text svneol=native#text/plain -src/forge/Gui_MultipleBlockers.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 -text svneol=native#text/plain -src/forge/HumanPlayer.java -text 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 -text svneol=native#text/plain -src/forge/KeyListenerTest.java -text svneol=native#text/plain -src/forge/MP3Player.java -text 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 @@ -9045,140 +679,127 @@ 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 -text svneol=native#text/plain -src/forge/Player.java -text svneol=native#text/plain -src/forge/PlayerUtil.java -text 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/QuestData.java svneol=native#text/plain -src/forge/QuestData_BoosterPack.java svneol=native#text/plain -src/forge/QuestData_Prefs.java svneol=native#text/plain -src/forge/QuestData_State.java svneol=native#text/plain -src/forge/Quest_Assignment.java -text svneol=native#text/plain +src/forge/Quest_Assignment.java svneol=native#text/plain src/forge/ReadBoosterPack.java svneol=native#text/plain -src/forge/ReadCard.java svneol=native#text/plain -src/forge/ReadDraftBoosterPack.java -text svneol=native#text/plain -src/forge/ReadPriceList.java -text 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/RunTest.java svneol=native#text/plain -src/forge/SetInfo.java -text svneol=native#text/plain -src/forge/SetInfoUtil.java -text 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 -text svneol=native#text/plain -src/forge/StaticEffects.java -text svneol=native#text/plain -src/forge/TableModel.java -text 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/Test.java svneol=native#text/plain -src/forge/TestMove.java svneol=native#text/plain -src/forge/TestPanel.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 -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_AlterLife.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Animate.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Choose.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Clash.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Cleanup.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Combat.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Copy.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Counters.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_DealDamage.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Debuff.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Destroy.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Effect.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_GainControl.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Mana.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_PermanentState.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Pump.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Regenerate.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Reveal.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Token.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_Turns.java -text svneol=native#text/plain -src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactoryUtil.java -text 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 -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Instants.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Lands.java -text svneol=native#text/plain -src/forge/card/cardFactory/CardFactory_Planeswalkers.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 -text svneol=native#text/plain -src/forge/card/mana/ManaCost.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 -text 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/mana/Mana_PartTest.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 -text svneol=native#text/plain -src/forge/card/spellability/Ability_Static.java -text svneol=native#text/plain -src/forge/card/spellability/Ability_Sub.java -text 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 -text svneol=native#text/plain -src/forge/card/spellability/Cost_Payment.java -text 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 -text 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 -text svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Requirements.java -text 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 -text svneol=native#text/plain -src/forge/card/spellability/SpellAbility_Variables.java -text 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 -text svneol=native#text/plain -src/forge/card/spellability/Target_Choices.java -text svneol=native#text/plain -src/forge/card/spellability/Target_Selection.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger.java -text svneol=native#text/plain -src/forge/card/trigger/TriggerHandler.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_AttackerBlocked.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_AttackerUnblocked.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Attacks.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Blocks.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_ChangesZone.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Clashed.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_CounterAdded.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Cycled.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_DamageDone.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Discarded.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Drawn.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_LandPlayed.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_LifeGained.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_LifeLost.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Phase.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Sacrificed.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Shuffled.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_SpellAbilityCast.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Taps.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_TapsForMana.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_TurnFaceUp.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Unequip.java -text svneol=native#text/plain -src/forge/card/trigger/Trigger_Untaps.java -text 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 -text svneol=native#text/plain -src/forge/deck/generate/Generate3ColorDeck.java -text svneol=native#text/plain -src/forge/deck/generate/GenerateConstructedDeck.java -text svneol=native#text/plain -src/forge/deck/generate/GenerateConstructedMultiColorDeck.java -text svneol=native#text/plain -src/forge/deck/generate/GenerateSealedDeck.java svneol=native#text/plain -src/forge/deck/generate/GenerateThemeDeck.java -text 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 -text 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/ForgeFontConstants.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 @@ -9192,7 +813,7 @@ 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 -text 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 @@ -9235,16 +856,7 @@ 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/org/jdesktop/beans/AbstractBean.java svneol=native#text/plain -src/org/jdesktop/swingworker/AccumulativeRunnable.java -text svneol=native#text/plain -src/org/jdesktop/swingworker/SwingPropertyChangeSupport.java -text svneol=native#text/plain -src/org/jdesktop/swingworker/SwingWorker.java -text svneol=native#text/plain -src/org/jdesktop/swingx/JXMultiSplitPane.java -text svneol=native#text/plain -src/org/jdesktop/swingx/MultiSplitLayout.java -text svneol=native#text/plain -src/org/jdesktop/swingx/graphics/GraphicsUtilities.java svneol=native#text/plain -src/org/jdesktop/swingx/painter/AbstractPainter.java svneol=native#text/plain -src/org/jdesktop/swingx/painter/Painter.java svneol=native#text/plain src/treeProperties/PropertyElement.java svneol=native#text/plain -src/treeProperties/PropertyType.java -text svneol=native#text/plain -src/treeProperties/TreeProperties.java -text svneol=native#text/plain -src/treeProperties/types/FileType.java -text 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/.project b/.project index 22afe0576f5..4cd6d28ef0f 100644 --- a/.project +++ b/.project @@ -1,17 +1,23 @@ - - - ForgeSVN - - - - - - org.eclipse.jdt.core.javabuilder - - - - - - org.eclipse.jdt.core.javanature - - + + + ForgeGIT + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + org.eclipse.jdt.core.javanature + + diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 1167e3bf599..9183f906749 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,12 +1,13 @@ -#Wed Aug 25 23:06:01 CEST 2010 +#Fri Jul 22 16:00:20 PDT 2011 eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.5 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.5 +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.6 diff --git a/CHANGES.txt b/CHANGES.txt index 6cac653c684..30eabb6f53b 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,37 +1,25 @@ -Forge 06/12/2011 (unofficial BETA) version +Forge Beta: 0#-##-2011 ver 1.1.# (Quest icons used created by Teekatas, from his Legendora set http://raindropmemory.deviantart.com) -8269 cards in total. - -This version is based upon the revision # 9621 which is found on our SVN. +#### cards in total. -This version includes some new cards, bug fixes and a few new quest opponent decks. The developer mode at the new game window gives us a few new features to this option. These new features will primarily interest the devs as it will now help to test out specific cards while testing combat code changes. +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 are working on a new Maven system of building the project and the OS specific archives that we release with each beta. The Maven script will help to automate the process and should require less time to prepare the beta releases. +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. -We have added a new section to the readme.txt file and it states: - -"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." +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. -I found a utility to remove the hidden Mac-related files. I removed the ".SVN" and the /res/lib/ folders from this archive as they are not needed. We have changed the archiving format to ".tar.bz2" since this may help to store the file permissions for the Mac OS X launcher. There are utilities for Windows, Mac OS and the various *nix's that can be used to decompress these archives. +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 05/31/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. This version should only require java 1.5. +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: @@ -42,368 +30,153 @@ Your decks can be placed in the decks folder, your pics can be placed in the pic Fixes/Features: -- Completed the initial implementation of the Setup Battlefield dev command (it uses an external file dev_battle.txt in the root folder of MTG Forge as data for how to set up the battlefield situation). -- Removed Chronicles (CHR) from the list of possible block drafts for now (see the discussion at the forum). -- Added a possibility to preserve human/AI life amount in the Setup Battlefield dev command. -- Changed the initialization of the number of each rarity in a pack. This fixes pack files that do not explicitly state the card count for a particular rarity causing the draft to crash. -- Maven build files. Can create Mac App bundle. -- Fixed Drafting Alpha and Beta - incorrect set codes in SetInfoUtil and the pack files. -- The AI will now anticipate regeneration abilities. -- Improved the AI of curse pump etb abilities. -- Improved the AI of untap triggers. -- Added "SVar:RemAIDeck:True" to Blaze. -- Fixed some Java warnings. -- Removed SVar:RemAIDeck:True from Blaze (and several other AF_DealDamage Cost$ X spells) since the AI can infact pay the X portion to damage a creature or the human. -- Small Tweak to AF_Damage to not allow AI to pay more than max mana. -- Converted Dawnglare Invoker to Ability_Activated. -- Ran Set Info Script. -- Deleted an unneeded file that accidentally went into the last commit. -- Updated the Setup Battlefield functionality: made the dev_battle.txt format more intuitive, added an ability to add cards into the human and computer graveyards. -- Fixes, Updates and Ordering in CombatUtil and ComputerUtil. -- Added AI checks for regeneration in AF Destroy and DealDamage. -- Added an easy version of the Fin Fang Foom deck. -- Converted Jackal Pup and Shinka Gatekeeper to script. -- The Setup Battlefield command now allows to open a file through a standard file open dialog, so you're no longer limited to the file name dev_battle.txt. -- dev_battle.txt is no longer required for Setup Battlefield because the facility allows to open a custom-named text file through a standard file open dialog now (since r9136). -- Added P/T to Walker of Secret Ways. -- Added some SVars. -- Converted a few Instants to the standard Spell/Target/Cost system. -- Cost was passing wrong param for Instants. -- Fixed the LQ pic URLs for Coral Fighters, Cruel Fate and Eye Spy. -- Ran set info script. -- Refactored the Setup Battlefield dev command: moved the code to GuiDisplayUtil.java. -- Code simplification in Wall of Reverence. -- Added Player and Activator objects to SpellCast trigger; convert Forced Fruition to triggers. -- Some code fixes. -- Removed a couple un-needed imports. -- Several code simplifications in CF_Sorceries. -- Fixed logic change bug in Pulse of the Tangle. -- Added the requirements "OppPoisoned" and "OppNotPoisoned" to stPump. -- More code simplification in CF_Sorceries. -- Several code simplifications in CardFactoryUtil.java. -- Maven build. Can create Mac dmg and bzip, Windows exe file, bzip for Windows and Linux. -- Converted some etb "Put -1/-1 Counter on target" AF's to DB's. -- War Report will now count artifact creatures twice. -- Fixed rarity of Postmortem Lunge. -- Ran set info script. -- Code simplification in CF_Creatures and CF_Instants -- Maven build - fix plugin repo. -- Fixed the TableSorter.getRarity() method and it should now be compatible with the new set info. As a bonus, the new cards won in quest mode may now appear at the top of the list rather than requiring you to scroll down to the bottom of the listing. -- Corrected the rarity typo found in the SetInfo line for the cards Backlash and Rabble-Rouser as they were sorting to the very end of the card list with the table sorter fix. -- Code simplifications in CF_Creatures. -- Converted some hardcoded cards to Cost/Target. -- Added an optional condition and description to etbCounter. -- Converted cards with "If CARDNAME was kicked, it enters the battlefield with X +1/+1 counters on it." to etbCounter. -- Maven build: moved OSX build into profile so it does not build under Linux/Windows. Fixed permissions on executable files. -- Cleanup in GameActionUtil. -- The AI will now also anticipate targeted regeneration abilities. -- Added 4 cards with "If CARDNAME was kicked, it enters the battlefield with X +1/+1 counters on it.". -- The AI will no longer play legendary lands if it controls one with the same name already. -- Converted Infernal Kirin to script. -- Fixed Celestial Kirin. -- Ran set info script. -- Fixed AF GainControl setting summoning sickness when control doesn't actually change. -- Fixed some AF GainControl cards. -- Some cleanup of modified classes. -- The AI will now only use sacrifice costs, if the card itself will be sacrificed (for cards like Seal of Removal) or a preferred sacrifice is present (Hatching Plans). -- Added Shrek 1 deck. -- Updated sacrifice cost AI in more AF's. -- Added special AI for Skullclamp. -- Converted Oubliette to script (its implementation was and still is incomplete) and removed its rarity. -- Fixed spell description in Vaevictis Asmandi. -- Fixed Nihil Spellbomb. -- Fixed Cumulative upkeep for the AI. -- Fixed the -1/-1 counter theme. -- Fixed activation cost for Minotaur Illusionist -- Ran set info script. -- Fixed Perish the Thought. -- Maven build - Windows icon matches Mac icon. Tokenized forge.sh. -- Converted Reiterate to script. -- Some more converting to Cost/Target classes. -- Remember can now handle Targeted Players. -- Converted Laquatus's Champion to Script. -- Converted the CF_Planeswalker stuff to Cost/Target; some improvements; some code simplifications. -- Some more prep work for United Targeting front. -- Converted Goblin Skycutter to Cost/Target system. -- Code simplifications in Cost_Payment.java. -- Code simplifications in CombatUtil and ComputerUtil. -- Converted Plague Rats to script. -- The AI will now anticipate DamagePrevention abilities. -- Removed rarity of Do or Die. -- Ran set info script. -- Little improvement of equipping AI. -- Added basic AI checks to AF PumpAll. -- Code simplifications for getting various CardLists. -- Eased the runaway safety measures of the AF Token AI (for Thopter Foundry and other reusable token generators). -- Minor simplifications in GameAction.java. -- More AI improvements in AF Token. -- Converted Sorcerer's Strongbox to script. -- Converted Fork, Reverberate, and Twincast to script. Note that Fork keeps the same functionality it had in the code. -- Maven build, fix version number. -- Added the option "UntilEndOfCombat" to AF Pump. -- Maven build, ignore some files generated by release plugin. -- Fixed LQ pic for Murk Dwellers. -- Various code simplifications relating to CardLists in GameActionUtil and CardFactoryUtil. -- Fixed the non-functional CardFactoryUtil.enPumpCurse_Enchant.canPlayAI(). The list.filter was failing to remove cards from the list that are inappropriate targets for the cursed aura. -- Ran set info script. -- Little AI update for AF Untap. -- Converted Tithe to script. -- Added the code for Hidetsugu's Second Rite back into CF_Instants. -- Converted Gift of Estates to script. -- Various code simplifications in CardFactoryUtil.java. -- Converted Identity Crisis to script. -- Minor code improvements. -- Some code cleanup in ComputerAI_General. -- Ran set info script. -- Small fix Vendilion Clique. -- Code simplifications in GameActionUtil.java. -- Text update for Standstill. -- Simplified the enPumpCurse canPlayAI bug fix code. -- Some card.txt fixes. -- Small fix Dread. -- Added Condition to AF ChangeZone. -- Converted Gift of Estates. -- Fixed power of Scalding Salamander. -- Added the ability to specify library content to the Setup Battlefield Dev Mode option. -- Simplified the code found in forge.card.cardFactory.CardFactory_Auras. -- Code simplifications in GameAction.java. -- Simplified the code found in forge.card.cardFactory.CardFactory_Creatures. -- Simplified the code found in forge.card.cardFactory.CardFactory_Equipment. -- Simplified the code found in forge.card.cardFactory.CardFactory_Planeswalkers. -- Simplified the code found in forge.card.cardFactory. -- Simplified the code found in forge.card.cardFactory.CardFactoryUtil. -- Improved the AI of PutCounter AF. -- Made the Setup Game State text file format not dependent on the line order, now the format is more free and allows only certain lines to be present in the file. The lines that are absent in the file will be set to the default value that makes no changes. -- Renamed Setup Battlefield to Setup Game State as the function slowly outgrows its initial usage. -- Fixed a bug in the graveyard and library processing in Setup Game State that caused the cards added to human library and graveyard be registered as AI cards that caused a number of weird side effects. -- Made the way Setup Game State modifies the graveyard consistent with that of the hand and the library (now the graveyard gets replaced with the cards specified in the game state setup file). -- Added the ActivePlayer option to Setup Game State, it supports two values: Human and AI. It immediately switches control to the given player. Note that it does not change the current phase for now. -- A little cleanup in GuiDisplayUtil after making modifications to Setup Game State. -- Category names in Setup Game State are now case-insensitive. -- Setup Game State will now look for text files in the Forge directory instead of the system user directory (maybe it's worth creating the "tests" folder or something like that where to pile up test cases for various cards?) -- Simplified the code found in forge.gui.game.cardDetailPanel and forge.gui.input.Input_Attack. -- Simplified the code found in forge.gui.game.cardDetailPanel and forge.AllZoneUtil. -- Simplified the code found in forge.Card. -- Simplified the code found in forge.CardList. -- Simplified the code found in forge.CardListUtil. -- Simplified the code found in forge.Combat. -- Simplified the code found in forge.CombatUtil. -- Simplified the code found in forge.ComputerAI_General and forge.ComputerUtil_Attack2. -- Simplified the code found in forge.ComputerUtil_Block2 and forge.ComputerUtil and forge.DefaultPlayerZone. -- Simplified the code found in forge.EndOfTurn and forge.GameAction. -- Fixed Rarity of Scorched Ruins. -- Simplified the code found in forge.GameActionUtil. -- Text fix for Timetwister. -- Simplified the code found in forge.GuiDisplay3 and forge.GuiDisplay4 and forge.PhaseUtil and forge.Player and forge.ComesIntoPlay. -- Setup Game State now supports changing the current phase via the ActivePhase option (valid values are Untap, Upkeep, Draw, Main1, Declare Attackers, Declare Blockers, Main2, End of Turn, Cleanup). -- Fixed description of Sylvok Lifestaff. -- Maven build: fix release and deploy goals. -- Improved the AI of AF PumpAll. -- Setup Game State no longer requires the "END" tag in the end of the state setup files. -- Added an ability to add comments (preceded with "#") to the state setup files. -- Removed duplicate descriptions from some auras. -- Added Atomic Robo 3 deck. -- Fixed logic error in the AI part of unless cost counterspells. -- Reverted last commit. -- Simplified the code found in forge.Card and forge.CombatUtil. This should finish the conversion of getKeyword().contains(string) to hasKeyword(string). -- Fixed Titan's Revenge. -- Added the option DestinationAlternative to AF ChangeZone. -- Converted Dream Cache to new style DB. -- Removed doDrawBack function. -- Converted Teferi's Puzzle Box to Script. -- Added the ability to change Exile areas through Setup Game State (option names are HumanCardsInExile and AICardsInExile). -- Added some observer update commands to Setup Game State to make sure that the actual data about the number of cards in all areas are shown after the game state is modified. -- Cleanup after doDrawBack. -- Added the optional ability to specify a set for each card spawned through Setup Game State - for example, just Forest will spawn a "Forest" card using the last set available for it, while Forest@4ED will spawn a "Forest" card from the 4th Edition. -- Refactored the Setup Game State code (moved the repetitive code block out into a separate function, simplified the code). -- Moved SetInfo lists to external files. -- Bugfix in reading data files. -- Fixed triggers acting oddly when Setup Game State moves cards around. -- Fixed indexes. -- Fixed tokens vs ChangesZone triggers. -- Added some previously missed observer update calls to Setup Game State. -- Added RememberChanged in ChangeZoneHidden for Jeff. -- Centralized condition check and calling subabilities in AF resolve. -- Fixed misspelled method call in new Booster Draft generation code. -- Added NPH booster pack definition. -- Small fix. -- Code cleanups. -- Simplified the code found in forge.card.cardFactory.CardFactory_Auras and forge.card.cardFactory.CardFactory_Creatures. Updating c.getType().contains(string) to c.isType(string). -- Simplified the code found in forge.card.cardFactory.CardFactory_Lands and forge.card.cardFactory.CardFactory_Planeswalkers. Updating c.getType().contains(string) to c.isType(string). -- Simplified the code found in forge.card.cardFactory.CardFactory_Soceries and forge.card.cardFactory.CardFactory. Updating c.getType().contains(string) to c.isType(string). -- Defining the set code for Setup Game State is now consistent with the deck file format (e.g. Forest|4ED instead of the previously used Forest@4ED). -- Fixed issue with GainControl. -- Small fix. -- A little cleanup in a couple AFs. -- Ran Set Info script. -- Added AWAKENING counters. -- Added M1M1/P1P1 counters exchange to addCounterFromNonEffect. -- Changed damage from a source with Wither/Infect to use addCounter and not addCounterFromNonEffect. -- Little cleanup in AF GainControl. -- Fixed Pith Driller. -- Converted Rootwater Thief to script. -- Moved Unless cost to AbilityFactory making it available for all AFs. -- Added text to Drake Umbra. -- Cleanup in AF_CounterMagic. -- Fixed the duplicate text issue on a number of cards. +- 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. -- Little fix. -- Simplified code for Singe-Minded Ogre. -- Code tweak in CardFactoryUtil. -- Ran Set Info script. -- Code simplifications in Target.java. -- CardList.add -> addAll in a couple places. -- CardList.add -> addAll in a couple of more places. -- CardList.add -> addAll in a couple of more places. -- CardList.add -> addAll in a couple of more places. -- Code simplification in Player.java. -- Code simplifications in GuiDisplay classes. -- Fixed missing function in AllZoneUtil. -- Maven now creates a DMG file for OSX that has a background and drag-n-drop installation. -- Ignore *.tmp files in base directory. -- Fixed Soul Barrier. -- Ran Set Info script. -- Fixed to give AF_GainControl creature to original controller instead of automatically donating it to the opponent. -- Fixed creatures copied via Clone not having abilities. -- Update Google download labels. -- Code rearrangement out of AllZoneUtil. -- Ran Set Info script. -- Standardized the targeting part of AF_Counter to make it more closely match other AFs and prevent NPEs. -- Added some comments in AllZoneUtil. -- Converted Presence of the Master to script. -- Added Card.getCurSetURL method. -- Enabled use of SetInfo URL - if a card only has one picture then apply a 35% probability to download from provided URL, to cut down on cardforge.org traffic. -- Moved setDealtDmgToHumanThisTurn() and setDealtDmgToComputerThisTurn() to Cleanup in Phase.java. -- Incremental updates to Ant build.xml (still not fully working.) -- Ran Set Info script. -- Added AF_RegenerateAll. -- Converted Loxodon Hierarch and Wrap in Vigor to AF. -- Updated some SVars. -- "How To Play" is now part of the "Help" menu item. Fixes an issue on OSX. -- Fix "Help" menu in German. -- Changed the default of UnlessPlayer to TargetedController. -- Ran Set Info script. -- Added Flood counters. -- Added the option "Unique" to AF Effect. -- Improved implementation of Liege of the Tangle. -- Added a NumCopies param to AF_CopyPermanent. -- Converted Rite of Replication to AF. -- Fixed SubAbility stuff in Jolt and Muscle Burst. -- Made the "SVar=" part optional for SubAbility$ (now that all old-style drawbacks have been removed.) -- Fixed unix permissions. -- Added AF_AnimateAll. -- Fixed Nightcreep to use SP$AnimateAll. -- Updated SVar for Nightcreep. -- Updated Starting Quest Pool to have more cards. -- Ran Set Info script. -- Since the cardforge SVN repo has a non-standard layout (no trunk dir), had to add a tagbase to the release plugin. -- Converted Mirror Entity to AF_AnimateAll. -- Improved selection message for exileFromGraveType. -- Converted Scarblade Elite to AF_Destroy. -- Converted Venerated Teacher to triggers. -- Added AI mana pool. You can see its contents by mousing over the AI life. The AI still won't use the mana though. -- Added trunk directory. -- Moved googlecode upload profile. -- Fixed rarity of Graveborn Muse. -- Little fixes to card text files. -- Ran Set Info script. -- The AI will now use mana from the mana pool. -- Removed SVar:RemAIDeck:True from some cards. -- Fixed Goblin Tunneler's pump ability. -- Simplified the code found in forge.card.cardFactory.CardFactoryUtil and forge.card.abilityFactory.AbilityFactory_Animate. Updating c.getType().contains(string) to c.isType(string). -- Simplified the code found in forge.card.cardFactory.CardFactoryUtil and forge.card.spellability.Ability_Mana and forge.card.spellability.Spell_Permanent. Updating c.getType().contains(string) to c.isType(string). -- Simplified the code found in forge.AIPlayer and forge.CardListUtil and forge.CombatUtil. Updating c.getType().contains(string) to c.isType(string). -- Added targeting and Defined parameters to AF Mana. -- Fixed some cards with TapsForMana triggers. -- Fixed missing SVar on Jackal Pup. -- Fixed Elspeth, Knight-Errant pump ability lasting past EOT. -- Converted Gauntlet of Might, Overgrowth and Wild Growth to script. -- Removed extra pipe in Manabarbs. -- Converted Pit Scorpion to triggers. -- Tweak stack description for AF_Poison and code cleanup in AbilityFactory_AlterLife class. -- Simplified the code found in forge.GameAction and forge.ComputerAI_General and forge.ComputerUtil. Updating c.getType().contains(string) to c.isType(string). -- Simplified the code found in forge.GameActionUtil and forge.PlayerZone_ComesIntoPlay and forge.RunTest. Updating c.getType().contains(string) to c.isType(string). -- Updated isType("Aura") to isAura(). -- Moved window/linux build into profile to make the Maven install goal less time-consuming. -- Updated isType("Creature") to isCreature(). -- Updated isType("Enchantment") to isEnchantment(). -- Updated isType("Equipment") to isEquipment(). -- Updated isType("Instant") to isInstant(). -- Updated isType("Land") to isLand(). -- Gave googlecode upload tasks different name for each platform. -- Fixed AF_Token adding triggers to the created token. I was getting errors testing changes to Serpent Generator. Tested with Mitotic Slime and Skirk Ridge Exhumer, which are the only cards using this. They still work as expected. -- Converted Serpent Generator tokens to triggers. -- Retired the keyword "Whenever this creature deals damage to a player, that player gets a poison counter." -- Converted Dovescape to triggers. -- Updated isType("Planeswalker") to isPlaneswalker(). -- Updated isType("Snow") to isSnow(). -- Updated isType("Sorcery") to isSorcery(). -- Updated isType("Wall") to isWall(). -- Updated isType("Basic") to isBasicLand(). -- Little fixes in the AI mana paying. -- Converted Forbidden Orchard to script. -- Added AF_RemoveCounterAll. -- Converted Heartmender to triggers. -- A few xcount additions. -- Several small tweaks in AF_Counters. -- Cleanup in Ability_Mana.java. -- Ran Set Info script. -- Removed misnamed card. -- Small fix to Eladamris Vineyard. -- Small fix. -- Ran Set Info script. -- Added TriggerZones$ Battlefield to Gauntlet of Might. -- Removed two unneeded functions. -- Added TriggerZones$ Battlefield to two more cards. -- Added the option to use Y instead of X in hasProperty. -- Some preparations for triggered counter abilities with defined controlled by the AI. -- Fixed a regression that caused the booster draft mode to crash when a block with only one or two sets was chosen. -- Fixed Phyrexian Rebirth, it should only give you one X/X token. -- Fixed casting cost of Forced Worship. -- Fixed java warning in QuestStallPurchasable.java. -- Incremental changes toward Vesuva. -- Added a section to the readme file pertaining to card picture issues. -- Improved Clash stack description. -- Fixed Pulling Teeth and Springjack Knight. -- The AI will now check checkETBEffects before playing evoked creatures. -- Converted Counterbalance to script. -- Fixed a bug in the AI of AF Dig. -- Method name tweaking in AF_Pump for clarity. -- Small tweak in AF_Choose. -- Proper fix for drafting sets since the externalized set data. -- Ran Set Info script. -- Allowed the AI to play sorceries without PlayMain1 SVar in Main1 (timing should be handled by canPlayAI in the AF's). -- Added AF_Unpump for things like "target creature loses flying until end of turn". -- Updated the changes.txt file. Not finished at this time. -- Added a very hard version of the Gold Finger deck. -- Added a Cube to the Draft folder, to have one available in the default build. -- Converted Chalice of the Void to script. -- Removed some redundant SVars. -- Renamed AF_Unpump to AF_Debuff. +- 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: -Rob Cashwalker -Agetian -Sloth -Slapshot5 -JenDave -Friar Sol -Snacko -Hellfish -Jeff Wadsworth -Jaedayr -SoulStorm -Starcrash -DeadSpeak -Chris H + Added many cards, including: -Adarkar Windform AEthermage's Touch Aphotic Wisps Aquitect's Will Baleful Stare Bandage Barrenton Medic Battlefield Medic Brass Herald Brood of Cockroaches Canker Abomination Catastrophe Cephalid Aristocrat Chained Throatseeker Cinderhaze Wretch Combat Medic Copy Artifact Corrupted Zendikon Crazed Armodon Crimson Wisps Crusher Zendikon Crystal Shard D'Avenant Healer Dance of Many Daru Healer Deathbringer Liege Diligent Farmhand Disciple of Tevesh Szat Disembowel Dispatch Dwarven Vigilantes Eiganjo Castle Eladamri's Vineyard Erratic Portal Esper Battlemage Ethereal Champion Excise Favorable Destiny Femeref Healer Flickerwisp Forsaken Wastes Galepowder Mage Genesis Chamber Gibbering Hyenas Glimmerpoint Stag Gloomwidow's Feast Glyph of Destruction Goblin Goon Griffin Canyon Guardian Zendikon Gutwrencher Oni Hasran Ogress Heal Healing Leaves Healing Salve Hell Swarm Ichneumon Druid Isolation Cell Kavu Aggressor Kei Takahashi Knight of Valor Lavacore Elemental Liege of the Tangle Loxodon Anchorite Lyzolda, the Blood Witch Magus of the Vineyard Mana Geyser Martyrs' Tomb Master Healer Mending Hands Monstrous Hound Murk Dwellers Natural Affinity Nether Void Nightcreep Niveous Wisps Ordruun Commando Orim's Thunder Otherworldly Journey Pact of Negation Painwracker Oni Pardic Firecat Phyrexian Metamorph Phyrexian Tyranny Pincer Spider Plague Fiend Questing Phelddagrif Rabid Elephant Ravaging Riftwurm Return to Dust Rhystic Deluge Rhystic Study Rishadan Brigand Rishadan Cutpurse Rishadan Footpad Rootwater Mystic Savage Firecat Scald Scarwood Bandits Scoria Wurm Sculpting Steel Segmented Wurm Seizures Selfless Exorcist Sheltering Prayers Shield of the Ages Shieldmate's Blessing Sinking Feeling Soul Barrier Soul Scourge Spawning Pit Split-Tail Miko Squee's Toy Sunken Hope Sway of the Stars Swift Maneuver Tangleroot Thermal Navigator Tidehollow Sculler Turn to Mist Unwilling Recruit Urborg Skeleton Vastwood Zendikon Vernal Bloom Viridian Betrayers Viridian Scout Vodalian Serpent Wail of the Nim Walking Dream Wayfarer's Bauble Wellspring Wild Wurm Wind Zendikon Winter Sky Withering Gaze Withstand Zirilan of the Claw Zombie Mob + end diff --git a/README.txt b/README.txt index 3c5e7d56267..9ab279f3008 100644 --- a/README.txt +++ b/README.txt @@ -25,4 +25,16 @@ The server containing the set pictures is limited to 30 gigs per month. At the c 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. \ No newline at end of file +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.xml b/build.xml deleted file mode 100644 index 10604ca4f02..00000000000 --- a/build.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/forge.jardesc b/build/forge.jardesc deleted file mode 100644 index ca89f39f319..00000000000 --- a/build/forge.jardesc +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/build/forge.xml b/build/forge.xml deleted file mode 100644 index a86b981edb5..00000000000 --- a/build/forge.xml +++ /dev/null @@ -1,23 +0,0 @@ - - true - gui - forge.jar - ../forge.exe - - - - normal - http://java.com/download - - true - false - - forge.ico - - - 1.6.0 - - preferJre - 1024 - - \ No newline at end of file diff --git a/build/manifest.forge b/build/manifest.forge deleted file mode 100644 index bb24bf045a3..00000000000 --- a/build/manifest.forge +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Main-Class: forge.Gui_NewGame -Class-Path: res/lib/google-collections-1.0.jar res/lib/java-image-scaling-0.8.4.jar res/lib/substance.jar res/lib/napkinlaf-1.2.jar res/lib/nimrodlf.jar res/lib/jl1.0.1.jar res/lib/miglayout-3.7.3.1-swing.jar res/lib/xpp3_min-1.1.4c.jar res/lib/xstream-1.3.1.jar diff --git a/pom.xml b/pom.xml index 2afd892eace..4cb6835c8ef 100644 --- a/pom.xml +++ b/pom.xml @@ -5,9 +5,21 @@ forge jar Forge - 1.0.14-SNAPSHOT - Forge - http://www.slightlymagic.net/ + 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 @@ -38,27 +50,133 @@ 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:svn:https://cardforge.googlecode.com/svn/src - scm:svn:https://cardforge.googlecode.com/svn/src + 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.1 + 2.2.1 + - - https://cardforge.googlecode.com/svn/tags - + true + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.9 + + true @@ -90,6 +208,7 @@ maven-assembly-plugin 2.2.1 + jar-with-dependencies @@ -112,152 +231,127 @@ + - com.akathist.maven.plugins.launch4j - launch4j-maven-plugin - 1.3 + 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 - l4j-gui - package + released-version - launch4j + released-version - - gui - ${project.build.directory}/forge.exe - ${project.build.directory}/${project.build.finalName}-jar-with-dependencies.jar - forge - ${basedir}/build/forge.ico - - forge.Gui_NewGame - false - anything - - - 1.5.0 - - - 1.0.0.0 - 1.0.0.0 - Forge - Forge - 1.0.0.0 - 1.0.0.0 - Forge - forge - original.exe - - - - org.apache.maven.plugins - maven-pmd-plugin - 2.5 - - - - org.apache.maven.plugins - maven-checkstyle-plugin - 2.6 - - - maven-compiler-plugin - 2.3.2 - - 1.5 - 1.5 - - - - - org.apache.maven.plugins - maven-site-plugin - 2.3 - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - - org.apache.maven.plugins - maven-deploy-plugin - 2.6 - - true - - - - com.google.code.maven-svn-wagon - maven-svn-wagon - 1.4 - - - org.apache.maven.plugins maven-javadoc-plugin 2.8 + + true + false + false + package + package + - - com.googlecode.maven-gcu-plugin - maven-gcu-plugin - 1.1 - - - 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.3.1 + 2.4 false false @@ -279,14 +373,22 @@ + + org.apache.maven.plugins + maven-surefire-report-plugin + 2.9 + + org.apache.maven.plugins maven-javadoc-plugin - 2.7 + 2.8 true false false + package + package @@ -303,27 +405,88 @@ + 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.google.code.maven-svn-wagon - maven-svn-wagon - 1.4 - - - org.bluestemsoftware.open.maven.plugin - launch4j-plugin - 1.5.0.0 - com.miglayout miglayout - 3.7.3 + 3.7.4 com.mortennobel @@ -331,28 +494,99 @@ 0.8.5 - com.google.collections - google-collections - 1.0 + com.google.guava + guava + r09 - de.huxhorn.sulky - de.huxhorn.sulky.3rdparty.jlayer - 1.0 + com.thoughtworks.xstream + xstream + 1.3.1 - net.sourceforge.jarbundler - jarbundler - 2.2.0 + 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 - googlecode - Cardforge - svn:https://cardforge.googlecode.com/svn/trunk/repository + forge-ftp-repository + Forge + ftp.cardforge.org/releases + + forge-ftp-snapshot-repository + Forge + ftp.cardforge.org/snapshots + @@ -362,7 +596,7 @@ default http://arcane.googlecode.com/svn/trunk/repository - false + true @@ -374,7 +608,7 @@ default http://arcane.googlecode.com/svn/trunk/repository - false + true @@ -386,12 +620,57 @@ 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 @@ -400,13 +679,18 @@ ant-nodeps 1.7.1 + + net.sourceforge.jarbundler + jarbundler + 2.2.0 + win-linux-app-bundle package - + @@ -415,10 +699,16 @@ - + + + + + + + @@ -432,7 +722,7 @@ - + run @@ -441,35 +731,23 @@ - com.googlecode.maven-gcu-plugin - maven-gcu-plugin - 1.1 + org.codehaus.mojo + build-helper-maven-plugin + 1.7 - googlecode-upload-windows-linux - deploy + attach-distribution + package - upload + attach-artifact - true - - cardforge - - - - - ${project.build.directory}/${project.build.finalName}.tar.bz2 - - ${project.name} ${project.version} Windows/Linux package - - - - - - - - + + + ${project.build.directory}/${project.build.finalName}.tar.bz2 + tar.bz2 + + @@ -488,7 +766,7 @@ osx - + @@ -501,6 +779,11 @@ ant-nodeps 1.7.1 + + net.sourceforge.jarbundler + jarbundler + 2.2.0 + @@ -514,19 +797,28 @@ + + - - - + + + + + + + + + + - - - + + + @@ -538,38 +830,46 @@ - com.googlecode.maven-gcu-plugin - maven-gcu-plugin - 1.1 + org.codehaus.mojo + build-helper-maven-plugin + 1.7 - googlecode-upload-osx - deploy + attach-distribution-osx + package - upload + attach-artifact - true - cardforge - - - - ${project.build.directory}/${project.build.finalName}.osx.tar.bz2 + + + ${project.build.directory}/${project.build.finalName}-osx.tar.bz2 - ${project.name} ${project.version} Mac OSX package - - - - - - - + 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/PerSetTracking.py b/res/PerSetTracking.py index 4d3bbf7ee13..280330adab1 100755 --- a/res/PerSetTracking.py +++ b/res/PerSetTracking.py @@ -3,7 +3,7 @@ pathToMtgData = "mtg-data.txt" ############IMPLEMENTATION FOLLOWS############ -import os,sys +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.") @@ -14,7 +14,6 @@ if not os.path.exists(pathToMtgData) : if not os.path.isdir(sys.path[0] + os.sep + 'PerSetTracking Results') : os.mkdir(sys.path[0] + os.sep + 'PerSetTracking Results') -forgeFolderContents = os.listdir(sys.path[0] + os.sep + "cardsfolder") forgeFolderFiles = [] forgeCards = [] mtgDataCards = {} @@ -52,15 +51,13 @@ with open(pathToMtgData) as mtgdata : #Parse Forge print("Parsing Forge") -for i in forgeFolderContents : - if os.path.isfile(sys.path[0] + os.sep + "cardsfolder" + os.sep + i) == True : - forgeFolderFiles.append(i) -for file in forgeFolderFiles : - with open(sys.path[0] + os.sep + "cardsfolder" + os.sep + file) as currentForgeCard : - tmpname = currentForgeCard.readline() - tmpname = tmpname[5:].replace("AE","Ae") - tmpname = tmpname.rstrip() - forgeCards.append(tmpname) +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.") diff --git a/res/blockdata/blocks.txt b/res/blockdata/blocks.txt index 298d0357324..dc0ac37eb42 100644 --- a/res/blockdata/blocks.txt +++ b/res/blockdata/blocks.txt @@ -43,4 +43,4 @@ Index:38|Set0:ROE|Name:Rise of the Eldrazi|DraftPacks:3|LandSetCode:ROE|SealedPa 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 index 355ec7d0a4b..ecc1724347f 100644 --- a/res/blockdata/setdata.txt +++ b/res/blockdata/setdata.txt @@ -72,12 +72,14 @@ 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 The Gathering 2010 +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 The Gathering 2011 +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 \ No newline at end of file +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/cardsfolder/abandoned_outpost.txt b/res/cardsfolder/abandoned_outpost.txt deleted file mode 100644 index ea8d647fb80..00000000000 --- a/res/cardsfolder/abandoned_outpost.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Abandoned Outpost -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/abandoned_outpost.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abbey_gargoyles.txt b/res/cardsfolder/abbey_gargoyles.txt deleted file mode 100644 index 7d0347f94bf..00000000000 --- a/res/cardsfolder/abbey_gargoyles.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Abbey Gargoyles -ManaCost:2 W W W -Types:Creature Gargoyle -Text:no text -PT:3/4 -K:Flying -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abbey_gargoyles.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/101.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abbey_matron.txt b/res/cardsfolder/abbey_matron.txt deleted file mode 100644 index aa974533ab5..00000000000 --- a/res/cardsfolder/abbey_matron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Abbey Matron -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:1/3 -A:AB$ Pump | Cost$ W T | NumDef$ +3 | SpellDescription$ CARDNAME gets +0/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/abbey_matron.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/102.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/abduction.txt b/res/cardsfolder/abduction.txt deleted file mode 100644 index 15cda7adb38..00000000000 --- a/res/cardsfolder/abduction.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Abduction -ManaCost:2 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap enchanted creature. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Enchanted -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigReturnOwner | TriggerDescription$ When enchanted creature is put into a graveyard, return that card to the battlefield under its owner's control. -SVar:TrigReturnOwner:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abduction.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/30.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abjure.txt b/res/cardsfolder/abjure.txt deleted file mode 100644 index be5ac8cd33b..00000000000 --- a/res/cardsfolder/abjure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Abjure -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U Sac<1/Permanent.Blue> | CostDesc$ As an additional cost to cast Abjure, sacrifice a blue permanent. | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/abjure.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abolish.txt b/res/cardsfolder/abolish.txt deleted file mode 100644 index 558e6353d73..00000000000 --- a/res/cardsfolder/abolish.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Abolish -ManaCost:1 W W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:AltCost:Discard<1/Plains> -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abolish.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abomination.txt b/res/cardsfolder/abomination.txt deleted file mode 100644 index bb988d8d968..00000000000 --- a/res/cardsfolder/abomination.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Abomination -ManaCost:3 B B -Types:Creature Horror -Text:no text -PT:2/6 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.Green,Creature.White | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a green or white creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.Green,Creature.White | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a green or white creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abomination.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/1.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aboshan_cephalid_emperor.txt b/res/cardsfolder/aboshan_cephalid_emperor.txt deleted file mode 100644 index d0a8b1bea39..00000000000 --- a/res/cardsfolder/aboshan_cephalid_emperor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aboshan, Cephalid Emperor -ManaCost:4 U U -Types:Legendary Creature Cephalid -Text:no text -PT:3/3 -A:AB$ Tap | Cost$ tapXType<1/Cephalid> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Tap target permanent. -A:AB$ TapAll | Cost$ U U U | ValidCards$ Creature.withoutFlying | SpellDescription$ Tap all creatures without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aboshan_cephalid_emperor.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/58.jpg -End diff --git a/res/cardsfolder/aboshans_desire.txt b/res/cardsfolder/aboshans_desire.txt deleted file mode 100644 index 9544af1d8e2..00000000000 --- a/res/cardsfolder/aboshans_desire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aboshan's Desire -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -K:stPumpEnchanted:Creature:0/0/Shroud:Threshold: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.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aboshans_desire.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/about_face.txt b/res/cardsfolder/about_face.txt deleted file mode 100644 index b2e19eac6b7..00000000000 --- a/res/cardsfolder/about_face.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:About Face -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/about_face.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/absolute_grace.txt b/res/cardsfolder/absolute_grace.txt deleted file mode 100644 index bb958c80733..00000000000 --- a/res/cardsfolder/absolute_grace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Absolute Grace -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/Protection from black:No Condition:All creatures have protection from black. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/absolute_grace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/absolute_law.txt b/res/cardsfolder/absolute_law.txt deleted file mode 100644 index ebab2390437..00000000000 --- a/res/cardsfolder/absolute_law.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Absolute Law -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/Protection from red:No Condition:All creatures have protection from red. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/absolute_law.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/absorb.txt b/res/cardsfolder/absorb.txt deleted file mode 100644 index 7f030ba014a..00000000000 --- a/res/cardsfolder/absorb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Absorb -ManaCost:W U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ W U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. You gain 3 life. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23155.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/absorb_vis.txt b/res/cardsfolder/absorb_vis.txt deleted file mode 100644 index 57585c6bea8..00000000000 --- a/res/cardsfolder/absorb_vis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Absorb Vis -ManaCost:6 B -Types:Sorcery -Text:no text -K:TypeCycling:Basic:1 B -A:SP$ LoseLife | Cost$ 6 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 4 life and you gain 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/absorb_vis.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/40.jpg -End diff --git a/res/cardsfolder/abuna_acolyte.txt b/res/cardsfolder/abuna_acolyte.txt deleted file mode 100644 index a9089229324..00000000000 --- a/res/cardsfolder/abuna_acolyte.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Abuna Acolyte -ManaCost:1 W -Types:Creature Cat Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature.Artifact | Amount$ 2 | TgtPrompt$ Select target artifact creature | SpellDescription$ Prevent the next 2 damage that would be dealt to target artifact creature this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abuna_acolyte.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_gatekeeper.txt b/res/cardsfolder/abyssal_gatekeeper.txt deleted file mode 100644 index 543fc7261bd..00000000000 --- a/res/cardsfolder/abyssal_gatekeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Abyssal Gatekeeper -ManaCost:1 B -Types:Creature Horror -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Creature | Defined$ Each -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_gatekeeper.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_horror.txt b/res/cardsfolder/abyssal_horror.txt deleted file mode 100644 index de01a362e20..00000000000 --- a/res/cardsfolder/abyssal_horror.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Abyssal Horror -ManaCost:4 B B -Types:Creature Horror -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_horror.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/115.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/63.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_hunter.txt b/res/cardsfolder/abyssal_hunter.txt deleted file mode 100644 index 6d89fb2956b..00000000000 --- a/res/cardsfolder/abyssal_hunter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Abyssal Hunter -ManaCost:3 B -Types:Creature Human Assassin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBTap | SpellDescription$ Tap target creature. CARDNAME deals damage equal to CARDNAME's power to that creature. -SVar:DBTap:DB$Tap | Defined$ Targeted -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_hunter.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/109.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/1.jpg -End diff --git a/res/cardsfolder/abyssal_nightstalker.txt b/res/cardsfolder/abyssal_nightstalker.txt deleted file mode 100644 index abf2fb0ee9e..00000000000 --- a/res/cardsfolder/abyssal_nightstalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Abyssal Nightstalker -ManaCost:3 B -Types:Creature Nightstalker -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscards | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player discards a card. -SVar:TrigDiscards:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/abyssal_nightstalker.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_nocturnus.txt b/res/cardsfolder/abyssal_nocturnus.txt deleted file mode 100644 index 4b060b7f4ee..00000000000 --- a/res/cardsfolder/abyssal_nocturnus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Abyssal Nocturnus -ManaCost:1 B B -Types:Creature Horror -Text:no text -PT:2/2 -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever an opponent discards a card, CARDNAME gets +2/+2 and gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | KW$ Fear -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_nocturnus.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_persecutor.txt b/res/cardsfolder/abyssal_persecutor.txt deleted file mode 100644 index 66ce5e2b621..00000000000 --- a/res/cardsfolder/abyssal_persecutor.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Abyssal Persecutor -ManaCost:2 B B -Types:Creature Demon -Text:no text -PT:6/6 -K:Flying -K:Trample -K:You can't win the game. -K:Your opponents can't lose the game. -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_persecutor.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/abyssal_specter.txt b/res/cardsfolder/abyssal_specter.txt deleted file mode 100644 index 2d0878dcf28..00000000000 --- a/res/cardsfolder/abyssal_specter.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Abyssal Specter -ManaCost:2 B B -Types:Creature Specter -Text:no text -PT:2/3 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/abyssal_specter.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/117.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/1.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/110.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/1.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/academy_rector.txt b/res/cardsfolder/academy_rector.txt deleted file mode 100644 index 82052c03d67..00000000000 --- a/res/cardsfolder/academy_rector.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Academy Rector -ManaCost:3 W -Types:Creature Human Cleric -Text:When Academy Rector is put into a graveyard from the battlefield, you may exile it. If you do, search your library for an enchantment card and put that card onto the battlefield. Then shuffle your library. -PT:1/2 -SVar:SacMe:4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/academy_rector.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/academy_ruins.txt b/res/cardsfolder/academy_ruins.txt deleted file mode 100644 index 2d8646340aa..00000000000 --- a/res/cardsfolder/academy_ruins.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Academy Ruins -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 U T | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target artifact card from your graveyard on top of your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/academy_ruins.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/accelerate.txt b/res/cardsfolder/accelerate.txt deleted file mode 100644 index 1ce49b201da..00000000000 --- a/res/cardsfolder/accelerate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Accelerate -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/accelerate.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/90.jpg -End diff --git a/res/cardsfolder/accelerated_mutation.txt b/res/cardsfolder/accelerated_mutation.txt deleted file mode 100644 index d5e01dcb0e9..00000000000 --- a/res/cardsfolder/accelerated_mutation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Accelerated Mutation -ManaCost:3 G G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the highest converted mana cost among permanents you control. -SVar:X:Count$MaxCMCYouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/accelerated_mutation.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/109.jpg -End diff --git a/res/cardsfolder/acceptable_losses.txt b/res/cardsfolder/acceptable_losses.txt deleted file mode 100644 index 312820ab569..00000000000 --- a/res/cardsfolder/acceptable_losses.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Acceptable Losses -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/acceptable_losses.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/accorder_paladin.txt b/res/cardsfolder/accorder_paladin.txt deleted file mode 100644 index 8bce099aa68..00000000000 --- a/res/cardsfolder/accorder_paladin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Accorder Paladin -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:3/1 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/accorder_paladin.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/accorders_shield.txt b/res/cardsfolder/accorders_shield.txt deleted file mode 100644 index be15d17d430..00000000000 --- a/res/cardsfolder/accorders_shield.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Accorder's Shield -ManaCost:0 -Types:Artifact Equipment -Text:Equipped creature gets +0/+3 and has vigilance. -K:eqPump 3:+0/+3/Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/accorders_shield.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/accumulated_knowledge.txt b/res/cardsfolder/accumulated_knowledge.txt deleted file mode 100644 index d09960544cf..00000000000 --- a/res/cardsfolder/accumulated_knowledge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Accumulated Knowledge -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 U | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Draw a card, then draw cards equal to the number of cards named CARDNAME in all graveyards. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ X -SVar:X:Count$NamedInAllYards.Accumulated Knowledge -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/accumulated_knowledge.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/accursed_centaur.txt b/res/cardsfolder/accursed_centaur.txt deleted file mode 100644 index ce9cea9cbaa..00000000000 --- a/res/cardsfolder/accursed_centaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Accursed Centaur -ManaCost:B -Types:Creature Zombie Centaur -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/accursed_centaur.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acid_rain.txt b/res/cardsfolder/acid_rain.txt deleted file mode 100644 index a220533097f..00000000000 --- a/res/cardsfolder/acid_rain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Acid Rain -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 U | ValidCards$ Forest | SpellDescription$ Destroy all Forests. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/acid_rain.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/44.jpg -End diff --git a/res/cardsfolder/acid_web_spider.txt b/res/cardsfolder/acid_web_spider.txt deleted file mode 100644 index d4829d3c781..00000000000 --- a/res/cardsfolder/acid_web_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Acid Web Spider -ManaCost:3 G G -Types:Creature Spider -Text:no text -PT:3/5 -K:Reach -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may destroy target Equipment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Equipment | TgtPrompt$ Choose target equipment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/acid_web_spider.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acidic_slime.txt b/res/cardsfolder/acidic_slime.txt deleted file mode 100644 index 2fd00649f44..00000000000 --- a/res/cardsfolder/acidic_slime.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Acidic Slime -ManaCost:3 G G -Types:Creature Ooze -Text:no text -PT:2/2 -K:Deathtouch -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact, enchantment, or land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact,Enchantment,Land | TgtPrompt$ Select an artifact, enchantment, or land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/acidic_slime.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/161.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acidic_sliver.txt b/res/cardsfolder/acidic_sliver.txt deleted file mode 100644 index 76fe0ed5742..00000000000 --- a/res/cardsfolder/acidic_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Acidic Sliver -ManaCost:B R -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Damage:no Condition:All Slivers have "2, Sacrifice this permanent: This permanent deals 2 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ 2 Sac<1/CARDNAME> | ValidTgts$ Creature,Player | NumDmg$ 2 | TgtPrompt$ Select a target creature or player. | SpellDescription$ Deal 2 damage to target creature or player. -SVar:BuffedBy:Sliver -SVar:Picture:http://www.wizards.com/global/images/magic/general/acidic_sliver.jpg -SVar:Rarity:Uncommon -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acidic_soil.txt b/res/cardsfolder/acidic_soil.txt deleted file mode 100644 index 30531127c78..00000000000 --- a/res/cardsfolder/acidic_soil.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Acidic Soil -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Defined$ You | NumDmg$ X | SubAbility$ SVar=DBDamageOpp | SpellDescription$ CARDNAME deals damage to each player equal to the number of lands he or she controls. -SVar:DBDamageOpp:DB$DealDamage | Defined$ Opponent | NumDmg$ Y -SVar:X:Count$TypeYouCtrl.Land -SVar:Y:Count$TypeOppCtrl.Land -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/acidic_soil.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acolyte_of_xathrid.txt b/res/cardsfolder/acolyte_of_xathrid.txt deleted file mode 100644 index 7492d34c9c0..00000000000 --- a/res/cardsfolder/acolyte_of_xathrid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Acolyte of Xathrid -ManaCost:B -Types:Creature Human Cleric -Text:no text -PT:0/1 -A:AB$ LoseLife | Cost$ 1 B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/acolyte_of_xathrid.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/83.jpg -End diff --git a/res/cardsfolder/acorn_harvest.txt b/res/cardsfolder/acorn_harvest.txt deleted file mode 100644 index b077608ecdb..00000000000 --- a/res/cardsfolder/acorn_harvest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Acorn Harvest -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G | TokenAmount$ 2 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 green Squirrel creature tokens onto the battlefield. -A:SP$ Token | Cost$ 1 G PayLife<3> | TokenAmount$ 2 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | Flashback$ True | CostDesc$ Flashback 1 G, Pay 3 life | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/acorn_harvest.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acquire.txt b/res/cardsfolder/acquire.txt deleted file mode 100644 index a8f8af075d4..00000000000 --- a/res/cardsfolder/acquire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Acquire -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 U U | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Artifact | ChangeNum$ 1 | GainControl$ True | IsCurse$ True | SpellDescription$ 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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/acquire.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/acridian.txt b/res/cardsfolder/acridian.txt deleted file mode 100644 index 8d805189780..00000000000 --- a/res/cardsfolder/acridian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Acridian -ManaCost:1 G -Types:Creature Insect -Text:no text -PT:2/4 -K:Echo:1 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/acridian.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/act_of_aggression.txt b/res/cardsfolder/act_of_aggression.txt deleted file mode 100644 index 4b3f5c4deae..00000000000 --- a/res/cardsfolder/act_of_aggression.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Act of Aggression -ManaCost:3 PR PR -Types:Instant -Text:no text -A:SP$ GainControl | Cost$ 3 PR PR | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature an opponent controls. | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature an opponent controls until end of turn. Untap that creature. It gains haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_aggression.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/act_of_treason.txt b/res/cardsfolder/act_of_treason.txt deleted file mode 100644 index 7cddf85023f..00000000000 --- a/res/cardsfolder/act_of_treason.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Act of Treason -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/act_of_treason.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/121.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/active_volcano.txt b/res/cardsfolder/active_volcano.txt deleted file mode 100644 index 766bb30bcc0..00000000000 --- a/res/cardsfolder/active_volcano.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Active Volcano -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Permanent.Blue | TgtPrompt$ Select target blue permanent | PrecostDesc$ Choose one - | SpellDescription$ Destroy target blue permanent; -A:SP$ ChangeZone | Cost$ R | ValidTgts$ Island | TgtPrompt$ Select target Island | Origin$ Battlefield | Destination$ Hand | SpellDescription$ or return target Island to its owner's hand. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/active_volcano.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adamaro_first_to_desire.txt b/res/cardsfolder/adamaro_first_to_desire.txt deleted file mode 100644 index 0550659fa5d..00000000000 --- a/res/cardsfolder/adamaro_first_to_desire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Adamaro, First to Desire -ManaCost:1 R R -Types:Legendary Creature Spirit -Text:no text -PT:*/* -K:stSetPT:Count$InOppHand:Count$InOppHand: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/adamaro_first_to_desire.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adarkar_sentinel.txt b/res/cardsfolder/adarkar_sentinel.txt deleted file mode 100644 index d0b513f79f9..00000000000 --- a/res/cardsfolder/adarkar_sentinel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Adarkar Sentinel -ManaCost:5 -Types:Artifact Creature Soldier -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/adarkar_sentinel.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/281.jpg -End diff --git a/res/cardsfolder/adarkar_valkyrie.txt b/res/cardsfolder/adarkar_valkyrie.txt deleted file mode 100644 index 990963bc6b8..00000000000 --- a/res/cardsfolder/adarkar_valkyrie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Adarkar Valkyrie -ManaCost:4 W W -Types:Snow Creature Angel -Text:no text -PT:4/5 -K:Flying -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121196.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adarkar_wastes.txt b/res/cardsfolder/adarkar_wastes.txt deleted file mode 100644 index 7b60ddadb3e..00000000000 --- a/res/cardsfolder/adarkar_wastes.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Adarkar Wastes -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/adarkar_wastes.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/325.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/410.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/317.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/326.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/347.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adarkar_windform.txt b/res/cardsfolder/adarkar_windform.txt deleted file mode 100644 index 9a6c81f1b82..00000000000 --- a/res/cardsfolder/adarkar_windform.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Adarkar Windform -ManaCost:4 U -Types:Snow Creature Illusion -Text:no text -PT:3/3 -K:Flying -A:AB$ Debuff | Cost$ 1 S | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/adarkar_windform.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adder_staff_boggart.txt b/res/cardsfolder/adder_staff_boggart.txt deleted file mode 100644 index 5e38c306560..00000000000 --- a/res/cardsfolder/adder_staff_boggart.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Adder-Staff Boggart -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on CARDNAME. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/adder_staff_boggart.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/admonition_angel.txt b/res/cardsfolder/admonition_angel.txt deleted file mode 100644 index 688388ec0ba..00000000000 --- a/res/cardsfolder/admonition_angel.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Admonition Angel -ManaCost:3 W W W -Types:Creature Angel -Text:(NOTE: This spell is rather buggy and should not be used at this time.) -PT:6/6 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may exile target nonland permanent other than CARDNAME. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return all cards exiled with it to the battlefield under their owners' control. -SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Choose target nonland permanent other than Admonition Angel. | RememberTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:BuffedBy:Land -SVar:RemAIDeck:True -SVar:Rarity:None -SVar:Picture:http://www.wizards.com/global/images/magic/general/admonition_angel.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/adun_oakenshield.txt b/res/cardsfolder/adun_oakenshield.txt deleted file mode 100644 index f6a8f44b4fd..00000000000 --- a/res/cardsfolder/adun_oakenshield.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Adun Oakenshield -ManaCost:G R B -Types:Legendary Creature Human Knight -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ B R G T | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/adun_oakenshield.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/advance_scout.txt b/res/cardsfolder/advance_scout.txt deleted file mode 100644 index ecbcc52cadb..00000000000 --- a/res/cardsfolder/advance_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Advance Scout -ManaCost:1 W -Types:Creature Human Soldier Scout -Text:no text -PT:1/1 -K:First Strike -A:AB$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/advance_scout.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/213.jpg -End diff --git a/res/cardsfolder/advanced_hoverguard.txt b/res/cardsfolder/advanced_hoverguard.txt deleted file mode 100644 index d28991524ff..00000000000 --- a/res/cardsfolder/advanced_hoverguard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Advanced Hoverguard -ManaCost:3 U -Types:Creature Drone -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/advanced_hoverguard.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/22.jpg -End diff --git a/res/cardsfolder/adventuring_gear.txt b/res/cardsfolder/adventuring_gear.txt deleted file mode 100644 index f76ef4d8ef0..00000000000 --- a/res/cardsfolder/adventuring_gear.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Adventuring Gear -ManaCost:1 -Types:Artifact Equipment -Text:no text -K:eqPump 1:+0/+0 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, equipped creature gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Equipped | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/adventuring_gear.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aegis_of_the_meek.txt b/res/cardsfolder/aegis_of_the_meek.txt deleted file mode 100644 index dc1fb375a73..00000000000 --- a/res/cardsfolder/aegis_of_the_meek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Aegis of the Meek -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 1 T | NumAtt$ +1 | NumDef$ +2 | ValidTgts$ Creature.powerEQ1+toughnessEQ1 | TgtPrompt$ Select target 1/1 Creature | SpellDescription$ Target 1/1 creature gets +1/+2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aegis_of_the_meek.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aeolipile.txt b/res/cardsfolder/aeolipile.txt deleted file mode 100644 index d1e4d3521b6..00000000000 --- a/res/cardsfolder/aeolipile.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Aeolipile -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 1 T Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aeolipile.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aerathi_berserker.txt b/res/cardsfolder/aerathi_berserker.txt deleted file mode 100644 index ff64c684e5e..00000000000 --- a/res/cardsfolder/aerathi_berserker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:AErathi Berserker -ManaCost:2 R R R -Types:Creature Human Berserker -Text:no text -PT:2/4 -K:Rampage 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aerathi_berserker.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aerie_mystics.txt b/res/cardsfolder/aerie_mystics.txt deleted file mode 100644 index e5b1af8eb38..00000000000 --- a/res/cardsfolder/aerie_mystics.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aerie Mystics -ManaCost:4 W -Types:Creature Bird Wizard -Text:no text -PT:3/3 -K:Flying -A:AB$ PumpAll | Cost$ 1 G U | ValidCards$ Creature.YouCtrl | KW$ Shroud | SpellDescription$ Creatures you control gain shroud until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aerie_mystics.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aerie_ouphes.txt b/res/cardsfolder/aerie_ouphes.txt deleted file mode 100644 index 164bc6408ac..00000000000 --- a/res/cardsfolder/aerie_ouphes.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aerie Ouphes -ManaCost:4 G -Types:Creature Ouphe -Text:no text -PT:3/3 -K:Persist -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature with flying. -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aerie_ouphes.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aesthir_glider.txt b/res/cardsfolder/aesthir_glider.txt deleted file mode 100644 index 2bf86ba60a4..00000000000 --- a/res/cardsfolder/aesthir_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aesthir Glider -ManaCost:3 -Types:Artifact Creature Bird -Text:no text -PT:2/1 -K:CARDNAME can't block. -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/al/en-us/card3040.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/156.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/aether_adept.txt b/res/cardsfolder/aether_adept.txt deleted file mode 100644 index 74105a20fcd..00000000000 --- a/res/cardsfolder/aether_adept.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:AEther Adept -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target creature to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_adept.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_burst.txt b/res/cardsfolder/aether_burst.txt deleted file mode 100644 index c0ff746dbb6..00000000000 --- a/res/cardsfolder/aether_burst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:AEther Burst -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return up to X target creatures to their owners' hands, where X is one plus the number of cards named CARDNAME in all graveyards as you cast CARDNAME. -SVar:X:Count$NamedInAllYards.AEther Burst/Plus.1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_burst.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_charge.txt b/res/cardsfolder/aether_charge.txt deleted file mode 100644 index fb4e207e97a..00000000000 --- a/res/cardsfolder/aether_charge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:AEther Charge -ManaCost:4 R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Beast.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever a Beast enters the battlefield under your control, you may have it deal 4 damage to target opponent. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | DamageSource$ TriggeredCard | ValidTgts$ Opponent | NumDmg$ 4 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_charge.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_figment.txt b/res/cardsfolder/aether_figment.txt deleted file mode 100644 index 8430181dcf2..00000000000 --- a/res/cardsfolder/aether_figment.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:AEther Figment -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:1/1 -K:Unblockable -K:Kicker:3 -K:etbCounter:P1P1:2:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_figment.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_flash.txt b/res/cardsfolder/aether_flash.txt deleted file mode 100644 index c6cc84c2ea9..00000000000 --- a/res/cardsfolder/aether_flash.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:AEther Flash -ManaCost:2 R R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a creature enters the battlefield, CARDNAME deals 2 damage to it. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCard | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_flash.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/88.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_membrane.txt b/res/cardsfolder/aether_membrane.txt deleted file mode 100644 index 34d0b31552d..00000000000 --- a/res/cardsfolder/aether_membrane.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:AEther Membrane -ManaCost:1 R R -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -K:Reach -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelayedTrig | TriggerDescription$ Whenever CARDNAME blocks a creature, return that creature to its owner's hand at end of combat. -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return blocked creature to its owner's hand at end of combat. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredAttacker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_membrane.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_mutation.txt b/res/cardsfolder/aether_mutation.txt deleted file mode 100644 index 1fc5e20687f..00000000000 --- a/res/cardsfolder/aether_mutation.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:AEther Mutation -ManaCost:3 G U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=TrigToken | SpellDescription$ 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. -#X will be the Converted Mana Cost of the target of AEther Mutation -SVar:TrigToken:DB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_mutation.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_shockwave.txt b/res/cardsfolder/aether_shockwave.txt deleted file mode 100644 index 7361ce196b6..00000000000 --- a/res/cardsfolder/aether_shockwave.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:AEther Shockwave -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ 3 W | ValidCards$ Spirit | PrecostDesc$ Choose one - | SpellDescription$ Tap all Spirits; -A:SP$ TapAll | Cost$ 3 W | ValidCards$ Creature.nonSpirit | PrecostDesc$ or | SpellDescription$ tap all non-Spirit creatures. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_shockwave.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_spellbomb.txt b/res/cardsfolder/aether_spellbomb.txt deleted file mode 100644 index 1ab3d81617c..00000000000 --- a/res/cardsfolder/aether_spellbomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:AEther Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ ChangeZone | Cost$ U Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_spellbomb.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_sting.txt b/res/cardsfolder/aether_sting.txt deleted file mode 100644 index b6ff5843017..00000000000 --- a/res/cardsfolder/aether_sting.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:AEther Sting -ManaCost:3 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent casts a creature spell, CARDNAME deals 1 damage to that player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_sting.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_tradewinds.txt b/res/cardsfolder/aether_tradewinds.txt deleted file mode 100644 index ed71275e175..00000000000 --- a/res/cardsfolder/aether_tradewinds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:AEther Tradewinds -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SubAbility$ SVar=DBChange | SpellDescription$ Return target permanent you control and target permanent you don't control to their owners' hands. -SVar:DBChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouDontCtrl | TgtPrompt$ Select target permanent you don't control -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_tradewinds.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_vial.txt b/res/cardsfolder/aether_vial.txt deleted file mode 100644 index 71599cc3a46..00000000000 --- a/res/cardsfolder/aether_vial.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:AEther Vial -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | ChangeNum$ 1 | SpellDescription$ You may put a creature card with converted mana cost equal to the number of charge counters on CARDNAME from your hand onto the battlefield. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_vial.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aether_web.txt b/res/cardsfolder/aether_web.txt deleted file mode 100644 index 6a150026a79..00000000000 --- a/res/cardsfolder/aether_web.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:AEther Web -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+1/Reach & CARDNAME can block creatures with shadow as though they didn't have shadow.:Enchanted creature gets +1/+1, has reach, and can block creatures with shadow as though they didn't have shadow. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aether_web.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aetherflame_wall.txt b/res/cardsfolder/aetherflame_wall.txt deleted file mode 100644 index d7365bdfa88..00000000000 --- a/res/cardsfolder/aetherflame_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:AEtherflame Wall -ManaCost:1 R -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -K:CARDNAME can block creatures with shadow as though they didn't have shadow. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aetherflame_wall.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/142.jpg -End diff --git a/res/cardsfolder/aethermages_touch.txt b/res/cardsfolder/aethermages_touch.txt deleted file mode 100644 index a30d0f5df2b..00000000000 --- a/res/cardsfolder/aethermages_touch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:AEthermage's Touch -ManaCost:2 W U -Types:Instant -Text:no text -A:SP$ Dig | Cost$ 2 W U | DigNum$ 4 | Reveal$ True | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | Keywords$ HIDDEN At the beginning of your end step, return CARDNAME to its owner's hand.| SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aethermages_touch.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aethersnipe.txt b/res/cardsfolder/aethersnipe.txt deleted file mode 100644 index 339fc418f72..00000000000 --- a/res/cardsfolder/aethersnipe.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:AEthersnipe -ManaCost:5 U -Types:Creature Elemental -Text: -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, return target nonland permanent to its owner's hand. -K:Evoke:1 U U -SVar:TrigBounce:DB$ChangeZone | ValidTgts$ Permanent.nonLand | TgtPrompt$ Choose target non-Land permanent. | Origin$ Battlefield | Destination$ Hand -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aethersnipe.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/affa_guard_hound.txt b/res/cardsfolder/affa_guard_hound.txt deleted file mode 100644 index 01015b9cc7c..00000000000 --- a/res/cardsfolder/affa_guard_hound.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Affa Guard Hound -ManaCost:2 W -Types:Creature Hound -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +0/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +3 -K:Flash -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/affa_guard_hound.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/afflict.txt b/res/cardsfolder/afflict.txt deleted file mode 100644 index 157f0a4aa65..00000000000 --- a/res/cardsfolder/afflict.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Afflict -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/afflict.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/115.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/125.jpg -End diff --git a/res/cardsfolder/afterlife.txt b/res/cardsfolder/afterlife.txt deleted file mode 100644 index a71460d9965..00000000000 --- a/res/cardsfolder/afterlife.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Afterlife -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SubAbility$ SVar=DBToken | SpellDescription$ Destroy target creature. It can't be regenerated. Its controller puts a 1/1 white Spirit creature token with flying onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ TargetedController | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/afterlife.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/205.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aftershock.txt b/res/cardsfolder/aftershock.txt deleted file mode 100644 index 08fb4121f41..00000000000 --- a/res/cardsfolder/aftershock.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aftershock -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SubAbility$ SVar=DBPain | SpellDescription$ Destroy target artifact, enchantment or land. CARDNAME deals 3 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 3 | Defined$ You -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aftershock.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/agadeem_occultist.txt b/res/cardsfolder/agadeem_occultist.txt deleted file mode 100644 index 29f9ff442b3..00000000000 --- a/res/cardsfolder/agadeem_occultist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Agadeem Occultist -ManaCost:2 B -Types:Creature Human Shaman Ally -Text:no text -PT:0/2 -A:AB$ ChangeZone | Cost$ T | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in your opponent's graveyard | ValidTgts$ Creature.YouDontCtrl+cmcLEX | ChangeNum$ 1 | SpellDescription$ 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. -SVar:X:Count$Valid Ally.YouCtrl -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/agadeem_occultist.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ageless_entity.txt b/res/cardsfolder/ageless_entity.txt deleted file mode 100644 index 1fc1d556524..00000000000 --- a/res/cardsfolder/ageless_entity.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ageless Entity -ManaCost:3 G G -Types:Creature Elemental -Text:no text -PT:4/4 -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you gain life, put that many +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:TriggerCount$LifeAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ageless_entity.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/agent_of_masks.txt b/res/cardsfolder/agent_of_masks.txt deleted file mode 100644 index 44612d0f828..00000000000 --- a/res/cardsfolder/agent_of_masks.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Agent of Masks -ManaCost:3 W B -Types:Creature Human Advisor -Text:no text -PT:2/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of your upkeep, each opponent loses 1 life. You gain life equal to the life lost this way. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_masks.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/agent_of_shauku.txt b/res/cardsfolder/agent_of_shauku.txt deleted file mode 100644 index 288353b5b09..00000000000 --- a/res/cardsfolder/agent_of_shauku.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Agent of Shauku -ManaCost:1 B -Types:Creature Human Mercenary -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 B Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_shauku.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/55.jpg -End diff --git a/res/cardsfolder/agent_of_stromgald.txt b/res/cardsfolder/agent_of_stromgald.txt deleted file mode 100644 index 00add13de86..00000000000 --- a/res/cardsfolder/agent_of_stromgald.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Agent of Stromgald -ManaCost:R -Types:Creature Human Knight -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ R | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/agent_of_stromgald.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/94.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/aggressive_urge.txt b/res/cardsfolder/aggressive_urge.txt deleted file mode 100644 index 9d7439cd4c7..00000000000 --- a/res/cardsfolder/aggressive_urge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aggressive Urge -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aggressive_urge.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/181.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/250.jpg -End diff --git a/res/cardsfolder/agility.txt b/res/cardsfolder/agility.txt deleted file mode 100644 index 1f03a3c14ca..00000000000 --- a/res/cardsfolder/agility.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Agility -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1/Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/agility.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/agonizing_demise.txt b/res/cardsfolder/agonizing_demise.txt deleted file mode 100644 index 26289daf703..00000000000 --- a/res/cardsfolder/agonizing_demise.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Agonizing Demise -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. If CARDNAME was kicked, it deals damage equal to that creature's power to the creature's controller. -A:SP$ Destroy | Cost$ 4 B R | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ SVar=DBDamage | SpellDescription$ Kicker 1 R (You may pay an additional 1 R as you cast this spell.) -SVar:DBDamage:DB$DealDamage | Cost$ 0 | Defined$ TargetedController | NumDmg$ X -SVar:X:Targeted$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/agonizing_demise.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/92.jpg -End diff --git a/res/cardsfolder/agony_warp.txt b/res/cardsfolder/agony_warp.txt deleted file mode 100644 index 896f5fcd3be..00000000000 --- a/res/cardsfolder/agony_warp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Agony Warp -ManaCost:U B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U B | ValidTgts$ Creature | TgtPrompt$ Select target creature to get -3/-0 | NumAtt$ -3 | IsCurse$ True | SubAbility$ SVar=DBPump | SpellDescription$ Target creature gets -3/-0 until end of turn. -SVar:DBPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to get -0/-3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -0/-3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/agony_warp.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/agrus_kos_wojek_veteran.txt b/res/cardsfolder/agrus_kos_wojek_veteran.txt deleted file mode 100644 index 155b2ad23ed..00000000000 --- a/res/cardsfolder/agrus_kos_wojek_veteran.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Agrus Kos, Wojek Veteran -ManaCost:3 R W -Types:Legendary Creature Human Soldier -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, attacking red creatures get +2/+0 and attacking white creatures get +0/+2 until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Red | NumAtt$ 2 | SubAbility$ SVar=DBPump -SVar:DBPump:DB$PumpAll | ValidCards$ Creature.attacking+White | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/agrus_kos_wojek_veteran.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/air_bladder.txt b/res/cardsfolder/air_bladder.txt deleted file mode 100644 index 7334a5364c2..00000000000 --- a/res/cardsfolder/air_bladder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Air Bladder -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying & HIDDEN CARDNAME can block only creatures with flying.:Enchanted creature has flying and can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/air_bladder.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/air_elemental.txt b/res/cardsfolder/air_elemental.txt deleted file mode 100644 index 2b193f20059..00000000000 --- a/res/cardsfolder/air_elemental.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Air Elemental -ManaCost:3 U U -Types:Creature Elemental -Text:no text -PT:4/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/air_elemental.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/59.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/47.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/47.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/58.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/31.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/59.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/58.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/64.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/42.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/56.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/47.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/71.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/32.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/air_servant.txt b/res/cardsfolder/air_servant.txt deleted file mode 100644 index 268438dde43..00000000000 --- a/res/cardsfolder/air_servant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Air Servant -ManaCost:4 U -Types:Creature Elemental -Text:no text -PT:4/3 -K:Flying -A:AB$ Tap | Cost$ 2 U | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Tap target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/air_servant.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/42.jpg -End diff --git a/res/cardsfolder/airborne_aid.txt b/res/cardsfolder/airborne_aid.txt deleted file mode 100644 index 660734efa23..00000000000 --- a/res/cardsfolder/airborne_aid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Airborne Aid -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U | NumCards$ X | SpellDescription$ Draw a card for each Bird on the battlefield. -SVar:X:Count$TypeOnBattlefield.Bird -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/airborne_aid.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/62.jpg -End diff --git a/res/cardsfolder/airdrop_condor.txt b/res/cardsfolder/airdrop_condor.txt deleted file mode 100644 index d625afeff52..00000000000 --- a/res/cardsfolder/airdrop_condor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Airdrop Condor -ManaCost:4 R -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -A:AB$ DealDamage | Cost$ 1 R Sac<1/Creature.Goblin> | Tgt$ TgtCP | NumDmg$ X | CostDesc$ 1 R, Sacrifice a Goblin creature: | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to target creature or player. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/airdrop_condor.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ajani_goldmane.txt b/res/cardsfolder/ajani_goldmane.txt deleted file mode 100644 index b42cf0c70d0..00000000000 --- a/res/cardsfolder/ajani_goldmane.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ajani Goldmane -ManaCost:2 W W -Types:Planeswalker Ajani -Text:no text -Loyalty:4 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/ajani_goldmane.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/1.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/1.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ajani_vengeant.txt b/res/cardsfolder/ajani_vengeant.txt deleted file mode 100644 index 244bafb431f..00000000000 --- a/res/cardsfolder/ajani_vengeant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ajani Vengeant -ManaCost:2 R W -Types:Planeswalker Ajani -Text:no text -Loyalty:3 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | ValidTgts$ Permanent | Permanent$ True | IsCurse$ True | SpellDescription$ Target permanent doesn't untap during its controller's next untap step. -A:AB$ DealDamage | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 3 damage to target creature or player and you gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 -# Ultimate can't be converted to AF since DestroyAll doesn't target -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/ajani_vengeant.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ajanis_mantra.txt b/res/cardsfolder/ajanis_mantra.txt deleted file mode 100644 index 0bca85f5dec..00000000000 --- a/res/cardsfolder/ajanis_mantra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ajani's Mantra -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_mantra.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ajanis_pridemate.txt b/res/cardsfolder/ajanis_pridemate.txt deleted file mode 100644 index c0dda2be9ee..00000000000 --- a/res/cardsfolder/ajanis_pridemate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ajani's Pridemate -ManaCost:1 W -Types:Creature Cat Soldier -Text:no text -PT:2/2 -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you gain life, you may put a +1/+1 counter on CARDNAME. (For example, if an effect causes you to gain 3 life, you may put one +1/+1 counter on this creature.) -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ajanis_pridemate.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_avalanchers.txt b/res/cardsfolder/akki_avalanchers.txt deleted file mode 100644 index c29fb4e3f84..00000000000 --- a/res/cardsfolder/akki_avalanchers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Avalanchers -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_avalanchers.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_blizzard_herder.txt b/res/cardsfolder/akki_blizzard_herder.txt deleted file mode 100644 index db436d40e77..00000000000 --- a/res/cardsfolder/akki_blizzard_herder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Blizzard-Herder -ManaCost:1 R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player sacrifices a land. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ Each -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_blizzard_herder.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_coalflinger.txt b/res/cardsfolder/akki_coalflinger.txt deleted file mode 100644 index 065ac302b3f..00000000000 --- a/res/cardsfolder/akki_coalflinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Coalflinger -ManaCost:1 R R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -K:First Strike -A:AB$ PumpAll | Cost$ R T | ValidCards$ Creature.attacking | KW$ First Strike | SpellDescription$ Attacking creatures gain first strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_coalflinger.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_drillmaster.txt b/res/cardsfolder/akki_drillmaster.txt deleted file mode 100644 index 42d43c40283..00000000000 --- a/res/cardsfolder/akki_drillmaster.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akki Drillmaster -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card74393.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/92.jpg -End diff --git a/res/cardsfolder/akki_raider.txt b/res/cardsfolder/akki_raider.txt deleted file mode 100644 index abb38f22b46..00000000000 --- a/res/cardsfolder/akki_raider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Raider -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a land is put into a graveyard from the battlefield, CARDNAME gets +1/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_raider.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_rockspeaker.txt b/res/cardsfolder/akki_rockspeaker.txt deleted file mode 100644 index c8c5f943c41..00000000000 --- a/res/cardsfolder/akki_rockspeaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Rockspeaker -ManaCost:1 R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ When CARDNAME enters the battlefield, add R to your mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ R | Amount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_rockspeaker.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_underling.txt b/res/cardsfolder/akki_underling.txt deleted file mode 100644 index 15925a3e428..00000000000 --- a/res/cardsfolder/akki_underling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akki Underling -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -K:stPumpSelf:Creature:2/1/First Strike:CardsInHandMore/7:As long as you have seven or more cards in hand, Akki Underling gets +2/+1 and has first strike. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_underling.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akki_underminer.txt b/res/cardsfolder/akki_underminer.txt deleted file mode 100644 index 5b8db2e4737..00000000000 --- a/res/cardsfolder/akki_underminer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akki Underminer -ManaCost:3 R -Types:Creature Goblin Rogue Shaman -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices a permanent. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | SacValid$ Permanent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akki_underminer.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akoum_battlesinger.txt b/res/cardsfolder/akoum_battlesinger.txt deleted file mode 100644 index a6f5ce5aecf..00000000000 --- a/res/cardsfolder/akoum_battlesinger.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Akoum Battlesinger -ManaCost:1 R -Types:Creature Human Berserker Ally -Text:no text -PT:1/1 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control get +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPumpAll | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control get +1/+0 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Ally+YouCtrl | NumAtt$ 1 -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Akoum_Battlesinger.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akoum_boulderfoot.txt b/res/cardsfolder/akoum_boulderfoot.txt deleted file mode 100644 index 408ea8c8758..00000000000 --- a/res/cardsfolder/akoum_boulderfoot.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Akoum Boulderfoot -ManaCost:4 R R -Types:Creature Giant Warrior -Text:no text -PT:4/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_boulderfoot.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akoum_refuge.txt b/res/cardsfolder/akoum_refuge.txt deleted file mode 100644 index 34836e40c12..00000000000 --- a/res/cardsfolder/akoum_refuge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Akoum Refuge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_refuge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akrasan_squire.txt b/res/cardsfolder/akrasan_squire.txt deleted file mode 100644 index ea19e58fa31..00000000000 --- a/res/cardsfolder/akrasan_squire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akrasan Squire -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/akrasan_squire.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akroma_angel_of_fury.txt b/res/cardsfolder/akroma_angel_of_fury.txt deleted file mode 100644 index 94b9614962e..00000000000 --- a/res/cardsfolder/akroma_angel_of_fury.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Akroma, Angel of Fury -ManaCost:5 R R R -Types:Legendary Creature Angel -Text:no text -PT:6/6 -K:Flying -K:Trample -K:Protection from white -K:Protection from blue -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -K:Morph:3 R R R -K:CARDNAME can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122432.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/94.jpg -End diff --git a/res/cardsfolder/akroma_angel_of_wrath.txt b/res/cardsfolder/akroma_angel_of_wrath.txt deleted file mode 100644 index e38bc17058b..00000000000 --- a/res/cardsfolder/akroma_angel_of_wrath.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Akroma, Angel of Wrath -ManaCost:5 W W W -Types:Legendary Creature Angel -Text:no text -PT:6/6 -K:Flying -K:Vigilance -K:First Strike -K:Trample -K:Haste -K:Protection from red -K:Protection from black -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card106645.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/1.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akromas_devoted.txt b/res/cardsfolder/akromas_devoted.txt deleted file mode 100644 index b1a11ae4ebd..00000000000 --- a/res/cardsfolder/akromas_devoted.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akroma's Devoted -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:2/4 -K:stPumpAll:Creature.Cleric:0/0/Vigilance:No Condition:Cleric creatures have vigilance. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/akromas_devoted.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akromas_memorial.txt b/res/cardsfolder/akromas_memorial.txt deleted file mode 100644 index b9fc7bba882..00000000000 --- a/res/cardsfolder/akromas_memorial.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akroma's Memorial -ManaCost:7 -Types:Legendary Artifact -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Flying & First Strike & Vigilance & Trample & Haste & Protection from black & Protection from red:No Condition:Creatures you control have flying, first strike, vigilance, trample, haste, and protection from black and from red. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/akromas_memorial.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akromas_vengeance.txt b/res/cardsfolder/akromas_vengeance.txt deleted file mode 100644 index 42e0eba44a7..00000000000 --- a/res/cardsfolder/akromas_vengeance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Akroma's Vengeance -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Artifact,Creature,Enchantment | SpellDescription$ Destroy all artifacts, creatures, and enchantments. -K:Cycling:3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/akromas_vengeance.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/2.jpg -End diff --git a/res/cardsfolder/aku_djinn.txt b/res/cardsfolder/aku_djinn.txt deleted file mode 100644 index 70e906da524..00000000000 --- a/res/cardsfolder/aku_djinn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aku Djinn -ManaCost:3 B B -Types:Creature Djinn -Text:no text -PT:5/6 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on each creature each opponent controls. -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.YouDontCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aku_djinn.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/akuta_born_of_ash.txt b/res/cardsfolder/akuta_born_of_ash.txt deleted file mode 100644 index 3b3b69c789c..00000000000 --- a/res/cardsfolder/akuta_born_of_ash.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Akuta, Born of Ash -ManaCost:2 B B -Types:Legendary Creature Spirit -Text:no text -PT:3/2 -K:Haste -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LTX | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ 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 CARDNAME from your graveyard to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ Sac<1/Swamp> | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield -SVar:X:Count$InYourHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/akuta_born_of_ash.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alabaster_dragon.txt b/res/cardsfolder/alabaster_dragon.txt deleted file mode 100644 index 443a50bf42b..00000000000 --- a/res/cardsfolder/alabaster_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Alabaster Dragon -ManaCost:4 W W -Types:Creature Dragon -PT:4/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ If CARDNAME is put into your graveyard from the battlefield, you may shuffle it into your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/alabaster_dragon.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/118.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alabaster_leech.txt b/res/cardsfolder/alabaster_leech.txt deleted file mode 100644 index 5471bb4993b..00000000000 --- a/res/cardsfolder/alabaster_leech.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alabaster Leech -ManaCost:W -Types:Creature Leech -Text:White spells you cast cost W more to cast. -PT:1/3 -K:CostChange:Player:More:W:Spell:white:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/alabaster_leech.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alabaster_wall.txt b/res/cardsfolder/alabaster_wall.txt deleted file mode 100644 index 141fd9a29e5..00000000000 --- a/res/cardsfolder/alabaster_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Alabaster Wall -ManaCost:2 W -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alabaster_wall.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_cavalier.txt b/res/cardsfolder/alaborn_cavalier.txt deleted file mode 100644 index 78e23bc6da3..00000000000 --- a/res/cardsfolder/alaborn_cavalier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Alaborn Cavalier -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME attacks, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/alaborn_cavalier.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_grenadier.txt b/res/cardsfolder/alaborn_grenadier.txt deleted file mode 100644 index b6363034862..00000000000 --- a/res/cardsfolder/alaborn_grenadier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alaborn Grenadier -ManaCost:W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6508.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_musketeer.txt b/res/cardsfolder/alaborn_musketeer.txt deleted file mode 100644 index 4047a979529..00000000000 --- a/res/cardsfolder/alaborn_musketeer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alaborn Musketeer -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/1 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6499.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_trooper.txt b/res/cardsfolder/alaborn_trooper.txt deleted file mode 100644 index 2080bb83bcd..00000000000 --- a/res/cardsfolder/alaborn_trooper.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Alaborn Trooper -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6493.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_veteran.txt b/res/cardsfolder/alaborn_veteran.txt deleted file mode 100644 index 704a9c8164a..00000000000 --- a/res/cardsfolder/alaborn_veteran.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alaborn Veteran -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Target creature gets +2/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/alaborn_veteran.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alaborn_zealot.txt b/res/cardsfolder/alaborn_zealot.txt deleted file mode 100644 index 1ee0ef17d4c..00000000000 --- a/res/cardsfolder/alaborn_zealot.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Alaborn Zealot -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidAttacker$ Creature | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME blocks a creature, destroy that creature and CARDNAME. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker | SubAbility$ SVar=DestroySelf -SVar:DestroySelf:DB$Destroy | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/alaborn_zealot.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aladdin.txt b/res/cardsfolder/aladdin.txt deleted file mode 100644 index 45c59ce68c5..00000000000 --- a/res/cardsfolder/aladdin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aladdin -ManaCost:2 R R -Types:Creature Human Rogue -Text:no text -PT:1/1 -A:AB$ GainControl | Cost$ 1 R R T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | LoseControl$ LeavesPlay,LoseControl | SpellDescription$ Gain control of target artifact for as long as you control CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aladdin.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aladdins_ring.txt b/res/cardsfolder/aladdins_ring.txt deleted file mode 100644 index d8333731568..00000000000 --- a/res/cardsfolder/aladdins_ring.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Aladdin's Ring -ManaCost:8 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 8 T | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aladdins_ring.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/291.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/286.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/346.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/310.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/286.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/271.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/232.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alarum.txt b/res/cardsfolder/alarum.txt deleted file mode 100644 index 9f423358619..00000000000 --- a/res/cardsfolder/alarum.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alarum -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.notattacking | TgtPrompt$ Select target nonattacking creature | NumAtt$ +1 | NumDef$ +3 | SubAbility$ SVar=DBUntap | SpellDescription$ Untap target nonattacking creature. It gets +1/+3 until end of turn. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alarum.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/albino_troll.txt b/res/cardsfolder/albino_troll.txt deleted file mode 100644 index f34c60a428d..00000000000 --- a/res/cardsfolder/albino_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Albino Troll -ManaCost:1 G -Types:Creature Troll -Text:no text -PT:3/3 -K:Echo:1 G -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/albino_troll.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alert_shu_infantry.txt b/res/cardsfolder/alert_shu_infantry.txt deleted file mode 100644 index c4c20dcdeee..00000000000 --- a/res/cardsfolder/alert_shu_infantry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Alert Shu Infantry -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10487.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alexi_zephyr_mage.txt b/res/cardsfolder/alexi_zephyr_mage.txt deleted file mode 100644 index 66109e6744d..00000000000 --- a/res/cardsfolder/alexi_zephyr_mage.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Alexi, Zephyr Mage -ManaCost:3 U U -Types:Legendary Creature Human Spellshaper -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ X U T Discard<2/Card> | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Return X target creatures to their owners' hands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/alexi_zephyr_mage.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alexis_cloak.txt b/res/cardsfolder/alexis_cloak.txt deleted file mode 100644 index 0a390862660..00000000000 --- a/res/cardsfolder/alexis_cloak.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Alexi's Cloak -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alexis_cloak.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/algae_gharial.txt b/res/cardsfolder/algae_gharial.txt deleted file mode 100644 index 17a161cc411..00000000000 --- a/res/cardsfolder/algae_gharial.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Algae Gharial -ManaCost:3 G -Types:Creature Crocodile -Text:no text -PT:1/1 -K:Shroud -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Creature.Other | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/algae_gharial.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ali_baba.txt b/res/cardsfolder/ali_baba.txt deleted file mode 100644 index ceb4e75b34e..00000000000 --- a/res/cardsfolder/ali_baba.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ali Baba -ManaCost:R -Types:Creature Human Rogue -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ R | ValidTgts$ Wall | TgtPrompt$ Select target wall | SpellDescription$ Tap target wall. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ali_baba.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/193.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/43.jpg -End diff --git a/res/cardsfolder/ali_from_cairo.txt b/res/cardsfolder/ali_from_cairo.txt deleted file mode 100644 index 9c47a47a099..00000000000 --- a/res/cardsfolder/ali_from_cairo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ali from Cairo -ManaCost:2 R R -Types:Creature Human -Text:no text -PT:0/1 -K:Damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ali_from_cairo.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alibans_tower.txt b/res/cardsfolder/alibans_tower.txt deleted file mode 100644 index 42d11353102..00000000000 --- a/res/cardsfolder/alibans_tower.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Aliban's Tower -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature.blocking | TgtPrompt$ Select target blocking creature | NumAtt$ +3 | NumDef$ +1 | SpellDescription$ Target blocking creature gets +3/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alibans_tower.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/76.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/all_hallows_eve.txt b/res/cardsfolder/all_hallows_eve.txt deleted file mode 100644 index 0236f368c97..00000000000 --- a/res/cardsfolder/all_hallows_eve.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:All Hallow's Eve -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B B | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBPutCounter | SpellDescription$ Exile CARDNAME with two scream counters on it. At the beginning of your upkeep, if CARDNAME 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. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+countersGE1SCREAM | PresentZone$ Exile | Execute$ TrigRemoveCounter | TriggerZones$ Exile | TriggerDescription$ Remove scream counter from CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self+countersEQ0SCREAM | PresentZone$ Exile | Execute$ TrigMoveToGraveyard | TriggerZones$ Exile | Secondary$ True | TriggerDescription$ Put CARDNAME into your graveyard and return all creatures to the battlefield. -SVar:TrigRemoveCounter:AB$ RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ SCREAM | CounterNum$ 1 -SVar:TrigMoveToGraveyard:AB$ ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Graveyard | Defined$ Self | SubAbility$ SVar=DBResurrection -SVar:DBResurrection:DB$ChangeZoneAll | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature -SVar:DBPutCounter:DB$PutCounter | CounterType$ SCREAM | CounterNum$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/all_hallows_eve.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/all_is_dust.txt b/res/cardsfolder/all_is_dust.txt deleted file mode 100644 index 559efa55a86..00000000000 --- a/res/cardsfolder/all_is_dust.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:All Is Dust -ManaCost:7 -Types:Tribal Sorcery Eldrazi -Text:Each player sacrifices all colored permanents he or she controls. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/all_is_dust.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/all_suns_dawn.txt b/res/cardsfolder/all_suns_dawn.txt deleted file mode 100644 index 82ce5d6abdd..00000000000 --- a/res/cardsfolder/all_suns_dawn.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:All Suns' Dawn -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target white card in your graveyard | ValidTgts$ Card.White+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ SVar=ReturnU | SpellDescription$ Return target white card from your graveyard to your hand. -SVar:ReturnU:DB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target blue card in your graveyard | ValidTgts$ Card.Blue+YouCtrl | TargetMin$ 0 | TargetMax$ 1 |SubAbility$ SVar=ReturnB | SpellDescription$ Return target blue card from your graveyard to your hand. -SVar:ReturnB:DB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target black card in your graveyard | ValidTgts$ Card.Black+YouCtrl |TargetMin$ 0 | TargetMax$ 1 | SubAbility$ SVar=ReturnR | SpellDescription$ Return target black card from your graveyard to your hand. -SVar:ReturnR:DB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target red card in your graveyard | ValidTgts$ Card.Red+YouCtrl |TargetMin$ 0 | TargetMax$ 1 | SubAbility$ SVar=ReturnG | SpellDescription$ Return target red card from your graveyard to your hand. -SVar:ReturnG:DB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target green card in your graveyard | ValidTgts$ Card.Green+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ SVar=DBExile | SpellDescription$ Return target green card from your graveyard to your hand. -SVar:DBExile:DB$ChangeZone | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/all_suns_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/allay.txt b/res/cardsfolder/allay.txt deleted file mode 100644 index 6adae3379bd..00000000000 --- a/res/cardsfolder/allay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Allay -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/allay.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/1.jpg -End diff --git a/res/cardsfolder/alley_grifters.txt b/res/cardsfolder/alley_grifters.txt deleted file mode 100644 index ad060852ba8..00000000000 --- a/res/cardsfolder/alley_grifters.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Alley Grifters -ManaCost:1 B B -Types:Creature Human Mercenary -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alley_grifters.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/allied_strategies.txt b/res/cardsfolder/allied_strategies.txt deleted file mode 100644 index 2f2aa53518b..00000000000 --- a/res/cardsfolder/allied_strategies.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Allied Strategies -ManaCost:4 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 4 U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Domain - Target player draws a card for each basic land type among lands he or she controls. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ps/en-us/card26383.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/allosaurus_rider.txt b/res/cardsfolder/allosaurus_rider.txt deleted file mode 100644 index 4c579e3c9a2..00000000000 --- a/res/cardsfolder/allosaurus_rider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Allosaurus Rider -ManaCost:5 G G -Types:Creature Elf Warrior -Text:no text -PT:1+*/1+* -K:stSetPT:Count$Valid Land.YouCtrl/Plus.1:Count$Valid Land.YouCtrl/Plus.1:CARDNAME's power and toughness are each equal to 1 plus the number of lands you control. -SVar:AltCost:ExileFromHand<2/Card.Green>$You may exile two green cards from your hand rather than pay CARDNAME's mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/allosaurus_rider.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alloy_myr.txt b/res/cardsfolder/alloy_myr.txt deleted file mode 100644 index 70840fa861d..00000000000 --- a/res/cardsfolder/alloy_myr.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Alloy Myr -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/alloy_myr.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alluring_scent.txt b/res/cardsfolder/alluring_scent.txt deleted file mode 100644 index d49cc8bca93..00000000000 --- a/res/cardsfolder/alluring_scent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Alluring Scent -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/alluring_scent.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/80.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/124.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alluring_siren.txt b/res/cardsfolder/alluring_siren.txt deleted file mode 100644 index 715909c30da..00000000000 --- a/res/cardsfolder/alluring_siren.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Alluring Siren -ManaCost:1 U -Types:Creature Siren -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.YouDontCtrl | KW$ HIDDEN CARDNAME attacks each turn if able. | TgtPrompt$ Choose target creature opponent controls. | SpellDescription$ Target creature an opponent controls attacks you this turn if able. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/alluring_siren.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/43.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alpha_kavu.txt b/res/cardsfolder/alpha_kavu.txt deleted file mode 100644 index d3020573273..00000000000 --- a/res/cardsfolder/alpha_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Alpha Kavu -ManaCost:2 G -Types:Creature Kavu -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 G | NumAtt$ -1 | NumDef$ +1 | ValidTgts$ Creature.Kavu | TgtPrompt$ Select target Kavu creature | SpellDescription$ Target Kavu creature gets -1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/alpha_kavu.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alpha_myr.txt b/res/cardsfolder/alpha_myr.txt deleted file mode 100644 index 0cec4a3a086..00000000000 --- a/res/cardsfolder/alpha_myr.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Alpha Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card49045.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/alpha_tyrranax.txt b/res/cardsfolder/alpha_tyrranax.txt deleted file mode 100644 index fd2ccd1e6c7..00000000000 --- a/res/cardsfolder/alpha_tyrranax.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Alpha Tyrranax -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:6/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/alpha_tyrranax.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/altar_golem.txt b/res/cardsfolder/altar_golem.txt deleted file mode 100644 index ff72357d44a..00000000000 --- a/res/cardsfolder/altar_golem.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Altar Golem -ManaCost:7 -Types:Artifact Creature Golem -Text:no text -PT:0/1 -K:Trample -K:CARDNAME doesn't untap during your untap step. -K:stSetPT:Count$TypeOnBattlefield.Creature:Count$TypeOnBattlefield.Creature:Altar Golem's power and toughness are each equal to the number of creatures on the battlefield. -A:AB$ Untap | Cost$ tapXType<5/Creature> | SpellDescription$ Untap CARDNAME. -SVar:BuffedBy:Creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_golem.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/altar_of_bone.txt b/res/cardsfolder/altar_of_bone.txt deleted file mode 100644 index 7d22faa3c74..00000000000 --- a/res/cardsfolder/altar_of_bone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Altar of Bone -ManaCost:G W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G W Sac<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_of_bone.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/359.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/altar_of_dementia.txt b/res/cardsfolder/altar_of_dementia.txt deleted file mode 100644 index 12e6728c608..00000000000 --- a/res/cardsfolder/altar_of_dementia.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Altar of Dementia -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ Sac<1/Creature> | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ 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. -SVar:X:Sacrificed$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_of_dementia.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/altar_of_shadows.txt b/res/cardsfolder/altar_of_shadows.txt deleted file mode 100644 index 0cb3f219675..00000000000 --- a/res/cardsfolder/altar_of_shadows.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Altar of Shadows -ManaCost:7 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGetMana | TriggerDescription$ At the beginning of your precombat main phase, add B to your mana pool for each charge counter on CARDNAME. -SVar:TrigGetMana:AB$ Mana | Cost$ 0 | Produced$ B | Amount$ X | SpellDescription$ Add X B to your mana pool -A:AB$ Destroy | Cost$ 7 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBPutCounter | SpellDescription$ Destroy target creature. Then put a charge counter on CARDNAME. -SVar:DBPutCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/altar_of_shadows.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/altars_light.txt b/res/cardsfolder/altars_light.txt deleted file mode 100644 index 1df7f082236..00000000000 --- a/res/cardsfolder/altars_light.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Altar's Light -ManaCost:2 W W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 W W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact or enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/altars_light.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aluren.txt b/res/cardsfolder/aluren.txt deleted file mode 100644 index 63b5f80782f..00000000000 --- a/res/cardsfolder/aluren.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Aluren -ManaCost:2 G G -Types:Enchantment -Text:no text -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aluren.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ambassador_laquatus.txt b/res/cardsfolder/ambassador_laquatus.txt deleted file mode 100644 index 55953c04337..00000000000 --- a/res/cardsfolder/ambassador_laquatus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ambassador Laquatus -ManaCost:1 U U -Types:Legendary Creature Merfolk Wizard -Text:no text -PT:1/3 -A:AB$ Mill | Cost$ 3 | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top three cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambassador_laquatus.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/23.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ambassador_oak.txt b/res/cardsfolder/ambassador_oak.txt deleted file mode 100644 index b05a47ebca2..00000000000 --- a/res/cardsfolder/ambassador_oak.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ambassador Oak -ManaCost:3 G -Types:Creature Treefolk Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambassador_oak.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ambitions_cost.txt b/res/cardsfolder/ambitions_cost.txt deleted file mode 100644 index e8d874639d8..00000000000 --- a/res/cardsfolder/ambitions_cost.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ambition's Cost -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 B | NumCards$ 3 | SpellDescription$ You draw three cards and you lose 3 life. | SubAbility$ SVar=DB -SVar:DB:DB$LoseLife | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambitions_cost.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ambush.txt b/res/cardsfolder/ambush.txt deleted file mode 100644 index e4bc8a56c56..00000000000 --- a/res/cardsfolder/ambush.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ambush -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 3 R | ValidCards$ Creature.blocking | KW$ First Strike | SpellDescription$ Blocking creatures gain first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambush.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/78.jpg -End - diff --git a/res/cardsfolder/ambush_commander.txt b/res/cardsfolder/ambush_commander.txt deleted file mode 100644 index dd15a8c169c..00000000000 --- a/res/cardsfolder/ambush_commander.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ambush Commander -ManaCost:3 G G -Types:Creature Elf -Text:no text -PT:2/2 -K:stAnimateAll:Forest.YouCtrl:1/1:Creature,Elf:Green,Overwrite:No Abilities:No Condition:Forests you control are 1/1 green Elf creatures that are still lands. -A:AB$Pump | Cost$ 1 G Sac<1/Elf> | Tgt$ TgtC | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambush_commander.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ambush_party.txt b/res/cardsfolder/ambush_party.txt deleted file mode 100644 index e891fecdf6f..00000000000 --- a/res/cardsfolder/ambush_party.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ambush Party -ManaCost:4 R -Types:Creature Human Rogue -Text:no text -PT:3/1 -K:First Strike -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ambush_party.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/79.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amnesia.txt b/res/cardsfolder/amnesia.txt deleted file mode 100644 index 2392e19097b..00000000000 --- a/res/cardsfolder/amnesia.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Amnesia -ManaCost:3 U U U -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 U U U | ValidTgts$ Player | Mode$ RevealDiscardAll | DiscardValid$ Card.nonLand | SpellDescription$ Target player reveals his or her hand and discards all nonland cards. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/dk/en-us/card1746.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amok.txt b/res/cardsfolder/amok.txt deleted file mode 100644 index f5797999407..00000000000 --- a/res/cardsfolder/amok.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Amok -ManaCost:1 R -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ 1 Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Rare -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/amok.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amphibious_kavu.txt b/res/cardsfolder/amphibious_kavu.txt deleted file mode 100644 index 7b6a3d0470a..00000000000 --- a/res/cardsfolder/amphibious_kavu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Amphibious Kavu -ManaCost:2 G -Types:Creature Kavu -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.Blue,Creature.Black | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more blue and/or black creatures, CARDNAME gets +3/+3 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.Blue,Creature.Black | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more blue and/or black creatures, CARDNAME gets +3/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 | NumDef$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/amphibious_kavu.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amrou_kithkin.txt b/res/cardsfolder/amrou_kithkin.txt deleted file mode 100644 index 23f97805c70..00000000000 --- a/res/cardsfolder/amrou_kithkin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Amrou Kithkin -ManaCost:W W -Types:Creature Kithkin -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by creatures with power 3 or greater. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/amrou_kithkin.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/252.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amrou_scout.txt b/res/cardsfolder/amrou_scout.txt deleted file mode 100644 index d41ca209db5..00000000000 --- a/res/cardsfolder/amrou_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Amrou Scout -ManaCost:1 W -Types:Creature Kithkin Rebel Scout -Text:no text -PT:2/1 -K:SearchRebel:4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/amrou_scout.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amrou_seekers.txt b/res/cardsfolder/amrou_seekers.txt deleted file mode 100644 index a384ee7133c..00000000000 --- a/res/cardsfolder/amrou_seekers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Amrou Seekers -ManaCost:2 W -Types:Creature Kithkin Rebel -Text:CARDNAME can't be blocked except by artifact creatures and/or white creatures. -PT:2/2 -K:CantBeBlockedBy Creature.nonArtifact+nonWhite -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/amrou_seekers.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amugaba.txt b/res/cardsfolder/amugaba.txt deleted file mode 100644 index 0e3df25f2ad..00000000000 --- a/res/cardsfolder/amugaba.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Amugaba -ManaCost:5 U U -Types:Creature Illusion -Text:no text -PT:6/6 -K:Flying -A:AB$ ChangeZone | Cost$ 2 U Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/amugaba.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amulet_of_kroog.txt b/res/cardsfolder/amulet_of_kroog.txt deleted file mode 100644 index 42f090200a4..00000000000 --- a/res/cardsfolder/amulet_of_kroog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Amulet of Kroog -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PreventDamage | Cost$ 2 T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/amulet_of_kroog.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/347.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/311.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amulet_of_unmaking.txt b/res/cardsfolder/amulet_of_unmaking.txt deleted file mode 100644 index 9f01f72bf68..00000000000 --- a/res/cardsfolder/amulet_of_unmaking.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Amulet of Unmaking -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 5 T Exile<1/CARDNAME> | ValidTgts$ Artifact,Creature,Land | SorcerySpeed$ True | TgtPrompt$ Select target artifact, creature, or land | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact, creature, or land. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/amulet_of_unmaking.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/amulet_of_vigor.txt b/res/cardsfolder/amulet_of_vigor.txt deleted file mode 100644 index 8c10ec783d8..00000000000 --- a/res/cardsfolder/amulet_of_vigor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Amulet of Vigor -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.tapped+YouCtrl | Execute$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent enters the battlefield tapped and under your control, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ TriggeredCard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/amulet_of_vigor.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/an_havva_constable.txt b/res/cardsfolder/an_havva_constable.txt deleted file mode 100644 index 2cc5bc560b5..00000000000 --- a/res/cardsfolder/an_havva_constable.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:An-Havva Constable -ManaCost:1 G G -Types:Creature Human -Text:no text -PT:2/1+* -K:stSetPT:2:Count$Valid Creature.Green/Plus.1:CARDNAME's toughness is equal to 1 plus the number of green creatures on the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/an_havva_constable.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/51.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/an_havva_inn.txt b/res/cardsfolder/an_havva_inn.txt deleted file mode 100644 index 21080608845..00000000000 --- a/res/cardsfolder/an_havva_inn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:An-Havva Inn -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 1 G G | LifeAmount$ X | SpellDescription$ You gain X plus 1 life, where X is the number of green creatures on the battlefield. -SVar:X:Count$GreenTypeOnBattlefield.Creature/Plus.1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/an_havva_inn.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/52.jpg -End diff --git a/res/cardsfolder/an_havva_township.txt b/res/cardsfolder/an_havva_township.txt deleted file mode 100644 index bd6fa904d63..00000000000 --- a/res/cardsfolder/an_havva_township.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:An-Havva Township -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/an_havva_township.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/an_zerrin_ruins.txt b/res/cardsfolder/an_zerrin_ruins.txt deleted file mode 100644 index f99bea3566a..00000000000 --- a/res/cardsfolder/an_zerrin_ruins.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:An-Zerrin Ruins -ManaCost:2 R R -Types:Enchantment -Text:As An-Zerrin Ruins enters the battlefield, choose a creature type.\r\nCreatures of the chosen type don't untap during their controllers' untap steps. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/an_zerrin_ruins.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ana_disciple.txt b/res/cardsfolder/ana_disciple.txt deleted file mode 100644 index f23607ed290..00000000000 --- a/res/cardsfolder/ana_disciple.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ana Disciple -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -A:AB$ Pump | Cost$ B T | NumAtt$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ana_disciple.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anaba_ancestor.txt b/res/cardsfolder/anaba_ancestor.txt deleted file mode 100644 index 68bc3a58703..00000000000 --- a/res/cardsfolder/anaba_ancestor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Anaba Ancestor -ManaCost:1 R -Types:Creature Minotaur Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | NumAtt$ +1 | NumDef$ +1 | ValidTgts$ Creature.Minotaur+Other | TgtPrompt$ Select another target Minotaur creature | SpellDescription$ Another target Minotaur creature gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anaba_ancestor.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anaba_bodyguard.txt b/res/cardsfolder/anaba_bodyguard.txt deleted file mode 100644 index fc18c6bcb46..00000000000 --- a/res/cardsfolder/anaba_bodyguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Anaba Bodyguard -ManaCost:3 R -Types:Creature Minotaur -Text:no text -PT:2/3 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/anaba_bodyguard.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/82.jpg|2 -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/164.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anaba_shaman.txt b/res/cardsfolder/anaba_shaman.txt deleted file mode 100644 index 86dce3bd37d..00000000000 --- a/res/cardsfolder/anaba_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Anaba Shaman -ManaCost:3 R -Types:Creature Minotaur Shaman -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ R T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/anaba_shaman.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/84.jpg|2 -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/175.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/165.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anaba_spirit_crafter.txt b/res/cardsfolder/anaba_spirit_crafter.txt deleted file mode 100644 index a7615729c58..00000000000 --- a/res/cardsfolder/anaba_spirit_crafter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anaba Spirit Crafter -ManaCost:2 R R -Types:Creature Minotaur Shaman -Text:no text -PT:1/3 -K:stPumpAll:Creature.Minotaur:1/0:No Condition:Minotaur creatures get +1/+0. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anaba_spirit_crafter.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anaconda.txt b/res/cardsfolder/anaconda.txt deleted file mode 100644 index 1c040d501d2..00000000000 --- a/res/cardsfolder/anaconda.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Anaconda -ManaCost:3 G -Types:Creature Snake -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83276.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/232.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/81.jpg|2 -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/229.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anarchist.txt b/res/cardsfolder/anarchist.txt deleted file mode 100644 index 5ae38a06592..00000000000 --- a/res/cardsfolder/anarchist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Anarchist -ManaCost:4 R -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target sorcery card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Sorcery.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84072.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/79.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/173.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anarchy.txt b/res/cardsfolder/anarchy.txt deleted file mode 100644 index 0906f45dd65..00000000000 --- a/res/cardsfolder/anarchy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anarchy -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 R R | ValidCards$ Permanent.White | SpellDescription$ Destroy all white permanents. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/anarchy.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/170.jpg -End diff --git a/res/cardsfolder/ancestors_chosen.txt b/res/cardsfolder/ancestors_chosen.txt deleted file mode 100644 index 9b66e479f1f..00000000000 --- a/res/cardsfolder/ancestors_chosen.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ancestor's Chosen -ManaCost:5 W W -Types:Creature Human Cleric -Text:no text -PT:4/4 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life for each card in your graveyard. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$InYourYard -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestors_chosen.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/1.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestors_prophet.txt b/res/cardsfolder/ancestors_prophet.txt deleted file mode 100644 index 492400332e0..00000000000 --- a/res/cardsfolder/ancestors_prophet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancestor's Prophet -ManaCost:4 W -Types:Creature Human Cleric -Text:no text -PT:1/5 -A:AB$ GainLife | Cost$ tapXType<5/Cleric> | LifeAmount$ 10 | SpellDescription$ You gain 10 life. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestors_prophet.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestral_mask.txt b/res/cardsfolder/ancestral_mask.txt deleted file mode 100644 index 0058baad5fa..00000000000 --- a/res/cardsfolder/ancestral_mask.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ancestral Mask -ManaCost:2 G -Types:Enchantment Aura -Text:Enchanted creature gets +2/+2 for each other enchantment on the battlefield. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$Valid Enchantment.Other/Times.2 -SVar:RemRandomDeck:True -SVar:BuffedBy:Enchantment -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_mask.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestral_memories.txt b/res/cardsfolder/ancestral_memories.txt deleted file mode 100644 index 5bcfa566242..00000000000 --- a/res/cardsfolder/ancestral_memories.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ancestral Memories -ManaCost:2 U U U -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 2 U U U | DigNum$ 7 | ChangeNum$ 2 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top seven cards of your library. Put two of them into your hand and the rest into your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_memories.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/57.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/52.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/41.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestral_recall.txt b/res/cardsfolder/ancestral_recall.txt deleted file mode 100644 index 4d8b4c6a6be..00000000000 --- a/res/cardsfolder/ancestral_recall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancestral Recall -ManaCost:U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player draws three cards. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card692.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/48.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/48.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestral_tribute.txt b/res/cardsfolder/ancestral_tribute.txt deleted file mode 100644 index a364b74c7fb..00000000000 --- a/res/cardsfolder/ancestral_tribute.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancestral Tribute -ManaCost:5 W W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 5 W W | LifeAmount$ X | SpellDescription$ You gain 2 life for each card in your graveyard. -A:SP$ GainLife | Cost$ 9 W W W | LifeAmount$ X | Flashback$ True | CostDesc$ Flashback 9 W W W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:X:Count$InYourYard/Times.2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_tribute.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancestral_vision.txt b/res/cardsfolder/ancestral_vision.txt deleted file mode 100644 index 53790751969..00000000000 --- a/res/cardsfolder/ancestral_vision.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ancestral Vision -ManaCost:no cost -Types:Sorcery -Text:no text -K:CARDNAME is blue. -K:Suspend:4:U -A:SP$ Draw | Cost$ 0 | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws three cards. | ActivationLimit$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancestral_vision.jpg -SVar:RemAIDeck:True -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_amphitheater.txt b/res/cardsfolder/ancient_amphitheater.txt deleted file mode 100644 index da4dc4927c4..00000000000 --- a/res/cardsfolder/ancient_amphitheater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ancient Amphitheater -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal a Giant card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_amphitheater.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_craving.txt b/res/cardsfolder/ancient_craving.txt deleted file mode 100644 index 5dc878a1cf2..00000000000 --- a/res/cardsfolder/ancient_craving.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ancient Craving -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 B | NumCards$ 3 | SpellDescription$ You draw three cards and you lose 3 life. | SubAbility$ SVar=DB -SVar:DB:DB$LoseLife | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/ancient_craving.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_den.txt b/res/cardsfolder/ancient_den.txt deleted file mode 100644 index aa3d97aa0e2..00000000000 --- a/res/cardsfolder/ancient_den.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ancient Den -ManaCost:no cost -Types:Artifact Land -Text:(Ancient Den isn't a spell.) -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_den.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_grudge.txt b/res/cardsfolder/ancient_grudge.txt deleted file mode 100644 index 589b32a3181..00000000000 --- a/res/cardsfolder/ancient_grudge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ancient Grudge -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Destroy target artifact. -A:SP$ Destroy | Cost$ G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | Flashback$ True | CostDesc$ Flashback G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_grudge.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_hellkite.txt b/res/cardsfolder/ancient_hellkite.txt deleted file mode 100644 index a8d67fbba33..00000000000 --- a/res/cardsfolder/ancient_hellkite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ancient Hellkite -ManaCost:4 R R R -Types:Creature Dragon -PT:6/6 -K:Flying -A:AB$ DealDamage | Cost$ R | ValidTgts$ Creature.YouDontCtrl | NumDmg$ 1 | IsPresent$ Card.Self+attacking | SpellDescription$ CARDNAME deals 1 damage to target creature defending player controls. Activate this ability only if CARDNAME is attacking. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_hellkite.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_hydra.txt b/res/cardsfolder/ancient_hydra.txt deleted file mode 100644 index b3ffe020310..00000000000 --- a/res/cardsfolder/ancient_hydra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancient Hydra -ManaCost:4 R -Types:Creature Hydra -Text:no text -PT:5/1 -K:Fading:5 -A:AB$ DealDamage | Cost$ 1 SubCounter<1/FADE> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_hydra.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_runes.txt b/res/cardsfolder/ancient_runes.txt deleted file mode 100644 index db1608fc4e5..00000000000 --- a/res/cardsfolder/ancient_runes.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Ancient Runes -ManaCost:2 R -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDamageYou | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of artifacts he or she controls. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | Execute$ TrigDamageOpp | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of artifacts he or she controls. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ X -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ Y -SVar:X:Count$Valid Artifact.YouCtrl -SVar:Y:Count$Valid Artifact.YouDontCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_runes.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_silverback.txt b/res/cardsfolder/ancient_silverback.txt deleted file mode 100644 index 719d7fa1f49..00000000000 --- a/res/cardsfolder/ancient_silverback.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ancient Silverback -ManaCost:4 G G -Types:Creature Ape -Text:no text -PT:6/5 -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82950.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/101.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/230.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_spider.txt b/res/cardsfolder/ancient_spider.txt deleted file mode 100644 index d205abbd61c..00000000000 --- a/res/cardsfolder/ancient_spider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancient Spider -ManaCost:2 G W -Types:Creature Spider -Text:no text -PT:2/5 -K:First Strike -K:Reach -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_spider.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_spring.txt b/res/cardsfolder/ancient_spring.txt deleted file mode 100644 index 95f88a6fca2..00000000000 --- a/res/cardsfolder/ancient_spring.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ancient Spring -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W B | SpellDescription$ Add W B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_spring.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_stirrings.txt b/res/cardsfolder/ancient_stirrings.txt deleted file mode 100644 index 534ed08801b..00000000000 --- a/res/cardsfolder/ancient_stirrings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ancient Stirrings -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ G | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.Colorless | SpellDescription$ 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.) -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_stirrings.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ancient_tomb.txt b/res/cardsfolder/ancient_tomb.txt deleted file mode 100644 index ceb02a7e19f..00000000000 --- a/res/cardsfolder/ancient_tomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ancient Tomb -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SubAbility$ SVar=DBPain | SpellDescription$ Add 2 to your mana pool. CARDNAME deals 2 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 2 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ancient_tomb.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/andradite_leech.txt b/res/cardsfolder/andradite_leech.txt deleted file mode 100644 index 0dcdeadf194..00000000000 --- a/res/cardsfolder/andradite_leech.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Andradite Leech -ManaCost:2 B -Types:Creature Leech -Text:Black spells you cast cost B more to cast. -PT:2/2 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -K:CostChange:Player:More:B:Spell:black:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/andradite_leech.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/93.jpg -End diff --git a/res/cardsfolder/angel_of_despair.txt b/res/cardsfolder/angel_of_despair.txt deleted file mode 100644 index 447003af6a8..00000000000 --- a/res/cardsfolder/angel_of_despair.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Angel of Despair -ManaCost:3 W W B B -Types:Creature Angel -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target permanent. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Permanent | TgtPrompt$ Select target permanent. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card83869.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angel_of_fury.txt b/res/cardsfolder/angel_of_fury.txt deleted file mode 100644 index 0fea57a4cd1..00000000000 --- a/res/cardsfolder/angel_of_fury.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angel of Fury -ManaCost:4 W W -Types:Creature Angel -PT:3/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ If CARDNAME is put into your graveyard from the battlefield, you may shuffle it into your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angel_of_fury.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angel_of_light.txt b/res/cardsfolder/angel_of_light.txt deleted file mode 100644 index 41ea1d0ba83..00000000000 --- a/res/cardsfolder/angel_of_light.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angel of Light -ManaCost:4 W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20391.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angel_of_mercy.txt b/res/cardsfolder/angel_of_mercy.txt deleted file mode 100644 index 4105d4e7f81..00000000000 --- a/res/cardsfolder/angel_of_mercy.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Angel of Mercy -ManaCost:4 W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82992.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/1.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/2.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/1.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/2.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/128.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angel_of_retribution.txt b/res/cardsfolder/angel_of_retribution.txt deleted file mode 100644 index 240fe1988ae..00000000000 --- a/res/cardsfolder/angel_of_retribution.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angel of Retribution -ManaCost:6 W -Types:Creature Angel -Text:no text -PT:5/5 -K:Flying -K:First Strike -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angel_of_retribution.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelfire_crusader.txt b/res/cardsfolder/angelfire_crusader.txt deleted file mode 100644 index 4ee1b8f3192..00000000000 --- a/res/cardsfolder/angelfire_crusader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Angelfire Crusader -ManaCost:3 W -Types:Creature Human Soldier Knight -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card21253.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/1.jpg -End diff --git a/res/cardsfolder/angelheart_vial.txt b/res/cardsfolder/angelheart_vial.txt deleted file mode 100644 index 1caa281513e..00000000000 --- a/res/cardsfolder/angelheart_vial.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Angelheart Vial -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 2 T SubCounter<4/CHARGE> | Defined$ You | LifeAmount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ You gain 2 life and draw a card. -T:Mode$ DamageDone | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you're dealt damage, you may put that many charge counters on CARDNAME. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelheart_vial.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_benediction.txt b/res/cardsfolder/angelic_benediction.txt deleted file mode 100644 index 816740b44a6..00000000000 --- a/res/cardsfolder/angelic_benediction.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angelic Benediction -ManaCost:3 W -Types:Enchantment -Text:no text -K:Exalted -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ Whenever a creature you control attacks alone, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_benediction.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_blessing.txt b/res/cardsfolder/angelic_blessing.txt deleted file mode 100644 index af3abac13ad..00000000000 --- a/res/cardsfolder/angelic_blessing.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Angelic Blessing -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ Flying | SpellDescription$ Target creature gets +3/+3 and gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4370.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/2.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/164.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/2.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/3.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/129.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_chorus.txt b/res/cardsfolder/angelic_chorus.txt deleted file mode 100644 index 7ba73c657c9..00000000000 --- a/res/cardsfolder/angelic_chorus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Angelic Chorus -ManaCost:3 W W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you gain life equal to its toughness. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggeredCard$CardToughness -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_chorus.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/3.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_curator.txt b/res/cardsfolder/angelic_curator.txt deleted file mode 100644 index 6a14b21ad15..00000000000 --- a/res/cardsfolder/angelic_curator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angelic Curator -ManaCost:1 W -Types:Creature Angel Spirit -Text:no text -PT:1/1 -K:Flying -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_curator.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_favor.txt b/res/cardsfolder/angelic_favor.txt deleted file mode 100755 index 304bff8790f..00000000000 --- a/res/cardsfolder/angelic_favor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angelic Favor -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ Token | Cost$ tapXType<1/Creature> | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying<>At the beginning of the end step, exile CARDNAME. | ActivatingPhases$ BeginCombat->EndCombat | IsPresent$ Plains.YouCtrl | CostDesc$ If you control a Plains, | SpellDescription$ you may tap an untapped creature you control rather than pay CARDNAME's mana cost. -A:SP$ Token | Cost$ 3 W | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying<>At the beginning of the end step, exile CARDNAME. | ActivatingPhases$ BeginCombat->EndCombat | SpellDescription$ Cast CARDNAME 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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_favor.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_page.txt b/res/cardsfolder/angelic_page.txt deleted file mode 100644 index d45664839df..00000000000 --- a/res/cardsfolder/angelic_page.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Angelic Page -ManaCost:1 W -Types:Creature Angel Spirit -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ T | NumAtt$ +1 | NumDef$ +1 | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | SpellDescription$ Target attacking or blocking creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_page.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/2.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/4.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_protector.txt b/res/cardsfolder/angelic_protector.txt deleted file mode 100644 index 1172f07f8cd..00000000000 --- a/res/cardsfolder/angelic_protector.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Angelic Protector -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, it gets +0/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_protector.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_renewal.txt b/res/cardsfolder/angelic_renewal.txt deleted file mode 100644 index ebedcff20c3..00000000000 --- a/res/cardsfolder/angelic_renewal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Angelic Renewal -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouOwn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, you may sacrifice CARDNAME. If you do, return that card to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ Sac<1/CARDNAME> | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_renewal.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_shield.txt b/res/cardsfolder/angelic_shield.txt deleted file mode 100644 index e5d5ec27192..00000000000 --- a/res/cardsfolder/angelic_shield.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Angelic Shield -ManaCost:W U -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/1:No Condition:Creatures you control get +0/+1. -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_shield.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_voices.txt b/res/cardsfolder/angelic_voices.txt deleted file mode 100644 index d78bfd4def0..00000000000 --- a/res/cardsfolder/angelic_voices.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Angelic Voices -ManaCost:2 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:1/1:isNotPresent Creature.nonWhite+nonArtifact+YouCtrl:Creatures you control get +1/+1 as long as you control no nonartifact, nonwhite creatures. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_voices.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angelic_wall.txt b/res/cardsfolder/angelic_wall.txt deleted file mode 100644 index 06a86dae552..00000000000 --- a/res/cardsfolder/angelic_wall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Angelic Wall -ManaCost:1 W -Types:Creature Wall -Text:no text -PT:0/4 -K:Flying -K:Defender -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129671.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/130.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/3.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angels_feather.txt b/res/cardsfolder/angels_feather.txt deleted file mode 100644 index 41fb04c930a..00000000000 --- a/res/cardsfolder/angels_feather.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Angel's Feather -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_feather.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/201.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/206.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/92.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/287.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angels_grace.txt b/res/cardsfolder/angels_grace.txt deleted file mode 100644 index 6eccfb7030b..00000000000 --- a/res/cardsfolder/angels_grace.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Angel's Grace -ManaCost:W -Types:Instant -Text:no text -K:Split second -A:SP$ Effect | Cost$ W | Name$ Angel's Grace Effect | Keywords$ CantLose,OppsCantWin,AliFromCairo | SpellDescription$ 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. -SVar:CantLose:You can't lose the game. -SVar:OppsCantWin:Your opponents can't win the game. -SVar:AliFromCairo:Damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_grace.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angels_mercy.txt b/res/cardsfolder/angels_mercy.txt deleted file mode 100644 index 73fe6b034fb..00000000000 --- a/res/cardsfolder/angels_mercy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Angel's Mercy -ManaCost:2 W W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 2 W W | LifeAmount$ 7 | SpellDescription$ You gain 7 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/angels_mercy.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/2.jpg -End diff --git a/res/cardsfolder/angelsong.txt b/res/cardsfolder/angelsong.txt deleted file mode 100644 index 87a0db208c3..00000000000 --- a/res/cardsfolder/angelsong.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Angelsong -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 W | SpellDescription$ Prevent all combat damage that would be dealt this turn. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelsong.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/4.jpg -End diff --git a/res/cardsfolder/anger.txt b/res/cardsfolder/anger.txt deleted file mode 100644 index 46295e2ce19..00000000000 --- a/res/cardsfolder/anger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anger -ManaCost:3 R -Types:Creature Incarnation -Text:As long as Anger is in your graveyard and you control a Mountain, creatures you control have Haste. -PT:2/2 -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/jud/en-us/card33717.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angry_mob.txt b/res/cardsfolder/angry_mob.txt deleted file mode 100644 index 70edd4c2ce7..00000000000 --- a/res/cardsfolder/angry_mob.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Angry Mob -ManaCost:2 W W -Types:Creature Human -Text:no text -PT:2+*/2+* -K:Trample -K:stSetPT:2:2:isYourTurn:Count$NumTypeOppCtrl.Swamp/Plus.2:Count$NumTypeOppCtrl.Swamp/Plus.2: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. -SVar:BuffedBy:Swamp -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/angry_mob.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/280.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/74.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/angus_mackenzie.txt b/res/cardsfolder/angus_mackenzie.txt deleted file mode 100644 index ab7a1b331b8..00000000000 --- a/res/cardsfolder/angus_mackenzie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Angus Mackenzie -ManaCost:W U G -Types:Legendary Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ Fog | Cost$ W U G T | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat,Declare Attackers - Play Instants and Abilities,Combat_Declare_Blockers_InstantAbility | SpellDescription$ Prevent all combat damage that would be dealt this turn. Activate this ability only before the combat damage step. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/angus_mackenzie.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/animal_boneyard.txt b/res/cardsfolder/animal_boneyard.txt deleted file mode 100644 index 856c8b997b9..00000000000 --- a/res/cardsfolder/animal_boneyard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Animal Boneyard -ManaCost:2 W -Types:Enchantment Aura -K:Enchant Land -K:stPumpAll:Card.AttachedBy:0/0/SVar=GainLife & SVar=LifeGained:No Condition:Enchanted land has "Tap, Sacrifice a creature: You gain life equal to that creature's toughness." -SVar:GainLife:AB$GainLife | Cost$ T Sac<1/Creature> | LifeAmount$ LifeGained | SpellDescription$ You gain life equal to the sacrificed creature's toughness. -SVar:LifeGained:Sacrificed$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/animal_boneyard.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/animate_artifact.txt b/res/cardsfolder/animate_artifact.txt deleted file mode 100644 index 5bc9ee38a59..00000000000 --- a/res/cardsfolder/animate_artifact.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Animate Artifact -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Enchant Artifact -K:stAnimateEnchanted:Artifact:Count$CardManaCost/Count$CardManaCost:Creature:no colors:No Abilities:isPresent Card.AttachedBy+nonCreature: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/animate_artifact.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/49.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/49.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/48.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/60.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/animate_dead.txt b/res/cardsfolder/animate_dead.txt deleted file mode 100644 index 94bae5fe0d3..00000000000 --- a/res/cardsfolder/animate_dead.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Animate Dead -ManaCost:1 B -Types:Enchantment Aura -Text:Enchant creature card in a graveyard\r\nWhen 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. -K:stPumpEnchanted:Creature:-1/0:No Condition:Enchanted creature gets -1/-0. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3823.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/1.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/1.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/2.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/2.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/1.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/animate_land.txt b/res/cardsfolder/animate_land.txt deleted file mode 100644 index c18945e033c..00000000000 --- a/res/cardsfolder/animate_land.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Animate Land -ManaCost:G -Types:Instant -Text:no text -A:SP$ Animate | Cost$ G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature | SpellDescription$ Until end of turn, target land becomes a 3/3 creature that's still a land. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/animate_land.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/animate_wall.txt b/res/cardsfolder/animate_wall.txt deleted file mode 100644 index 8fa399910ce..00000000000 --- a/res/cardsfolder/animate_wall.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Animate Wall -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant Wall -K:enPump:HIDDEN CARDNAME can attack as though it didn't have defender.:Enchanted Wall can attack as though it didn't have defender. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/animate_wall.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/185.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/186.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/281.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/254.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/1.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/185.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ankh_of_mishra.txt b/res/cardsfolder/ankh_of_mishra.txt deleted file mode 100644 index 23b51b65cc4..00000000000 --- a/res/cardsfolder/ankh_of_mishra.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Ankh of Mishra -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land enters the battlefield, CARDNAME deals 2 damage to that land's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ankh_of_mishra.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/230.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/232.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/348.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/312.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/273.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/233.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/annihilate.txt b/res/cardsfolder/annihilate.txt deleted file mode 100644 index 9a40c3e17eb..00000000000 --- a/res/cardsfolder/annihilate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Annihilate -ManaCost:3 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/annihilate.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/94.jpg -End diff --git a/res/cardsfolder/annul.txt b/res/cardsfolder/annul.txt deleted file mode 100644 index da5ac7b227d..00000000000 --- a/res/cardsfolder/annul.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Annul -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target artifact or enchantment spell | ValidTgts$ Artifact,Enchantment | SpellDescription$ Counter target artifact or enchantment spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/annul.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/29.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anodet_lurker.txt b/res/cardsfolder/anodet_lurker.txt deleted file mode 100644 index 6c18d4f8703..00000000000 --- a/res/cardsfolder/anodet_lurker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Anodet Lurker -ManaCost:5 -Types:Artifact Creature Construct -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 3 life. -SVar:TrigSac:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/anodet_lurker.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anoint.txt b/res/cardsfolder/anoint.txt deleted file mode 100644 index b08ac25b023..00000000000 --- a/res/cardsfolder/anoint.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anoint -ManaCost:W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ W | ValidTgts$ Creature | Amount$ 3 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature this turn. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/anoint.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anowon_the_ruin_sage.txt b/res/cardsfolder/anowon_the_ruin_sage.txt deleted file mode 100644 index 74705b1cf5b..00000000000 --- a/res/cardsfolder/anowon_the_ruin_sage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Anowon, the Ruin Sage -ManaCost:3 B B -Types:Legendary Creature Vampire Shaman -Text:no text -PT:4/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, each player sacrifices a non-Vampire creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Creature.nonVampire | Defined$ Each -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anowon_the_ruin_sage.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ant_queen.txt b/res/cardsfolder/ant_queen.txt deleted file mode 100644 index 98dba399d5b..00000000000 --- a/res/cardsfolder/ant_queen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ant Queen -ManaCost:3 G G -Types:Creature Insect -Text:no text -PT:5/5 -A:AB$ Token | Cost$ 1 G | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Insect creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ant_queen.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anthroplasm.txt b/res/cardsfolder/anthroplasm.txt deleted file mode 100644 index 51618be40e2..00000000000 --- a/res/cardsfolder/anthroplasm.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Anthroplasm -ManaCost:2 U U -Types:Creature Shapeshifter -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -A:AB$ RemoveCounter | Cost$ X T | CounterType$ P1P1 | CounterNum$ All | SpellDescription$ Remove all +1/+1 counters from CARDNAME and put X +1/+1 counters on it. | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ X -SVar:X:Count$xPaid -SVar:All:Count$CardCounters.P1P1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anthroplasm.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/antler_skulkin.txt b/res/cardsfolder/antler_skulkin.txt deleted file mode 100644 index da9eacfe9df..00000000000 --- a/res/cardsfolder/antler_skulkin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Antler Skulkin -ManaCost:5 -Types:Artifact Creature Scarecrow -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | KW$ Persist | SpellDescription$ Target white creature gains persist until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/antler_skulkin.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/167.jpg -End diff --git a/res/cardsfolder/anurid_barkripper.txt b/res/cardsfolder/anurid_barkripper.txt deleted file mode 100644 index 8fa9d0266bc..00000000000 --- a/res/cardsfolder/anurid_barkripper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anurid Barkripper -ManaCost:1 G G -Types:Creature Frog Beast -Text:no text -PT:2/2 -K:stPumpSelf:Creature:2/2:Threshold:Threshold - Anurid Barkripper gets +2/+2 as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/anurid_barkripper.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anurid_brushhopper.txt b/res/cardsfolder/anurid_brushhopper.txt deleted file mode 100644 index 98297f77811..00000000000 --- a/res/cardsfolder/anurid_brushhopper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anurid Brushhopper -ManaCost:1 G W -Types:Creature Frog Beast -Text:no text -PT:3/4 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anurid_brushhopper.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anurid_murkdiver.txt b/res/cardsfolder/anurid_murkdiver.txt deleted file mode 100644 index 58cfe6f91eb..00000000000 --- a/res/cardsfolder/anurid_murkdiver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Anurid Murkdiver -ManaCost:4 B B -Types:Creature Zombie Frog Beast -Text:no text -PT:4/3 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card43638.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/anvil_of_bogardan.txt b/res/cardsfolder/anvil_of_bogardan.txt deleted file mode 100644 index 028cd46c54b..00000000000 --- a/res/cardsfolder/anvil_of_bogardan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Anvil of Bogardan -ManaCost:2 -Types:Artifact -Text:Players have no maximum hand size. -K:HandSize = INF All -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws an additional card, then discards a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredPlayer | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/anvil_of_bogardan.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apes_of_rath.txt b/res/cardsfolder/apes_of_rath.txt deleted file mode 100644 index 7b8798716a6..00000000000 --- a/res/cardsfolder/apes_of_rath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Apes of Rath -ManaCost:2 G G -Types:Creature Ape -Text:no text -PT:5/4 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | TriggerDescription$ Whenever CARDNAME attacks, it doesn't untap during its controller's next untap step. -SVar:StayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/apes_of_rath.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apex_hawks.txt b/res/cardsfolder/apex_hawks.txt deleted file mode 100644 index 4337eab0810..00000000000 --- a/res/cardsfolder/apex_hawks.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Apex Hawks -ManaCost:2 W -Types:Creature Bird -Text:Apex Hawks enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:2/2 -K:Flying -K:Multikicker 1 W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/apex_hawks.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aphetto_alchemist.txt b/res/cardsfolder/aphetto_alchemist.txt deleted file mode 100644 index 7c2e3cb0c51..00000000000 --- a/res/cardsfolder/aphetto_alchemist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aphetto Alchemist -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -K:Morph:U -A:AB$ Untap | Cost$ T | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SpellDescription$ Untap target artifact or creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_alchemist.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/64.jpg -End diff --git a/res/cardsfolder/aphetto_exterminator.txt b/res/cardsfolder/aphetto_exterminator.txt deleted file mode 100644 index 731347e4076..00000000000 --- a/res/cardsfolder/aphetto_exterminator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aphetto Exterminator -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:3/1 -K:Morph:3 B -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is turned face up, target creature gets -3/-3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_exterminator.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aphetto_grifter.txt b/res/cardsfolder/aphetto_grifter.txt deleted file mode 100644 index 9d46647aec5..00000000000 --- a/res/cardsfolder/aphetto_grifter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aphetto Grifter -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ tapXType<2/Wizard> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Tap target permanent. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_grifter.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/65.jpg -End diff --git a/res/cardsfolder/aphetto_runecaster.txt b/res/cardsfolder/aphetto_runecaster.txt deleted file mode 100644 index 6237ff62f12..00000000000 --- a/res/cardsfolder/aphetto_runecaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aphetto Runecaster -ManaCost:3 U -Types:Creature Human Wizard -Text:no text -PT:2/3 -T:Mode$ TurnFaceUp | ValidCard$ Permanent | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent is turned face up, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_runecaster.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aphetto_vulture.txt b/res/cardsfolder/aphetto_vulture.txt deleted file mode 100644 index 6c7e3279470..00000000000 --- a/res/cardsfolder/aphetto_vulture.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aphetto Vulture -ManaCost:4 B B -Types:Creature Zombie Bird -Text:no text -PT:3/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may put target Zombie card from your graveyard on top of your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | TgtPrompt$ Choose target Zombie card in your graveyard | ValidTgts$ Zombie.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target Zombie card from your graveyard on top of your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphetto_vulture.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aphotic_wisps.txt b/res/cardsfolder/aphotic_wisps.txt deleted file mode 100644 index 4cb40536a87..00000000000 --- a/res/cardsfolder/aphotic_wisps.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aphotic Wisps -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear | SubAbility$ SVar=DBDraw | SpellDescription$ 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. -SVar:DBDraw:DB$Draw | SubAbility$ SVar=DBColor | NumCards$ 1 -SVar:DBColor:DB$Animate | Colors$ Black | OverwriteColors$ True | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aphotic_wisps.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apocalypse.txt b/res/cardsfolder/apocalypse.txt deleted file mode 100644 index 34ac0a57655..00000000000 --- a/res/cardsfolder/apocalypse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Apocalypse -ManaCost:2 R R R -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 R R R | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Exile | SubAbility$ SVar=DBDiscard | SpellDescription$ Exile all permanents. You discard your hand. -SVar:DBDiscard:DB$Discard | Mode$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/apocalypse.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apocalypse_hydra.txt b/res/cardsfolder/apocalypse_hydra.txt deleted file mode 100644 index 7c7a57fa37f..00000000000 --- a/res/cardsfolder/apocalypse_hydra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Apocalypse Hydra -ManaCost:X G R -Types:Creature Hydra -Text: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. -PT:0/0 -A:AB$ DealDamage | Cost$ 1 R SubCounter<1/P1P1> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -# This xPaid doesn't do anything, it's just needed to make Cost work properly -SVar:X:Count$xPaid -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/apocalypse_hydra.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apostles_blessing.txt b/res/cardsfolder/apostles_blessing.txt deleted file mode 100644 index ff68ccc3585..00000000000 --- a/res/cardsfolder/apostles_blessing.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Apostle's Blessing -ManaCost:1 PW -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from white | SpellDescription$ Target creature or artifact you control gains protection from white until end of turn. -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from black | SpellDescription$ Target creature or artifact you control gains protection from black until end of turn. -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from blue | SpellDescription$ Target creature or artifact you control gains protection from blue until end of turn. -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from red | SpellDescription$ Target creature or artifact you control gains protection from red until end of turn. -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from green | SpellDescription$ Target creature or artifact you control gains protection from green until end of turn. -A:SP$ Pump | Cost$ 1 PW | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target creature or artifact | KW$ Protection from artifacts | SpellDescription$ Target creature or artifact you control gains protection from artifacts until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/apostles_blessing.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apothecary_initiate.txt b/res/cardsfolder/apothecary_initiate.txt deleted file mode 100644 index 4c898629bf6..00000000000 --- a/res/cardsfolder/apothecary_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Apothecary Initiate -ManaCost:W -Types:Creature Kithkin Cleric -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may pay 1. If you do, gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/apothecary_initiate.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apprentice_necromancer.txt b/res/cardsfolder/apprentice_necromancer.txt deleted file mode 100644 index 2292775aabf..00000000000 --- a/res/cardsfolder/apprentice_necromancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Apprentice Necromancer -ManaCost:1 B -Types:Creature Zombie Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | GainControl$ True | SubAbility$ SVar=DBPump | SpellDescription$ Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. -SVar:DBPump:DB$Pump | KW$ Haste & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/apprentice_necromancer.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apprentice_sorcerer.txt b/res/cardsfolder/apprentice_sorcerer.txt deleted file mode 100644 index af061761332..00000000000 --- a/res/cardsfolder/apprentice_sorcerer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Apprentice Sorcerer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/apprentice_sorcerer.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/apprentice_wizard.txt b/res/cardsfolder/apprentice_wizard.txt deleted file mode 100644 index e88b0335b2e..00000000000 --- a/res/cardsfolder/apprentice_wizard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Apprentice Wizard -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:0/1 -A:AB$ Mana | Cost$ U T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/apprentice_wizard.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/20.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aquamoeba.txt b/res/cardsfolder/aquamoeba.txt deleted file mode 100644 index 8038f39d14e..00000000000 --- a/res/cardsfolder/aquamoeba.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aquamoeba -ManaCost:1 U -Types:Creature Elemental Beast -Text:no text -PT:1/3 -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aquamoeba.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aquitects_will.txt b/res/cardsfolder/aquitects_will.txt deleted file mode 100644 index 5fc739d8b6e..00000000000 --- a/res/cardsfolder/aquitects_will.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Aquitect's Will -ManaCost:U -Types:Tribal Sorcery Merfolk -Text:no text -A:SP$ Effect | Cost$ U | Name$ Flood Effect | Keywords$ KWAnimateAll | Unique$ True | Duration$ Permanent | SubAbility$ SVar=TrigPutCounter | SpellDescription$ 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. -SVar:TrigPutCounter:DB$ PutCounter | Cost$ 0 | ValidTgts$ Land | CounterType$ FLOOD | CounterNum$ 1 | TgtPrompt$ Select target land | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$ Draw | Cost$ 0 | NumCards$ 1 | ConditionPresent$ Merfolk.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Merfolk, -SVar:KWAnimateAll:stAnimateAll:Land.countersGE1FLOOD:no changes:Island:no colors:Overwrite:No Condition:no text -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aquitects_will.jpg -SetInfo:LOR|Common|http://magiccards.info/scans/en/lor/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/araba_mothrider.txt b/res/cardsfolder/araba_mothrider.txt deleted file mode 100644 index 6a3962e016f..00000000000 --- a/res/cardsfolder/araba_mothrider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Araba Mothrider -ManaCost:1 W -Types:Creature Human Samurai -Text:no text -PT:1/1 -K:Flying -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/araba_mothrider.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arachnoid.txt b/res/cardsfolder/arachnoid.txt deleted file mode 100644 index bfb7930ba51..00000000000 --- a/res/cardsfolder/arachnoid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arachnoid -ManaCost:6 -Types:Artifact Creature Spider -Text:no text -PT:2/6 -K:Reach -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51230.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arashi_the_sky_asunder.txt b/res/cardsfolder/arashi_the_sky_asunder.txt deleted file mode 100644 index 2e6e44b06ca..00000000000 --- a/res/cardsfolder/arashi_the_sky_asunder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Arashi, the Sky Asunder -ManaCost:3 G G -Types:Legendary Creature Spirit -Text:no text -PT:5/5 -A:AB$ DealDamage | Cost$ X G T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target flying creature. | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature with flying. -A:AB$ DamageAll | PrecostDesc$ Channel - | Cost$ X G G Discard<1/CARDNAME> | ActivatingZone$ Hand | ValidCards$ Creature.withFlying | NumDmg$ X | ValidDescription$ each creature with flying. | SpellDescription$CARDNAME deals X damage to each creature with flying. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card87333.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arbiter_of_knollridge.txt b/res/cardsfolder/arbiter_of_knollridge.txt deleted file mode 100644 index 0de8fc46439..00000000000 --- a/res/cardsfolder/arbiter_of_knollridge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Arbiter of Knollridge -ManaCost:6 W -Types:Creature Giant Wizard -Text:no text -PT:5/5 -K:Vigilance -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigLife | TriggerDescription$ When CARDNAME enters the battlefield, each player's life total becomes the highest life total among all players. -SVar:TrigLife:AB$SetLife | Cost$ 0 | Defined$ Each | LifeAmount$ X -SVar:X:Count$HighestLifeTotal -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arbiter_of_knollridge.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arbor_elf.txt b/res/cardsfolder/arbor_elf.txt deleted file mode 100644 index 1b9a713e97a..00000000000 --- a/res/cardsfolder/arbor_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arbor Elf -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ T | ValidTgts$ Forest | TgtPrompt$ Select target forest | SpellDescription$ Untap target Forest. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arbor_elf.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/95.jpg -End diff --git a/res/cardsfolder/arc_blade.txt b/res/cardsfolder/arc_blade.txt deleted file mode 100644 index 13217f8c446..00000000000 --- a/res/cardsfolder/arc_blade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arc Blade -ManaCost:3 R R -Types:Sorcery -Text:no text -K:Suspend:3:2 R -A:SP$ DealDamage | Cost$ 3 R R | Tgt$ TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBChange | SpellDescription$ CARDNAME deals 2 damage to target creature or player. Exile CARDNAME with three time counters on it. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | CounterType$ TIME | CounterNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_blade.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arc_lightning.txt b/res/cardsfolder/arc_lightning.txt deleted file mode 100644 index 23f21cc2e51..00000000000 --- a/res/cardsfolder/arc_lightning.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arc Lightning -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 3 damage divided as you choose among one, two, or three target creatures and/or players. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (3) | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_lightning.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arc_mage.txt b/res/cardsfolder/arc_mage.txt deleted file mode 100644 index c74f084f93f..00000000000 --- a/res/cardsfolder/arc_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arc Mage -ManaCost:2 R -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 2 R T Discard<1/Card> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage | SpellDescription$ CARDNAME deals 2 damage divided as you choose among any number of target creatures and/or players. -SVar:DBDamage:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_mage.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arc_runner.txt b/res/cardsfolder/arc_runner.txt deleted file mode 100644 index ccf92674807..00000000000 --- a/res/cardsfolder/arc_runner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arc Runner -ManaCost:2 R -Types:Creature Elemental Ox -Text:no text -PT:5/1 -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_runner.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arc_slogger.txt b/res/cardsfolder/arc_slogger.txt deleted file mode 100644 index 122fab13763..00000000000 --- a/res/cardsfolder/arc_slogger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arc-Slogger -ManaCost:3 R R -Types:Creature Beast -Text:no text -PT:4/5 -A:AB$ DealDamage | Cost$ R ExileFromTop<10/Card> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_slogger.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arc_trail.txt b/res/cardsfolder/arc_trail.txt deleted file mode 100644 index dbc9b671f77..00000000000 --- a/res/cardsfolder/arc_trail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arc Trail -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature or player (2 damage) | NumDmg$ 2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 1 damage to another target creature or player. -SVar:DBDealDamage:DB$DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature or player (1 damage) | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arc_trail.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcades_sabboth.txt b/res/cardsfolder/arcades_sabboth.txt deleted file mode 100644 index d9e34b4e3ac..00000000000 --- a/res/cardsfolder/arcades_sabboth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Arcades Sabboth -ManaCost:2 W W U U G G -Types:Legendary Creature Elder Dragon -Text:no text -PT:7/7 -K:Flying -K:stPumpAll:Creature.notattacking+untapped+YouCtrl:0/2:No Condition:Each untapped creature you control gets +0/+2 as long as it's not attacking. -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay W U G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcades_sabboth.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/258.jpg -End diff --git a/res/cardsfolder/arcane_sanctum.txt b/res/cardsfolder/arcane_sanctum.txt deleted file mode 100644 index fa48a89bd3a..00000000000 --- a/res/cardsfolder/arcane_sanctum.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcane Sanctum -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_sanctum.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcane_spyglass.txt b/res/cardsfolder/arcane_spyglass.txt deleted file mode 100644 index e200cc8502d..00000000000 --- a/res/cardsfolder/arcane_spyglass.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcane Spyglass -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T Sac<1/Land> | NumCards$ 1 | SubAbility$ SVar=DBPutCounter | SpellDescription$ Draw a card and put a charge counter on CARDNAME. -SVar:DBPutCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -A:AB$Draw | Cost$ SubCounter<3/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_spyglass.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcane_teachings.txt b/res/cardsfolder/arcane_teachings.txt deleted file mode 100644 index 3afb90a8531..00000000000 --- a/res/cardsfolder/arcane_teachings.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcane Teachings -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcane_teachings.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcanis_the_omnipotent.txt b/res/cardsfolder/arcanis_the_omnipotent.txt deleted file mode 100644 index 9b2ee492334..00000000000 --- a/res/cardsfolder/arcanis_the_omnipotent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcanis the Omnipotent -ManaCost:3 U U U -Types:Legendary Creature Wizard -Text:no text -PT:3/4 -A:AB$ Draw | Cost$ T | NumCards$ 3 | SpellDescription$ Draw three cards. -A:AB$ ChangeZone | Cost$ 2 U U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcanis_the_omnipotent.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/66.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_bruiser.txt b/res/cardsfolder/arcbound_bruiser.txt deleted file mode 100644 index d68af47b569..00000000000 --- a/res/cardsfolder/arcbound_bruiser.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arcbound Bruiser -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:0/0 -K:Modular 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_bruiser.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_crusher.txt b/res/cardsfolder/arcbound_crusher.txt deleted file mode 100644 index 5e5586ce496..00000000000 --- a/res/cardsfolder/arcbound_crusher.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Arcbound Crusher -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:0/0 -K:Trample -K:Modular 1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.Other | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another artifact enters the battlefield, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_crusher.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_hybrid.txt b/res/cardsfolder/arcbound_hybrid.txt deleted file mode 100644 index 8db7fce9d0a..00000000000 --- a/res/cardsfolder/arcbound_hybrid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arcbound Hybrid -ManaCost:4 -Types:Artifact Creature Beast -Text:no text -PT:0/0 -K:Haste -K:Modular 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_hybrid.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_lancer.txt b/res/cardsfolder/arcbound_lancer.txt deleted file mode 100644 index 0990a702b55..00000000000 --- a/res/cardsfolder/arcbound_lancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arcbound Lancer -ManaCost:7 -Types:Artifact Creature Beast -Text:no text -PT:0/0 -K:First Strike -K:Modular 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_lancer.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_overseer.txt b/res/cardsfolder/arcbound_overseer.txt deleted file mode 100644 index 9b46c27e7be..00000000000 --- a/res/cardsfolder/arcbound_overseer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcbound Overseer -ManaCost:8 -Types:Artifact Creature Golem -Text:no text -PT:0/0 -K:Modular 6 -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on each creature with modular you control. -SVar:TrigPutCounter:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.YouCtrl+withModular | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_overseer.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_ravager.txt b/res/cardsfolder/arcbound_ravager.txt deleted file mode 100644 index d4c1dcb8b8e..00000000000 --- a/res/cardsfolder/arcbound_ravager.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arcbound Ravager -ManaCost:2 -Types:Artifact Creature Beast -Text:no text -PT:0/0 -A:AB$ PutCounter | Cost$ Sac<1/Artifact> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -K:Modular 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_ravager.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_reclaimer.txt b/res/cardsfolder/arcbound_reclaimer.txt deleted file mode 100644 index 2dee46dd009..00000000000 --- a/res/cardsfolder/arcbound_reclaimer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcbound Reclaimer -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:0/0 -A:AB$ ChangeZone | Cost$ SubCounter<1/P1P1> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target artifact card from your graveyard on top of your library. -K:Modular 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_reclaimer.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_slith.txt b/res/cardsfolder/arcbound_slith.txt deleted file mode 100644 index ac2343158f3..00000000000 --- a/res/cardsfolder/arcbound_slith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcbound Slith -ManaCost:2 -Types:Artifact Creature Slith -Text:no text -PT:0/0 -K:Modular 1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_slith.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_stinger.txt b/res/cardsfolder/arcbound_stinger.txt deleted file mode 100644 index f59b59f65af..00000000000 --- a/res/cardsfolder/arcbound_stinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arcbound Stinger -ManaCost:2 -Types:Artifact Creature Insect -Text:no text -PT:0/0 -K:Flying -K:Modular 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_stinger.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_wanderer.txt b/res/cardsfolder/arcbound_wanderer.txt deleted file mode 100644 index 05b066cfa21..00000000000 --- a/res/cardsfolder/arcbound_wanderer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arcbound Wanderer -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:0/0 -K:Modular 0 -K:Sunburst -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_wanderer.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcbound_worker.txt b/res/cardsfolder/arcbound_worker.txt deleted file mode 100644 index a2bc436d5ff..00000000000 --- a/res/cardsfolder/arcbound_worker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arcbound Worker -ManaCost:1 -Types:Artifact Creature Construct -Text:no text -PT:0/0 -K:Modular 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcbound_worker.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archaeological_dig.txt b/res/cardsfolder/archaeological_dig.txt deleted file mode 100644 index 124992c4214..00000000000 --- a/res/cardsfolder/archaeological_dig.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Archaeological Dig -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/archaeological_dig.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archangel.txt b/res/cardsfolder/archangel.txt deleted file mode 100644 index 2d19e1a3145..00000000000 --- a/res/cardsfolder/archangel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Archangel -ManaCost:5 W W -Types:Creature Angel -Text:no text -PT:5/5 -K:Flying -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/vi/en-us/card3708.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/131.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/4.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/165.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/2.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archdemon_of_unx.txt b/res/cardsfolder/archdemon_of_unx.txt deleted file mode 100644 index 24cd7d4d495..00000000000 --- a/res/cardsfolder/archdemon_of_unx.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Archdemon of Unx -ManaCost:5 B B -Types:Creature Demon -Text:no text -PT:6/6 -K:Flying -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a non-Zombie creature, then put a 2/2 black Zombie creature token onto the battlefield. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature.nonZombie | SacMessage$ non-Zombie Creature | SubAbility$ SVar=MakeToken -SVar:MakeToken:DB$Token | TokenImage$ B 2 2 Zombie | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/archdemon_of_unx.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/architects_of_will.txt b/res/cardsfolder/architects_of_will.txt deleted file mode 100644 index 9e46a81a55f..00000000000 --- a/res/cardsfolder/architects_of_will.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Architects of Will -ManaCost:2 U B -Types:Artifact Creature Human Wizard -Text:no text -PT:3/3 -K:Cycling:UB -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top three cards of target player's library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/architects_of_will.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archivist.txt b/res/cardsfolder/archivist.txt deleted file mode 100644 index 229ef31183d..00000000000 --- a/res/cardsfolder/archivist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Archivist -ManaCost:2 U U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/archivist.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/60.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/26.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archon_of_justice.txt b/res/cardsfolder/archon_of_justice.txt deleted file mode 100644 index f1d29b28b3e..00000000000 --- a/res/cardsfolder/archon_of_justice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Archon of Justice -ManaCost:3 W W -Types:Creature Archon -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile target permanent. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent | Origin$ Battlefield | Destination$ Exile -PT:4/4 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/archon_of_justice.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/archon_of_redemption.txt b/res/cardsfolder/archon_of_redemption.txt deleted file mode 100644 index ca25911b0d6..00000000000 --- a/res/cardsfolder/archon_of_redemption.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Archon of Redemption -ManaCost:3 W W -Types:Creature Archon -Text:no text -PT:3/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+withFlying | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME or another creature with flying enters the battlefield under your control, you may gain life equal to that creature's power. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggeredCard$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/archon_of_redemption.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arctic_flats.txt b/res/cardsfolder/arctic_flats.txt deleted file mode 100644 index 0be45a0ced9..00000000000 --- a/res/cardsfolder/arctic_flats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arctic Flats -ManaCost:no cost -Types:Snow Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arctic_flats.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arctic_foxes.txt b/res/cardsfolder/arctic_foxes.txt deleted file mode 100644 index bd339402498..00000000000 --- a/res/cardsfolder/arctic_foxes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arctic Foxes -ManaCost:1 W -Types:Creature Fox -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't be blocked by creatures with power 2 or greater.:isPresent Land.Snow+YouDontCtrl:Creatures with power 2 or greater can't block Arctic Foxes as long as defending player controls a snow land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arctic_foxes.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arctic_nishoba.txt b/res/cardsfolder/arctic_nishoba.txt deleted file mode 100644 index c780b4712e0..00000000000 --- a/res/cardsfolder/arctic_nishoba.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arctic Nishoba -ManaCost:5 G -Types:Creature Cat Warrior -Text:When Arctic Nishoba is put into a graveyard from the battlefield, you gain 2 life for each age counter on it. -PT:6/6 -K:Trample -K:Cumulative upkeep:GW -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arctic_nishoba.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arctic_wolves.txt b/res/cardsfolder/arctic_wolves.txt deleted file mode 100644 index 174eec9ad20..00000000000 --- a/res/cardsfolder/arctic_wolves.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arctic Wolves -ManaCost:3 G G -Types:Creature Wolf -Text:no text -PT:4/5 -K:Cumulative upkeep:2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arctic_wolves.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arcums_sleigh.txt b/res/cardsfolder/arcums_sleigh.txt deleted file mode 100644 index 11acc237a72..00000000000 --- a/res/cardsfolder/arcums_sleigh.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arcum's Sleigh -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | KW$ Vigilance | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Land.Snow+YouDontCtrl | ActivatingPhases$ BeginCombat->EndCombat | SpellDescription$ Target creature gains vigilance until end of turn. Activate this ability only during combat and only if defending player controls a snow land. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arcums_sleigh.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ardent_militia.txt b/res/cardsfolder/ardent_militia.txt deleted file mode 100644 index fdacad8141b..00000000000 --- a/res/cardsfolder/ardent_militia.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Ardent Militia -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:2/5 -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ardent_militia.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/3.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/2.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/166.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/3.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/121.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ardent_plea.txt b/res/cardsfolder/ardent_plea.txt deleted file mode 100644 index cc8ea24f5b6..00000000000 --- a/res/cardsfolder/ardent_plea.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ardent Plea -ManaCost:1 W U -Types:Enchantment -Text:no text -K:Exalted -K:Cascade -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ardent_plea.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ardent_recruit.txt b/res/cardsfolder/ardent_recruit.txt deleted file mode 100644 index 5fd0636c263..00000000000 --- a/res/cardsfolder/ardent_recruit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ardent Recruit -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Creature:2/2:Metalcraft:Metalcraft - Ardent Recruit gets +2/+2 as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ardent_recruit.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ardent_soldier.txt b/res/cardsfolder/ardent_soldier.txt deleted file mode 100644 index 77c10f9421d..00000000000 --- a/res/cardsfolder/ardent_soldier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ardent Soldier -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:Vigilance -K:Kicker:2 -K:etbCounter:P1P1:1:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ardent_soldier.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arena_of_the_ancients.txt b/res/cardsfolder/arena_of_the_ancients.txt deleted file mode 100644 index ff1e1f1856e..00000000000 --- a/res/cardsfolder/arena_of_the_ancients.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arena of the Ancients -ManaCost:3 -Types:Artifact -Text:Legendary creatures don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Creature.Legendary -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all legendary creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.Legendary -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arena_of_the_ancients.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arensons_aura.txt b/res/cardsfolder/arensons_aura.txt deleted file mode 100644 index 73b07b75f09..00000000000 --- a/res/cardsfolder/arensons_aura.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arenson's Aura -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ W Sac<1/Enchantment> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -A:AB$ Counter | Cost$ 3 U U | TargetType$ Spell | TgtPrompt$ Select target Enchantment | ValidTgts$ Enchantment | SpellDescription$ Counter target enchantment spell. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arensons_aura.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/282.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argent_mutation.txt b/res/cardsfolder/argent_mutation.txt deleted file mode 100644 index 5ed90e87345..00000000000 --- a/res/cardsfolder/argent_mutation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Argent Mutation -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Animate | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | SubAbility$ SVar=DBDraw| SpellDescription$ Target permanent becomes an artifact in addition to its other types until end of turn. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/argent_mutation.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argentum_armor.txt b/res/cardsfolder/argentum_armor.txt deleted file mode 100644 index f039d8f7908..00000000000 --- a/res/cardsfolder/argentum_armor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Argentum Armor -ManaCost:6 -Types:Artifact Equipment -Text:Equipped creature gets +6/+6. -K:eqPump 6:+6/+6 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigDestroy | TriggerDescription$ Whenever equipped creature attacks, destroy target permanent. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/argentum_armor.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argivian_archaeologist.txt b/res/cardsfolder/argivian_archaeologist.txt deleted file mode 100644 index 2a39175c872..00000000000 --- a/res/cardsfolder/argivian_archaeologist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Argivian Archaeologist -ManaCost:1 W W -Types:Creature Human Artificer -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ W W T | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/argivian_archaeologist.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argivian_blacksmith.txt b/res/cardsfolder/argivian_blacksmith.txt deleted file mode 100644 index 5649913697f..00000000000 --- a/res/cardsfolder/argivian_blacksmith.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Argivian Blacksmith -ManaCost:1 W W -Types:Creature Human Artificer -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature.Artifact | Amount$ 2 | TgtPrompt$ Select target artifact creature | SpellDescription$ Prevent the next 2 damage that would be dealt to target artifact creature this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/argivian_blacksmith.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argivian_find.txt b/res/cardsfolder/argivian_find.txt deleted file mode 100644 index a41c0d1603e..00000000000 --- a/res/cardsfolder/argivian_find.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Argivian Find -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact or enchantment card in your graveyard | ValidTgts$ Artifact.YouCtrl,Enchantment.YouCtrl | SpellDescription$ Return target artifact or enchantment card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/argivian_find.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argivian_restoration.txt b/res/cardsfolder/argivian_restoration.txt deleted file mode 100644 index 96c63c8aa9c..00000000000 --- a/res/cardsfolder/argivian_restoration.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Argivian Restoration -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U U | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SpellDescription$ Return target artifact card from your graveyard to the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/argivian_restoration.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argothian_elder.txt b/res/cardsfolder/argothian_elder.txt deleted file mode 100644 index 36610c3057b..00000000000 --- a/res/cardsfolder/argothian_elder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Argothian Elder -ManaCost:3 G -Types:Creature Elf Druid -Text:no text -PT:2/2 -A:AB$ Untap | Cost$ T | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap two target lands. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_elder.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argothian_enchantress.txt b/res/cardsfolder/argothian_enchantress.txt deleted file mode 100644 index 1156d42c179..00000000000 --- a/res/cardsfolder/argothian_enchantress.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Argothian Enchantress -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:0/1 -K:Shroud -T:Mode$ SpellCast | ValidCard$ Card.Enchantment+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_enchantress.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argothian_pixies.txt b/res/cardsfolder/argothian_pixies.txt deleted file mode 100644 index 8c72d7796f2..00000000000 --- a/res/cardsfolder/argothian_pixies.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Argothian Pixies -ManaCost:1 G -Types:Creature Faerie -Text:Prevent all damage that would be dealt to CARDNAME by artifact creatures.\r\nCARDNAME can't be blocked by artifact creatures. -PT:2/1 -K:PreventAllDamageBy Artifact.Creature -K:CantBeBlockedBy Artifact.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_pixies.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argothian_swine.txt b/res/cardsfolder/argothian_swine.txt deleted file mode 100644 index 995ffc27afb..00000000000 --- a/res/cardsfolder/argothian_swine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Argothian Swine -ManaCost:3 G -Types:Creature Boar -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5862.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/argothian_treefolk.txt b/res/cardsfolder/argothian_treefolk.txt deleted file mode 100644 index 36b99983a91..00000000000 --- a/res/cardsfolder/argothian_treefolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Argothian Treefolk -ManaCost:3 G G -Types:Creature Treefolk -Text:Prevent all damage that would be dealt to CARDNAME by artifacts. -PT:3/5 -K:PreventAllDamageBy Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_treefolk.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arid_mesa.txt b/res/cardsfolder/arid_mesa.txt deleted file mode 100644 index 7239ea1c202..00000000000 --- a/res/cardsfolder/arid_mesa.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Arid Mesa -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Mountain,Plains | ChangeNum$ 1 | SpellDescription$ Search your library for a Mountain or Plains card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/arid_mesa.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ark_of_blight.txt b/res/cardsfolder/ark_of_blight.txt deleted file mode 100644 index ef4a893c10c..00000000000 --- a/res/cardsfolder/ark_of_blight.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ark of Blight -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Destroy | Cost$ 3 T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ark_of_blight.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/140.jpg -End diff --git a/res/cardsfolder/armadillo_cloak.txt b/res/cardsfolder/armadillo_cloak.txt deleted file mode 100644 index afa0b40204e..00000000000 --- a/res/cardsfolder/armadillo_cloak.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Armadillo Cloak -ManaCost:1 G W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Trample -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armadillo_cloak.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armageddon.txt b/res/cardsfolder/armageddon.txt deleted file mode 100644 index 36529bb9739..00000000000 --- a/res/cardsfolder/armageddon.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Armageddon -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 W | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20387.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/186.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/187.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/167.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/255.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/132.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/4.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/186.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/283.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/6.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armageddon_clock.txt b/res/cardsfolder/armageddon_clock.txt deleted file mode 100644 index 01a2d7945d8..00000000000 --- a/res/cardsfolder/armageddon_clock.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Armageddon Clock -ManaCost:6 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your draw step, CARDNAME deals damage equal to the number of doom counters on it to each player. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a doom counter on CARDNAME. -A:AB$ RemoveCounter | Cost$ 4 | CounterType$ DOOM | CounterNum$ 1 | ActivatingPhases$ Upkeep | AnyPlayer$ True | SpellDescription$ Remove a doom counter from CARDNAME. Any player may activate this ability but only during any upkeep step. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ Each | NumDmg$ X -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DOOM | CounterNum$ 1 -SVar:X:Count$CardCounters.DOOM -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/armageddon_clock.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/234.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/313.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armament_master.txt b/res/cardsfolder/armament_master.txt deleted file mode 100644 index c9dc79fc577..00000000000 --- a/res/cardsfolder/armament_master.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Armament Master -ManaCost:W W -Types:Creature Kor Soldier -Text:no text -PT:2/2 -K:stPumpAll:Creature.Kor+Other+YouCtrl:X/X:no Condition:Other Kor creatures you control get +2/+2 for each Equipment attached to Armament Master. -SVar:X:Count$Valid Equipment.Attached/Times.2 -SVar:EquipMe:Multiple -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/armament_master.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armed_response.txt b/res/cardsfolder/armed_response.txt deleted file mode 100644 index dc533cd51a9..00000000000 --- a/res/cardsfolder/armed_response.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Armed Response -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target Creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target attacking creature equal to the number of Equipment you control. -SVar:X:Count$Valid Equipment.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armed_response.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armillary_sphere.txt b/res/cardsfolder/armillary_sphere.txt deleted file mode 100644 index 0dfa0746066..00000000000 --- a/res/cardsfolder/armillary_sphere.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Armillary Sphere -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards, reveal them, and put them into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armillary_sphere.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armistice.txt b/res/cardsfolder/armistice.txt deleted file mode 100644 index b3ded3c7824..00000000000 --- a/res/cardsfolder/armistice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Armistice -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 3 W W | NumCards$ 1 | SpellDescription$ You draw a card and target opponent gains 3 life. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ Opponent | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/armistice.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armor_of_faith.txt b/res/cardsfolder/armor_of_faith.txt deleted file mode 100644 index 41daf6b42a3..00000000000 --- a/res/cardsfolder/armor_of_faith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Armor of Faith -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -A:AB$ Pump | Cost$ W | Defined$ Enchanted | NumDef$ +1 | SpellDescription$ Enchanted creature gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armor_of_faith.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/284.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armor_sliver.txt b/res/cardsfolder/armor_sliver.txt deleted file mode 100644 index 22861af6d24..00000000000 --- a/res/cardsfolder/armor_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Armor Sliver -ManaCost:2 W -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/SVar=Pump:no Condition:All Sliver creatures have "2: This creature gets +0/+1 until end of turn." -SVar:Pump:AB$Pump | Cost$ 2 | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/armor_sliver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armor_thrull.txt b/res/cardsfolder/armor_thrull.txt deleted file mode 100644 index bb378c41f29..00000000000 --- a/res/cardsfolder/armor_thrull.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Armor Thrull -ManaCost:2 B -Types:Creature Thrull -Text:no text -PT:1/3 -A:AB$ PutCounter | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P2 | CounterNum$ 1 | SpellDescription$ Put a +1/+2 counter on target creature. -SVar:Rarity:Common -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/armor_thrull.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/1.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/armored_ascension.txt b/res/cardsfolder/armored_ascension.txt deleted file mode 100644 index 70eb19dfef2..00000000000 --- a/res/cardsfolder/armored_ascension.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Armored Ascension -ManaCost:3 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying:Enchanted creature gets +1/+1 for each Plains you control and has flying. -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$TypeYouCtrl.Plains -SVar:BuffedBy:Plains -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/armored_ascension.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/5.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/3.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armored_cancrix.txt b/res/cardsfolder/armored_cancrix.txt deleted file mode 100644 index caad7068ef8..00000000000 --- a/res/cardsfolder/armored_cancrix.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Armored Cancrix -ManaCost:4 U -Types:Creature Crab -Text:no text -PT:2/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armored_cancrix.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armored_galleon.txt b/res/cardsfolder/armored_galleon.txt deleted file mode 100644 index 85202bda827..00000000000 --- a/res/cardsfolder/armored_galleon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Armored Galleon -ManaCost:4 U -Types:Creature Human Pirate -Text:no text -PT:5/4 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Uncommon -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Second_Age/armored_galleon.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armored_griffin.txt b/res/cardsfolder/armored_griffin.txt deleted file mode 100644 index a385b3ab03e..00000000000 --- a/res/cardsfolder/armored_griffin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Armored Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/3 -K:Flying -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Second_Age/armored_griffin.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armored_guardian.txt b/res/cardsfolder/armored_guardian.txt deleted file mode 100644 index 3f439772b43..00000000000 --- a/res/cardsfolder/armored_guardian.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Armored Guardian -ManaCost:3 W U -Types:Creature Cat Soldier -Text:no text -PT:2/5 -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from white | SpellDescription$ Target creature you control gains protection from white until end of turn. -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from blue | SpellDescription$ Target creature you control gains protection from blue until end of turn. -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from black | SpellDescription$ Target creature you control gains protection from black until end of turn. -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from red | SpellDescription$ Target creature you control gains protection from red until end of turn. -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from green | SpellDescription$ Target creature you control gains protection from green until end of turn. -A:AB$ Pump | Cost$ 1 U U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/armored_guardian.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/230.jpg -End diff --git a/res/cardsfolder/armored_pegasus.txt b/res/cardsfolder/armored_pegasus.txt deleted file mode 100644 index f00da3584f8..00000000000 --- a/res/cardsfolder/armored_pegasus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Armored Pegasus -ManaCost:1 W -Types:Creature Pegasus -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14469.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/217.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/armorer_guildmage.txt b/res/cardsfolder/armorer_guildmage.txt deleted file mode 100644 index 78e3c4c0bdd..00000000000 --- a/res/cardsfolder/armorer_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Armorer Guildmage -ManaCost:R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +1 | SpellDescription$ Target creature gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/armorer_guildmage.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/156.jpg -End diff --git a/res/cardsfolder/arms_dealer.txt b/res/cardsfolder/arms_dealer.txt deleted file mode 100644 index a79aa58fa24..00000000000 --- a/res/cardsfolder/arms_dealer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arms Dealer -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ 1 R Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arms_dealer.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/army_ants.txt b/res/cardsfolder/army_ants.txt deleted file mode 100644 index 467c5734407..00000000000 --- a/res/cardsfolder/army_ants.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Army Ants -ManaCost:1 B R -Types:Creature Insect -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T Sac<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/army_ants.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/126.jpg -End diff --git a/res/cardsfolder/army_of_allah.txt b/res/cardsfolder/army_of_allah.txt deleted file mode 100644 index ec05568746a..00000000000 --- a/res/cardsfolder/army_of_allah.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Army of Allah -ManaCost:1 W W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.attacking | NumAtt$ +2 | SpellDescription$ Attacking creatures get +2/+0 until end of turn -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/army_of_allah.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/56.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/arnjlots_ascent.txt b/res/cardsfolder/arnjlots_ascent.txt deleted file mode 100644 index 2782ae34565..00000000000 --- a/res/cardsfolder/arnjlots_ascent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arnjlot's Ascent -ManaCost:1 U U -Types:Enchantment -Text:no text -K:Cumulative upkeep:U -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arnjlots_ascent.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/57.jpg -End diff --git a/res/cardsfolder/arrest.txt b/res/cardsfolder/arrest.txt deleted file mode 100644 index 2ab5668000e..00000000000 --- a/res/cardsfolder/arrest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Arrest -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated.:Enchanted creature can't attack or block and its activated abilities can't be activated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/arrest.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/2.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/2.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arrogant_bloodlord.txt b/res/cardsfolder/arrogant_bloodlord.txt deleted file mode 100644 index 6695e07ce65..00000000000 --- a/res/cardsfolder/arrogant_bloodlord.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Arrogant Bloodlord -ManaCost:1 B B -Types:Creature Vampire Knight -Text:no text -PT:4/4 -T:Mode$ Blocks | ValidCard$ Creature.powerLE1 | ValidBlocked$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature with power 1 or less, destroy CARDNAME at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.powerLE1 | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature with power 1 or less, destroy CARDNAME at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy CARDNAME at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arrogant_bloodlord.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arrogant_vampire.txt b/res/cardsfolder/arrogant_vampire.txt deleted file mode 100644 index 0331f5bb3ea..00000000000 --- a/res/cardsfolder/arrogant_vampire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Arrogant Vampire -ManaCost:3 B B -Types:Creature Vampire -Text:no text -PT:4/3 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4207.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arrogant_wurm.txt b/res/cardsfolder/arrogant_wurm.txt deleted file mode 100644 index 46c4867b294..00000000000 --- a/res/cardsfolder/arrogant_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Arrogant Wurm -ManaCost:3 G G -Types:Creature Wurm -Text:no text -PT:4/4 -K:Trample -K:Madness:2 G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arrogant_wurm.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/arrow_volley_trap.txt b/res/cardsfolder/arrow_volley_trap.txt deleted file mode 100755 index 993d549d508..00000000000 --- a/res/cardsfolder/arrow_volley_trap.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Arrow Volley Trap -ManaCost:3 W W -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 W W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 5 damage divided as you choose among any number of target attacking creatures. -A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | IsPresent$ Creature.attacking | PresentCompare$ GE4 | CostDesc$ If four or more creatures are attacking, you may pay 1 W rather than pay CARDNAME's mana cost. | SpellDescription$   -SVar:DBDamage2:DB$DealDamage | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (3) | NumDmg$ 1 | SubAbility$ SVar=DBDamage4 -SVar:DBDamage4:DB$DealDamage | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (4) | NumDmg$ 1 | SubAbility$ SVar=DBDamage5 -SVar:DBDamage5:DB$DealDamage | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature (5) | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/arrow_volley_trap.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/artifact_blast.txt b/res/cardsfolder/artifact_blast.txt deleted file mode 100644 index 0734f4a6862..00000000000 --- a/res/cardsfolder/artifact_blast.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Artifact Blast -ManaCost:R -Types:Instant -Text:no text -A:SP$ Counter | Cost$ R | TargetType$ Spell | ValidTgts$ Artifact | SpellDescription$ Counter target artifact spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/artifact_blast.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/artifact_mutation.txt b/res/cardsfolder/artifact_mutation.txt deleted file mode 100644 index a4f651237e8..00000000000 --- a/res/cardsfolder/artifact_mutation.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Artifact Mutation -ManaCost:R G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | NoRegen$ True | SubAbility$ SVar=TrigToken | SpellDescription$ 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. -#X will be the Converted Mana Cost of the target of Mutation -SVar:TrigToken:DB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Targeted$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/artifact_mutation.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/231.jpg -End diff --git a/res/cardsfolder/artifact_ward.txt b/res/cardsfolder/artifact_ward.txt deleted file mode 100644 index 002456439a6..00000000000 --- a/res/cardsfolder/artifact_ward.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Artifact Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from artifacts:Enchanted creature has protection from artifacts. This effect doesn't remove Artifact Ward. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/artifact_ward.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/artificers_intuition.txt b/res/cardsfolder/artificers_intuition.txt deleted file mode 100644 index 32afa84a320..00000000000 --- a/res/cardsfolder/artificers_intuition.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Artificer's Intuition -ManaCost:1 U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ U Discard<1/Artifact> | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.cmcLE1 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/artificers_intuition.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/artillerize.txt b/res/cardsfolder/artillerize.txt deleted file mode 100644 index 5260c6b9d4b..00000000000 --- a/res/cardsfolder/artillerize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Artillerize -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R Sac<1/Artifact,Creature> | Tgt$ TgtCP | NumDmg$ 5 | CostDesc$ As an additional cost to cast CARDNAME, sacrifice an artifact or creature. | SpellDescription$ CARDNAME deals 5 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/artillerize.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/artisan_of_kozilek.txt b/res/cardsfolder/artisan_of_kozilek.txt deleted file mode 100644 index c0f69c26aed..00000000000 --- a/res/cardsfolder/artisan_of_kozilek.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Artisan of Kozilek -ManaCost:9 -Types:Creature Eldrazi -Text:no text -PT:10/9 -K:Annihilator 2 -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ When you cast CARDNAME, you may return target creature card from your graveyard to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature in your graveyard | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/artisan_of_kozilek.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ascendant_evincar.txt b/res/cardsfolder/ascendant_evincar.txt deleted file mode 100644 index 4bc637f1c02..00000000000 --- a/res/cardsfolder/ascendant_evincar.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ascendant Evincar -ManaCost:4 B B -Types:Legendary Creature Vampire -Text:no text -PT:3/3 -K:Flying -K:stPumpAll:Creature.Black+Other:1/1:No Condition:Other black creatures get +1/+1. -K:stPumpAll:Creature.nonBlack:-1/-1:No Condition:Nonblack creatures get -1/-1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ascendant_evincar.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/51.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ascending_aven.txt b/res/cardsfolder/ascending_aven.txt deleted file mode 100644 index 4f3ec63e6e4..00000000000 --- a/res/cardsfolder/ascending_aven.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ascending Aven -ManaCost:2 U U -Types:Creature Bird Soldier -Text:no text -PT:3/2 -K:Flying -K:CARDNAME can block only creatures with flying. -K:Morph:2 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ascending_aven.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/asceticism.txt b/res/cardsfolder/asceticism.txt deleted file mode 100644 index fadc0b9e47d..00000000000 --- a/res/cardsfolder/asceticism.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Asceticism -ManaCost:3 G G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN CARDNAME can't be the target of spells or abilities your opponents control.:No Condition:Creatures you control can't be the target of spells or abilities your opponents control. -A:AB$ Regenerate | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/asceticism.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashas_favor.txt b/res/cardsfolder/ashas_favor.txt deleted file mode 100644 index ff6260be2af..00000000000 --- a/res/cardsfolder/ashas_favor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Asha's Favor -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying & First Strike & Vigilance:Enchanted creature has flying, first strike, and vigilance. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashas_favor.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashcoat_bear.txt b/res/cardsfolder/ashcoat_bear.txt deleted file mode 100644 index d9eb1be6a03..00000000000 --- a/res/cardsfolder/ashcoat_bear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ashcoat Bear -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -K:Flash -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card114905.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashen_firebeast.txt b/res/cardsfolder/ashen_firebeast.txt deleted file mode 100644 index 9aa32555faa..00000000000 --- a/res/cardsfolder/ashen_firebeast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ashen Firebeast -ManaCost:6 R R -Types:Creature Beast -Text:no text -PT:6/6 -A:AB$ DamageAll | Cost$ 1 R | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashen_firebeast.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashen_monstrosity.txt b/res/cardsfolder/ashen_monstrosity.txt deleted file mode 100644 index ad8ebd95f98..00000000000 --- a/res/cardsfolder/ashen_monstrosity.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ashen Monstrosity -ManaCost:5 R R -Types:Creature Spirit -Text:no text -PT:7/4 -K:Haste -K:CARDNAME attacks each turn if able. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashen_monstrosity.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashen_powder.txt b/res/cardsfolder/ashen_powder.txt deleted file mode 100644 index 0fe13609b57..00000000000 --- a/res/cardsfolder/ashen_powder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ashen Powder -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in an opponent's graveyard | ValidTgts$ Creature.YouDontCtrl | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashen_powder.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/112.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashen_skin_zubera.txt b/res/cardsfolder/ashen_skin_zubera.txt deleted file mode 100644 index 0ab9feb47d5..00000000000 --- a/res/cardsfolder/ashen_skin_zubera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ashen-Skin Zubera -ManaCost:1 B -Types:Creature Zubera Spirit -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target opponent discards a card for each Zubera put into a graveyard from the battlefield this turn. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | NumCards$ X | Mode$ TgtChoose -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Card.Zubera -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80509.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashenmoor_cohort.txt b/res/cardsfolder/ashenmoor_cohort.txt deleted file mode 100644 index 57b228324b1..00000000000 --- a/res/cardsfolder/ashenmoor_cohort.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ashenmoor Cohort -ManaCost:5 B -Types:Creature Elemental Warrior -Text:no text -PT:4/3 -K:stPumpSelf:Creature:1/1:isPresent Creature.Black+Other+YouCtrl:CARDNAME gets +1/+1 as long as you control another black creature. -SVar:BuffedBy:Creature.Black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashenmoor_cohort.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashenmoor_gouger.txt b/res/cardsfolder/ashenmoor_gouger.txt deleted file mode 100644 index bf582d6707b..00000000000 --- a/res/cardsfolder/ashenmoor_gouger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ashenmoor Gouger -ManaCost:BR BR BR -Types:Creature Elemental Warrior -Text:no text -PT:4/4 -K:CARDNAME can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashenmoor_gouger.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashenmoor_liege.txt b/res/cardsfolder/ashenmoor_liege.txt deleted file mode 100644 index 14216d01e70..00000000000 --- a/res/cardsfolder/ashenmoor_liege.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ashenmoor Liege -ManaCost:1 BR BR BR -Types:Creature Elemental Knight -Text:no text -PT:4/1 -K:stPumpAll:Creature.Red+Other+YouCtrl:1/1:No Condition:Other red creatures you control get +1/+1. -K:stPumpAll:Creature.Black+Other+YouCtrl:1/1:No Condition:Other black creatures you control get +1/+1. -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability an opponent controls, that player loses 4 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 4 -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashenmoor_liege.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashes_to_ashes.txt b/res/cardsfolder/ashes_to_ashes.txt deleted file mode 100644 index e91292fe27f..00000000000 --- a/res/cardsfolder/ashes_to_ashes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ashes to Ashes -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B B | ValidTgts$ Creature.nonArtifact | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select 2 target nonartifact creatures | Origin$ Battlefield | Destination$ Exile | SubAbility$ SVar=DBDamage | SpellDescription$ Exile two target nonartifact creatures. CARDNAME deals 5 damage to you. -SVar:DBDamage:DB$DealDamage | Defined$ You | NumDmg$ 5 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashes_to_ashes.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/3.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/1.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashnods_altar.txt b/res/cardsfolder/ashnods_altar.txt deleted file mode 100644 index b8d8cc817df..00000000000 --- a/res/cardsfolder/ashnods_altar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ashnod's Altar -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashnods_altar.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/349.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/274.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ashnods_transmogrant.txt b/res/cardsfolder/ashnods_transmogrant.txt deleted file mode 100644 index 95e66caaf77..00000000000 --- a/res/cardsfolder/ashnods_transmogrant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ashnod's Transmogrant -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.nonArtifact | TgtPrompt$ Select target nonartifact creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=DBAnimate| SpellDescription$ Put a +1/+1 counter on target nonartifact creature. That creature becomes an artifact in addition to its other types. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Artifact | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ashnods_transmogrant.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/350.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/asmira_holy_avenger.txt b/res/cardsfolder/asmira_holy_avenger.txt deleted file mode 100644 index 5e031f093ec..00000000000 --- a/res/cardsfolder/asmira_holy_avenger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Asmira, Holy Avenger -ManaCost:2 G W -Types:Legendary Creature Human Cleric -Text:no text -PT:2/3 -K:Flying -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ 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. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/asmira_holy_avenger.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aspect_of_mongoose.txt b/res/cardsfolder/aspect_of_mongoose.txt deleted file mode 100644 index 99bf81dcc0c..00000000000 --- a/res/cardsfolder/aspect_of_mongoose.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aspect of Mongoose -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Shroud -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aspect_of_mongoose.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aspect_of_wolf.txt b/res/cardsfolder/aspect_of_wolf.txt deleted file mode 100644 index 56c2a2c5263..00000000000 --- a/res/cardsfolder/aspect_of_wolf.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Aspect of Wolf -ManaCost:1 G -Types:Enchantment Aura -Text: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. -K:Enchant Creature -K:stPumpEnchanted:Creature:X/Y:no Condition:no text -SVar:X:Count$TypeYouCtrl.Forest/HalfDown -SVar:Y:Count$Valid Forest.YouCtrl/HalfUp -SVar:BuffedBy:Forest -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aspect_of_wolf.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/140.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/93.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/93.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/117.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/assassinate.txt b/res/cardsfolder/assassinate.txt deleted file mode 100644 index b43f7189dcf..00000000000 --- a/res/cardsfolder/assassinate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Assassinate -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | SpellDescription$ Destroy target tapped creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/assassinate.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/81.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/84.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/95.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/128.jpg -End diff --git a/res/cardsfolder/assassins_blade.txt b/res/cardsfolder/assassins_blade.txt deleted file mode 100644 index ba809ce2249..00000000000 --- a/res/cardsfolder/assassins_blade.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Assassin's Blade -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonBlack+attacking | TgtPrompt$ Select target nonblack attacking creature | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Destroy target nonblack attacking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/assassins_blade.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/assault_griffin.txt b/res/cardsfolder/assault_griffin.txt deleted file mode 100644 index 9a4c6ec515d..00000000000 --- a/res/cardsfolder/assault_griffin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Assault Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:3/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/assault_griffin.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/assault_strobe.txt b/res/cardsfolder/assault_strobe.txt deleted file mode 100644 index 9f43fef44d8..00000000000 --- a/res/cardsfolder/assault_strobe.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Assault Strobe -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Double Strike | SpellDescription$ Target creature gains double strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/assault_strobe.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/82.jpg -End diff --git a/res/cardsfolder/assault_zeppelid.txt b/res/cardsfolder/assault_zeppelid.txt deleted file mode 100644 index f47f158010b..00000000000 --- a/res/cardsfolder/assault_zeppelid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Assault Zeppelid -ManaCost:2 G U -Types:Creature Beast -Text:no text -PT:3/3 -K:Flying -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97107.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/assembly_worker.txt b/res/cardsfolder/assembly_worker.txt deleted file mode 100644 index c9f22c6f365..00000000000 --- a/res/cardsfolder/assembly_worker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Assembly-Worker -ManaCost:3 -Types:Artifact Creature Assembly-Worker -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Assembly-Worker | TgtPrompt$ Select target Assembly-Worker creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target Assembly-Worker creature gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/assembly_worker.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/assert_authority.txt b/res/cardsfolder/assert_authority.txt deleted file mode 100644 index bb01af3e6c3..00000000000 --- a/res/cardsfolder/assert_authority.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Assert Authority -ManaCost:5 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 5 U U | TargetType$ Spell | ValidTgts$ Card | Destination$ Exile | SpellDescription$ Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/assert_authority.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/astral_slide.txt b/res/cardsfolder/astral_slide.txt deleted file mode 100644 index 0813a0b60e9..00000000000 --- a/res/cardsfolder/astral_slide.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Astral Slide -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigExile | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ SVar=DelTrig -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return exiled creature to the battlefield. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/astral_slide.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/astral_steel.txt b/res/cardsfolder/astral_steel.txt deleted file mode 100644 index 992eaae5c56..00000000000 --- a/res/cardsfolder/astral_steel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Astral Steel -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ Target creature gets +1/+2 until end of turn. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/astral_steel.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/astrolabe.txt b/res/cardsfolder/astrolabe.txt deleted file mode 100644 index 4689ad28413..00000000000 --- a/res/cardsfolder/astrolabe.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Astrolabe -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ W | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Add W W to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ U | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Add U U to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Add B B to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Add R R to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ G | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Add G G to your mana pool. Draw a card at the beginning of the next turn's upkeep. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/astrolabe.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/159.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/atog.txt b/res/cardsfolder/atog.txt deleted file mode 100644 index c280a1b9ad8..00000000000 --- a/res/cardsfolder/atog.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Atog -ManaCost:1 R -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Artifact> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/atog.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/86.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/209.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/138.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/88.jpg -End diff --git a/res/cardsfolder/atogatog.txt b/res/cardsfolder/atogatog.txt deleted file mode 100644 index aaf4c733a84..00000000000 --- a/res/cardsfolder/atogatog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Atogatog -ManaCost:W U B R G -Types:Creature Atog -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ Sac<1/Creature.Atog> | Defined$ Self | NumAtt$ X | NumDef$ X | CostDesc$ Sacrifice an Atog creature: | SpellDescription$ CARDNAME gets +X/+X until end of turn, where X is the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/atogatog.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/attrition.txt b/res/cardsfolder/attrition.txt deleted file mode 100644 index ef06c048a9d..00000000000 --- a/res/cardsfolder/attrition.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Attrition -ManaCost:1 B B -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ B Sac<1/Creature> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/attrition.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/52.jpg -End diff --git a/res/cardsfolder/attunement.txt b/res/cardsfolder/attunement.txt deleted file mode 100644 index af728e9868a..00000000000 --- a/res/cardsfolder/attunement.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Attunement -ManaCost:2 U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ Return<1/CARDNAME> | NumCards$ 3 | SpellDescription$ Draw three cards, then discard four cards. | SubAbility$ SVar=DB -SVar:DB:DB$Discard | NumCards$ 4 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/attunement.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/augur_il_vec.txt b/res/cardsfolder/augur_il_vec.txt deleted file mode 100644 index cc69955a731..00000000000 --- a/res/cardsfolder/augur_il_vec.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Augur il-Vec -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/3 -K:Shadow -A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ 4 | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ You gain 4 life. Activate this ability only during your upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/augur_il_vec.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/augur_of_skulls.txt b/res/cardsfolder/augur_of_skulls.txt deleted file mode 100644 index e9426d0113c..00000000000 --- a/res/cardsfolder/augur_of_skulls.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Augur of Skulls -ManaCost:1 B -Types:Creature Skeleton Wizard -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -A:AB$ Discard | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Target player discards two cards. Activate this ability only during your upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/augur_of_skulls.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/augury_adept.txt b/res/cardsfolder/augury_adept.txt deleted file mode 100644 index c109563fbca..00000000000 --- a/res/cardsfolder/augury_adept.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Augury Adept -ManaCost:1 WU WU -Types:Creature Kithkin Wizard -Text: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. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/augury_adept.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/augury_owl.txt b/res/cardsfolder/augury_owl.txt deleted file mode 100644 index f477f68cb09..00000000000 --- a/res/cardsfolder/augury_owl.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Augury Owl -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME 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.) -SVar:TrigScry:AB$Scry | Cost$ 0 | ScryNum$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/augury_owl.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aunties_hovel.txt b/res/cardsfolder/aunties_hovel.txt deleted file mode 100644 index b99c050e9cd..00000000000 --- a/res/cardsfolder/aunties_hovel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Auntie's Hovel -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal a Goblin card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aunties_hovel.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aura_blast.txt b/res/cardsfolder/aura_blast.txt deleted file mode 100644 index a8082668481..00000000000 --- a/res/cardsfolder/aura_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aura Blast -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_blast.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/1.jpg -End diff --git a/res/cardsfolder/aura_extraction.txt b/res/cardsfolder/aura_extraction.txt deleted file mode 100644 index 4617dfd9ce6..00000000000 --- a/res/cardsfolder/aura_extraction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aura Extraction -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target enchantment on top of its owner's library. -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_extraction.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aura_flux.txt b/res/cardsfolder/aura_flux.txt deleted file mode 100644 index c776d5707b2..00000000000 --- a/res/cardsfolder/aura_flux.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aura Flux -ManaCost:2 U -Types:Enchantment -Text:no text -K:stPumpAll:Enchantment.Other:0/0/At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2:No Condition:Other enchantments have "At the beginning of your upkeep, sacrifice this enchantment unless you pay 2." -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_flux.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aura_fracture.txt b/res/cardsfolder/aura_fracture.txt deleted file mode 100644 index 2cf6ea0179b..00000000000 --- a/res/cardsfolder/aura_fracture.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Aura Fracture -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ Sac<1/Land> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_fracture.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/2.jpg -End diff --git a/res/cardsfolder/aura_gnarlid.txt b/res/cardsfolder/aura_gnarlid.txt deleted file mode 100644 index 03356d3bbcf..00000000000 --- a/res/cardsfolder/aura_gnarlid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aura Gnarlid -ManaCost:2 G -Types:Creature Beast -Text:no text -PT:2/2 -K:Creatures with power less than CARDNAME's power can't block it. -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +1/+1 for each Aura on the battlefield. -SVar:X:Count$Valid Aura -SVar:BuffedBy:Aura -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_gnarlid.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aura_mutation.txt b/res/cardsfolder/aura_mutation.txt deleted file mode 100644 index 7b23afea150..00000000000 --- a/res/cardsfolder/aura_mutation.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aura Mutation -ManaCost:G W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SubAbility$ SVar=TrigToken | SpellDescription$ Destroy target enchantment. Put X 1/1 green Saproling creature tokens onto the battlefield, where X is that enchantment's converted mana cost. -#X will be the Converted Mana Cost of the target of Mutation -SVar:TrigToken:DB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Targeted$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_mutation.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/232.jpg -End diff --git a/res/cardsfolder/aura_of_dominion.txt b/res/cardsfolder/aura_of_dominion.txt deleted file mode 100644 index 4eb3938bdce..00000000000 --- a/res/cardsfolder/aura_of_dominion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aura of Dominion -ManaCost:U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Untap | Cost$ 1 tapXType<1/Creature> | Defined$ Enchanted | CostDesc$ 1, Tap an untapped creature you control: | SpellDescription$ Untap enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_of_dominion.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aura_of_silence.txt b/res/cardsfolder/aura_of_silence.txt deleted file mode 100644 index 120e7b8a5c9..00000000000 --- a/res/cardsfolder/aura_of_silence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aura of Silence -ManaCost:1 W W -Types:Enchantment -Text:Artifact and enchantment spells your opponents cast cost 2 more to cast. -K:CostChange:Opponent:More:2:Spell:All:Enchantment/Artifact:OnlyOneBonus -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Enchantment,Artifact | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_of_silence.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/123.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/6.jpg -End diff --git a/res/cardsfolder/aura_shards.txt b/res/cardsfolder/aura_shards.txt deleted file mode 100644 index b902ab6227c..00000000000 --- a/res/cardsfolder/aura_shards.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aura Shards -ManaCost:1 W G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDestroy | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may destroy target artifact or enchantment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment -SVar:BuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_shards.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auramancer.txt b/res/cardsfolder/auramancer.txt deleted file mode 100644 index 9ec27932a62..00000000000 --- a/res/cardsfolder/auramancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auramancer -ManaCost:2 W -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target enchantment card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/auramancer.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auratog.txt b/res/cardsfolder/auratog.txt deleted file mode 100644 index 0d0eca4f50c..00000000000 --- a/res/cardsfolder/auratog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auratog -ManaCost:1 W -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Enchantment> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/auratog.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/218.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/2.jpg -End diff --git a/res/cardsfolder/auriok_bladewarden.txt b/res/cardsfolder/auriok_bladewarden.txt deleted file mode 100644 index ed54d3609d5..00000000000 --- a/res/cardsfolder/auriok_bladewarden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auriok Bladewarden -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is CARDNAME's power. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_bladewarden.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/3.jpg -End diff --git a/res/cardsfolder/auriok_champion.txt b/res/cardsfolder/auriok_champion.txt deleted file mode 100644 index d962ffcb433..00000000000 --- a/res/cardsfolder/auriok_champion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Auriok Champion -ManaCost:W W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Protection from black -K:Protection from red -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_champion.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auriok_edgewright.txt b/res/cardsfolder/auriok_edgewright.txt deleted file mode 100644 index a007232cdf7..00000000000 --- a/res/cardsfolder/auriok_edgewright.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auriok Edgewright -ManaCost:W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/Double Strike:Metalcraft:Metalcraft - Auriok Edgewright has double strike as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_edgewright.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auriok_glaivemaster.txt b/res/cardsfolder/auriok_glaivemaster.txt deleted file mode 100644 index 91207c860e4..00000000000 --- a/res/cardsfolder/auriok_glaivemaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auriok Glaivemaster -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Permanent.equipped:1/1/First Strike:No Condition:As long as Auriok Glaivemaster is equipped, it gets +1/+1 and has first strike. -SVar:EquipMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_glaivemaster.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auriok_salvagers.txt b/res/cardsfolder/auriok_salvagers.txt deleted file mode 100644 index fa0514e9e89..00000000000 --- a/res/cardsfolder/auriok_salvagers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Auriok Salvagers -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/4 -A:AB$ ChangeZone | Cost$ 1 W | TgtPrompt$ Choose target artifact card with converted mana cost 1 or less in your graveyard | ValidTgts$ Artifact.cmcLE1+YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card with converted mana cost 1 or less from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_salvagers.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auriok_sunchaser.txt b/res/cardsfolder/auriok_sunchaser.txt deleted file mode 100644 index b63ad6b1213..00000000000 --- a/res/cardsfolder/auriok_sunchaser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auriok Sunchaser -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Creature:2/2/Flying:Metalcraft:Metalcraft - As long as you control three or more artifacts, Auriok Sunchaser gets +2/+2 and has flying. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_sunchaser.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auriok_transfixer.txt b/res/cardsfolder/auriok_transfixer.txt deleted file mode 100644 index a47cd3f8943..00000000000 --- a/res/cardsfolder/auriok_transfixer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Auriok Transfixer -ManaCost:W -Types:Creature Human Scout -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ W T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Tap target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_transfixer.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/5.jpg -End diff --git a/res/cardsfolder/aurochs.txt b/res/cardsfolder/aurochs.txt deleted file mode 100644 index ac0b8441c64..00000000000 --- a/res/cardsfolder/aurochs.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Aurochs -ManaCost:3 G -Types:Creature Aurochs -Text:no text -PT:2/3 -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Aurochs.attacking+Other -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aurochs.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/141.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aurochs_herd.txt b/res/cardsfolder/aurochs_herd.txt deleted file mode 100644 index b0f09f206cb..00000000000 --- a/res/cardsfolder/aurochs_herd.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Aurochs Herd -ManaCost:5 G -Types:Creature Aurochs -Text:no text -PT:4/4 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Aurochs | ChangeNum$ 1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Aurochs.attacking+Other -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aurochs_herd.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/103.jpg -End diff --git a/res/cardsfolder/aurora_eidolon.txt b/res/cardsfolder/aurora_eidolon.txt deleted file mode 100644 index 78695f4bad4..00000000000 --- a/res/cardsfolder/aurora_eidolon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aurora Eidolon -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | Tgt$ TgtCP | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aurora_eidolon.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aurora_griffin.txt b/res/cardsfolder/aurora_griffin.txt deleted file mode 100644 index ed0c16097a7..00000000000 --- a/res/cardsfolder/aurora_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aurora Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -A:AB$ Animate | Cost$ W | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ White | OverwriteColors$ True | SpellDescription$ Target permanent becomes white until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aurora_griffin.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/auspicious_ancestor.txt b/res/cardsfolder/auspicious_ancestor.txt deleted file mode 100644 index 3b011143f6d..00000000000 --- a/res/cardsfolder/auspicious_ancestor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Auspicious Ancestor -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may pay 1. If you do, gain 1 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGrave | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 3 life. -SVar:TrigGrave:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 3 -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/auspicious_ancestor.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/austere_command.txt b/res/cardsfolder/austere_command.txt deleted file mode 100644 index 060fef0f96f..00000000000 --- a/res/cardsfolder/austere_command.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Austere Command -ManaCost:4 W W -Types:Sorcery -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/austere_command.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avalanche.txt b/res/cardsfolder/avalanche.txt deleted file mode 100644 index 20fb8cedbab..00000000000 --- a/res/cardsfolder/avalanche.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Avalanche -ManaCost:X 2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ X 2 R R | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | SpellDescription$ Destroy X target snow lands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land.Snow -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/avalanche.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avalanche_riders.txt b/res/cardsfolder/avalanche_riders.txt deleted file mode 100644 index f0440abbfb8..00000000000 --- a/res/cardsfolder/avalanche_riders.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Avalanche Riders -ManaCost:3 R -Types:Creature Human Nomad -Text:no text -PT:2/2 -K:Haste -K:Echo:3 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/avalanche_riders.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/55.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avarax.txt b/res/cardsfolder/avarax.txt deleted file mode 100644 index a0cdbeb30c8..00000000000 --- a/res/cardsfolder/avarax.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Avarax -ManaCost:3 R R -Types:Creature Beast -Text:no text -PT:3/3 -K:Haste -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedAvarax | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/avarax.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/187.jpg -End diff --git a/res/cardsfolder/avatar_of_fury.txt b/res/cardsfolder/avatar_of_fury.txt deleted file mode 100644 index 4ffebd18161..00000000000 --- a/res/cardsfolder/avatar_of_fury.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Avatar of Fury -ManaCost:6 R R -Types:Creature Avatar -Text:If an opponent controls seven or more lands, Avatar of Fury costs 6 less to cast. -PT:6/6 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_fury.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/82.jpg -End diff --git a/res/cardsfolder/avatar_of_might.txt b/res/cardsfolder/avatar_of_might.txt deleted file mode 100644 index da2c5107d4c..00000000000 --- a/res/cardsfolder/avatar_of_might.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Avatar of Might -ManaCost:6 G G -Types:Creature Avatar -Text:If an opponent controls at least four more creatures than you, Avatar of Might costs 6 less to cast. -PT:8/8 -K:Trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_might.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/109.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avatar_of_will.txt b/res/cardsfolder/avatar_of_will.txt deleted file mode 100644 index 852238c79ef..00000000000 --- a/res/cardsfolder/avatar_of_will.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Avatar of Will -ManaCost:6 U U -Types:Creature Avatar -Text:If an opponent has no cards in hand, CARDNAME costs 6 less to cast. -PT:5/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_will.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avatar_of_woe.txt b/res/cardsfolder/avatar_of_woe.txt deleted file mode 100644 index 1e32b28bd3d..00000000000 --- a/res/cardsfolder/avatar_of_woe.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Avatar of Woe -ManaCost:6 B B -Types:Creature Avatar -Text:If there are ten or more creature cards total in all graveyards, CARDNAME costs 6 less to cast. -PT:6/5 -K:Fear -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SpellDescription$ Destroy target creature. It can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avatar_of_woe.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/56.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/37.jpg -End diff --git a/res/cardsfolder/aven_archer.txt b/res/cardsfolder/aven_archer.txt deleted file mode 100644 index 713d61eb070..00000000000 --- a/res/cardsfolder/aven_archer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Archer -ManaCost:3 W W -Types:Creature Bird Soldier Archer -Text:no text -PT:2/2 -K:Flying -A:AB$ DealDamage | Cost$ 2 W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_archer.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_augur.txt b/res/cardsfolder/aven_augur.txt deleted file mode 100644 index 844e283d54d..00000000000 --- a/res/cardsfolder/aven_augur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Augur -ManaCost:3 U -Types:Creature Bird Wizard -Text:no text -PT:2/2 -K:Flying -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Return up to two target creatures to their owners' hands. Activate this ability only during your upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_augur.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_brigadier.txt b/res/cardsfolder/aven_brigadier.txt deleted file mode 100644 index cad0ddb2ebf..00000000000 --- a/res/cardsfolder/aven_brigadier.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aven Brigadier -ManaCost:3 W W W -Types:Creature Bird Soldier -Text:no text -PT:3/5 -K:Flying -K:stPumpAll:Creature.Bird+Other:1/1:No Condition:Other Bird creatures get +1/+1. -K:stPumpAll:Creature.Soldier+Other:1/1:No Condition:Other Soldier creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_brigadier.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_cloudchaser.txt b/res/cardsfolder/aven_cloudchaser.txt deleted file mode 100644 index 16050e2e353..00000000000 --- a/res/cardsfolder/aven_cloudchaser.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Aven Cloudchaser -ManaCost:3 W -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_cloudchaser.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/5.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/7.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/3.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_envoy.txt b/res/cardsfolder/aven_envoy.txt deleted file mode 100644 index 4a65649ce74..00000000000 --- a/res/cardsfolder/aven_envoy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aven Envoy -ManaCost:U -Types:Creature Bird Soldier -Text:no text -PT:0/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card44325.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_farseer.txt b/res/cardsfolder/aven_farseer.txt deleted file mode 100644 index 1a1ecabca79..00000000000 --- a/res/cardsfolder/aven_farseer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aven Farseer -ManaCost:1 W -Types:Creature Bird Soldier -Text:no text -PT:1/1 -K:Flying -T:Mode$ TurnFaceUp | ValidCard$ Permanent | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a permanent is turned face up, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_farseer.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_fateshaper.txt b/res/cardsfolder/aven_fateshaper.txt deleted file mode 100644 index 6e045d36410..00000000000 --- a/res/cardsfolder/aven_fateshaper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aven Fateshaper -ManaCost:6 U -Types:Creature Bird Wizard -Text:no text -PT:4/5 -K:Flying -A:AB$ RearrangeTopOfLibrary | Cost$ 4 U | Defined$ You | NumCards$ 4 | SpellDescription$ Look at the top four cards of your library, then put them back in any order. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_fateshaper.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_fisher.txt b/res/cardsfolder/aven_fisher.txt deleted file mode 100644 index 91c73430010..00000000000 --- a/res/cardsfolder/aven_fisher.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Aven Fisher -ManaCost:3 U -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82998.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/61.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/63.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/61.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_flock.txt b/res/cardsfolder/aven_flock.txt deleted file mode 100644 index c7f93fc7db2..00000000000 --- a/res/cardsfolder/aven_flock.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aven Flock -ManaCost:4 W -Types:Creature Bird Soldier -Text:no text -PT:2/3 -K:Flying -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_flock.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/6.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/8.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/4.jpg -End diff --git a/res/cardsfolder/aven_fogbringer.txt b/res/cardsfolder/aven_fogbringer.txt deleted file mode 100644 index 8c4ac48a9db..00000000000 --- a/res/cardsfolder/aven_fogbringer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Aven Fogbringer -ManaCost:3 U -Types:Creature Bird Wizard -Text:no text -PT:2/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target land to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Land | TgtPrompt$ Select target land | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_fogbringer.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_redeemer.txt b/res/cardsfolder/aven_redeemer.txt deleted file mode 100644 index d63632af00d..00000000000 --- a/res/cardsfolder/aven_redeemer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Redeemer -ManaCost:3 W -Types:Creature Bird Cleric -Text:no text -PT:2/2 -K:Flying -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_redeemer.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_riftwatcher.txt b/res/cardsfolder/aven_riftwatcher.txt deleted file mode 100644 index a0969d1bd1e..00000000000 --- a/res/cardsfolder/aven_riftwatcher.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Aven Riftwatcher -ManaCost:2 W -Types:Creature Bird Rebel Soldier -Text:no text -K:Vanishing:3 -PT:2/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you gain 2 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigGainLife | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_riftwatcher.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_smokeweaver.txt b/res/cardsfolder/aven_smokeweaver.txt deleted file mode 100644 index 5a2992ae017..00000000000 --- a/res/cardsfolder/aven_smokeweaver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Smokeweaver -ManaCost:2 U U -Types:Creature Bird Soldier -Text:no text -PT:2/3 -K:Flying -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_smokeweaver.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_squire.txt b/res/cardsfolder/aven_squire.txt deleted file mode 100644 index 47524f0fd9f..00000000000 --- a/res/cardsfolder/aven_squire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Squire -ManaCost:1 W -Types:Creature Bird Soldier -Text:no text -PT:1/1 -K:Flying -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_squire.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_trailblazer.txt b/res/cardsfolder/aven_trailblazer.txt deleted file mode 100644 index ea8939aa648..00000000000 --- a/res/cardsfolder/aven_trailblazer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aven Trailblazer -ManaCost:2 W -Types:Creature Bird Soldier -Text:no text -PT:2/* -K:Flying -K:stSetPT:2:Count$Domain:Domain - Aven Trailblazer's toughness is equal to the number of basic land types among lands you control. -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_trailblazer.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aven_trooper.txt b/res/cardsfolder/aven_trooper.txt deleted file mode 100644 index 65effa19532..00000000000 --- a/res/cardsfolder/aven_trooper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aven Trooper -ManaCost:3 W -Types:Creature Bird Soldier -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ 2 W Discard<1/Card> | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ CARDNAME gets +1/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aven_trooper.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avenger_en_dal.txt b/res/cardsfolder/avenger_en_dal.txt deleted file mode 100644 index da099deb04b..00000000000 --- a/res/cardsfolder/avenger_en_dal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Avenger en-Dal -ManaCost:1 W -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 2 W T Discard<1/Card> | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. Its controller gains life equal to its toughness. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avenger_en_dal.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avenger_of_zendikar.txt b/res/cardsfolder/avenger_of_zendikar.txt deleted file mode 100644 index 0a68e9b7b1d..00000000000 --- a/res/cardsfolder/avenger_of_zendikar.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Avenger of Zendikar -ManaCost:5 G G -Types:Creature Elemental -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 0/1 green Plant creature token onto the battlefield for each land you control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 -SVar:X:Count$NumTypeYouCtrl.Land -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | OptionalDecider$ You | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a +1/+1 counter on each Plant creature you control. -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.Plant+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Land -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/avenger_of_zendikar.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avenging_angel.txt b/res/cardsfolder/avenging_angel.txt deleted file mode 100644 index 869b99cdb11..00000000000 --- a/res/cardsfolder/avenging_angel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Avenging Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may put CARDNAME on top of its owner's library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/avenging_angel.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avian_changeling.txt b/res/cardsfolder/avian_changeling.txt deleted file mode 100644 index a6a510ed1e1..00000000000 --- a/res/cardsfolder/avian_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Avian Changeling -ManaCost:2 W -Types:Creature Shapeshifter -Text:no text -PT:2/2 -K:Flying -K:Changeling -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card145813.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/avoid_fate.txt b/res/cardsfolder/avoid_fate.txt deleted file mode 100644 index 9d8fe7540a1..00000000000 --- a/res/cardsfolder/avoid_fate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Avoid Fate -ManaCost:G -Types:Instant -Text:no text -A:SP$ Counter | Cost$ G | TargetType$ Spell | ValidTgts$ Instant,Aura | TargetValidTargeting$ Permanent.YouCtrl | SpellDescription$ Counter target instant or Aura spell that targets a permanent you control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/avoid_fate.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/73.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/awakener_druid.txt b/res/cardsfolder/awakener_druid.txt deleted file mode 100644 index 3eadb987fcd..00000000000 --- a/res/cardsfolder/awakener_druid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Awakener Druid -ManaCost:2 G -Types:Creature Human Druid -Text:no text -PT:1/1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/awakener_druid.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/163.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/awakening.txt b/res/cardsfolder/awakening.txt deleted file mode 100644 index e1d9ba65020..00000000000 --- a/res/cardsfolder/awakening.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Awakening -ManaCost:2 G G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ At the beginning of each upkeep, untap all creatures and lands. -SVar:TrigUntapAll:AB$UntapAll | Cost$ 0 | ValidCards$ Creature,Land | SpellDescription$ untap all creatures and lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/awakening.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/awakening_zone.txt b/res/cardsfolder/awakening_zone.txt deleted file mode 100644 index 52e02b126df..00000000000 --- a/res/cardsfolder/awakening_zone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Awakening Zone -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ 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." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/awakening_zone.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/axegrinder_giant.txt b/res/cardsfolder/axegrinder_giant.txt deleted file mode 100644 index 22553704341..00000000000 --- a/res/cardsfolder/axegrinder_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Axegrinder Giant -ManaCost:4 R R -Types:Creature Giant Warrior -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card145976.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/axelrod_gunnarson.txt b/res/cardsfolder/axelrod_gunnarson.txt deleted file mode 100644 index 0bae2fd8738..00000000000 --- a/res/cardsfolder/axelrod_gunnarson.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Axelrod Gunnarson -ManaCost:4 B B R R -Types:Legendary Creature Giant -Text:no text -PT:5/5 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.DamagedBy | Execute$ TrigDealDamage | TriggerDescription$ Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, you gain 1 life and CARDNAME deals 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/axelrod_gunnarson.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aysen_abbey.txt b/res/cardsfolder/aysen_abbey.txt deleted file mode 100644 index 7267b846eec..00000000000 --- a/res/cardsfolder/aysen_abbey.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Aysen Abbey -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_abbey.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aysen_bureaucrats.txt b/res/cardsfolder/aysen_bureaucrats.txt deleted file mode 100644 index d153e5958b7..00000000000 --- a/res/cardsfolder/aysen_bureaucrats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Aysen Bureaucrats -ManaCost:1 W -Types:Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | SpellDescription$ Tap target creature with power 2 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_bureaucrats.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/104.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/285.jpg -End diff --git a/res/cardsfolder/aysen_crusader.txt b/res/cardsfolder/aysen_crusader.txt deleted file mode 100644 index 09dfd90c6ec..00000000000 --- a/res/cardsfolder/aysen_crusader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aysen Crusader -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:2+*/2+* -K:stSetPT:Count$Valid Soldier.YouCtrl,Warrior.YouCtrl/Plus.2:Count$Valid Soldier.YouCtrl,Warrior.YouCtrl/Plus.2:CARDNAME's power and toughness are each equal to 2 plus the number of Soldiers and Warriors you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_crusader.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/aysen_highway.txt b/res/cardsfolder/aysen_highway.txt deleted file mode 100644 index 6baa55f492a..00000000000 --- a/res/cardsfolder/aysen_highway.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Aysen Highway -ManaCost:3 W W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White:0/0/Plainswalk:No Condition:White creatures have plainswalk. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/aysen_highway.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ayumi_the_last_visitor.txt b/res/cardsfolder/ayumi_the_last_visitor.txt deleted file mode 100644 index f34eb90c233..00000000000 --- a/res/cardsfolder/ayumi_the_last_visitor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ayumi, the Last Visitor -ManaCost:3 G G -Types:Legendary Creature Spirit -Text:no text -PT:7/3 -K:Legendary landwalk -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ayumi_the_last_visitor.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azami_lady_of_scrolls.txt b/res/cardsfolder/azami_lady_of_scrolls.txt deleted file mode 100644 index 46c6757944e..00000000000 --- a/res/cardsfolder/azami_lady_of_scrolls.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Azami, Lady of Scrolls -ManaCost:2 U U U -Types:Legendary Creature Human Wizard -Text:no text -PT:0/2 -A:AB$ Draw | Cost$ tapXType<1/Wizard> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/azami_lady_of_scrolls.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azimaet_drake.txt b/res/cardsfolder/azimaet_drake.txt deleted file mode 100644 index c0fba0152fe..00000000000 --- a/res/cardsfolder/azimaet_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Azimaet Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:1/3 -K:Flying -A:AB$ Pump | Cost$ U | NumAtt$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/azimaet_drake.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_aethermage.txt b/res/cardsfolder/azorius_aethermage.txt deleted file mode 100644 index d033140c1f4..00000000000 --- a/res/cardsfolder/azorius_aethermage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Azorius AEthermage -ManaCost:1 W U -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever a permanent is returned to your hand, you may pay 1. If you do, draw a card. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Card.YouOwn | Execute$ TrigDraw | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever a permanent is returned to your hand, you may pay 1. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 1 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_aethermage.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_chancery.txt b/res/cardsfolder/azorius_chancery.txt deleted file mode 100644 index da141659c72..00000000000 --- a/res/cardsfolder/azorius_chancery.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Azorius Chancery -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W U | SpellDescription$ Add W U to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_chancery.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_first_wing.txt b/res/cardsfolder/azorius_first_wing.txt deleted file mode 100644 index f20f87df682..00000000000 --- a/res/cardsfolder/azorius_first_wing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Azorius First-Wing -ManaCost:W U -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -K:Protection from enchantments -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_first_wing.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_guildmage.txt b/res/cardsfolder/azorius_guildmage.txt deleted file mode 100644 index b547d975d9f..00000000000 --- a/res/cardsfolder/azorius_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Azorius Guildmage -ManaCost:WU WU -Types:Creature Vedalken Wizard -Text:no text -PT:2/2 -A:AB$ Tap | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -A:AB$ Counter | Cost$ 2 U | TgtPrompt$ Select target Activated Ability | ValidTgts$ Card | TargetType$ Activated | SpellDescription$ Counter target activated ability. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_guildmage.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_ploy.txt b/res/cardsfolder/azorius_ploy.txt deleted file mode 100644 index 592830f3dca..00000000000 --- a/res/cardsfolder/azorius_ploy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Azorius Ploy -ManaCost:1 W W U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W W U | ValidTgts$ Creature | TgtPrompt$ Select target creature whose combat damage will be prevented | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ SVar=DBPump | SpellDescription$ Prevent all combat damage target creature would deal this turn. -SVar:DBPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature that will have all damage dealt to it prevented | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_ploy.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azorius_signet.txt b/res/cardsfolder/azorius_signet.txt deleted file mode 100644 index eb6fb43af44..00000000000 --- a/res/cardsfolder/azorius_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Azorius Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W U | SpellDescription$ Add W U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_signet.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azure_drake.txt b/res/cardsfolder/azure_drake.txt deleted file mode 100644 index 0ae5fbfc705..00000000000 --- a/res/cardsfolder/azure_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Azure Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:2/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83084.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/46.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/73.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/63.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/azusa_lost_but_seeking.txt b/res/cardsfolder/azusa_lost_but_seeking.txt deleted file mode 100644 index 9ee6a80183a..00000000000 --- a/res/cardsfolder/azusa_lost_but_seeking.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Azusa, Lost but Seeking -ManaCost:2 G -Types:Legendary Creature Human Monk -Text:You may play two additional lands on each of your turns. -PT:1/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/azusa_lost_but_seeking.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/back_to_basics.txt b/res/cardsfolder/back_to_basics.txt deleted file mode 100644 index f83fb39cde6..00000000000 --- a/res/cardsfolder/back_to_basics.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Back to Basics -ManaCost:2 U -Types:Enchantment -Text:Nonbasic lands don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Land.nonBasic -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/back_to_basics.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/back_to_nature.txt b/res/cardsfolder/back_to_nature.txt deleted file mode 100644 index c03fbca5a33..00000000000 --- a/res/cardsfolder/back_to_nature.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Back to Nature -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 1 G | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/back_to_nature.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/164.jpg -End diff --git a/res/cardsfolder/backfire.txt b/res/cardsfolder/backfire.txt deleted file mode 100644 index 4caee70f773..00000000000 --- a/res/cardsfolder/backfire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Backfire -ManaCost:U -Types:Enchantment Aura -Text:Whenever enchanted creature deals damage to you, Backfire deals that much damage to that creature's controller. -K:Enchant Creature Curse -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/backfire.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/62.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/backlash.txt b/res/cardsfolder/backlash.txt deleted file mode 100644 index 49609233adb..00000000000 --- a/res/cardsfolder/backlash.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Backlash -ManaCost:1 B R -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 1 B R| ValidTgts$ Creature.untapped | TgtPrompt$ Select an untapped creature | SubAbility$ SVar=DBDamage | SpellDescription$ Tap target untapped creature. That creature deals damage equal to its power to its controller. -SVar:DBDamage:DB$DealDamage | Cost$ 0 | Defined$ TargetedController | DamageSource$ Targeted | NumDmg$ X -SVar:X:Targeted$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/backlash.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bad_moon.txt b/res/cardsfolder/bad_moon.txt deleted file mode 100644 index 6e27bb516f6..00000000000 --- a/res/cardsfolder/bad_moon.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Bad Moon -ManaCost:1 B -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Black:1/1:No Condition:Black creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bad_moon.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/2.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/2.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/4.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/38.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/2.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/4.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bad_river.txt b/res/cardsfolder/bad_river.txt deleted file mode 100644 index 31f03b7d3fb..00000000000 --- a/res/cardsfolder/bad_river.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bad River -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Island,Swamp | ChangeNum$ 1 | SpellDescription$ Search your library for an Island or Swamp card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bad_river.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/badlands.txt b/res/cardsfolder/badlands.txt deleted file mode 100644 index 9833e7941f8..00000000000 --- a/res/cardsfolder/badlands.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Badlands -ManaCost:no cost -Types:Land Swamp Mountain -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/badlands.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/277.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/139.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/282.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baku_altar.txt b/res/cardsfolder/baku_altar.txt deleted file mode 100644 index c34c8fac51b..00000000000 --- a/res/cardsfolder/baku_altar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Baku Altar -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a ki counter on CARDNAME. -A:AB$ Token | Cost$ 2 T SubCounter<1/KI> | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Put a 1/1 colorless Spirit creature token onto the battlefield. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ KI | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/baku_altar.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bala_ged_scorpion.txt b/res/cardsfolder/bala_ged_scorpion.txt deleted file mode 100644 index 13907fecf14..00000000000 --- a/res/cardsfolder/bala_ged_scorpion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bala Ged Scorpion -ManaCost:3 B -Types:Creature Scorpion -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may destroy target creature with power 1 or less. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.powerLE1 | TgtPrompt$ Select target creature with power 1 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bala_ged_scorpion.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balance.txt b/res/cardsfolder/balance.txt deleted file mode 100644 index b2e8e8a5e9a..00000000000 --- a/res/cardsfolder/balance.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Balance -ManaCost:1 W -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balance.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/187.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/188.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/187.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/256.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_barbarians.txt b/res/cardsfolder/balduvian_barbarians.txt deleted file mode 100644 index ef21480d947..00000000000 --- a/res/cardsfolder/balduvian_barbarians.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Balduvian Barbarians -ManaCost:1 R R -Types:Creature Human Barbarian -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83001.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/176.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/166.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/174.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/172.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_bears.txt b/res/cardsfolder/balduvian_bears.txt deleted file mode 100644 index 9b881b5e055..00000000000 --- a/res/cardsfolder/balduvian_bears.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Balduvian Bears -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2550.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_conjurer.txt b/res/cardsfolder/balduvian_conjurer.txt deleted file mode 100644 index 76484414693..00000000000 --- a/res/cardsfolder/balduvian_conjurer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Balduvian Conjurer -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:0/2 -A:AB$ Animate | Cost$ T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature | SpellDescription$ Target snow land becomes a 2/2 creature until end of turn. It's still a land. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_conjurer.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_dead.txt b/res/cardsfolder/balduvian_dead.txt deleted file mode 100644 index ee0403f077d..00000000000 --- a/res/cardsfolder/balduvian_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Balduvian Dead -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/3 -A:AB$ Token | Cost$ 2 R ExileFromGrave<1/Creature> | TokenAmount$ 1 | TokenName$ Graveborn | TokenTypes$ Creature,Graveborn | TokenOwner$ You | TokenColors$ Black,Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste<>At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_dead.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_frostwaker.txt b/res/cardsfolder/balduvian_frostwaker.txt deleted file mode 100644 index 8a90f6a408a..00000000000 --- a/res/cardsfolder/balduvian_frostwaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Balduvian Frostwaker -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Animate | Cost$ T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Keywords$ Flying | Permanent$ True | SpellDescription$ Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_frostwaker.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_horde.txt b/res/cardsfolder/balduvian_horde.txt deleted file mode 100644 index 69bdc44561d..00000000000 --- a/res/cardsfolder/balduvian_horde.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Balduvian Horde -ManaCost:2 R R -Types:Creature Human Barbarian -Text:When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -PT:5/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_horde.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/167.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_rage.txt b/res/cardsfolder/balduvian_rage.txt deleted file mode 100644 index 16024cc643b..00000000000 --- a/res/cardsfolder/balduvian_rage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Balduvian Rage -ManaCost:X R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X R | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | NumAtt$ +X | SpellDescription$ Target attacking creature gets +X/+0 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_rage.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_trading_post.txt b/res/cardsfolder/balduvian_trading_post.txt deleted file mode 100644 index 7426cb8bb04..00000000000 --- a/res/cardsfolder/balduvian_trading_post.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Balduvian Trading Post -ManaCost:no cost -Types:Land -Text:If CARDNAME would enter the battlefield, sacrifice an untapped Mountain instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ 1 R | SpellDescription$ Add 1 R to your mana pool. -A:AB$ DealDamage | Cost$ 1 T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_trading_post.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balduvian_war_makers.txt b/res/cardsfolder/balduvian_war_makers.txt deleted file mode 100644 index aebabbb97db..00000000000 --- a/res/cardsfolder/balduvian_war_makers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Balduvian War-Makers -ManaCost:4 R -Types:Creature Human Barbarian -Text:no text -PT:3/3 -K:Haste -K:Rampage 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_war_makers.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/97.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/balefire_liege.txt b/res/cardsfolder/balefire_liege.txt deleted file mode 100644 index 659de3e4bea..00000000000 --- a/res/cardsfolder/balefire_liege.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Balefire Liege -ManaCost:2 RW RW RW -Types:Creature Spirit Horror -Text:no text -PT:2/4 -K:stPumpAll:Creature.Red+Other+YouCtrl:1/1:No Condition:Other red creatures you control get +1/+1. -K:stPumpAll:Creature.White+Other+YouCtrl:1/1:No Condition:Other white creatures you control get +1/+1. -T:Mode$ SpellCast | ValidCard$ Card.Red+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a red spell, CARDNAME deals 3 damage to target player. -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a white spell, you gain 3 life. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 3 -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:PlayMain1:TRUE -SVar:BuffedBy:Spell.Red,Spell.White -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balefire_liege.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baleful_stare.txt b/res/cardsfolder/baleful_stare.txt deleted file mode 100644 index 48d32a6bc73..00000000000 --- a/res/cardsfolder/baleful_stare.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Baleful Stare -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ RevealHand | Cost$ 2 U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ SVar=DBDraw | SpellDescription$ Target opponent reveals his or her hand. You draw a card for each Mountain and red card in it. -SVar:DBDraw:DB$Draw | NumCards$ X -SVar:X:Count$TypeInOppHand.Mountain/Plus.Y -SVar:Y:Count$RedInOppHand -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/baleful_stare.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/43.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/64.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ball_lightning.txt b/res/cardsfolder/ball_lightning.txt deleted file mode 100644 index 52323c28c42..00000000000 --- a/res/cardsfolder/ball_lightning.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Ball Lightning -ManaCost:R R R -Types:Creature Elemental -Text:no text -PT:6/1 -K:Haste -K:Trample -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4031.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/125.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/56.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/194.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ballista_squad.txt b/res/cardsfolder/ballista_squad.txt deleted file mode 100755 index ed931777856..00000000000 --- a/res/cardsfolder/ballista_squad.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ballista Squad -ManaCost:3 W -Types:Creature Human Rebel -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ X W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target attacking or blocking creature. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ballista_squad.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/5.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/5.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balloon_peddler.txt b/res/cardsfolder/balloon_peddler.txt deleted file mode 100644 index 5b0cddc76fa..00000000000 --- a/res/cardsfolder/balloon_peddler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Balloon Peddler -ManaCost:2 U -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ U T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/balloon_peddler.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ballynock_cohort.txt b/res/cardsfolder/ballynock_cohort.txt deleted file mode 100644 index ea5fe084142..00000000000 --- a/res/cardsfolder/ballynock_cohort.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ballynock Cohort -ManaCost:2 W -Types:Creature Kithkin Soldier -Text:no text -PT:2/2 -K:First Strike -K:stPumpSelf:Creature:1/1:isPresent Creature.White+Other+YouCtrl:CARDNAME gets +1/+1 as long as you control another white creature. -SVar:BuffedBy:Creature.White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ballynock_cohort.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ballynock_trapper.txt b/res/cardsfolder/ballynock_trapper.txt deleted file mode 100644 index 6fea293920b..00000000000 --- a/res/cardsfolder/ballynock_trapper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ballynock Trapper -ManaCost:3 W -Types:Creature Kithkin Soldier -Text:no text -PT:2/2 -A:AB$ Tap | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a white spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ballynock_trapper.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/2.jpg -End diff --git a/res/cardsfolder/ballyrush_banneret.txt b/res/cardsfolder/ballyrush_banneret.txt deleted file mode 100644 index fb5a28f8323..00000000000 --- a/res/cardsfolder/ballyrush_banneret.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ballyrush Banneret -ManaCost:1 W -Types:Creature Kithkin Soldier -Text:Kithkin spells and Soldier spells you cast cost 1 less to cast. -PT:2/1 -K:CostChange:Player:Less:1:Spell:All:Kithkin/Soldier:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ballyrush_banneret.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baloth_woodcrasher.txt b/res/cardsfolder/baloth_woodcrasher.txt deleted file mode 100644 index ca300c16e94..00000000000 --- a/res/cardsfolder/baloth_woodcrasher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Baloth Woodcrasher -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +4/+4 and gains trample until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 4 | NumDef$ 4 | KW$ Trample -SVar:BuffedBy:Land -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/baloth_woodcrasher.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balshan_collaborator.txt b/res/cardsfolder/balshan_collaborator.txt deleted file mode 100644 index 06afdb388ea..00000000000 --- a/res/cardsfolder/balshan_collaborator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Balshan Collaborator -ManaCost:3 U -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balshan_collaborator.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/25.jpg -End diff --git a/res/cardsfolder/balshan_griffin.txt b/res/cardsfolder/balshan_griffin.txt deleted file mode 100644 index 0351c97ff0a..00000000000 --- a/res/cardsfolder/balshan_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Balshan Griffin -ManaCost:3 U U -Types:Creature Griffin -Text:no text -PT:3/2 -K:Flying -A:AB$ ChangeZone | Cost$ 1 U Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/balshan_griffin.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balthor_the_defiled.txt b/res/cardsfolder/balthor_the_defiled.txt deleted file mode 100644 index 98ccb1a4032..00000000000 --- a/res/cardsfolder/balthor_the_defiled.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Balthor the Defiled -ManaCost:2 B B -Types:Creature Zombie Dwarf -Text:no text -PT:2/2 -K:stPumpAll:Creature.Minion:1/1:No Condition:Minion creatures get +1/+1. -A:AB$ ChangeZoneAll | Cost$ B B B Exile<1/CARDNAME> | ChangeType$ Creature.Black,Creature.Red | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Each player returns all black and all red creature cards from his or her graveyard to the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balthor_the_defiled.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/balthor_the_stout.txt b/res/cardsfolder/balthor_the_stout.txt deleted file mode 100644 index 449509c77f4..00000000000 --- a/res/cardsfolder/balthor_the_stout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Balthor the Stout -ManaCost:1 R R -Types:Legendary Creature Dwarf Barbarian -Text:no text -PT:2/2 -K:stPumpAll:Creature.Barbarian+Other:1/1:No Condition:Other Barbarian creatures get +1/+1. -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ +0 | TgtPrompt$ Choose another target Barbarian creature | ValidTgts$ Creature.Barbarian+Other | SpellDescription$ Another target Barbarian creature gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/balthor_the_stout.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bandage.txt b/res/cardsfolder/bandage.txt deleted file mode 100644 index bc2108f2f85..00000000000 --- a/res/cardsfolder/bandage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bandage -ManaCost:W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ W | Tgt$ TgtCP | Amount$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. Draw a card. -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bandage.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/101.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bane_of_the_living.txt b/res/cardsfolder/bane_of_the_living.txt deleted file mode 100644 index f2b5cb7cc28..00000000000 --- a/res/cardsfolder/bane_of_the_living.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bane of the Living -ManaCost:2 B B -Types:Creature Insect -Text:no text -PT:4/3 -K:Morph:X B B -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is turned face up, all creatures get -X/-X until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bane_of_the_living.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baneslayer_angel.txt b/res/cardsfolder/baneslayer_angel.txt deleted file mode 100644 index 1057088d5a1..00000000000 --- a/res/cardsfolder/baneslayer_angel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Baneslayer Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:5/5 -K:Flying -K:First Strike -K:Lifelink -K:Protection from Demons -K:Protection from Dragons -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/baneslayer_angel.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/7.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/banishing_knack.txt b/res/cardsfolder/banishing_knack.txt deleted file mode 100644 index a2848d1447a..00000000000 --- a/res/cardsfolder/banishing_knack.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Banishing Knack -ManaCost:U -Types:Instant -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/banishing_knack.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/banishment_decree.txt b/res/cardsfolder/banishment_decree.txt deleted file mode 100644 index 619ff1e7770..00000000000 --- a/res/cardsfolder/banishment_decree.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Banishment Decree -ManaCost:3 W W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 3 W W | ValidTgts$ Artifact,Creature,Enchantment | TgtPrompt$ Select target artifact, creature, or enchantment | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target artifact, creature, or enchantment on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/banishment_decree.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/banshee.txt b/res/cardsfolder/banshee.txt deleted file mode 100644 index 10c0d19a2f6..00000000000 --- a/res/cardsfolder/banshee.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Banshee -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:0/1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/banshee.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/banshees_blade.txt b/res/cardsfolder/banshees_blade.txt deleted file mode 100644 index 765551e6fcf..00000000000 --- a/res/cardsfolder/banshees_blade.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Banshee's Blade -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 2:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:Equipped creature gets +1/+1 for each charge counter on CARDNAME. -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player,Creature,Planeswalker | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage, put a charge counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/banshees_blade.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bant_battlemage.txt b/res/cardsfolder/bant_battlemage.txt deleted file mode 100644 index fcbd7166c0d..00000000000 --- a/res/cardsfolder/bant_battlemage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bant Battlemage -ManaCost:2 W -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -A:AB$ Pump | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_battlemage.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/5.jpg -End diff --git a/res/cardsfolder/bant_charm.txt b/res/cardsfolder/bant_charm.txt deleted file mode 100644 index 6e570857484..00000000000 --- a/res/cardsfolder/bant_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bant Charm -ManaCost:G W U -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G W U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Choose one - Destroy target artifact; -A:SP$ ChangeZone | Cost$ G W U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ or put target creature on the bottom of it's owner's library; -A:SP$ Counter | Cost$ G W U | TargetType$ Spell | ValidTgts$ Instant | SpellDescription$ or counter target instant spell. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_charm.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bant_panorama.txt b/res/cardsfolder/bant_panorama.txt deleted file mode 100644 index a947e6124f8..00000000000 --- a/res/cardsfolder/bant_panorama.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bant Panorama -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Forest+Basic,Land.Plains+Basic,Land.Island+Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic Forest, Plains, or Island card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_panorama.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bant_sojourners.txt b/res/cardsfolder/bant_sojourners.txt deleted file mode 100644 index 0d8f7118855..00000000000 --- a/res/cardsfolder/bant_sojourners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bant Sojourners -ManaCost:1 U W G -Types:Creature Human Soldier -Text:no text -PT:2/4 -K:Cycling:2 W -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may put a 1/1 white Soldier creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may put a 1/1 white Soldier creature token onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_sojourners.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bant_sureblade.txt b/res/cardsfolder/bant_sureblade.txt deleted file mode 100644 index e0fe29f0f2c..00000000000 --- a/res/cardsfolder/bant_sureblade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bant Sureblade -ManaCost:GU W -Types:Creature Human Soldier -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/First Strike:isPresent Permanent.MultiColor+Other+YouCtrl:As long as you control another multicolored permanent, Bant Sureblade gets +1/+1 and has first strike. -SVar:BuffedBy:Permanent.MultiColor -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_sureblade.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbarian_general.txt b/res/cardsfolder/barbarian_general.txt deleted file mode 100644 index 753f1728f36..00000000000 --- a/res/cardsfolder/barbarian_general.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barbarian General -ManaCost:4 R -Types:Creature Human Barbarian Soldier -Text:no text -PT:3/2 -K:Horsemanship -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_general.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbarian_horde.txt b/res/cardsfolder/barbarian_horde.txt deleted file mode 100644 index 5a254755ae4..00000000000 --- a/res/cardsfolder/barbarian_horde.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barbarian Horde -ManaCost:3 R -Types:Creature Human Barbarian Soldier -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10578.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbarian_lunatic.txt b/res/cardsfolder/barbarian_lunatic.txt deleted file mode 100644 index 489e8a6ab98..00000000000 --- a/res/cardsfolder/barbarian_lunatic.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barbarian Lunatic -ManaCost:2 R -Types:Creature Human Barbarian -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_lunatic.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbarian_outcast.txt b/res/cardsfolder/barbarian_outcast.txt deleted file mode 100644 index 4291d5f055b..00000000000 --- a/res/cardsfolder/barbarian_outcast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barbarian Outcast -ManaCost:1 R -Types:Creature Human Barbarian Beast -Text:no text -PT:2/2 -K:When you control no Swamps, sacrifice CARDNAME. -SVar:NeedsToPlay:Swamp.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_outcast.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbarian_riftcutter.txt b/res/cardsfolder/barbarian_riftcutter.txt deleted file mode 100644 index 3c980362e39..00000000000 --- a/res/cardsfolder/barbarian_riftcutter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barbarian Riftcutter -ManaCost:4 R -Types:Creature Human Barbarian -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_riftcutter.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/114.jpg -End diff --git a/res/cardsfolder/barbarian_ring.txt b/res/cardsfolder/barbarian_ring.txt deleted file mode 100644 index 38efee2d878..00000000000 --- a/res/cardsfolder/barbarian_ring.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barbarian Ring -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ DealDamage | Cost$ R T Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ CARDNAME deals 2 damage to target creature or player. Activate this ability only if seven or more cards are in your graveyard. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbarian_ring.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbary_apes.txt b/res/cardsfolder/barbary_apes.txt deleted file mode 100644 index 2abbf406c92..00000000000 --- a/res/cardsfolder/barbary_apes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barbary Apes -ManaCost:1 G -Types:Creature Ape -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1516.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbed_battlegear.txt b/res/cardsfolder/barbed_battlegear.txt deleted file mode 100644 index b1136a9b4bf..00000000000 --- a/res/cardsfolder/barbed_battlegear.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barbed Battlegear -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +4/-1. -K:eqPump 2:+4/-1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_battlegear.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbed_field.txt b/res/cardsfolder/barbed_field.txt deleted file mode 100644 index db524d16088..00000000000 --- a/res/cardsfolder/barbed_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Barbed Field -ManaCost:2 R R -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=Damage:No Condition:Enchanted land has "tap: This land deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_field.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/83.jpg -End diff --git a/res/cardsfolder/barbed_lightning.txt b/res/cardsfolder/barbed_lightning.txt deleted file mode 100644 index 6686da2a70f..00000000000 --- a/res/cardsfolder/barbed_lightning.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Barbed Lightning -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ Choose one - CARDNAME deals 3 damage to target creature; -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ or CARDNAME deals 3 damage to target player. -A:SP$ DealDamage | Cost$ 4 R | PrecostDesc$ Entwine | CostDesc$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ (Choose both if you pay the entwine cost.) | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$DealDamage| Tgt$ TgtP | NumDmg$ 3 | -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_lightning.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbed_sextant.txt b/res/cardsfolder/barbed_sextant.txt deleted file mode 100644 index 099fe35999d..00000000000 --- a/res/cardsfolder/barbed_sextant.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Barbed Sextant -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ W | SubAbility$ SVar=DBDraw | SpellDescription$ Add W to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ U | SubAbility$ SVar=DBDraw | SpellDescription$ Add U to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ B | SubAbility$ SVar=DBDraw | SpellDescription$ Add B to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ R | SubAbility$ SVar=DBDraw | SpellDescription$ Add R to your mana pool. Draw a card at the beginning of the next turn's upkeep. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ G | SubAbility$ SVar=DBDraw | SpellDescription$ Add G to your mana pool. Draw a card at the beginning of the next turn's upkeep. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_sextant.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/351.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbed_sliver.txt b/res/cardsfolder/barbed_sliver.txt deleted file mode 100644 index ad6c5bc6874..00000000000 --- a/res/cardsfolder/barbed_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Barbed Sliver -ManaCost:2 R -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/SVar=Pump:no Condition:All Sliver creatures have "2: This creature gets +1/+0 until end of turn." -SVar:Pump:AB$Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_sliver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barbtooth_wurm.txt b/res/cardsfolder/barbtooth_wurm.txt deleted file mode 100644 index 6b067d62535..00000000000 --- a/res/cardsfolder/barbtooth_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barbtooth Wurm -ManaCost:5 G -Types:Creature Wurm -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21077.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/62.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bargain.txt b/res/cardsfolder/bargain.txt deleted file mode 100644 index 60c92cd8447..00000000000 --- a/res/cardsfolder/bargain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bargain -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 W | LifeAmount$ 7 | SubAbility$ SVar=DBDraw | SpellDescription$ Target opponent draws a card. You gain 7 life. -SVar:DBDraw:DB$Draw | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bargain.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/134.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bargaining_table.txt b/res/cardsfolder/bargaining_table.txt deleted file mode 100644 index 29a214891f2..00000000000 --- a/res/cardsfolder/bargaining_table.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bargaining Table -ManaCost:5 -Types:Artifact -Text:no text -# The ability is untargeted (see: http://magiccards.info/mm/en/288.html), so the opponent is automaticaly chosen. This has to be modified as soon as multiplayer formats get supported. -A:AB$ Draw| Cost$ X T | NumCards$ 1 | SpellDescription$ Draw a card. X is the number of cards in an opponent's hand. -SVar:X:Count$InOppHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bargaining_table.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/288.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barishi.txt b/res/cardsfolder/barishi.txt deleted file mode 100644 index 2c761116061..00000000000 --- a/res/cardsfolder/barishi.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barishi -ManaCost:2 G G -Types:Creature Elemental -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExileandShuffle | TriggerZones$ Graveyard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile CARDNAME, then shuffle all creature cards from your graveyard into your library. -SVar:TrigExileandShuffle:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Exile | SubAbility$ SVar=DBShuffle -SVar:DBShuffle:DB$ChangeZoneAll | ChangeType$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | Shuffle$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barishi.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barkhide_mauler.txt b/res/cardsfolder/barkhide_mauler.txt deleted file mode 100644 index 0aef1531bda..00000000000 --- a/res/cardsfolder/barkhide_mauler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barkhide Mauler -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:4/4 -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card34196.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barktooth_warbeard.txt b/res/cardsfolder/barktooth_warbeard.txt deleted file mode 100644 index b2a2fce9de4..00000000000 --- a/res/cardsfolder/barktooth_warbeard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barktooth Warbeard -ManaCost:4 B R R -Types:Legendary Creature Human Warrior -Text:no text -PT:6/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1647.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barls_cage.txt b/res/cardsfolder/barls_cage.txt deleted file mode 100644 index 943a7087dbb..00000000000 --- a/res/cardsfolder/barls_cage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barl's Cage -ManaCost:4 -Types:Artifact -Text:3: Target creature doesn't untap during its controller's next untap step. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/barls_cage.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/352.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baron_sengir.txt b/res/cardsfolder/baron_sengir.txt deleted file mode 100644 index 273347dac85..00000000000 --- a/res/cardsfolder/baron_sengir.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Baron Sengir -ManaCost:5 B B B -Types:Legendary Creature Vampire -Text:no text -PT:5/5 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +2/+2 counter on CARDNAME. -A:AB$Regenerate | ValidTgts$ Creature.Vampire+Other | TgtPrompt$ Select another target Vampire | Cost$ T | SpellDescription$ Regenerate another target Vampire. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/baron_sengir.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barony_vampire.txt b/res/cardsfolder/barony_vampire.txt deleted file mode 100644 index 9b2af76a4a7..00000000000 --- a/res/cardsfolder/barony_vampire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barony Vampire -ManaCost:2 B -Types:Creature Vampire -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barony_vampire.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barrage_ogre.txt b/res/cardsfolder/barrage_ogre.txt deleted file mode 100644 index 879ef3a9e7a..00000000000 --- a/res/cardsfolder/barrage_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Barrage Ogre -ManaCost:3 R R -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T Sac<1/Artifact> | Tgt$ CP | NumDmg$ 2 | SpellDescription$ Barrage Ogre deals 2 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/barrage_ogre.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barren_glory.txt b/res/cardsfolder/barren_glory.txt deleted file mode 100644 index 48c8b05605d..00000000000 --- a/res/cardsfolder/barren_glory.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Barren Glory -ManaCost:4 W W -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/barren_glory.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barren_moor.txt b/res/cardsfolder/barren_moor.txt deleted file mode 100644 index f0d83bdc172..00000000000 --- a/res/cardsfolder/barren_moor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barren Moor -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -K:Cycling:B -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barren_moor.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barrenton_cragtreads.txt b/res/cardsfolder/barrenton_cragtreads.txt deleted file mode 100644 index b0169e007ec..00000000000 --- a/res/cardsfolder/barrenton_cragtreads.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barrenton Cragtreads -ManaCost:2 WU WU -Types:Creature Kithkin Scout -Text:Barrenton Cragtreads can't be blocked by red creatures. -PT:3/3 -K:CantBeBlockedBy Creature.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barrenton_cragtreads.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barrenton_medic.txt b/res/cardsfolder/barrenton_medic.txt deleted file mode 100644 index fe6839444b7..00000000000 --- a/res/cardsfolder/barrenton_medic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barrenton Medic -ManaCost:4 W -Types:Creature Kithkin Cleric -Text:no text -PT:0/4 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/barrenton_medic.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barrin_master_wizard.txt b/res/cardsfolder/barrin_master_wizard.txt deleted file mode 100644 index 83e7af0b421..00000000000 --- a/res/cardsfolder/barrin_master_wizard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Barrin, Master Wizard -ManaCost:1 U U -Types:Legendary Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 2 Sac<1/Permanent> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/barrin_master_wizard.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barrins_codex.txt b/res/cardsfolder/barrins_codex.txt deleted file mode 100644 index ae77f1acaf0..00000000000 --- a/res/cardsfolder/barrins_codex.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Barrin's Codex -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a page counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ PAGE | CounterNum$ 1 -A:AB$ Draw | Cost$ 4 T Sac<1/CARDNAME> | NumCards$ X | SpellDescription$ Draw X cards, where X is the number of page counters on CARDNAME. -SVar:X:Count$CardCounters.PAGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/Barrins_Codex.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bartel_runeaxe.txt b/res/cardsfolder/bartel_runeaxe.txt deleted file mode 100644 index d02ca6b7da4..00000000000 --- a/res/cardsfolder/bartel_runeaxe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bartel Runeaxe -ManaCost:3 G R B -Types:Legendary Creature Giant Warrior -Text:no text -PT:6/5 -K:Vigilance -K:CARDNAME can't be the target of Aura spells. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bartel_runeaxe.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/barter_in_blood.txt b/res/cardsfolder/barter_in_blood.txt deleted file mode 100644 index a74db76c535..00000000000 --- a/res/cardsfolder/barter_in_blood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Barter in Blood -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 2 B B | Amount$ 2 | SacValid$ Creature | Defined$ Each | SpellDescription$ Each player sacrifices two creatures. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/barter_in_blood.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baru_fist_of_krosa.txt b/res/cardsfolder/baru_fist_of_krosa.txt deleted file mode 100644 index 673e7d944b3..00000000000 --- a/res/cardsfolder/baru_fist_of_krosa.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Baru, Fist of Krosa -ManaCost:3 G G -Types:Legendary Creature Human Druid -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Forest | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a Forest enters the battlefield, green creatures you control get +1/+1 and gain trample until end of turn. -A:AB$ Token | Cost$ Discard<1/Card.namedBaru, Fist of Krosa> | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Creature,Wurm | TokenOwner$ You | TokenColors$ Green | TokenPower$ X | TokenToughness$ X | CostDesc$ Grandeur - Discard another card named CARDNAME: | SpellDescription$ Put an X/X green Wurm creature token onto the battlefield, where X is the number of lands you control. -SVar:X:Valid Land.YouCtrl -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Green+YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Trample -SVar:BuffedBy:Forest -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136155.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/basal_sliver.txt b/res/cardsfolder/basal_sliver.txt deleted file mode 100644 index 60871c798df..00000000000 --- a/res/cardsfolder/basal_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Basal Sliver -ManaCost:2 B -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Mana:no Condition:All Slivers have "Sacrifice this permanent: Add B B to your mana pool." -SVar:Mana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/basal_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/basal_thrull.txt b/res/cardsfolder/basal_thrull.txt deleted file mode 100644 index 4558c7e67c6..00000000000 --- a/res/cardsfolder/basal_thrull.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Basal Thrull -ManaCost:B B -Types:Creature Thrull -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/basal_thrull.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/5.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/basalt_gargoyle.txt b/res/cardsfolder/basalt_gargoyle.txt deleted file mode 100644 index 86cbbc5b92c..00000000000 --- a/res/cardsfolder/basalt_gargoyle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Basalt Gargoyle -ManaCost:2 R -Types:Creature Gargoyle -Text:no text -PT:3/2 -K:Flying -K:Echo:2 R -A:AB$ Pump | Cost$ R | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/basalt_gargoyle.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/145.jpg -End diff --git a/res/cardsfolder/basalt_monolith.txt b/res/cardsfolder/basalt_monolith.txt deleted file mode 100644 index d20f92fdaa4..00000000000 --- a/res/cardsfolder/basalt_monolith.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Basalt Monolith -ManaCost:3 -Types:Artifact -Text:no text -K:CARDNAME doesn't untap during your untap step. -A:AB$ Untap | Cost$ 3 | SpellDescription$ Untap CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/basalt_monolith.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/231.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/233.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/235.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bash_to_bits.txt b/res/cardsfolder/bash_to_bits.txt deleted file mode 100644 index dfe8fcac7d4..00000000000 --- a/res/cardsfolder/bash_to_bits.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bash to Bits -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Destroy target artifact. -A:SP$ Destroy | Cost$ 4 R R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | Flashback$ True | CostDesc$ Flashback 4 R R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bash_to_bits.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/basilisk_collar.txt b/res/cardsfolder/basilisk_collar.txt deleted file mode 100644 index 95618553fbb..00000000000 --- a/res/cardsfolder/basilisk_collar.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Basilisk Collar -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature has deathtouch and lifelink. -K:eqPump 2:Deathtouch & Lifelink -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/basilisk_collar.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/basking_rootwalla.txt b/res/cardsfolder/basking_rootwalla.txt deleted file mode 100644 index c32da04cbf2..00000000000 --- a/res/cardsfolder/basking_rootwalla.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Basking Rootwalla -ManaCost:G -Types:Creature Lizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 G | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. Activate this ability only once each turn. -K:Madness:0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/basking_rootwalla.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/baton_of_courage.txt b/res/cardsfolder/baton_of_courage.txt deleted file mode 100644 index 7a6156a0414..00000000000 --- a/res/cardsfolder/baton_of_courage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Baton of Courage -ManaCost:3 -Types:Artifact -Text:no text -K:Flash -K:Sunburst -A:AB$ Pump | Cost$ SubCounter<1/CHARGE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ 1 | NumAtt$ 1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/baton_of_courage.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battered_golem.txt b/res/cardsfolder/battered_golem.txt deleted file mode 100644 index 8de158c6ae4..00000000000 --- a/res/cardsfolder/battered_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Battered Golem -ManaCost:3 -Types:Artifact Creature Golem -Text:no text -PT:3/2 -K:CARDNAME doesn't untap during your untap step. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | IsPresent$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever an artifact enters the battlefield, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battered_golem.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battering_craghorn.txt b/res/cardsfolder/battering_craghorn.txt deleted file mode 100644 index 5888349de11..00000000000 --- a/res/cardsfolder/battering_craghorn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battering Craghorn -ManaCost:2 R R -Types:Creature Goat Beast -Text:no text -PT:3/1 -K:First Strike -K:Morph:1 R R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battering_craghorn.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battering_sliver.txt b/res/cardsfolder/battering_sliver.txt deleted file mode 100644 index 3940ef1de6d..00000000000 --- a/res/cardsfolder/battering_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battering Sliver -ManaCost:5 R -Types:Creature Sliver -Text:no text -PT:4/4 -K:stPumpAll:Creature.Sliver:0/0/Trample:No Condiion:All Sliver creatures have trample. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battering_sliver.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battering_wurm.txt b/res/cardsfolder/battering_wurm.txt deleted file mode 100644 index a2dc5667bd2..00000000000 --- a/res/cardsfolder/battering_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battering Wurm -ManaCost:6 G -Types:Creature Wurm -Text:no text -PT:4/3 -K:Bloodthirst 1 -K:Creatures with power less than CARDNAME's power can't block it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/battering_wurm.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/79.jpg -End diff --git a/res/cardsfolder/batterskull.txt b/res/cardsfolder/batterskull.txt deleted file mode 100644 index f77ab947f59..00000000000 --- a/res/cardsfolder/batterskull.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Batterskull -ManaCost:5 -Types:Artifact Equipment -Text:Equipped creature gets +4/+4 and has vigilance and lifelink. -K:eqPump 5:+4/+4/Vigilance & Lifelink -A:AB$ ChangeZone | Cost$ 3 | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -K:Living Weapon -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/batterskull.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_frenzy.txt b/res/cardsfolder/battle_frenzy.txt deleted file mode 100644 index 9d75a5cf1f7..00000000000 --- a/res/cardsfolder/battle_frenzy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Battle Frenzy -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature.Green+YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Green creatures you control get +1/+1 until end of turn. Nongreen creatures you control get +1/+0 until end of turn. | SubAbility$ SVar=DBPumpAll -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.nonGreen+YouCtrl | NumAtt$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_frenzy.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_hurda.txt b/res/cardsfolder/battle_hurda.txt deleted file mode 100644 index 4d6cf380135..00000000000 --- a/res/cardsfolder/battle_hurda.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Battle Hurda -ManaCost:4 W -Types:Creature Giant -Text:no text -PT:3/3 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_hurda.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_mad_ronin.txt b/res/cardsfolder/battle_mad_ronin.txt deleted file mode 100644 index 6e7ab25a5c9..00000000000 --- a/res/cardsfolder/battle_mad_ronin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battle-Mad Ronin -ManaCost:1 R -Types:Creature Human Samurai -Text:no text -PT:1/1 -K:CARDNAME attacks each turn if able. -K:Bushido 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_mad_ronin.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_mastery.txt b/res/cardsfolder/battle_mastery.txt deleted file mode 100644 index 71bc9133c46..00000000000 --- a/res/cardsfolder/battle_mastery.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Battle Mastery -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_mastery.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_of_wits.txt b/res/cardsfolder/battle_of_wits.txt deleted file mode 100644 index 6335140623a..00000000000 --- a/res/cardsfolder/battle_of_wits.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Battle of Wits -ManaCost:3 U U -Types:Enchantment -Text:At the beginning of your upkeep, if you have 200 or more cards in your library, you win the game. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_of_wits.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/69.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_rampart.txt b/res/cardsfolder/battle_rampart.txt deleted file mode 100644 index 2c6e23c83c6..00000000000 --- a/res/cardsfolder/battle_rampart.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Battle Rampart -ManaCost:2 R -Types:Creature Wall -Text:no text -PT:1/3 -K:Defender -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_rampart.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/173.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/135.jpg -End diff --git a/res/cardsfolder/battle_rattle_shaman.txt b/res/cardsfolder/battle_rattle_shaman.txt deleted file mode 100644 index ad2753f7f97..00000000000 --- a/res/cardsfolder/battle_rattle_shaman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battle-Rattle Shaman -ManaCost:3 R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, you may have target creature get +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Tgt$ TgtC | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_rattle_shaman.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_screech.txt b/res/cardsfolder/battle_screech.txt deleted file mode 100644 index 67d2125e096..00000000000 --- a/res/cardsfolder/battle_screech.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Battle Screech -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2 W W | TokenImage$ W 1 1 Bird Flying | TokenOwner$ You | TokenAmount$ 2 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put two 1/1 white Bird creature tokens with flying onto the battlefield. -A:SP$ Token | Cost$ tapXType<3/Creature.White> | TokenImage$ W 1 1 Bird Flying | TokenOwner$ You | TokenAmount$ 2 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | Flashback$ True | CostDesc$ Flashback - Tap three untapped white creatures you control. | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_screech.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_squadron.txt b/res/cardsfolder/battle_squadron.txt deleted file mode 100644 index 4c669bdd025..00000000000 --- a/res/cardsfolder/battle_squadron.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Battle Squadron -ManaCost:3 R R -Types:Creature Goblin -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$NumTypeYouCtrl.Creature:Count$NumTypeYouCtrl.Creature:Battle Squadron's power and toughness are each equal to the number of creatures you control. -SVar:BuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_squadron.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battle_strain.txt b/res/cardsfolder/battle_strain.txt deleted file mode 100644 index e26542b936d..00000000000 --- a/res/cardsfolder/battle_strain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battle Strain -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature blocks, CARDNAME deals 1 damage to that creature's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredBlockerController | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/battle_strain.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlefield_forge.txt b/res/cardsfolder/battlefield_forge.txt deleted file mode 100644 index fc791e89864..00000000000 --- a/res/cardsfolder/battlefield_forge.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Battlefield Forge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlefield_forge.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/139.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/318.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/348.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlefield_medic.txt b/res/cardsfolder/battlefield_medic.txt deleted file mode 100644 index b4dacc9e8b8..00000000000 --- a/res/cardsfolder/battlefield_medic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battlefield Medic -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature | Amount$ X | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next X damage that would be dealt to target creature this turn, where X is the number of Clerics on the battlefield. -SVar:X:Count$TypeOnBattlefield.Cleric -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlefield_medic.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlefield_percher.txt b/res/cardsfolder/battlefield_percher.txt deleted file mode 100644 index f1105da4352..00000000000 --- a/res/cardsfolder/battlefield_percher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Battlefield Percher -ManaCost:3 B B -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -K:CARDNAME can block only creatures with flying. -A:AB$ Pump | Cost$ 1 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlefield_percher.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/52.jpg -End diff --git a/res/cardsfolder/battlegate_mimic.txt b/res/cardsfolder/battlegate_mimic.txt deleted file mode 100644 index 92352c3fb0c..00000000000 --- a/res/cardsfolder/battlegate_mimic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Battlegate Mimic -ManaCost:1 RW -Types:Creature Shapeshifter -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.Red+White | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a spell that's both red and white, CARDNAME becomes 4/2 and gains first strike until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 2 | Keywords$ First Strike -SVar:BuffedBy:Spell.Red+White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlegate_mimic.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlegrace_angel.txt b/res/cardsfolder/battlegrace_angel.txt deleted file mode 100644 index 4091762883b..00000000000 --- a/res/cardsfolder/battlegrace_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Battlegrace Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -K:Exalted -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gains lifelink until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | KW$ Lifelink -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlegrace_angel.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlegrowth.txt b/res/cardsfolder/battlegrowth.txt deleted file mode 100644 index d5864fc6a0a..00000000000 --- a/res/cardsfolder/battlegrowth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Battlegrowth -ManaCost:G -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlegrowth.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlewand_oak.txt b/res/cardsfolder/battlewand_oak.txt deleted file mode 100644 index 21c7698e5d0..00000000000 --- a/res/cardsfolder/battlewand_oak.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Battlewand Oak -ManaCost:2 G -Types:Creature Treefolk Warrior -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Forest.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a Forest enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -T:Mode$ SpellCast | ValidCard$ Treefolk.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Treefolk spell, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Forest,Treefolk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlewand_oak.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/battlewise_aven.txt b/res/cardsfolder/battlewise_aven.txt deleted file mode 100644 index c88342661c2..00000000000 --- a/res/cardsfolder/battlewise_aven.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Battlewise Aven -ManaCost:3 W -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Creature:1/1/First Strike:Threshold:Threshold - As long as seven or more cards are in your graveyard, Battlewise Aven gets +1/+1 and has first strike. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/battlewise_aven.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bay_falcon.txt b/res/cardsfolder/bay_falcon.txt deleted file mode 100644 index 6bc80fa1497..00000000000 --- a/res/cardsfolder/bay_falcon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bay Falcon -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3325.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bayou.txt b/res/cardsfolder/bayou.txt deleted file mode 100644 index 903cf8ba33b..00000000000 --- a/res/cardsfolder/bayou.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bayou -ManaCost:no cost -Types:Land Swamp Forest -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/1e/en-us/card280.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/278.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/279.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/283.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bayou_dragonfly.txt b/res/cardsfolder/bayou_dragonfly.txt deleted file mode 100644 index 84f7bee4d83..00000000000 --- a/res/cardsfolder/bayou_dragonfly.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bayou Dragonfly -ManaCost:1 G -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4749.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bazaar_of_baghdad.txt b/res/cardsfolder/bazaar_of_baghdad.txt deleted file mode 100644 index 6f50be65491..00000000000 --- a/res/cardsfolder/bazaar_of_baghdad.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bazaar of Baghdad -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Draw | Cost$ T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard three cards. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bazaar_of_baghdad.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/84.jpg -End diff --git a/res/cardsfolder/bazaar_of_wonders.txt b/res/cardsfolder/bazaar_of_wonders.txt deleted file mode 100644 index 359cf568477..00000000000 --- a/res/cardsfolder/bazaar_of_wonders.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bazaar of Wonders -ManaCost:3 U U -Types:World Enchantment -Text:When Bazaar of Wonders enters the battlefield, exile all cards from all graveyards.\r\nWhenever 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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bazaar_of_wonders.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_behemoth.txt b/res/cardsfolder/beacon_behemoth.txt deleted file mode 100644 index 21fc751ea94..00000000000 --- a/res/cardsfolder/beacon_behemoth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beacon Behemoth -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:5/3 -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ Vigilance | SpellDescription$ Target creature with power 5 or greater gains vigilance until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_behemoth.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/78.jpg -End - diff --git a/res/cardsfolder/beacon_hawk.txt b/res/cardsfolder/beacon_hawk.txt deleted file mode 100644 index 22d7fdb7050..00000000000 --- a/res/cardsfolder/beacon_hawk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Beacon Hawk -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigUntap | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may untap target creature. -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:TrigUntap:AB$Untap | Cost$ 0 | ValidTgts$ Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_hawk.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_of_creation.txt b/res/cardsfolder/beacon_of_creation.txt deleted file mode 100644 index 281c8ff0390..00000000000 --- a/res/cardsfolder/beacon_of_creation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beacon of Creation -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SVar=DBShuffle | SpellDescription$ Put a 1/1 green Insect creature token onto the battlefield for each Forest you control. Shuffle CARDNAME into its owner's library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:X:Count$TypeYouCtrl.Forest -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_of_creation.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_of_destruction.txt b/res/cardsfolder/beacon_of_destruction.txt deleted file mode 100644 index df04357d679..00000000000 --- a/res/cardsfolder/beacon_of_destruction.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beacon of Destruction -ManaCost:3 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | Tgt$ TgtCP | NumDmg$ 5 | SubAbility$ SVar=DBShuffle | SpellDescription$ CARDNAME deals 5 damage to target player. Shuffle CARDNAME into its owner's library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51612.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/61.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_of_immortality.txt b/res/cardsfolder/beacon_of_immortality.txt deleted file mode 100644 index 1db05bd307f..00000000000 --- a/res/cardsfolder/beacon_of_immortality.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Beacon of Immortality -ManaCost:5 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 5 W | LifeAmount$ X | SubAbility$ SVar=DBShuffle | SpellDescription$ Double target player's life total. Shuffle CARDNAME into its owner's library. -SVar:X:Count$YourLifeTotal -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_of_immortality.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/6.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_of_tomorrows.txt b/res/cardsfolder/beacon_of_tomorrows.txt deleted file mode 100644 index 39bb0d2d2a7..00000000000 --- a/res/cardsfolder/beacon_of_tomorrows.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Beacon of Tomorrows -ManaCost:6 U U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 6 U U | ValidTgts$ Player | NumTurns$ 1 | SubAbility$ SVar=DBShuffle | SpellDescription$ Target player takes an extra turn after this one. Shuffle CARDNAME into its owner's library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/beacon_of_tomorrows.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beacon_of_unrest.txt b/res/cardsfolder/beacon_of_unrest.txt deleted file mode 100644 index f0988fa11ec..00000000000 --- a/res/cardsfolder/beacon_of_unrest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beacon of Unrest -ManaCost:3 B B -Types:Sorcery -Text: -A:SP$ ChangeZone | Cost$ 3 B B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select a target creature or artifact in a graveyard | ValidTgts$ Creature,Artifact | SubAbility$ SVar=DBShuffle | SpellDescription$ Put target artifact or creature card from a graveyard onto the battlefield under your control. Shuffle CARDNAME into its owner's library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51611.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/41.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bear_cub.txt b/res/cardsfolder/bear_cub.txt deleted file mode 100644 index 050d2754528..00000000000 --- a/res/cardsfolder/bear_cub.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bear Cub -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6613.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bear_umbra.txt b/res/cardsfolder/bear_umbra.txt deleted file mode 100644 index 7d239aeb50d..00000000000 --- a/res/cardsfolder/bear_umbra.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bear Umbra -ManaCost:2 G G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+2/+2 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Enchanted creature has "Whenever this creature attacks, untap all lands you control." -SVar:TrigUntap:AB$UntapAll | Cost$ 0 | ValidCards$ Land.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bear_umbra.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bearscape.txt b/res/cardsfolder/bearscape.txt deleted file mode 100644 index ff9441248a5..00000000000 --- a/res/cardsfolder/bearscape.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bearscape -ManaCost:1 G G -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 1 G ExileFromGrave<2/Card> | TokenAmount$ 1 | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 |SpellDescription$ Put a 2/2 green Bear creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bearscape.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/229.jpg -End diff --git a/res/cardsfolder/beast_attack.txt b/res/cardsfolder/beast_attack.txt deleted file mode 100644 index 3f474a99101..00000000000 --- a/res/cardsfolder/beast_attack.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Beast Attack -ManaCost:2 G G G -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 G G G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenColors$ Green | TokenOwner$ You | TokenPower$ 4 | TokenToughness$ 4 | SpellDescription$ Put a 4/4 green Beast creature token onto the battlefield. -A:SP$ Token | Cost$ 2 G G G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenColors$ Green | TokenOwner$ You | TokenPower$ 4 | TokenToughness$ 4 | Flashback$ True | CostDesc$ Flashback 2 G G G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_attack.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beast_hunt.txt b/res/cardsfolder/beast_hunt.txt deleted file mode 100644 index 176a652f9a0..00000000000 --- a/res/cardsfolder/beast_hunt.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Beast Hunt -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 3 G | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top three cards of your library. Put all creature cards revealed this way into your hand and the rest into your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_hunt.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beast_of_burden.txt b/res/cardsfolder/beast_of_burden.txt deleted file mode 100644 index ac147c174a2..00000000000 --- a/res/cardsfolder/beast_of_burden.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Beast of Burden -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:*/* -K:stSetPT:Count$TypeOnBattlefield.Creature:Count$TypeOnBattlefield.Creature:Beast of Burden's power and toughness are each equal to the number of creatures on the battlefield. -SVar:BuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_of_burden.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/292.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/122.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/288.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beast_within.txt b/res/cardsfolder/beast_within.txt deleted file mode 100644 index 0d637580f31..00000000000 --- a/res/cardsfolder/beast_within.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beast Within -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ SVar=DBToken | SpellDescription$ Destroy target permanent. Its controller puts a 3/3 green Beast creature token onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ TargetedController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beast_within.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beastbreaker_of_bala_ged.txt b/res/cardsfolder/beastbreaker_of_bala_ged.txt deleted file mode 100644 index dd211086d1d..00000000000 --- a/res/cardsfolder/beastbreaker_of_bala_ged.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Beastbreaker of Bala Ged -ManaCost:1 G -Types:Creature Human Warrior -Text:no text -PT:2/2 -K:stSetPT:2:2:LevelGE1:4:4:LevelGE4:6:6:LEVEL 1-3 4/4 LEVEL 4+ 6/6 Trample -K:stPumpSelf:Creature.countersGE4LEVEL:0/0/Trample:No Condition:no text -K:Level up:2 G -K:maxLevel:4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beastbreaker_of_bala_ged.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beastmaster_ascension.txt b/res/cardsfolder/beastmaster_ascension.txt deleted file mode 100644 index 86ff29dec56..00000000000 --- a/res/cardsfolder/beastmaster_ascension.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Beastmaster Ascension -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPut | OptionalDecider$ You | TriggerDescription$ Whenever a creature you control attacks, you may put a quest counter on CARDNAME. -SVar:TrigPut:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -K:stPumpAll:Creature.YouCtrl:5/5:isValid Permanent.countersGE7QUEST:As long as CARDNAME has seven or more quest counters on it, creatures you control get +5/+5. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/beastmaster_ascension.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beastmasters_magemark.txt b/res/cardsfolder/beastmasters_magemark.txt deleted file mode 100644 index 164ab931065..00000000000 --- a/res/cardsfolder/beastmasters_magemark.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Beastmaster's Magemark -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpAll:Creature.enchanted+YouCtrl:1/1:no Condition:Creatures you control that are enchanted get +1/+1. -T:Mode$ AttackerBlocked | ValidCard$ Creature.enchanted+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control that's enchanted becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X -SVar:X:TriggerCount$NumBlockers -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/beastmasters_magemark.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beasts_of_bogardan.txt b/res/cardsfolder/beasts_of_bogardan.txt deleted file mode 100644 index 994d8d11fba..00000000000 --- a/res/cardsfolder/beasts_of_bogardan.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beasts of Bogardan -ManaCost:4 R -Types:Creature Beast -Text:no text -PT:3/3 -K:Protection from red -K:stPumpSelf:Creature:1/1:isPresent Permanent.White+YouDontCtrl:Beasts of Bogardan gets +1/+1 as long as an opponent controls a white permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beasts_of_bogardan.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beckon_apparition.txt b/res/cardsfolder/beckon_apparition.txt deleted file mode 100644 index 7b927ed9282..00000000000 --- a/res/cardsfolder/beckon_apparition.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Beckon Apparition -ManaCost:WB -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ WB | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ SVar=DBToken | SpellDescription$ Exile target card from a graveyard. Put a 1/1 white and black Spirit creature token with flying onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White,Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/beckon_apparition.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bedlam.txt b/res/cardsfolder/bedlam.txt deleted file mode 100644 index a1b92a4a11f..00000000000 --- a/res/cardsfolder/bedlam.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bedlam -ManaCost:2 R R -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/HIDDEN CARDNAME can't block.:No Condition:Creatures can't block. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bedlam.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/175.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bee_sting.txt b/res/cardsfolder/bee_sting.txt deleted file mode 100644 index 58aad975903..00000000000 --- a/res/cardsfolder/bee_sting.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bee Sting -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 G | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ Bee Sting deals 2 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bee_sting.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/64.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/befoul.txt b/res/cardsfolder/befoul.txt deleted file mode 100644 index 7fe93682a85..00000000000 --- a/res/cardsfolder/befoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Befoul -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Land,Creature.nonBlack | TgtPrompt$ Select target land or nonblack creature | NoRegen$ True | SpellDescription$ Destroy target land or nonblack creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/befoul.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/116.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/102.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/118.jpg -End diff --git a/res/cardsfolder/behemoth_sledge.txt b/res/cardsfolder/behemoth_sledge.txt deleted file mode 100644 index 4117325882e..00000000000 --- a/res/cardsfolder/behemoth_sledge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Behemoth Sledge -ManaCost:1 G W -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has lifelink and trample. -K:eqPump 3:+2/+2/Lifelink & Trample -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/behemoth_sledge.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/belbes_armor.txt b/res/cardsfolder/belbes_armor.txt deleted file mode 100644 index 8226020c838..00000000000 --- a/res/cardsfolder/belbes_armor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Belbe's Armor -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ X T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ +X | SpellDescription$ Target creature gets -X/+X until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/belbes_armor.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/belbes_percher.txt b/res/cardsfolder/belbes_percher.txt deleted file mode 100644 index 20c8116effd..00000000000 --- a/res/cardsfolder/belbes_percher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Belbe's Percher -ManaCost:2 B -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/belbes_percher.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/belbes_portal.txt b/res/cardsfolder/belbes_portal.txt deleted file mode 100644 index 247ff6263d1..00000000000 --- a/res/cardsfolder/belbes_portal.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Belbe's Portal -ManaCost:5 -Types:Artifact -Text:As CARDNAME enters the battlefield, choose a creature type. -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.ChosenType | ChangeNum$ 1 | SpellDescription$ You may put a creature card from your hand onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/belbes_portal.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/belligerent_hatchling.txt b/res/cardsfolder/belligerent_hatchling.txt deleted file mode 100644 index 5cef79f65e9..00000000000 --- a/res/cardsfolder/belligerent_hatchling.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Belligerent Hatchling -ManaCost:3 RW -Types:Creature Elemental -Text:no text -PT:6/6 -K:etbCounter:M1M1:4 -K:First Strike -T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a red spell, remove a -1/-1 counter from CARDNAME. -T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a white spell, remove a -1/-1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:BuffedBy:Spell.Red,Spell.White -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Belligerent_Hatchling.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bellowing_fiend.txt b/res/cardsfolder/bellowing_fiend.txt deleted file mode 100644 index abdf752fc98..00000000000 --- a/res/cardsfolder/bellowing_fiend.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bellowing Fiend -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME deals damage to a creature, CARDNAME deals 3 damage to that creature's controller and 3 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredTargetController | NumDmg$ 3 | SubAbility$ SVar=DBDealDamage -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bellowing_fiend.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/2.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bellowing_tanglewurm.txt b/res/cardsfolder/bellowing_tanglewurm.txt deleted file mode 100644 index 81e0dd64ea4..00000000000 --- a/res/cardsfolder/bellowing_tanglewurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bellowing Tanglewurm -ManaCost:3 G G -Types:Creature Wurm -Text:no text -PT:4/4 -K:Intimidate -K:stPumpAll:Creature.Green+Other+YouCtrl:0/0/Intimidate:No Condition:Other green creatures you control have Intimidate. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bellowing_tanglewurm.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/belltower_sphinx.txt b/res/cardsfolder/belltower_sphinx.txt deleted file mode 100644 index 38cc8716fd3..00000000000 --- a/res/cardsfolder/belltower_sphinx.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Belltower Sphinx -ManaCost:4 U -Types:Creature Sphinx -Text:no text -PT:2/5 -K:Flying -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever a source deals damage to CARDNAME, that source's controller puts that many cards from the top of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ TriggeredSourceController | NumCards$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/belltower_sphinx.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beloved_chaplain.txt b/res/cardsfolder/beloved_chaplain.txt deleted file mode 100644 index 3a61a34d629..00000000000 --- a/res/cardsfolder/beloved_chaplain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Beloved Chaplain -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Protection from creatures -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beloved_chaplain.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ben_ben_akki_hermit.txt b/res/cardsfolder/ben_ben_akki_hermit.txt deleted file mode 100644 index ae4b79006e3..00000000000 --- a/res/cardsfolder/ben_ben_akki_hermit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ben-Ben, Akki Hermit -ManaCost:2 R R -Types:Legendary Creature Goblin Shaman -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking Creature | NumDmg$ X | SpellDescription$ Ben-Ben, Akki Hermit deals damage to target attacking creature equal to the number of untapped Mountains you control. -SVar:X:Count$Valid Mountain.untapped+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ben_ben_akki_hermit.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_cavalry.txt b/res/cardsfolder/benalish_cavalry.txt deleted file mode 100644 index c00624dbb8a..00000000000 --- a/res/cardsfolder/benalish_cavalry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Benalish Cavalry -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_cavalry.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_emissary.txt b/res/cardsfolder/benalish_emissary.txt deleted file mode 100644 index df34683cd29..00000000000 --- a/res/cardsfolder/benalish_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Benalish Emissary -ManaCost:2 W -Types:Creature Human Wizard -Text:no text -PT:1/4 -K:Kicker:1 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target land. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_emissary.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_heralds.txt b/res/cardsfolder/benalish_heralds.txt deleted file mode 100644 index 367a4f5fd43..00000000000 --- a/res/cardsfolder/benalish_heralds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Benalish Heralds -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/4 -A:AB$ Draw | Cost$ 3 U T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_heralds.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_knight.txt b/res/cardsfolder/benalish_knight.txt deleted file mode 100644 index f34b3e7132b..00000000000 --- a/res/cardsfolder/benalish_knight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Benalish Knight -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flash -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_knight.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/125.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_missionary.txt b/res/cardsfolder/benalish_missionary.txt deleted file mode 100644 index b540c01193a..00000000000 --- a/res/cardsfolder/benalish_missionary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Benalish Missionary -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 W T | ValidTgts$ Creature.blocked | TgtPrompt$ Select target blocked creature | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target blocked creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_missionary.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benalish_trapper.txt b/res/cardsfolder/benalish_trapper.txt deleted file mode 100644 index da1ef395b74..00000000000 --- a/res/cardsfolder/benalish_trapper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Benalish Trapper -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_trapper.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/8.jpg -End diff --git a/res/cardsfolder/benevolent_ancestor.txt b/res/cardsfolder/benevolent_ancestor.txt deleted file mode 100644 index a1f28b0f4fd..00000000000 --- a/res/cardsfolder/benevolent_ancestor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Benevolent Ancestor -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:0/4 -K:Defender -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benevolent_ancestor.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benevolent_bodyguard.txt b/res/cardsfolder/benevolent_bodyguard.txt deleted file mode 100644 index 12ce0f5cf5b..00000000000 --- a/res/cardsfolder/benevolent_bodyguard.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Benevolent Bodyguard -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from white | SpellDescription$ Target creature you control gains protection from white until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from black | SpellDescription$ Target creature you control gains protection from black until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from blue | SpellDescription$ Target creature you control gains protection from blue until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from red | SpellDescription$ Target creature you control gains protection from red until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from green | SpellDescription$ Target creature you control gains protection from green until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/benevolent_bodyguard.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benevolent_unicorn.txt b/res/cardsfolder/benevolent_unicorn.txt deleted file mode 100644 index 1c7afc5c00d..00000000000 --- a/res/cardsfolder/benevolent_unicorn.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Benevolent Unicorn -ManaCost:1 W -Types:Creature Unicorn -Text:If a spell would deal damage to a creature or player, it deals that much damage minus 1 to that creature or player instead. -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/benevolent_unicorn.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benthic_behemoth.txt b/res/cardsfolder/benthic_behemoth.txt deleted file mode 100644 index 96b1e8de0bd..00000000000 --- a/res/cardsfolder/benthic_behemoth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Benthic Behemoth -ManaCost:5 U U U -Types:Creature Serpent -Text:no text -PT:7/6 -K:Islandwalk -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card13030.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/54.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benthic_djinn.txt b/res/cardsfolder/benthic_djinn.txt deleted file mode 100644 index 75e57d03e71..00000000000 --- a/res/cardsfolder/benthic_djinn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Benthic Djinn -ManaCost:2 U B -Types:Creature Djinn -Text:no text -PT:5/3 -K:Islandwalk -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/benthic_djinn.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/benthicore.txt b/res/cardsfolder/benthicore.txt deleted file mode 100644 index 2541d870843..00000000000 --- a/res/cardsfolder/benthicore.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Benthicore -ManaCost:6 U -Types:Creature Elemental -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 1/1 blue Merfolk Wizard tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ U 1 1 Merfolk Wizard | TokenAmount$ 2 | TokenName$ Merfolk Wizard | TokenTypes$ Creature,Merfolk,Wizard | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 blue Merfolk Wizard creature tokens onto the battlefield. -A:AB$ Untap | Cost$ tapXType<2/Merfolk> | SubAbility$ SVar=GainShroud | SpellDescription$ Untap CARDNAME. -SVar:GainShroud:DB$Pump | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/benthicore.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bequeathal.txt b/res/cardsfolder/bequeathal.txt deleted file mode 100644 index 36dffbba580..00000000000 --- a/res/cardsfolder/bequeathal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bequeathal -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigDraw | TriggerDescription$ When enchanted creature is put into a graveyard, draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bequeathal.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/106.jpg -End diff --git a/res/cardsfolder/bereavement.txt b/res/cardsfolder/bereavement.txt deleted file mode 100644 index ff7d4373b1b..00000000000 --- a/res/cardsfolder/bereavement.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bereavement -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigYouDiscard | TriggerDescription$ Whenever a green creature is put into a graveyard from the battlefield, -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigOppDiscard | TriggerDescription$ its controller discards a card. -SVar:TrigYouDiscard:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:TrigOppDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bereavement.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/117.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/berserk.txt b/res/cardsfolder/berserk.txt deleted file mode 100644 index 411d3df11ff..00000000000 --- a/res/cardsfolder/berserk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Berserk -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | AnyPlayer$ True | NumAtt$ X | KW$ Trample & HIDDEN At the beginning of the next end step, destroy CARDNAME if it attacked this turn. | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat,Declare Attackers - Play Instants and Abilities,Declare Blockers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME 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. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/berserk.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/94.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/94.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/berserk_murlodont.txt b/res/cardsfolder/berserk_murlodont.txt deleted file mode 100644 index f18f8212145..00000000000 --- a/res/cardsfolder/berserk_murlodont.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Berserk Murlodont -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Beast | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a Beast becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X -SVar:X:TriggerCount$NumBlockers -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/berserk_murlodont.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/berserkers_of_blood_ridge.txt b/res/cardsfolder/berserkers_of_blood_ridge.txt deleted file mode 100644 index 9e45937a31e..00000000000 --- a/res/cardsfolder/berserkers_of_blood_ridge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Berserkers of Blood Ridge -ManaCost:4 R -Types:Creature Human Berserker -Text:no text -PT:4/4 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/berserkers_of_blood_ridge.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/124.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/beseech_the_queen.txt b/res/cardsfolder/beseech_the_queen.txt deleted file mode 100644 index 82595d75cae..00000000000 --- a/res/cardsfolder/beseech_the_queen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Beseech the Queen -ManaCost:2/B 2/B 2/B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2/B 2/B 2/B | Origin$ Library | Destination$ Hand | ChangeType$ Card.cmcLEX | ChangeNum$ 1 | SpellDescription$ 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. -SVar:X:Count$Valid Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/beseech_the_queen.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bestial_fury.txt b/res/cardsfolder/bestial_fury.txt deleted file mode 100644 index f83cabf02ea..00000000000 --- a/res/cardsfolder/bestial_fury.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bestial Fury -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -T:Mode$ AttackerBlocked | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever enchanted creature becomes blocked, it gets +4/+0 and gains trample until end of turn. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Enchanted | NumAtt$ +4 | KW$ Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bestial_fury.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/99.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/bestial_menace.txt b/res/cardsfolder/bestial_menace.txt deleted file mode 100644 index a9dbebe837b..00000000000 --- a/res/cardsfolder/bestial_menace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bestial Menace -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G G | TokenAmount$ 1 | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SVar=DBWolfToken | SpellDescription$ Put a 1/1 green Snake creature token, -SVar:DBWolfToken:DB$Token | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SubAbility$ SVar=DBElephantToken | SpellDescription$ a 2/2 green Wolf creature token, -SVar:DBElephantToken:DB$Token | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ and a 3/3 green Elephant creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bestial_menace.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/betrayal.txt b/res/cardsfolder/betrayal.txt deleted file mode 100644 index b76ce0f2b26..00000000000 --- a/res/cardsfolder/betrayal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Betrayal -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant Creature an opponent controls -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever enchanted creature becomes tapped, you draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/betrayal.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/betrayal_of_flesh.txt b/res/cardsfolder/betrayal_of_flesh.txt deleted file mode 100644 index a832e20d6ab..00000000000 --- a/res/cardsfolder/betrayal_of_flesh.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Betrayal of Flesh -ManaCost:5 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 5 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Choose one - | SpellDescription$ Destroy target creature; -A:SP$ ChangeZone | Cost$ 5 B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ or return target creature card from your graveyard to the battlefield. -A:SP$ Destroy | Cost$ 5 B Sac<3/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBChange | PrecostDesc$ Entwine Sacrifice three lands | SpellDescription$ (Choose both if you pay the entwine cost.) -SVar:DBChange:DB$ ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/betrayal_of_flesh.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/betrothed_of_fire.txt b/res/cardsfolder/betrothed_of_fire.txt deleted file mode 100644 index bdebd983570..00000000000 --- a/res/cardsfolder/betrothed_of_fire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Betrothed of Fire -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Pump | Cost$ Sac<1/Creature.untapped> | Defined$ Enchanted | NumAtt$ +2 | CostDesc$ Sacrifice an untapped creature: | SpellDescription$ Enchanted creature get +2/+0 until end of turn. -A:AB$ PumpAll | Cost$ Sac<1/Card.AttachedBy> | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | CostDesc$ Sacrifice enchanted creature: | SpellDescription$ Creatures you control get +2/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/betrothed_of_fire.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bewilder.txt b/res/cardsfolder/bewilder.txt deleted file mode 100644 index c67dfd1fe48..00000000000 --- a/res/cardsfolder/bewilder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bewilder -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-0 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bewilder.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/49.jpg -End diff --git a/res/cardsfolder/big_game_hunter.txt b/res/cardsfolder/big_game_hunter.txt deleted file mode 100644 index 21e265e6972..00000000000 --- a/res/cardsfolder/big_game_hunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Big Game Hunter -ManaCost:1 B B -Types:Creature Human Rebel Assassin -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target creature with power 4 or greater. It can't be regenerated. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.powerGE4 | NoRegen$ True | TgtPrompt$ Select target creature with power 4 or greater. -K:Madness:B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/big_game_hunter.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/63.jpg -End diff --git a/res/cardsfolder/bile_urchin.txt b/res/cardsfolder/bile_urchin.txt deleted file mode 100644 index 2ff49efb62a..00000000000 --- a/res/cardsfolder/bile_urchin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bile Urchin -ManaCost:B -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select a player to lose 1 life | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bile_urchin.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bind.txt b/res/cardsfolder/bind.txt deleted file mode 100644 index 792a034f857..00000000000 --- a/res/cardsfolder/bind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bind -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 G | TgtPrompt$ Select target Activated Ability | ValidTgts$ Card | TargetType$ Activated | SpellDescription$ Counter target activated ability. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bind.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/binding_agony.txt b/res/cardsfolder/binding_agony.txt deleted file mode 100644 index 443a79ac192..00000000000 --- a/res/cardsfolder/binding_agony.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Binding Agony -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ DamageDone | ValidTarget$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever enchanted creature is dealt damage, CARDNAME deals that much damage to that creature's controller. -SVar:TrigDealDamage:AB$ DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/binding_agony.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/binding_grasp.txt b/res/cardsfolder/binding_grasp.txt deleted file mode 100644 index befbacbac0d..00000000000 --- a/res/cardsfolder/binding_grasp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Binding Grasp -ManaCost:3 U -Types:Enchantment Aura -Text:You control enchanted creature. Enchanted creature gets +0/+1. -K:Enchant creature -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 U -K:enControlCreature -K:enPump:+0/+1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/binding_grasp.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/74.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/biomantic_mastery.txt b/res/cardsfolder/biomantic_mastery.txt deleted file mode 100644 index efc2d97c7c2..00000000000 --- a/res/cardsfolder/biomantic_mastery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Biomantic Mastery -ManaCost:4 GU GU GU -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 4 GU GU GU | NumCards$ X | SpellDescription$ Draw a card for each creature target player controls, then draw a card for each creature another target player controls. -SVar:X:Count$TypeOnBattlefield.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/biomantic_mastery.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/142.jpg -End diff --git a/res/cardsfolder/biorhythm.txt b/res/cardsfolder/biorhythm.txt deleted file mode 100644 index 4c4ea097e12..00000000000 --- a/res/cardsfolder/biorhythm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Biorhythm -ManaCost:6 G G -Types:Sorcery -Text:no text -A:SP$ SetLife | Cost$ 6 G G | Defined$ You | LifeAmount$ X | SubAbility$ SVar=DBSetLifeOpp | SpellDescription$ Each player's life total becomes the number of creatures he or she controls. -SVar:DBSetLifeOpp:DB$SetLife | Defined$ Opponent | LifeAmount$ Y -SVar:X:Count$Valid Creature.YouCtrl -SVar:Y:Count$Valid Creature.YouDontCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/biorhythm.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/247.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/birchlore_rangers.txt b/res/cardsfolder/birchlore_rangers.txt deleted file mode 100644 index 82cc30000dc..00000000000 --- a/res/cardsfolder/birchlore_rangers.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Birchlore Rangers -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ tapXType<2/Elf> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Morph:G -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/birchlore_rangers.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bird_maiden.txt b/res/cardsfolder/bird_maiden.txt deleted file mode 100644 index 261c6090596..00000000000 --- a/res/cardsfolder/bird_maiden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bird Maiden -ManaCost:2 R -Types:Creature Human Bird -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4032.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/211.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/195.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/45.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/birds_of_paradise.txt b/res/cardsfolder/birds_of_paradise.txt deleted file mode 100644 index d853e8130fb..00000000000 --- a/res/cardsfolder/birds_of_paradise.txt +++ /dev/null @@ -1,27 +0,0 @@ -Name:Birds of Paradise -ManaCost:G -Types:Creature Bird -Text:no text -PT:0/1 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83688.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/233.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/153.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/95.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/231.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/142.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/118.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/252.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/165.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/168.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/217.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/94.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/95.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/biting_tether.txt b/res/cardsfolder/biting_tether.txt deleted file mode 100644 index 354a7cdc6c4..00000000000 --- a/res/cardsfolder/biting_tether.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Biting Tether -ManaCost:4 U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on enchanted creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/biting_tether.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bitterblossom.txt b/res/cardsfolder/bitterblossom.txt deleted file mode 100644 index 806f743e788..00000000000 --- a/res/cardsfolder/bitterblossom.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bitterblossom -ManaCost:1 B -Types:Tribal Enchantment Faerie -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You |TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Faerie Rogue | TokenTypes$ Creature,Faerie,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ SVar=DB -SVar:DB:DB$LoseLife | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bitterblossom.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/58.jpg -End diff --git a/res/cardsfolder/bituminous_blast.txt b/res/cardsfolder/bituminous_blast.txt deleted file mode 100644 index d4658f78703..00000000000 --- a/res/cardsfolder/bituminous_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bituminous Blast -ManaCost:3 B R -Types:Instant -Text:no text -K:Cascade -A:SP$ DealDamage | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bituminous_blast.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/34.jpg -End diff --git a/res/cardsfolder/black_carriage.txt b/res/cardsfolder/black_carriage.txt deleted file mode 100644 index 6e626a272de..00000000000 --- a/res/cardsfolder/black_carriage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Black Carriage -ManaCost:3 B B -Types:Creature Horse -Text:no text -PT:4/4 -K:Trample -K:CARDNAME doesn't untap during your untap step. -A:AB$ Untap | Cost$ Sac<1/Creature> | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Untap CARDNAME. Activate this ability only during your upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_carriage.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_knight.txt b/res/cardsfolder/black_knight.txt deleted file mode 100644 index 23496cb66b8..00000000000 --- a/res/cardsfolder/black_knight.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Black Knight -ManaCost:B B -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from white -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_knight.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/3.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/3.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/5.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/5.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/83.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/85.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/3.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_lotus.txt b/res/cardsfolder/black_lotus.txt deleted file mode 100644 index 98c588c0a67..00000000000 --- a/res/cardsfolder/black_lotus.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Black Lotus -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | Amount$ 3 | SpellDescription$ Add W W W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | Amount$ 3 | SpellDescription$ Add U U U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_lotus.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/232.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/234.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_mana_battery.txt b/res/cardsfolder/black_mana_battery.txt deleted file mode 100644 index 2afcdd83fef..00000000000 --- a/res/cardsfolder/black_mana_battery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Black Mana Battery -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_mana_battery.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/316.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_market.txt b/res/cardsfolder/black_market.txt deleted file mode 100644 index 950ed30249d..00000000000 --- a/res/cardsfolder/black_market.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Black Market -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, put a charge counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGetMana | TriggerDescription$ At the beginning of your precombat main phase, add B to your mana pool for each charge counter on CARDNAME. -SVar:TrigGetMana:AB$ Mana | Cost$ 0 | Produced$ B | Amount$ X | SpellDescription$ Add X B to your mana pool -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_market.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_poplar_shaman.txt b/res/cardsfolder/black_poplar_shaman.txt deleted file mode 100644 index b54e54ddde1..00000000000 --- a/res/cardsfolder/black_poplar_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Black Poplar Shaman -ManaCost:2 B -Types:Creature Treefolk Shaman -Text:no text -PT:1/3 -A:AB$ Regenerate | ValidTgts$ Creature.Treefolk | TgtPrompt$ Select target Treefolk. | Cost$ 2 B | SpellDescription$ Regenerate target Treefolk. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_poplar_shaman.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_scarab.txt b/res/cardsfolder/black_scarab.txt deleted file mode 100644 index 252821f4bbc..00000000000 --- a/res/cardsfolder/black_scarab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Black Scarab -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:CARDNAME can't be blocked by black creatures. -K:stPumpEnchanted:Creature:2/2:isPresent Permanent.Black+YouDontCtrl:Enchanted creature gets +2/+2 as long as an opponent controls a black permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_scarab.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_suns_zenith.txt b/res/cardsfolder/black_suns_zenith.txt deleted file mode 100644 index 612cfd6653b..00000000000 --- a/res/cardsfolder/black_suns_zenith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Black Sun's Zenith -ManaCost:X B B -Types:Sorcery -Text:no text -A:SP$ PutCounterAll | Cost$ X B B | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ X | SubAbility$ SVar=DBShuffle | IsCurse$ True | SpellDescription$ Put X -1/-1 counters on each creature. Shuffle CARDNAME into its owner's library. -SVar:X:Count$xPaid -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_suns_zenith.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_vise.txt b/res/cardsfolder/black_vise.txt deleted file mode 100644 index a8baae0df32..00000000000 --- a/res/cardsfolder/black_vise.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Black Vise -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ GT4 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your opponent's upkeep, CARDNAME deals X damage to that player, where X is the number of cards in his or her hand minus 4. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/Minus.4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_vise.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/233.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/235.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/236.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/317.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/black_ward.txt b/res/cardsfolder/black_ward.txt deleted file mode 100644 index ae3924fa898..00000000000 --- a/res/cardsfolder/black_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Black Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from black:Enchanted creature has protection from black. This effect doesn't remove Black Ward. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/black_ward.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/189.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/190.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/189.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/258.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blackcleave_cliffs.txt b/res/cardsfolder/blackcleave_cliffs.txt deleted file mode 100644 index b08ccb20d68..00000000000 --- a/res/cardsfolder/blackcleave_cliffs.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blackcleave Cliffs -ManaCost:no cost -Types:Land -text:Blackcleave Cliffs enters the battlefield tapped unless you control two or fewer other lands. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -K:CARDNAME enters the battlefield tapped unless you control two or fewer other lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blackcleave_cliffs.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blackcleave_goblin.txt b/res/cardsfolder/blackcleave_goblin.txt deleted file mode 100644 index 99351800eec..00000000000 --- a/res/cardsfolder/blackcleave_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blackcleave Goblin -ManaCost:3 B -Types:Creature Goblin Zombie -Text:no text -PT:2/1 -K:Haste -K:Infect -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blackcleave_goblin.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blade_of_the_bloodchief.txt b/res/cardsfolder/blade_of_the_bloodchief.txt deleted file mode 100644 index 03303bab876..00000000000 --- a/res/cardsfolder/blade_of_the_bloodchief.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blade of the Bloodchief -ManaCost:1 -Types:Artifact Equipment -Text:no text -K:eqPump 1:+0/+0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blade_of_the_bloodchief.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blade_of_the_sixth_pride.txt b/res/cardsfolder/blade_of_the_sixth_pride.txt deleted file mode 100644 index f30455910aa..00000000000 --- a/res/cardsfolder/blade_of_the_sixth_pride.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blade of the Sixth Pride -ManaCost:1 W -Types:Creature Cat Rebel -Text:no text -PT:3/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130676.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blade_sliver.txt b/res/cardsfolder/blade_sliver.txt deleted file mode 100644 index 448d1a48e78..00000000000 --- a/res/cardsfolder/blade_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blade Sliver -ManaCost:2 R -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:1/0:no Condition:All Sliver creatures get +1/+0. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blade_sliver.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blade_splicer.txt b/res/cardsfolder/blade_splicer.txt deleted file mode 100644 index ffeb3095dfd..00000000000 --- a/res/cardsfolder/blade_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blade Splicer -ManaCost:2 W -Types:Creature Human Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -K:stPumpAll:Creature.Golem+YouCtrl:0/0/First Strike:No Condition:Golem creatures you control have first strike. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blade_splicer.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blade_tribe_berserkers.txt b/res/cardsfolder/blade_tribe_berserkers.txt deleted file mode 100644 index 804825ebda2..00000000000 --- a/res/cardsfolder/blade_tribe_berserkers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blade-Tribe Berserkers -ManaCost:3 R -Types:Creature Human Berserker -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Metalcraft$ True | Execute$ TrigPump | TriggerDescription$ Metalcraft - When CARDNAME enters the battlefield, if you control three or more artifacts, CARDNAME gets +3/+3 and gains haste until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 | NumDef$ 3 | KW$ Haste | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blade_tribe_berserkers.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bladed_pinions.txt b/res/cardsfolder/bladed_pinions.txt deleted file mode 100644 index 0c748562b30..00000000000 --- a/res/cardsfolder/bladed_pinions.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bladed Pinions -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature has flying and first strike. -K:eqPump 2:Flying & First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bladed_pinions.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bladed_sentinel.txt b/res/cardsfolder/bladed_sentinel.txt deleted file mode 100644 index 2f9f8883e0c..00000000000 --- a/res/cardsfolder/bladed_sentinel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bladed Sentinel -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:2/4 -A:AB$ Pump | Cost$ W | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bladed_sentinel.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blades_of_velis_vel.txt b/res/cardsfolder/blades_of_velis_vel.txt deleted file mode 100644 index 759dfb6e516..00000000000 --- a/res/cardsfolder/blades_of_velis_vel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blades of Velis Vel -ManaCost:1 R -Types:Tribal Instant Shapeshifter -Text:no text -K:Changeling -A:SP$ Pump | Cost$ 1 R | TargetMin$ 0 | TargetMax$ 2 | NumAtt$ +2 | KW$ Changeling | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ Up to two target creatures each get +2/+0 and gain all creature types until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blades_of_velis_vel.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bladetusk_boar.txt b/res/cardsfolder/bladetusk_boar.txt deleted file mode 100644 index aa2175b7399..00000000000 --- a/res/cardsfolder/bladetusk_boar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bladetusk Boar -ManaCost:3 R -Types:Creature Boar -Text:no text -PT:3/2 -K:Intimidate -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bladetusk_boar.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bladewing_the_risen.txt b/res/cardsfolder/bladewing_the_risen.txt deleted file mode 100644 index 6f7b380956e..00000000000 --- a/res/cardsfolder/bladewing_the_risen.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bladewing the Risen -ManaCost:3 B B R R -Types:Legendary Creature Zombie Dragon -Text:no text -PT:4/4 -K:Flying -A:AB$ PumpAll | Cost$ B R | ValidCards$ Creature.Dragon | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Dragon creatures get +1/+1 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target Dragon permanent card from your graveyard to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.Dragon+YouOwn | TgtPrompt$ Choose target Dragon permanent in your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bladewing_the_risen.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bladewings_thrall.txt b/res/cardsfolder/bladewings_thrall.txt deleted file mode 100644 index 2c6cb6e0112..00000000000 --- a/res/cardsfolder/bladewings_thrall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bladewing's Thrall -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:3/3 -K:stPumpSelf:Creature:0/0/Flying:isPresent Dragon.YouCtrl:CARDNAME has flying as long as you control a Dragon. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Dragon | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ When a Dragon enters the battlefield, you may return CARDNAME from your graveyard to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield -SVar:BuffedBy:Dragon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bladewings_thrall.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blanchwood_armor.txt b/res/cardsfolder/blanchwood_armor.txt deleted file mode 100644 index 0dd6aa9bd54..00000000000 --- a/res/cardsfolder/blanchwood_armor.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Blanchwood Armor -ManaCost:2 G -Types:Enchantment Aura -Text:Enchanted creature gets +1/+1 for each Forest you control. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$TypeYouCtrl.Forest -SVar:BuffedBy:Forest -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blanchwood_armor.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/234.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/237.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/253.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/232.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blanchwood_treefolk.txt b/res/cardsfolder/blanchwood_treefolk.txt deleted file mode 100644 index 052c988ff7d..00000000000 --- a/res/cardsfolder/blanchwood_treefolk.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blanchwood Treefolk -ManaCost:4 G -Types:Creature Treefolk -Text:no text -PT:4/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5747.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blanket_of_night.txt b/res/cardsfolder/blanket_of_night.txt deleted file mode 100644 index 5e49feb9674..00000000000 --- a/res/cardsfolder/blanket_of_night.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blanket of Night -ManaCost:1 B B -Types:Enchantment -Text:no text -K:stPumpAll:Land:0/0/Types=Swamp:No Condition:Each land is a Swamp in addition to its other land types. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blanket_of_night.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blasted_landscape.txt b/res/cardsfolder/blasted_landscape.txt deleted file mode 100644 index d1100ededf3..00000000000 --- a/res/cardsfolder/blasted_landscape.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blasted Landscape -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blasted_landscape.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blaster_mage.txt b/res/cardsfolder/blaster_mage.txt deleted file mode 100644 index fbd3f0853b8..00000000000 --- a/res/cardsfolder/blaster_mage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blaster Mage -ManaCost:2 R -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ R T Discard<1/Card> | ValidTgts$ Wall | TgtPrompt$ Select target Wall | SpellDescription$ Destroy target Wall. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blaster_mage.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/175.jpg -End diff --git a/res/cardsfolder/blasting_station.txt b/res/cardsfolder/blasting_station.txt deleted file mode 100644 index 47ac656681f..00000000000 --- a/res/cardsfolder/blasting_station.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blasting Station -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ T Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a creature enters the battlefield, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blasting_station.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blastoderm.txt b/res/cardsfolder/blastoderm.txt deleted file mode 100644 index 8b364e5c50e..00000000000 --- a/res/cardsfolder/blastoderm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blastoderm -ManaCost:2 G G -Types:Creature Beast -Text:no text -PT:5/5 -K:Shroud -K:Fading:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blastoderm.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blatant_thievery.txt b/res/cardsfolder/blatant_thievery.txt deleted file mode 100644 index 6ca8e4ad4ff..00000000000 --- a/res/cardsfolder/blatant_thievery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blatant Thievery -ManaCost:4 U U U -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 4 U U U | ValidTgts$ Permanent.YouDontCtrl | TgtPrompt$ Select target permanent opponent controls. | SpellDescription$ For each opponent, gain control of target permanent that player controls. (This effect lasts indefinitely.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blatant_thievery.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blaze.txt b/res/cardsfolder/blaze.txt deleted file mode 100644 index cc6bd867592..00000000000 --- a/res/cardsfolder/blaze.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Blaze -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blaze.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/177.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/102.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/175.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/122.jpg|2 -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/175.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/190.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/91.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blazethorn_scarecrow.txt b/res/cardsfolder/blazethorn_scarecrow.txt deleted file mode 100644 index 27cabe2a3c6..00000000000 --- a/res/cardsfolder/blazethorn_scarecrow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blazethorn Scarecrow -ManaCost:5 -Types:Artifact Creature Scarecrow -Text:no text -PT:3/3 -K:stPumpSelf:Creature:0/0/Haste:isPresent Creature.Red+YouCtrl:Blazethorn Scarecrow has haste as long as you control a red creature. -K:stPumpSelf:Creature:0/0/Wither:isPresent Creature.Green+YouCtrl:Blazethorn Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.) -SVar:BuffedBy:Creature.Red,Creature.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blazethorn_scarecrow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blazing_archon.txt b/res/cardsfolder/blazing_archon.txt deleted file mode 100644 index 9bdfa08c032..00000000000 --- a/res/cardsfolder/blazing_archon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blazing Archon -ManaCost:6 W W W -Types:Creature Archon -Text:Creatures can't attack you. -PT:5/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blazing_archon.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blazing_shoal.txt b/res/cardsfolder/blazing_shoal.txt deleted file mode 100644 index ae3e422d706..00000000000 --- a/res/cardsfolder/blazing_shoal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blazing Shoal -ManaCost:X R R -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ X R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn. -A:SP$ Pump | Cost$ ExileFromHand<1/Card.Red> | CostDesc$ You may exile a red card from your hand rather than pay Blazing Shoal's mana cost. | ValidTgts$ Creature | NumAtt$ +Y | SpellDescription$ Target creature gets +X/+0 until end of turn, where X is the exiled card's converted mana cost. -SVar:X:Count$xPaid -SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blazing_shoal.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blazing_specter.txt b/res/cardsfolder/blazing_specter.txt deleted file mode 100644 index 5799cd268cf..00000000000 --- a/res/cardsfolder/blazing_specter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blazing Specter -ManaCost:2 B R -Types:Creature Specter -Text:no text -PT:2/2 -K:Flying -K:Haste -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blazing_specter.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bleak_coven_vampires.txt b/res/cardsfolder/bleak_coven_vampires.txt deleted file mode 100644 index 33cb77b62da..00000000000 --- a/res/cardsfolder/bleak_coven_vampires.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bleak Coven Vampires -ManaCost:3 B B -Types:Creature Vampire Warrior -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Metalcraft$ True | Execute$ TrigDrain | TriggerDescription$ Metalcraft - When CARDNAME enters the battlefield, if you control three or more artifacts, target player loses 4 life and you gain 4 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 4 | SubAbility$ SVar=DBGainLife | IsCurse$ True | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE3 -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bleak_coven_vampires.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessed_orator.txt b/res/cardsfolder/blessed_orator.txt deleted file mode 100644 index 4875216f388..00000000000 --- a/res/cardsfolder/blessed_orator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blessed Orator -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:1/4 -K:stPumpAll:Creature.Other+YouCtrl:0/1:No Condition:Other creatures you control get +0/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessed_orator.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/12.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessed_reversal.txt b/res/cardsfolder/blessed_reversal.txt deleted file mode 100644 index 27bac91923c..00000000000 --- a/res/cardsfolder/blessed_reversal.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blessed Reversal -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ X | SpellDescription$ You gain 3 life for each creature attacking you. -SVar:X:Count$Valid Creature.attacking+YouDontCtrl/Times.3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessed_reversal.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/7.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/169.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/2.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessed_wind.txt b/res/cardsfolder/blessed_wind.txt deleted file mode 100644 index 20582345a4c..00000000000 --- a/res/cardsfolder/blessed_wind.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blessed Wind -ManaCost:7 W W -Types:Sorcery -Text:no text -A:SP$ SetLife | Cost$ 7 W W | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 20 | SpellDescription$ Target player's life total becomes 20. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessed_wind.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessed_wine.txt b/res/cardsfolder/blessed_wine.txt deleted file mode 100644 index 0027f92c28e..00000000000 --- a/res/cardsfolder/blessed_wine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blessed Wine -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 1 | SpellDescription$ You gain 1 life. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessed_wine.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/287.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessing.txt b/res/cardsfolder/blessing.txt deleted file mode 100644 index 08cddd75ff7..00000000000 --- a/res/cardsfolder/blessing.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Blessing -ManaCost:W W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ W | Defined$ Enchanted | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Enchanted creature gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessing.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/191.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/192.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/190.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/259.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessing_of_leeches.txt b/res/cardsfolder/blessing_of_leeches.txt deleted file mode 100644 index f12cdcacdad..00000000000 --- a/res/cardsfolder/blessing_of_leeches.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Blessing of Leeches -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Flash -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life. -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Regenerate | Cost$ 0 | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessing_of_leeches.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blessing_of_the_nephilim.txt b/res/cardsfolder/blessing_of_the_nephilim.txt deleted file mode 100644 index bf32b7d9f8d..00000000000 --- a/res/cardsfolder/blessing_of_the_nephilim.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Blessing of the Nephilim -ManaCost:W -Types:Enchantment Aura -Text:Enchanted creature gets +1/+1 for each of its colors. -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.White:1/1:No Condition:no text -K:stPumpEnchanted:Creature.Blue:1/1:No Condition:no text -K:stPumpEnchanted:Creature.Black:1/1:No Condition:no text -K:stPumpEnchanted:Creature.Red:1/1:No Condition:no text -K:stPumpEnchanted:Creature.Green:1/1:No Condition:no text -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blessing_of_the_nephilim.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blight.txt b/res/cardsfolder/blight.txt deleted file mode 100644 index 66a6ae9b46e..00000000000 --- a/res/cardsfolder/blight.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blight -ManaCost:B B -Types:Enchantment Aura -Text:no text -K:Enchant Land Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | Execute$ TrigDestroy | TriggerDescription$ When enchanted land becomes tapped, destroy it. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredCard -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blight.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/6.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/113.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/6.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blight_mamba.txt b/res/cardsfolder/blight_mamba.txt deleted file mode 100644 index bb761b5e58c..00000000000 --- a/res/cardsfolder/blight_mamba.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blight Mamba -ManaCost:1 G -Types:Creature Snake -Text:no text -PT:1/1 -K:Infect -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blight_mamba.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blight_sickle.txt b/res/cardsfolder/blight_sickle.txt deleted file mode 100644 index 6ac72ff540e..00000000000 --- a/res/cardsfolder/blight_sickle.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blight Sickle -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0 and has wither. -K:eqPump 2:+1/+0/Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blight_sickle.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blighted_agent.txt b/res/cardsfolder/blighted_agent.txt deleted file mode 100644 index 5d9f9978c00..00000000000 --- a/res/cardsfolder/blighted_agent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blighted Agent -ManaCost:1 U -Types:Creature Human Rogue -Text:no text -PT:1/1 -K:Infect -K:Unblockable -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blighted_agent.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blighted_shaman.txt b/res/cardsfolder/blighted_shaman.txt deleted file mode 100644 index 38be5edbded..00000000000 --- a/res/cardsfolder/blighted_shaman.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blighted Shaman -ManaCost:1 B -Types:Creature Human Cleric Shaman -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T Sac<1/Swamp> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ T Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blighted_shaman.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/114.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/5.jpg -End diff --git a/res/cardsfolder/blightning.txt b/res/cardsfolder/blightning.txt deleted file mode 100644 index d101f386359..00000000000 --- a/res/cardsfolder/blightning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blightning -ManaCost:1 B R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 B R | ValidTgts$ Player | NumDmg$ 3 | SubAbility$ SVar=DBDiscard | SpellDescription$ Blightning deals 3 damage to target player. That player discards two cards. -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blightning.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/156.jpg -End diff --git a/res/cardsfolder/blightsoil_druid.txt b/res/cardsfolder/blightsoil_druid.txt deleted file mode 100644 index 619cc28a861..00000000000 --- a/res/cardsfolder/blightsoil_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blightsoil Druid -ManaCost:1 B -Types:Creature Elf Druid -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blightsoil_druid.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blightspeaker.txt b/res/cardsfolder/blightspeaker.txt deleted file mode 100644 index e21ea408041..00000000000 --- a/res/cardsfolder/blightspeaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blightspeaker -ManaCost:1 B -Types:Creature Human Rebel Cleric -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -K:SearchRebel:4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blightspeaker.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/64.jpg -End diff --git a/res/cardsfolder/blightsteel_colossus.txt b/res/cardsfolder/blightsteel_colossus.txt deleted file mode 100644 index ebb524f4dea..00000000000 --- a/res/cardsfolder/blightsteel_colossus.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blightsteel Colossus -ManaCost:12 -Types:Artifact Creature Golem -Text:no text -PT:11/11 -K:Trample -K:Infect -K:Indestructible -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead. -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/blightsteel_colossus.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blightwidow.txt b/res/cardsfolder/blightwidow.txt deleted file mode 100644 index 93b096e720d..00000000000 --- a/res/cardsfolder/blightwidow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blightwidow -ManaCost:3 G -Types:Creature Spider -Text:no text -PT:2/4 -K:Reach -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blightwidow.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blind_creeper.txt b/res/cardsfolder/blind_creeper.txt deleted file mode 100644 index f12749654d1..00000000000 --- a/res/cardsfolder/blind_creeper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blind Creeper -ManaCost:1 B -Types:Creature Zombie Beast -Text:no text -PT:3/3 -T:Mode$ SpellCast | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a player casts a spell, CARDNAME gets -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -1 | NumDef$ -1 -SVar:AntiBuffedBy:Spell -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_creeper.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blind_phantasm.txt b/res/cardsfolder/blind_phantasm.txt deleted file mode 100644 index 820a77e5980..00000000000 --- a/res/cardsfolder/blind_phantasm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blind Phantasm -ManaCost:2 U -Types:Creature Illusion -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card126143.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blind_spot_giant.txt b/res/cardsfolder/blind_spot_giant.txt deleted file mode 100644 index 802b373f17b..00000000000 --- a/res/cardsfolder/blind_spot_giant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blind-Spot Giant -ManaCost:2 R -Types:Creature Giant Warrior -Text:no text -PT:4/3 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack or block.:isNotPresent Giant.Other+YouCtrl:Blind-Spot Giant can't attack or block unless you control another Giant. -SVar:BuffedBy:Giant -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_spot_giant.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blind_with_anger.txt b/res/cardsfolder/blind_with_anger.txt deleted file mode 100644 index 0b30df92ae5..00000000000 --- a/res/cardsfolder/blind_with_anger.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blind With Anger -ManaCost:3 R -Types:Instant Arcane -Text:no text -A:SP$ GainControl | Cost$ 3 R | ValidTgts$ Creature.nonLegendary | TgtPrompt$ Select target nonlegendary creature. | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Untap target nonlegendary creature and gain control of it until end of turn. That creature gains haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_with_anger.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blind_zealot.txt b/res/cardsfolder/blind_zealot.txt deleted file mode 100644 index 4d02f072c12..00000000000 --- a/res/cardsfolder/blind_zealot.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blind Zealot -ManaCost:1 B B -Types:Creature Human Cleric -Text:no text -PT:2/2 -K:Intimidate -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, destroy target creature that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature defending player controls | NoRegen$ False -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blind_zealot.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinding_light.txt b/res/cardsfolder/blinding_light.txt deleted file mode 100644 index 3031194dc61..00000000000 --- a/res/cardsfolder/blinding_light.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blinding Light -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ TapAll | Cost$ 2 W | ValidCards$ Creature.nonWhite | SpellDescription$ Tap all nonwhite creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20388.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/8.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/209.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/170.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinding_mage.txt b/res/cardsfolder/blinding_mage.txt deleted file mode 100644 index ab1ba659028..00000000000 --- a/res/cardsfolder/blinding_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blinding Mage -ManaCost:1 W -Types:Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blinding_mage.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/8.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/5.jpg -End diff --git a/res/cardsfolder/blinding_souleater.txt b/res/cardsfolder/blinding_souleater.txt deleted file mode 100644 index c00ba9b5a8b..00000000000 --- a/res/cardsfolder/blinding_souleater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blinding Souleater -ManaCost:3 -Types:Artifact Creature Cleric -Text:no text -PT:1/3 -A:AB$ Tap | Cost$ PW T | Tgt$ TgtC | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blinding_souleater.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinking_spirit.txt b/res/cardsfolder/blinking_spirit.txt deleted file mode 100644 index 48dc6bcfaaf..00000000000 --- a/res/cardsfolder/blinking_spirit.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blinking Spirit -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blinking_spirit.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/288.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/8.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinkmoth_infusion.txt b/res/cardsfolder/blinkmoth_infusion.txt deleted file mode 100644 index adf30c7be2c..00000000000 --- a/res/cardsfolder/blinkmoth_infusion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blinkmoth Infusion -ManaCost:12 U U -Types:Instant -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -A:SP$ UntapAll | Cost$ 12 U U | ValidCards$ Artifact | SpellDescription$ Untap all artifacts. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_infusion.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinkmoth_nexus.txt b/res/cardsfolder/blinkmoth_nexus.txt deleted file mode 100644 index c20d2f6fe17..00000000000 --- a/res/cardsfolder/blinkmoth_nexus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blinkmoth Nexus -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 1 | Defined$ Self | Power$ 1 | Toughness$ 1 | Types$ Creature,Artifact,Blinkmoth | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 1/1 Blinkmoth artifact creature with flying until end of turn. It's still a land. -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature.Blinkmoth | TgtPrompt$ Select target Blinkmoth creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target Blinkmoth creature gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card39439.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blinkmoth_well.txt b/res/cardsfolder/blinkmoth_well.txt deleted file mode 100644 index e06e051789a..00000000000 --- a/res/cardsfolder/blinkmoth_well.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blinkmoth Well -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Tap | Cost$ 2 T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Tap target noncreature artifact. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blinkmoth_well.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blister_beetle.txt b/res/cardsfolder/blister_beetle.txt deleted file mode 100644 index e5a62afdfeb..00000000000 --- a/res/cardsfolder/blister_beetle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blister Beetle -ManaCost:1 B -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets -1/-1 until end of turn. -SVar:TrigPump:DB$Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blister_beetle.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blistergrub.txt b/res/cardsfolder/blistergrub.txt deleted file mode 100644 index e90df3ec03f..00000000000 --- a/res/cardsfolder/blistergrub.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blistergrub -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:2/2 -K:Swampwalk -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each opponent loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blistergrub.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blistering_barrier.txt b/res/cardsfolder/blistering_barrier.txt deleted file mode 100644 index 983a69474bb..00000000000 --- a/res/cardsfolder/blistering_barrier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blistering Barrier -ManaCost:2 R -Types:Creature Wall -Text:no text -PT:5/2 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blistering_barrier.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blistering_dieflyn.txt b/res/cardsfolder/blistering_dieflyn.txt deleted file mode 100644 index 53325f183c3..00000000000 --- a/res/cardsfolder/blistering_dieflyn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blistering Dieflyn -ManaCost:3 R -Types:Creature Imp -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ BR | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blistering_dieflyn.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/82.jpg -End diff --git a/res/cardsfolder/blistering_firecat.txt b/res/cardsfolder/blistering_firecat.txt deleted file mode 100644 index b7380aa9d0a..00000000000 --- a/res/cardsfolder/blistering_firecat.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blistering Firecat -ManaCost:1 R R R -Types:Creature Elemental Cat -Text:no text -PT:7/1 -K:Morph:R R -K:Trample -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39737.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blisterstick_shaman.txt b/res/cardsfolder/blisterstick_shaman.txt deleted file mode 100644 index a729feff208..00000000000 --- a/res/cardsfolder/blisterstick_shaman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blisterstick Shaman -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blisterstick_shaman.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blitz_hellion.txt b/res/cardsfolder/blitz_hellion.txt deleted file mode 100644 index cf1d2cfe3f6..00000000000 --- a/res/cardsfolder/blitz_hellion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Blitz Hellion -ManaCost:3 R G -Types:Creature Hellion -Text:no text -PT:7/7 -K:Trample -K:Haste -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ At the beginning of the end step, CARDNAME's owner shuffles it into his or her library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Library | Shuffle$ True | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blitz_hellion.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blizzard.txt b/res/cardsfolder/blizzard.txt deleted file mode 100644 index 48a2297b887..00000000000 --- a/res/cardsfolder/blizzard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blizzard -ManaCost:G G -Types:Enchantment -Text:Cast CARDNAME only if you control a snow land.\r\n\r\nCreatures with flying don't untap during their controllers' untap steps. -K:Cumulative upkeep:2 -K:Permanents don't untap during their controllers' untap steps:Creature.withFlying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blizzard.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blizzard_elemental.txt b/res/cardsfolder/blizzard_elemental.txt deleted file mode 100644 index d031c5f80b8..00000000000 --- a/res/cardsfolder/blizzard_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blizzard Elemental -ManaCost:5 U U -Types:Creature Elemental -Text:no text -PT:5/5 -K:Flying -A:AB$ Untap | Cost$ 3 U | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/bd/en-us/card26653.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/27.jpg -End diff --git a/res/cardsfolder/bloated_toad.txt b/res/cardsfolder/bloated_toad.txt deleted file mode 100644 index 45db3f32e8d..00000000000 --- a/res/cardsfolder/bloated_toad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloated Toad -ManaCost:2 G -Types:Creature Frog -Text:no text -PT:2/2 -K:Protection from blue -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloated_toad.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blockade_runner.txt b/res/cardsfolder/blockade_runner.txt deleted file mode 100644 index d6aabe69bc7..00000000000 --- a/res/cardsfolder/blockade_runner.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blockade Runner -ManaCost:3 U -Types:Creature Merfolk -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ U | KW$ Unblockable | SpellDescription$ CARDNAME is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blockade_runner.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/60.jpg -End diff --git a/res/cardsfolder/blockbuster.txt b/res/cardsfolder/blockbuster.txt deleted file mode 100644 index c2920b34d5d..00000000000 --- a/res/cardsfolder/blockbuster.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blockbuster -ManaCost:3 R R -Types:Enchantment -Text:no text -PT:6/6 -A:AB$ DamageAll | Cost$ 1 R Sac<1/CARDNAME> | ValidCards$ Creature.tapped | ValidPlayers$ Each | NumDmg$ 3 | ValidDescription$ each tapped creature and each player. | SpellDescription$ CARDNAME deals 3 damage to each tapped creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blockbuster.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_celebrant.txt b/res/cardsfolder/blood_celebrant.txt deleted file mode 100644 index e152a84d5e3..00000000000 --- a/res/cardsfolder/blood_celebrant.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Blood Celebrant -ManaCost:B -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ B PayLife<1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ B PayLife<1> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ B PayLife<1> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ B PayLife<1> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ B PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_celebrant.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_crypt.txt b/res/cardsfolder/blood_crypt.txt deleted file mode 100644 index 48fb3507e5a..00000000000 --- a/res/cardsfolder/blood_crypt.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Blood Crypt -ManaCost:no cost -Types:Land Swamp Mountain -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97102.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_cultist.txt b/res/cardsfolder/blood_cultist.txt deleted file mode 100644 index 67495a9f884..00000000000 --- a/res/cardsfolder/blood_cultist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blood Cultist -ManaCost:1 B R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_cultist.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_frenzy.txt b/res/cardsfolder/blood_frenzy.txt deleted file mode 100644 index 20a0e325a01..00000000000 --- a/res/cardsfolder/blood_frenzy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Blood Frenzy -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat,Declare Attackers - Play Instants and Abilities,Declare Blockers - Play Instants and Abilities | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumAtt$ +4 | NumDef$ +0 | KW$ At the beginning of the end step, destroy CARDNAME. | SpellDescription$ Cast CARDNAME 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_frenzy.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_hound.txt b/res/cardsfolder/blood_hound.txt deleted file mode 100644 index 67f2072d0e2..00000000000 --- a/res/cardsfolder/blood_hound.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blood Hound -ManaCost:2 R -Types:Creature Hound -PT:1/1 -T:Mode$ DamageDone | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you're dealt damage, you may put that many +1/+1 counters on CARDNAME. -SVar:TrigPutCounter: AB$ PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ At the beginning of your end step, remove all +1/+1 counters from CARDNAME. -SVar:TrigRemoveCounter: AB$ RemoveCounter | Cost$ 0 | CounterType$ P1P1 | CounterNum$ All -SVar:X:TriggerCount$DamageAmount -SVar:All:Count$CardCounters.P1P1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_hound.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_knight.txt b/res/cardsfolder/blood_knight.txt deleted file mode 100644 index e79f427a37c..00000000000 --- a/res/cardsfolder/blood_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blood Knight -ManaCost:R R -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from white -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_knight.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_moon.txt b/res/cardsfolder/blood_moon.txt deleted file mode 100644 index 494f6bc85d8..00000000000 --- a/res/cardsfolder/blood_moon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blood Moon -ManaCost:2 R -Types:Enchantment -Text:no text -K:stAnimateAll:Land.nonBasic:no change/no change/Overwrite:Land,Mountain,RemoveSubTypes:no colors:Overwrite:No Condition:Nonbasic lands are Mountains. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_moon.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/178.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/57.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_pet.txt b/res/cardsfolder/blood_pet.txt deleted file mode 100644 index a6f54c22262..00000000000 --- a/res/cardsfolder/blood_pet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blood Pet -ManaCost:B -Types:Creature Thrull -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_pet.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/3.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/115.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_rites.txt b/res/cardsfolder/blood_rites.txt deleted file mode 100644 index ae324205cab..00000000000 --- a/res/cardsfolder/blood_rites.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blood Rites -ManaCost:3 R R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 1 R Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_rites.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_seeker.txt b/res/cardsfolder/blood_seeker.txt deleted file mode 100644 index a9f485134f1..00000000000 --- a/res/cardsfolder/blood_seeker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blood Seeker -ManaCost:1 B -Types:Creature Vampire Shaman -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDrain | TriggerDescription$ Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_seeker.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_speaker.txt b/res/cardsfolder/blood_speaker.txt deleted file mode 100644 index 26d04ff96d1..00000000000 --- a/res/cardsfolder/blood_speaker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blood Speaker -ManaCost:3 B -Types:Creature Ogre Shaman -Text:no text -PT:3/2 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand |ChangeType$ Demon | ChangeNum$ 1 | ActivatingZone$ Battlefield | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ At the beginning of your upkeep, you may sacrifice CARDNAME. If you do, search your library for a Demon card, reveal that card, and put it into your hand. Then shuffle your library. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Demon.YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever a Demon enters the battlefield under your control, you may return CARDNAME from your graveyard to your Hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:BuffedBy:Demon -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_speaker.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_tithe.txt b/res/cardsfolder/blood_tithe.txt deleted file mode 100644 index b34f3267423..00000000000 --- a/res/cardsfolder/blood_tithe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blood Tithe -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 3 B | Defined$ Opponent | LifeAmount$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ Each opponent loses 3 life. You gain life equal to the life lost this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_tithe.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blood_tyrant.txt b/res/cardsfolder/blood_tyrant.txt deleted file mode 100644 index 8d7279788a0..00000000000 --- a/res/cardsfolder/blood_tyrant.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Blood Tyrant -ManaCost:4 U B R -Types:Creature Vampire -Text:no text -PT:5/5 -K:Flying -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, each player loses 1 life. Put a +1/+1 counter on CARDNAME for each 1 life lost this way. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Each | LifeAmount$ 1 | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Cost$ 0 | CounterType$ P1P1 | CounterNum$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_tyrant.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/99.jpg -End diff --git a/res/cardsfolder/blood_vassal.txt b/res/cardsfolder/blood_vassal.txt deleted file mode 100644 index 58a802b4314..00000000000 --- a/res/cardsfolder/blood_vassal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blood Vassal -ManaCost:2 B -Types:Creature Thrull -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blood_vassal.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodbraid_elf.txt b/res/cardsfolder/bloodbraid_elf.txt deleted file mode 100644 index f108a84a12b..00000000000 --- a/res/cardsfolder/bloodbraid_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodbraid Elf -ManaCost:2 R G -Types:Creature Elf -Text:no text -PT:3/2 -K:Haste -K:Cascade -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodbraid_elf.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodcurdling_scream.txt b/res/cardsfolder/bloodcurdling_scream.txt deleted file mode 100644 index 8fde30c610c..00000000000 --- a/res/cardsfolder/bloodcurdling_scream.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodcurdling Scream -ManaCost:X B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ X B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodcurdling_scream.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodfire_colossus.txt b/res/cardsfolder/bloodfire_colossus.txt deleted file mode 100644 index 3fe189d1745..00000000000 --- a/res/cardsfolder/bloodfire_colossus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodfire Colossus -ManaCost:6 R R -Types:Creature Giant -Text:no text -PT:6/6 -A:AB$ DamageAll | Cost$ R Sac<1/CARDNAME> | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 6 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 6 damage to each creature and each player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_colossus.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/55.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/177.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodfire_dwarf.txt b/res/cardsfolder/bloodfire_dwarf.txt deleted file mode 100644 index 2f891ec1258..00000000000 --- a/res/cardsfolder/bloodfire_dwarf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodfire Dwarf -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:1/1 -A:AB$ DamageAll | Cost$ R Sac<1/CARDNAME> | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_dwarf.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodfire_infusion.txt b/res/cardsfolder/bloodfire_infusion.txt deleted file mode 100644 index 9410500df95..00000000000 --- a/res/cardsfolder/bloodfire_infusion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodfire Infusion -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant Creature you control -A:AB$ DamageAll | Cost$ R Sac<1/Card.AttachedBy> | ActivatingZone$ Battlefield | ValidCards$ Creature | NumDmg$ X | CostDesc$ R, Sacrifice enchanted creature: | ValidDescription$ each creature | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to each creature. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_infusion.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodfire_kavu.txt b/res/cardsfolder/bloodfire_kavu.txt deleted file mode 100644 index 4695ad5b8c1..00000000000 --- a/res/cardsfolder/bloodfire_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodfire Kavu -ManaCost:2 R R -Types:Creature Kavu -Text:no text -PT:2/2 -A:AB$ DamageAll | Cost$ R Sac<1/CARDNAME> | ValidCards$ Creature | NumDmg$ 2 | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 2 damage to each creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodfire_kavu.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodghast.txt b/res/cardsfolder/bloodghast.txt deleted file mode 100644 index 728026abbd9..00000000000 --- a/res/cardsfolder/bloodghast.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bloodghast -ManaCost:B B -Types:Creature Vampire Spirit -Text:no text -PT:2/1 -K:CARDNAME can't block. -K:stPumpSelf:Creature:0/0/Haste:OppLifeLE/10:CARDNAME has haste as long as an opponent has 10 or less life. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may return CARDNAME from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodghast.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodhall_ooze.txt b/res/cardsfolder/bloodhall_ooze.txt deleted file mode 100644 index 145c4fc5f82..00000000000 --- a/res/cardsfolder/bloodhall_ooze.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bloodhall Ooze -ManaCost:R -Types:Creature Ooze -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.Black+YouCtrl | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, if you control a black permanent, you may put a +1/+1 counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.Green+YouCtrl | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, if you control a green permanent, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Permanent.Green -SVar:BuffedBy:Permanent.Black -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodhall_ooze.jpg -SVar:Rarity:Rare -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/59.jpg -End diff --git a/res/cardsfolder/bloodhusk_ritualist.txt b/res/cardsfolder/bloodhusk_ritualist.txt deleted file mode 100644 index b7bf310bd4c..00000000000 --- a/res/cardsfolder/bloodhusk_ritualist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bloodhusk Ritualist -ManaCost:2 B -Types:Creature Vampire Shaman -Text:no text -PT:2/2 -K:Multikicker B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card for each time it was kicked. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | NumCards$ X | Mode$ TgtChoose -SVar:X:Count$TimesKicked -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Bloodhusk_Ritualist.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodied_ghost.txt b/res/cardsfolder/bloodied_ghost.txt deleted file mode 100644 index 999de04eae8..00000000000 --- a/res/cardsfolder/bloodied_ghost.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodied Ghost -ManaCost:1 WB WB -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -K:etbCounter:M1M1:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodied_ghost.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodletter_quill.txt b/res/cardsfolder/bloodletter_quill.txt deleted file mode 100644 index e099b0b9d87..00000000000 --- a/res/cardsfolder/bloodletter_quill.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodletter Quill -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T AddCounter<1/BLOOD> | NumCards$ 1 | SpellDescription$ Draw a card, then lose 1 life for each blood counter on CARDNAME. | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ X -A:AB$ RemoveCounter | Cost$ U B | CounterType$ BLOOD | CounterNum$ 1 | SpellDescription$ Remove a blood counter from CARDNAME. -SVar:X:Count$CardCounters.BLOOD -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodletter_quill.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodmark_mentor.txt b/res/cardsfolder/bloodmark_mentor.txt deleted file mode 100644 index ef760450e12..00000000000 --- a/res/cardsfolder/bloodmark_mentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodmark Mentor -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:stPumpAll:Creature.Red+YouCtrl:0/0/First Strike:No Condition:Red creatures you control have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodmark_mentor.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodpyre_elemental.txt b/res/cardsfolder/bloodpyre_elemental.txt deleted file mode 100644 index acea5770f10..00000000000 --- a/res/cardsfolder/bloodpyre_elemental.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodpyre Elemental -ManaCost:4 R -Types:Creature Elemental -Text:no text -PT:4/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SorcerySpeed$ True | SpellDescription$ CARDNAME deals 4 damage to target creature. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodpyre_elemental.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodrite_invoker.txt b/res/cardsfolder/bloodrite_invoker.txt deleted file mode 100644 index 643be423a24..00000000000 --- a/res/cardsfolder/bloodrite_invoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodrite Invoker -ManaCost:2 B -Types:Creature Vampire Shaman -Text:no text -PT:3/1 -A:AB$ LoseLife | Cost$ 8 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 3 life and you gain 3 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodrite_invoker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/97.jpg -End diff --git a/res/cardsfolder/bloodrock_cyclops.txt b/res/cardsfolder/bloodrock_cyclops.txt deleted file mode 100644 index 60c46243769..00000000000 --- a/res/cardsfolder/bloodrock_cyclops.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodrock Cyclops -ManaCost:2 R -Types:Creature Cyclops -Text:no text -PT:3/3 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodrock_cyclops.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/90.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodscale_prowler.txt b/res/cardsfolder/bloodscale_prowler.txt deleted file mode 100644 index 5fa683e7355..00000000000 --- a/res/cardsfolder/bloodscale_prowler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodscale Prowler -ManaCost:2 R -Types:Creature Viashino Warrior -Text:no text -PT:3/1 -K:Bloodthirst 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodscale_prowler.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodscent.txt b/res/cardsfolder/bloodscent.txt deleted file mode 100644 index 953ee858853..00000000000 --- a/res/cardsfolder/bloodscent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodscent -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodscent.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodshed_fever.txt b/res/cardsfolder/bloodshed_fever.txt deleted file mode 100644 index 8c8afb144d5..00000000000 --- a/res/cardsfolder/bloodshed_fever.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodshed Fever -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME attacks each turn if able.:Enchanted creature attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodshed_fever.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodshot_cyclops.txt b/res/cardsfolder/bloodshot_cyclops.txt deleted file mode 100644 index 087e516067f..00000000000 --- a/res/cardsfolder/bloodshot_cyclops.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bloodshot Cyclops -ManaCost:5 R -Types:Creature Cyclops Giant -Text:no text -PT:4/4 -A:AB$ DealDamage | Cost$ T Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to target creature or player. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodshot_cyclops.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/179.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/77.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodshot_trainee.txt b/res/cardsfolder/bloodshot_trainee.txt deleted file mode 100644 index 1944e7f6349..00000000000 --- a/res/cardsfolder/bloodshot_trainee.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodshot Trainee -ManaCost:3 R -Types:Creature Goblin Warrior -Text:no text -PT:2/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Card.powerGE4+Self | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. Activate this ability only if CARDNAME's power is 4 or greater. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodshot_trainee.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/110.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodstained_mire.txt b/res/cardsfolder/bloodstained_mire.txt deleted file mode 100644 index e42a4339ac2..00000000000 --- a/res/cardsfolder/bloodstained_mire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bloodstained Mire -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Swamp,Mountain | ChangeNum$ 1 | SpellDescription$ Search your library for a Swamp or Mountain card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodstained_mire.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodstoke_howler.txt b/res/cardsfolder/bloodstoke_howler.txt deleted file mode 100644 index fcfd0a176c6..00000000000 --- a/res/cardsfolder/bloodstoke_howler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodstoke Howler -ManaCost:5 R -Types:Creature Beast -Text:no text -PT:3/4 -K:Morph:6 R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is turned face up, Beast creatures you control get +3/+0 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Beast+YouCtrl | NumAtt$ +3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodstoke_howler.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodstone_cameo.txt b/res/cardsfolder/bloodstone_cameo.txt deleted file mode 100644 index cd06b6d94bf..00000000000 --- a/res/cardsfolder/bloodstone_cameo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bloodstone Cameo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodstone_cameo.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodthirsty_ogre.txt b/res/cardsfolder/bloodthirsty_ogre.txt deleted file mode 100644 index 2db0a9003d6..00000000000 --- a/res/cardsfolder/bloodthirsty_ogre.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bloodthirsty Ogre -ManaCost:2 B -Types:Creature Ogre Warrior Shaman -Text:no text -PT:3/1 -A:AB$ PutCounter | Cost$ T | CounterType$ DEVOTION | CounterNum$ 1 | SpellDescription$ Put a devotion counter on CARDNAME. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsPresent$ Demon.YouCtrl | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of devotion counters on CARDNAME. Activate this ability only if you control a Demon. -SVar:X:Count$CardCounters.DEVOTION -SVar:BuffedBy:Demon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodthirsty_ogre.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bloodthorn_taunter.txt b/res/cardsfolder/bloodthorn_taunter.txt deleted file mode 100644 index d2dd08223a8..00000000000 --- a/res/cardsfolder/bloodthorn_taunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bloodthorn Taunter -ManaCost:1 R -Types:Creature Human Scout -Text:no text -PT:1/1 -K:Haste -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ Haste | SpellDescription$ Target creature with power 5 or greater gains haste until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodthorn_taunter.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/94.jpg -End diff --git a/res/cardsfolder/bloodthrone_vampire.txt b/res/cardsfolder/bloodthrone_vampire.txt deleted file mode 100644 index b22a4b82591..00000000000 --- a/res/cardsfolder/bloodthrone_vampire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bloodthrone Vampire -ManaCost:1 B -Types:Creature Vampire -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodthrone_vampire.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/85.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blossoming_wreath.txt b/res/cardsfolder/blossoming_wreath.txt deleted file mode 100644 index 612ead3a800..00000000000 --- a/res/cardsfolder/blossoming_wreath.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Blossoming Wreath -ManaCost:G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ G | LifeAmount$ X | SpellDescription$ You gain life equal to the number of creature cards in your graveyard. -SVar:X:Count$TypeInYourYard.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blossoming_wreath.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/62.jpg -End diff --git a/res/cardsfolder/blue_elemental_blast.txt b/res/cardsfolder/blue_elemental_blast.txt deleted file mode 100644 index d884558b43a..00000000000 --- a/res/cardsfolder/blue_elemental_blast.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Blue Elemental Blast -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Card.Red | TgtPrompt$ Select target Red Spell | SpellDescription$ Choose one - Counter target red spell; -A:SP$ Destroy | Cost$ U | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent. | SpellDescription$ or destroy target red permanent. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_elemental_blast.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/50.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/50.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/49.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/63.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blue_mana_battery.txt b/res/cardsfolder/blue_mana_battery.txt deleted file mode 100644 index e905d7a5fb2..00000000000 --- a/res/cardsfolder/blue_mana_battery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blue Mana Battery -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_mana_battery.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/318.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blue_scarab.txt b/res/cardsfolder/blue_scarab.txt deleted file mode 100644 index c72f79cf09c..00000000000 --- a/res/cardsfolder/blue_scarab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blue Scarab -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:CARDNAME can't be blocked by blue creatures. -K:stPumpEnchanted:Creature:2/2:isPresent Permanent.Blue+YouDontCtrl:Enchanted creature gets +2/+2 as long as an opponent controls a blue permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_scarab.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blue_suns_zenith.txt b/res/cardsfolder/blue_suns_zenith.txt deleted file mode 100644 index ecafce8fb14..00000000000 --- a/res/cardsfolder/blue_suns_zenith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Blue Sun's Zenith -ManaCost:X U U U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ X U U U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ SVar=DBShuffle | SpellDescription$ Target player draws X cards. Shuffle CARDNAME into its owner's library. -SVar:X:Count$xPaid -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_suns_zenith.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blue_ward.txt b/res/cardsfolder/blue_ward.txt deleted file mode 100644 index 65eb6a0e82b..00000000000 --- a/res/cardsfolder/blue_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Blue Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from blue:Enchanted creature has protection from blue. This effect doesn't remove Blue Ward. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/blue_ward.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/192.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/193.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/191.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/260.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blunt_the_assault.txt b/res/cardsfolder/blunt_the_assault.txt deleted file mode 100644 index 8503cf97691..00000000000 --- a/res/cardsfolder/blunt_the_assault.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blunt the Assault -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 3 G | Defined$ You | LifeAmount$ X | SubAbility$ SVar=DBFog | SpellDescription$ You gain 1 life for each creature on the battlefield. -SVar:DBFog:DB$Fog | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:X:Count$Valid Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/blunt_the_assault.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/blurred_mongoose.txt b/res/cardsfolder/blurred_mongoose.txt deleted file mode 100644 index 1c17f4556af..00000000000 --- a/res/cardsfolder/blurred_mongoose.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Blurred Mongoose -ManaCost:1 G -Types:Creature Mongoose -Text:no text -PT:2/1 -K:CARDNAME can't be countered. -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/blurred_mongoose.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boa_constrictor.txt b/res/cardsfolder/boa_constrictor.txt deleted file mode 100644 index 7e62ff9f735..00000000000 --- a/res/cardsfolder/boa_constrictor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boa Constrictor -ManaCost:4 G -Types:Creature Snake -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ T | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boa_constrictor.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boar_umbra.txt b/res/cardsfolder/boar_umbra.txt deleted file mode 100644 index 79ddbe526cd..00000000000 --- a/res/cardsfolder/boar_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boar Umbra -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+3/+3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boar_umbra.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boartusk_liege.txt b/res/cardsfolder/boartusk_liege.txt deleted file mode 100644 index f9d4bf5f9b0..00000000000 --- a/res/cardsfolder/boartusk_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Boartusk Liege -ManaCost:1 RG RG RG -Types:Creature Goblin Knight -Text:no text -PT:3/4 -K:Trample -K:stPumpAll:Creature.Red+Other+YouCtrl:1/1:No Condition:Other red creatures you control get +1/+1. -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/boartusk_liege.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/body_of_jukai.txt b/res/cardsfolder/body_of_jukai.txt deleted file mode 100644 index 1f8b7b8e16e..00000000000 --- a/res/cardsfolder/body_of_jukai.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Body of Jukai -ManaCost:7 G G -Types:Creature Spirit -Text:no text -PT:8/5 -K:Trample -K:Soulshift:8 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/body_of_jukai.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_glider.txt b/res/cardsfolder/bog_glider.txt deleted file mode 100644 index 9df203f5e66..00000000000 --- a/res/cardsfolder/bog_glider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bog Glider -ManaCost:2 B -Types:Creature Human Mercenary -Text:no text -PT:1/1 -K:Flying -A:AB$ ChangeZone | Cost$ T Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_glider.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_gnarr.txt b/res/cardsfolder/bog_gnarr.txt deleted file mode 100644 index 616af750d1d..00000000000 --- a/res/cardsfolder/bog_gnarr.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bog Gnarr -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a player casts a black spell, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Spell.Black -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_gnarr.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_hoodlums.txt b/res/cardsfolder/bog_hoodlums.txt deleted file mode 100644 index 3b08ade271d..00000000000 --- a/res/cardsfolder/bog_hoodlums.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bog Hoodlums -ManaCost:5 B -Types:Creature Goblin Warrior -Text:no text -PT:4/1 -K:CARDNAME can't block. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on CARDNAME. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_hoodlums.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_imp.txt b/res/cardsfolder/bog_imp.txt deleted file mode 100644 index cb0ec44c698..00000000000 --- a/res/cardsfolder/bog_imp.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Bog Imp -ManaCost:1 B -Types:Creature Imp -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83010.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/119.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/122.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/7.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/3.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/116.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/3.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/7.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/65.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_initiate.txt b/res/cardsfolder/bog_initiate.txt deleted file mode 100644 index ee75d356587..00000000000 --- a/res/cardsfolder/bog_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bog Initiate -ManaCost:1 B -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ 1 | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_initiate.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_raiders.txt b/res/cardsfolder/bog_raiders.txt deleted file mode 100644 index 9f0d898e430..00000000000 --- a/res/cardsfolder/bog_raiders.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bog Raiders -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/2 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5597.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/86.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/119.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/66.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_rats.txt b/res/cardsfolder/bog_rats.txt deleted file mode 100644 index e50b661c4dc..00000000000 --- a/res/cardsfolder/bog_rats.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bog Rats -ManaCost:B -Types:Creature Rat -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by Walls. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_rats.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/8.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/4.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_serpent.txt b/res/cardsfolder/bog_serpent.txt deleted file mode 100644 index 12e208cc801..00000000000 --- a/res/cardsfolder/bog_serpent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bog Serpent -ManaCost:5 B -Types:Creature Serpent -Text:no text -PT:5/5 -K:CARDNAME can't attack unless defending player controls a Swamp. -K:When you control no Swamps, sacrifice CARDNAME. -SVar:NeedsToPlay:Swamp.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_serpent.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_smugglers.txt b/res/cardsfolder/bog_smugglers.txt deleted file mode 100644 index 3e6ad0bfc3b..00000000000 --- a/res/cardsfolder/bog_smugglers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bog Smugglers -ManaCost:1 B B -Types:Creature Human Mercenary -Text:no text -PT:2/2 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19598.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_strider_ash.txt b/res/cardsfolder/bog_strider_ash.txt deleted file mode 100644 index 81930186c28..00000000000 --- a/res/cardsfolder/bog_strider_ash.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bog-Strider Ash -ManaCost:3 G -Types:Creature Treefolk Shaman -Text:no text -PT:2/4 -K:Swampwalk -T:Mode$ SpellCast | ValidCard$ Goblin | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a Goblin spell, you may pay G. If you do, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ G | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_strider_ash.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_tatters.txt b/res/cardsfolder/bog_tatters.txt deleted file mode 100644 index c56c238ab2d..00000000000 --- a/res/cardsfolder/bog_tatters.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bog Tatters -ManaCost:4 B -Types:Creature Wraith -Text:no text -PT:4/2 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_tatters.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_witch.txt b/res/cardsfolder/bog_witch.txt deleted file mode 100644 index 7c5420caaa2..00000000000 --- a/res/cardsfolder/bog_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bog Witch -ManaCost:2 B -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ B T Discard<1/Card> | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_witch.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_wraith.txt b/res/cardsfolder/bog_wraith.txt deleted file mode 100644 index a87577d41ee..00000000000 --- a/res/cardsfolder/bog_wraith.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Bog Wraith -ManaCost:3 B -Types:Creature Wraith -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83011.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/120.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/4.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/4.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/123.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/5.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/8.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/117.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/130.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/86.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/118.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/4.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/9.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/67.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bog_wreckage.txt b/res/cardsfolder/bog_wreckage.txt deleted file mode 100644 index 818e9de5289..00000000000 --- a/res/cardsfolder/bog_wreckage.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Bog Wreckage -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_wreckage.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/314.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bogardan_firefiend.txt b/res/cardsfolder/bogardan_firefiend.txt deleted file mode 100644 index 6df8beb1679..00000000000 --- a/res/cardsfolder/bogardan_firefiend.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bogardan Firefiend -ManaCost:2 R -Types:Creature Elemental Spirit -Text:no text -PT:2/1 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDamage | TriggerDescription$ When CARDNAME is put into the graveyard from the battlefield, it deals 2 damage to target creature. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_firefiend.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/91.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bogardan_hellkite.txt b/res/cardsfolder/bogardan_hellkite.txt deleted file mode 100644 index 258f9a161e2..00000000000 --- a/res/cardsfolder/bogardan_hellkite.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Bogardan Hellkite -ManaCost:6 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flash -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Dmg1 | TriggerDescription$ Whenever CARDNAME enters the battlefield, it deals 5 damage divided as you choose among any number of target creatures and/or players. -SVar:Dmg1:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=Dmg2 -SVar:Dmg2:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=Dmg3 -SVar:Dmg3:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=Dmg4 -SVar:Dmg4:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=Dmg5 -SVar:Dmg5:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (3) | NumDmg$ 1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_hellkite.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/127.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bogardan_lancer.txt b/res/cardsfolder/bogardan_lancer.txt deleted file mode 100644 index 7340fd31c16..00000000000 --- a/res/cardsfolder/bogardan_lancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bogardan Lancer -ManaCost:1 R -Types:Creature Human Knight -Text:no text -PT:1/1 -K:Bloodthirst 1 -K:Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_lancer.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bogardan_rager.txt b/res/cardsfolder/bogardan_rager.txt deleted file mode 100644 index 9f2d9dead09..00000000000 --- a/res/cardsfolder/bogardan_rager.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bogardan Rager -ManaCost:5 R -Types:Creature Elemental -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +4/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 -K:Flash -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bogardan_rager.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_arsonists.txt b/res/cardsfolder/boggart_arsonists.txt deleted file mode 100644 index e4802c9d386..00000000000 --- a/res/cardsfolder/boggart_arsonists.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Arsonists -ManaCost:2 R -Types:Creature Goblin Rogue -Text:no text -PT:2/1 -K:Plainswalk -A:AB$ Destroy | Cost$ 2 R Sac<1/CARDNAME> | ValidTgts$ Scarecrow,Plains | TgtPrompt$ Select target Scarecrow or Plains | SpellDescription$ Destroy target Scarecrow or Plains. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_arsonists.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/85.jpg -End diff --git a/res/cardsfolder/boggart_birth_rite.txt b/res/cardsfolder/boggart_birth_rite.txt deleted file mode 100644 index 56744abda28..00000000000 --- a/res/cardsfolder/boggart_birth_rite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boggart Birth Rite -ManaCost:B -Types:Tribal Sorcery Goblin -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target Goblin card in your graveyard | ValidTgts$ Goblin.YouCtrl | SpellDescription$ Return target Goblin card from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_birth_rite.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_forager.txt b/res/cardsfolder/boggart_forager.txt deleted file mode 100644 index ec4e108cab8..00000000000 --- a/res/cardsfolder/boggart_forager.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Forager -ManaCost:R -Types:Creature Goblin Rogue -Text:no text -PT:1/1 -A:AB$ Shuffle | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player shuffles his or her library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_forager.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_harbinger.txt b/res/cardsfolder/boggart_harbinger.txt deleted file mode 100644 index 615546f5be4..00000000000 --- a/res/cardsfolder/boggart_harbinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Boggart Harbinger -ManaCost:2 B -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Goblin | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_loggers.txt b/res/cardsfolder/boggart_loggers.txt deleted file mode 100644 index 0a323232fa6..00000000000 --- a/res/cardsfolder/boggart_loggers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Loggers -ManaCost:2 B -Types:Creature Goblin Rogue -Text:no text -PT:2/1 -K:Forestwalk -A:AB$ Destroy | Cost$ 2 B Sac<1/CARDNAME> | ValidTgts$ Treefolk,Forest | TgtPrompt$ Select target Treefolk or Forest | SpellDescription$ Destroy target Treefolk or Forest. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_loggers.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/103.jpg -End diff --git a/res/cardsfolder/boggart_mob.txt b/res/cardsfolder/boggart_mob.txt deleted file mode 100644 index bfff7c69921..00000000000 --- a/res/cardsfolder/boggart_mob.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Boggart Mob -ManaCost:3 B -Types:Creature Goblin Warrior -Text:no text -PT:5/5 -K:Champion:Goblin -T:Mode$ DamageDone | ValidSource$ Goblin.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Goblin Rogue | TokenTypes$ Creature,Goblin,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_mob.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_ram_gang.txt b/res/cardsfolder/boggart_ram_gang.txt deleted file mode 100644 index a6e6f06eef7..00000000000 --- a/res/cardsfolder/boggart_ram_gang.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Ram-Gang -ManaCost:RG RG RG -Types:Creature Goblin Warrior -Text:no text -PT:3/3 -K:Haste -K:Wither -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_ram_gang.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_shenanigans.txt b/res/cardsfolder/boggart_shenanigans.txt deleted file mode 100644 index d2cb6463629..00000000000 --- a/res/cardsfolder/boggart_shenanigans.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Shenanigans -ManaCost:2 R -Types:Tribal Enchantment Goblin -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Goblin.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever another Goblin you control is put into a graveyard from the battlefield, you may have CARDNAME deal 1 damage to target player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_shenanigans.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boggart_sprite_chaser.txt b/res/cardsfolder/boggart_sprite_chaser.txt deleted file mode 100644 index af1ef868c81..00000000000 --- a/res/cardsfolder/boggart_sprite_chaser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boggart Sprite-Chaser -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/2 -K:stPumpSelf:Creature:1/1/Flying:isPresent Faerie.YouCtrl:As long as you control a Faerie, Boggart Sprite-Chaser gets +1/+1 and has flying. -SVar:BuffedBy:Faerie -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boggart_sprite_chaser.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boil.txt b/res/cardsfolder/boil.txt deleted file mode 100644 index 3c4f5361d07..00000000000 --- a/res/cardsfolder/boil.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Boil -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card25675.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/180.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/165.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/169.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/177.jpg -End diff --git a/res/cardsfolder/boiling_blood.txt b/res/cardsfolder/boiling_blood.txt deleted file mode 100644 index 07b9fb60842..00000000000 --- a/res/cardsfolder/boiling_blood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boiling Blood -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | KW$ HIDDEN CARDNAME attacks each turn if able. | TgtPrompt$ Select target creature | SpellDescription$ Target creature attacks this turn if able. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boiling_blood.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boiling_seas.txt b/res/cardsfolder/boiling_seas.txt deleted file mode 100644 index b4043529981..00000000000 --- a/res/cardsfolder/boiling_seas.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boiling Seas -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boiling_seas.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/124.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/178.jpg -End diff --git a/res/cardsfolder/bojuka_bog.txt b/res/cardsfolder/bojuka_bog.txt deleted file mode 100644 index 424719e855d..00000000000 --- a/res/cardsfolder/bojuka_bog.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bojuka Bog -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target player's graveyard. -SVar:TrigExile:AB$ChangeZoneAll | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bojuka_bog.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bojuka_brigand.txt b/res/cardsfolder/bojuka_brigand.txt deleted file mode 100644 index 246bf5c3cfa..00000000000 --- a/res/cardsfolder/bojuka_brigand.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Bojuka Brigand -ManaCost:1 B -Types:Creature Human Warrior Ally -Text:no text -PT:1/1 -K:CARDNAME can't block. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bojuka_brigand.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bola_warrior.txt b/res/cardsfolder/bola_warrior.txt deleted file mode 100644 index e4ee4e824fd..00000000000 --- a/res/cardsfolder/bola_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bola Warrior -ManaCost:1 R -Types:Creature Human Spellshaper Warrior -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bola_warrior.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boldwyr_heavyweights.txt b/res/cardsfolder/boldwyr_heavyweights.txt deleted file mode 100644 index 10906e19434..00000000000 --- a/res/cardsfolder/boldwyr_heavyweights.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Boldwyr Heavyweights -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:8/8 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/boldwyr_heavyweights.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonded_fetch.txt b/res/cardsfolder/bonded_fetch.txt deleted file mode 100644 index e6f7ac54a6d..00000000000 --- a/res/cardsfolder/bonded_fetch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bonded Fetch -ManaCost:2 U -Types:Creature Homunculus -Text:no text -PT:0/2 -K:Defender -K:Haste -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card132229.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonds_of_quicksilver.txt b/res/cardsfolder/bonds_of_quicksilver.txt deleted file mode 100644 index 86b78c3cb80..00000000000 --- a/res/cardsfolder/bonds_of_quicksilver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bonds of Quicksilver -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonds_of_quicksilver.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bone_flute.txt b/res/cardsfolder/bone_flute.txt deleted file mode 100644 index 3f049490b29..00000000000 --- a/res/cardsfolder/bone_flute.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bone Flute -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ PumpAll | Cost$ 2 T | ValidCards$ Creature | NumAtt$ -1 | SpellDescription$ All creatures get -1/-0 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_flute.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bone_harvest.txt b/res/cardsfolder/bone_harvest.txt deleted file mode 100644 index f3324655d6f..00000000000 --- a/res/cardsfolder/bone_harvest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bone Harvest -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Put any number of target creature cards from your graveyard on top of your library. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_harvest.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bone_saw.txt b/res/cardsfolder/bone_saw.txt deleted file mode 100644 index 5909bb87c0b..00000000000 --- a/res/cardsfolder/bone_saw.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bone Saw -ManaCost:0 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0. -K:eqPump 1:+1/+0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_saw.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bone_shredder.txt b/res/cardsfolder/bone_shredder.txt deleted file mode 100644 index 224b579e615..00000000000 --- a/res/cardsfolder/bone_shredder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bone Shredder -ManaCost:2 B -Types:Creature Minion -Text:no text -PT:1/1 -K:Flying -K:Echo:2 B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonartifact, nonblack creature. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.nonArtifact+nonBlack | TgtPrompt$ Select target nonartifact, nonblack creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_shredder.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bone_splinters.txt b/res/cardsfolder/bone_splinters.txt deleted file mode 100644 index 823c07d0a82..00000000000 --- a/res/cardsfolder/bone_splinters.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bone Splinters -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bone_splinters.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonehoard.txt b/res/cardsfolder/bonehoard.txt deleted file mode 100644 index 04faf15707f..00000000000 --- a/res/cardsfolder/bonehoard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bonehoard -ManaCost:4 -Types:Artifact Equipment -Text:Equipped creature gets +X/+X, where X is the number of creature cards in all graveyards. -K:eqPump 2:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:no text -K:Living Weapon -SVar:X:Count$TypeInAllYards.Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonehoard.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boneknitter.txt b/res/cardsfolder/boneknitter.txt deleted file mode 100644 index 2e5028ec771..00000000000 --- a/res/cardsfolder/boneknitter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boneknitter -ManaCost:1 B -Types:Creature Zombie Cleric -Text:no text -PT:1/1 -A:AB$ Regenerate | ValidTgts$ Zombie | TgtPrompt$ Select target Zombie. | Cost$ 1 B | SpellDescription$ Regenerate target Zombie. -K:Morph:2 B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boneknitter.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boneshard_slasher.txt b/res/cardsfolder/boneshard_slasher.txt deleted file mode 100644 index 1294fb39a8a..00000000000 --- a/res/cardsfolder/boneshard_slasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boneshard Slasher -ManaCost:1 B -Types:Creature Horror -Text:no text -PT:1/1 -K:Flying -K:stPumpSelf:Creature:2/2/When CARDNAME becomes the target of a spell or ability, sacrifice it.:Threshold: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." -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boneshard_slasher.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonesplitter.txt b/res/cardsfolder/bonesplitter.txt deleted file mode 100644 index 3f0d1f0d5d1..00000000000 --- a/res/cardsfolder/bonesplitter.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bonesplitter -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +2/+0. -K:eqPump 1:+2/+0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonesplitter.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonesplitter_sliver.txt b/res/cardsfolder/bonesplitter_sliver.txt deleted file mode 100644 index 17186291353..00000000000 --- a/res/cardsfolder/bonesplitter_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bonesplitter Sliver -ManaCost:3 R -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:2/0:no Condition:All Sliver creatures get +2/+0. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonesplitter_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bonethorn_valesk.txt b/res/cardsfolder/bonethorn_valesk.txt deleted file mode 100644 index 7191395c3d7..00000000000 --- a/res/cardsfolder/bonethorn_valesk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bonethorn Valesk -ManaCost:4 R -Types:Creature Beast -Text:no text -PT:4/2 -T:Mode$ TurnFaceUp | ValidCard$ Permanent | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a permanent is turned face up, CARDNAME deals 1 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonethorn_valesk.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/book_of_rass.txt b/res/cardsfolder/book_of_rass.txt deleted file mode 100644 index 88f4c4efd8c..00000000000 --- a/res/cardsfolder/book_of_rass.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Book of Rass -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 PayLife<2> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/book_of_rass.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boomerang.txt b/res/cardsfolder/boomerang.txt deleted file mode 100644 index d6f7a78d27e..00000000000 --- a/res/cardsfolder/boomerang.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Boomerang -ManaCost:U U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boomerang.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/63.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/48.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/75.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/64.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/66.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/70.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/58.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boon_reflection.txt b/res/cardsfolder/boon_reflection.txt deleted file mode 100644 index e2618ae20ae..00000000000 --- a/res/cardsfolder/boon_reflection.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Boon Reflection -ManaCost:4 W -Types:Enchantment -Text:If you would gain life, you gain twice that much life instead. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/boon_reflection.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/borborygmos.txt b/res/cardsfolder/borborygmos.txt deleted file mode 100644 index bb980ac07fe..00000000000 --- a/res/cardsfolder/borborygmos.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Borborygmos -ManaCost:3 R R G G -Types:Legendary Creature Cyclops -Text:no text -PT:6/7 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigCounters | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on each creature you control. -SVar:TrigCounters:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/borborygmos.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/border_guard.txt b/res/cardsfolder/border_guard.txt deleted file mode 100644 index 6462e04611d..00000000000 --- a/res/cardsfolder/border_guard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Border Guard -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20396.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/9.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/border_patrol.txt b/res/cardsfolder/border_patrol.txt deleted file mode 100644 index f87943e1939..00000000000 --- a/res/cardsfolder/border_patrol.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Border Patrol -ManaCost:4 W -Types:Creature Human Nomad -Text:no text -PT:1/6 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/border_patrol.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/borderland_behemoth.txt b/res/cardsfolder/borderland_behemoth.txt deleted file mode 100644 index bb058bae034..00000000000 --- a/res/cardsfolder/borderland_behemoth.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Borderland Behemoth -ManaCost:5 R R -Types:Creature Giant Warrior -Text:no text -PT:4/4 -K:Trample -K:stPumpSelf:Creature:X/X:no Condition:Borderland Behemoth gets +4/+4 for each other Giant you control. -SVar:X:Count$Valid Giant.Other+YouCtrl/Times.4 -SVar:RemRandomDeck:True -SVar:BuffedBy:Giant -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/borderland_behemoth.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/borderland_ranger.txt b/res/cardsfolder/borderland_ranger.txt deleted file mode 100644 index 369e64e17a3..00000000000 --- a/res/cardsfolder/borderland_ranger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Borderland Ranger -ManaCost:2 G -Types:Creature Human Scout -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/borderland_ranger.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boreal_centaur.txt b/res/cardsfolder/boreal_centaur.txt deleted file mode 100644 index 3e8bea9984a..00000000000 --- a/res/cardsfolder/boreal_centaur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boreal Centaur -ManaCost:1 G -Types:Snow Creature Centaur Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ S | NumAtt$ +1 | NumDef$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boreal_centaur.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boreal_druid.txt b/res/cardsfolder/boreal_druid.txt deleted file mode 100644 index eac1b0b8a3b..00000000000 --- a/res/cardsfolder/boreal_druid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boreal Druid -ManaCost:G -Types:Snow Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121193.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boreal_griffin.txt b/res/cardsfolder/boreal_griffin.txt deleted file mode 100644 index f623ae03108..00000000000 --- a/res/cardsfolder/boreal_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Boreal Griffin -ManaCost:3 W W -Types:Snow Creature Griffin -Text:no text -PT:3/2 -K:Flying -A:AB$ Pump | Cost$ S | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boreal_griffin.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/2.jpg -End diff --git a/res/cardsfolder/boreal_shelf.txt b/res/cardsfolder/boreal_shelf.txt deleted file mode 100644 index 1655816d48b..00000000000 --- a/res/cardsfolder/boreal_shelf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boreal Shelf -ManaCost:no cost -Types:Snow Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boreal_shelf.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boris_devilboon.txt b/res/cardsfolder/boris_devilboon.txt deleted file mode 100644 index 7073acf07e5..00000000000 --- a/res/cardsfolder/boris_devilboon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boris Devilboon -ManaCost:3 B R -Types:Legendary Creature Zombie Wizard -Text:no text -PT:2/2 -A:AB$ Token | Cost$ 2 B R T | TokenAmount$ 1 | TokenName$ Minor Demon | TokenOwner$ You | TokenTypes$ Creature,Demon | TokenColors$ Black,Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 black and red Demon creature token named Minor Demon onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/boris_devilboon.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boros_garrison.txt b/res/cardsfolder/boros_garrison.txt deleted file mode 100644 index 349138d9eee..00000000000 --- a/res/cardsfolder/boros_garrison.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Boros Garrison -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R W | SpellDescription$ Add R W to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_garrison.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boros_guildmage.txt b/res/cardsfolder/boros_guildmage.txt deleted file mode 100644 index ad5ff221c1f..00000000000 --- a/res/cardsfolder/boros_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Boros Guildmage -ManaCost:RW RW -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_guildmage.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/242.jpg -End diff --git a/res/cardsfolder/boros_recruit.txt b/res/cardsfolder/boros_recruit.txt deleted file mode 100644 index e3bd8014c60..00000000000 --- a/res/cardsfolder/boros_recruit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boros Recruit -ManaCost:RW -Types:Creature Goblin Soldier -Text:no text -PT:1/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_recruit.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boros_signet.txt b/res/cardsfolder/boros_signet.txt deleted file mode 100644 index 39675c34443..00000000000 --- a/res/cardsfolder/boros_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boros Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W R | SpellDescription$ Add W R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_signet.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/boros_swiftblade.txt b/res/cardsfolder/boros_swiftblade.txt deleted file mode 100644 index fd08ee6affb..00000000000 --- a/res/cardsfolder/boros_swiftblade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Boros Swiftblade -ManaCost:R W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_swiftblade.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/borrowing_100000_arrows.txt b/res/cardsfolder/borrowing_100000_arrows.txt deleted file mode 100644 index 4fcb6a5bb1c..00000000000 --- a/res/cardsfolder/borrowing_100000_arrows.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Borrowing 100,000 Arrows -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ X | SpellDescription$ Draw a card for each tapped creature target opponent controls. -SVar:X:Count$TypeOppCtrlTapped.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/borrowing_100000_arrows.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/borrowing_the_east_wind.txt b/res/cardsfolder/borrowing_the_east_wind.txt deleted file mode 100644 index aacd14239a1..00000000000 --- a/res/cardsfolder/borrowing_the_east_wind.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Borrowing the East Wind -ManaCost:X G G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X G G | ValidCards$ Creature.withHorsemanship | ValidPlayers$ Each | NumDmg$ X | ValidDescription$ each creature with horsemanship and each player. | SpellDescription$ CARDNAME deals X damage to each creature with horsemanship and each player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/borrowing_the_east_wind.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bosh_iron_golem.txt b/res/cardsfolder/bosh_iron_golem.txt deleted file mode 100644 index 25c076c99be..00000000000 --- a/res/cardsfolder/bosh_iron_golem.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bosh, Iron Golem -ManaCost:8 -Types:Legendary Artifact Creature Golem -Text:no text -PT:6/7 -K:Trample -A:AB$ DealDamage | Cost$ 3 R Sac<1/Artifact> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed artifact's converted mana cost to target creature or player. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bosh_iron_golem.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bosk_banneret.txt b/res/cardsfolder/bosk_banneret.txt deleted file mode 100644 index ae918f06a06..00000000000 --- a/res/cardsfolder/bosk_banneret.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bosk Banneret -ManaCost:1 G -Types:Creature Treefolk Shaman -Text:Treefolk spells and Shaman spells you cast cost 1 less to cast. -PT:1/3 -K:CostChange:Player:Less:1:Spell:All:Treefolk/Shaman:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bosk_banneret.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bottle_gnomes.txt b/res/cardsfolder/bottle_gnomes.txt deleted file mode 100644 index 553c528d6c6..00000000000 --- a/res/cardsfolder/bottle_gnomes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bottle Gnomes -ManaCost:3 -Types:Artifact Creature Gnome -Text:no text -PT:1/3 -A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bottle_gnomes.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/148.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/268.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/290.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/312.jpg -End diff --git a/res/cardsfolder/bottle_of_suleiman.txt b/res/cardsfolder/bottle_of_suleiman.txt deleted file mode 100644 index dd6c94dd102..00000000000 --- a/res/cardsfolder/bottle_of_suleiman.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Bottle of Suleiman -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ FlipACoin | Cost$ 1 Sac<1/CARDNAME> | WinSubAbility$ DBToken | LoseSubAbility$ DBDamage | SpellDescription$ Flip a coin. If you lose the flip, CARDNAME deals 5 damage to you. If you win the flip, put a 5/5 colorless Djinn artifact creature token with flying onto the battlefield. -SVar:DBDamage:DB$DealDamage | Defined$ You | NumDmg$ 5 -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Djinn | TokenTypes$ Creature,Artifact,Djinn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bottle_of_suleiman.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/354.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/275.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/237.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/319.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bottomless_pit.txt b/res/cardsfolder/bottomless_pit.txt deleted file mode 100644 index ae5d99dd90c..00000000000 --- a/res/cardsfolder/bottomless_pit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bottomless Pit -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of each player's upkeep, that player discards a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ Random -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bottomless_pit.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bottomless_vault.txt b/res/cardsfolder/bottomless_vault.txt deleted file mode 100644 index 98040d43371..00000000000 --- a/res/cardsfolder/bottomless_vault.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bottomless Vault -ManaCost:no cost -Types:Land -Text:At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. -K:CARDNAME enters the battlefield tapped. -K:You may choose not to untap CARDNAME during your untap step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bottomless_vault.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/411.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bouncing_beebles.txt b/res/cardsfolder/bouncing_beebles.txt deleted file mode 100644 index 7947c18864e..00000000000 --- a/res/cardsfolder/bouncing_beebles.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bouncing Beebles -ManaCost:2 U -Types:Creature Beeble -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/HIDDEN Unblockable:isPresent Artifact.YouDontCtrl:CARDNAME is unblockable as long as defending player controls an artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bouncing_beebles.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bound_in_silence.txt b/res/cardsfolder/bound_in_silence.txt deleted file mode 100644 index 0bdb5807ba2..00000000000 --- a/res/cardsfolder/bound_in_silence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bound in Silence -ManaCost:2 W -Types:Tribal Enchantment Rebel Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bound_in_silence.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bounteous_kirin.txt b/res/cardsfolder/bounteous_kirin.txt deleted file mode 100644 index 2f0264d2c3f..00000000000 --- a/res/cardsfolder/bounteous_kirin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bounteous Kirin -ManaCost:5 G G -Types:Legendary Creature Kirin Spirit -Text:no text -PT:4/4 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may gain life equal to that spell's converted mana cost. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggeredCard$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bounteous_kirin.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bountiful_harvest.txt b/res/cardsfolder/bountiful_harvest.txt deleted file mode 100644 index 841b2b1d21e..00000000000 --- a/res/cardsfolder/bountiful_harvest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bountiful Harvest -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 4 G | LifeAmount$ X | SpellDescription$ You gain 1 life for each land you control. -SVar:X:Count$TypeYouCtrl.Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bountiful_harvest.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/170.jpg -End diff --git a/res/cardsfolder/bounty_hunter.txt b/res/cardsfolder/bounty_hunter.txt deleted file mode 100644 index 2ef15f945de..00000000000 --- a/res/cardsfolder/bounty_hunter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bounty Hunter -ManaCost:2 B B -Types:Creature Human Archer Minion -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | CounterType$ BOUNTY | CounterNum$ 1 | SpellDescription$ Put a bounty counter on target nonblack creature. -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.countersGE1BOUNTY | TgtPrompt$ Select target creature with a bounty counter on it | SpellDescription$ Destroy target creature with a bounty counter on it. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bounty_hunter.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brackwater_elemental.txt b/res/cardsfolder/brackwater_elemental.txt deleted file mode 100644 index 9265c8f837d..00000000000 --- a/res/cardsfolder/brackwater_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Brackwater Elemental -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:4/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME attacks or blocks, sacrifice it at the beginning of the next end step. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ When CARDNAME attacks or blocks, sacrifice it at the beginning of the next end step. -K:Unearth:2 U -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ HIDDEN At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brackwater_elemental.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/braid_of_fire.txt b/res/cardsfolder/braid_of_fire.txt deleted file mode 100644 index c22b7cf4339..00000000000 --- a/res/cardsfolder/braid_of_fire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Braid of Fire -ManaCost:1 R -Types:Enchantment -Text:Cumulative upkeep-Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/braid_of_fire.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/braids_cabal_minion.txt b/res/cardsfolder/braids_cabal_minion.txt deleted file mode 100644 index 99781d4d0f1..00000000000 --- a/res/cardsfolder/braids_cabal_minion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Braids, Cabal Minion -ManaCost:2 B B -Types:Legendary Creature Human Minion -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacYou | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices an artifact, creature or land. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigSacOpp | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices an artifact, creature or land.   -SVar:TrigSacYou:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature,Artifact,Land | Defined$ You | ChangeNum$ 1 | SpellDescription$ Sacrifice an artifact, creature or land. -SVar:TrigSacOpp:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature,Artifact,Land | Defined$ Opponent | ChangeNum$ 1 | SpellDescription$ Sacrifice an artifact, creature or land. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/braids_cabal_minion.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/117.jpg -End diff --git a/res/cardsfolder/braids_conjurer_adept.txt b/res/cardsfolder/braids_conjurer_adept.txt deleted file mode 100644 index 34d380bf94d..00000000000 --- a/res/cardsfolder/braids_conjurer_adept.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Braids, Conjurer Adept -ManaCost:2 U U -Types:Legendary Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZoneYou | TriggerDescription$ 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. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigChangeZoneOpp | Secondary$ True | TriggerDescription$ 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. -SVar:TrigChangeZoneYou:AB$ ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature,Artifact,Land | Defined$ You | ChangeNum$ 1 | SpellDescription$ You may put an artifact, creature or land card from his or her hand onto the battlefield. -SVar:TrigChangeZoneOpp:AB$ ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature,Artifact,Land | Defined$ Opponent | ChangeNum$ 1 | SpellDescription$ Your opponent may put an artifact, creature or land card from his or her hand onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/braids_conjurer_adept.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/36.jpg -End diff --git a/res/cardsfolder/braidwood_cup.txt b/res/cardsfolder/braidwood_cup.txt deleted file mode 100644 index 3b29fa69ba3..00000000000 --- a/res/cardsfolder/braidwood_cup.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Braidwood Cup -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/braidwood_cup.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/126.jpg -End diff --git a/res/cardsfolder/braidwood_sextant.txt b/res/cardsfolder/braidwood_sextant.txt deleted file mode 100644 index 8c9b42b16b3..00000000000 --- a/res/cardsfolder/braidwood_sextant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Braidwood Sextant -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/braidwood_sextant.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brain_freeze.txt b/res/cardsfolder/brain_freeze.txt deleted file mode 100644 index 068ce6eb898..00000000000 --- a/res/cardsfolder/brain_freeze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brain Freeze -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Mill | Cost$ 1 U | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top three cards of his or her library into his or her graveyard. -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brain_freeze.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brainbite.txt b/res/cardsfolder/brainbite.txt deleted file mode 100644 index 5493ee965ae..00000000000 --- a/res/cardsfolder/brainbite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brainbite -ManaCost:2 U B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 U B | ValidTgts$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals his or her hand. You choose a card from it. That player discards that card. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brainbite.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/braingeyser.txt b/res/cardsfolder/braingeyser.txt deleted file mode 100644 index cdbddc3e1d7..00000000000 --- a/res/cardsfolder/braingeyser.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Braingeyser -ManaCost:X U U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ X U U | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws X cards. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/braingeyser.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/51.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/51.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/50.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brainspoil.txt b/res/cardsfolder/brainspoil.txt deleted file mode 100644 index 2222b419b69..00000000000 --- a/res/cardsfolder/brainspoil.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brainspoil -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature.unenchanted | TgtPrompt$ Select target creature that isn't enchanted | NoRegen$ True | SpellDescription$ Destroy target creature that isn't enchanted. It can't be regenerated. -K:Transmute:1 B B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brainspoil.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/78.jpg -End diff --git a/res/cardsfolder/brainstorm.txt b/res/cardsfolder/brainstorm.txt deleted file mode 100644 index 7c9154d249b..00000000000 --- a/res/cardsfolder/brainstorm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Brainstorm -ManaCost:U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 3 | SpellDescription$ Draw three cards, then put two cards from your hand on top of your library in any order. | SubAbility$ SVar=ChangeZoneDB -SVar:ChangeZoneDB:DB$ChangeZone | Origin$ Hand | Destination$ Library | ChangeNum$ 2 | Mandatory$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brainstorm.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/76.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/61.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bramble_creeper.txt b/res/cardsfolder/bramble_creeper.txt deleted file mode 100644 index bdab3a8cfa7..00000000000 --- a/res/cardsfolder/bramble_creeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bramble Creeper -ManaCost:4 G -Types:Creature Elemental -Text:no text -PT:0/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +5/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bramble_creeper.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bramblesnap.txt b/res/cardsfolder/bramblesnap.txt deleted file mode 100644 index b0e04a94a8f..00000000000 --- a/res/cardsfolder/bramblesnap.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bramblesnap -ManaCost:1 G -Types:Creature Elemental -Text:no text -PT:1/1 -K:Trample -A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bramblesnap.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/branching_bolt.txt b/res/cardsfolder/branching_bolt.txt deleted file mode 100644 index 7ae1d87b405..00000000000 --- a/res/cardsfolder/branching_bolt.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Branching Bolt -ManaCost:1 R G -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. | NumDmg$ 3 | SpellDescription$ Choose one - CARDNAME deals 3 damage to target creature with flying; -A:SP$ DealDamage | Cost$ 1 R G | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying. | NumDmg$ 3 | SpellDescription$ or CARDNAME deals 3 damage to target creature without flying; -A:SP$ DealDamage | Cost$ 1 R G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. | NumDmg$ 3 | SubAbility$ SVar=DBDamage | SpellDescription$ or CARDNAME deals 3 damage to target creature with flying and 3 damage to target creature without flying. -SVar:DBDamage:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying. | NumDmg$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/branching_bolt.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/branchsnap_lorian.txt b/res/cardsfolder/branchsnap_lorian.txt deleted file mode 100644 index 23904957caa..00000000000 --- a/res/cardsfolder/branchsnap_lorian.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Branchsnap Lorian -ManaCost:1 G G -Types:Creature Beast -Text:no text -PT:4/1 -K:Trample -K:Morph:G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/branchsnap_lorian.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/branded_brawlers.txt b/res/cardsfolder/branded_brawlers.txt deleted file mode 100644 index c15d0527e2f..00000000000 --- a/res/cardsfolder/branded_brawlers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Branded Brawlers -ManaCost:R -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack.:isPresent Land.untapped+YouDontCtrl:CARDNAME can't attack if defending player controls an untapped land. -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't block.:isPresent Land.untapped+YouCtrl:CARDNAME can't can't block if you control an untapped land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/branded_brawlers.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/84.jpg -End diff --git a/res/cardsfolder/brass_gnat.txt b/res/cardsfolder/brass_gnat.txt deleted file mode 100644 index 5e343899889..00000000000 --- a/res/cardsfolder/brass_gnat.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Brass Gnat -ManaCost:1 -Types:Artifact Creature Insect -Text:no text -PT:1/1 -K:Flying -K:CARDNAME doesn't untap during your untap step. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may pay 1. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 1 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_gnat.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brass_herald.txt b/res/cardsfolder/brass_herald.txt deleted file mode 100644 index cb991d467ba..00000000000 --- a/res/cardsfolder/brass_herald.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Brass Herald -ManaCost:6 -Types:Artifact Creature Golem -Text:As CARDNAME enters the battlefield, choose a creature type. -PT:2/2 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ ChooseCT | TriggerDescription$ When CARDNAME 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. -SVar:ChooseCT:AB$ ChooseType | Cost$ 0 | Defined$ You | Type$ Creature | SubAbility$ SVar=TrigDig -SVar:TrigDig:DB$ Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature.ChosenType -K:stPumpAll:Creature.ChosenType:+1/+1:No Condition:Creatures of the chosen type get +1/+1. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_herald.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/133.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brass_man.txt b/res/cardsfolder/brass_man.txt deleted file mode 100644 index feb396af9ac..00000000000 --- a/res/cardsfolder/brass_man.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Brass Man -ManaCost:1 -Types:Artifact Creature Construct -Text:no text -PT:1/3 -K:CARDNAME doesn't untap during your untap step. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may pay 1. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 1 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_man.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/238.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/320.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brass_secretary.txt b/res/cardsfolder/brass_secretary.txt deleted file mode 100644 index 2c3a4c60640..00000000000 --- a/res/cardsfolder/brass_secretary.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brass Secretary -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/1 -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_secretary.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brass_squire.txt b/res/cardsfolder/brass_squire.txt deleted file mode 100644 index 98481fd0dcb..00000000000 --- a/res/cardsfolder/brass_squire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brass Squire -ManaCost:3 -Types:Artifact Creature Myr -Text:Tap: Attach target Equipment you control to target creature you control. -PT:1/3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_squire.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brass_talon_chimera.txt b/res/cardsfolder/brass_talon_chimera.txt deleted file mode 100644 index c9d5fb7edc7..00000000000 --- a/res/cardsfolder/brass_talon_chimera.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Brass-Talon Chimera -ManaCost:4 -Types:Artifact Creature Chimera -Text:no text -PT:2/2 -K:First Strike -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) -SVar:DBPump:DB$Pump | KW$ First Strike | Defined$ Targeted | Permanent$ True -SVar:Rarity:Uncommon -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/brass_talon_chimera.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brassclaw_orcs.txt b/res/cardsfolder/brassclaw_orcs.txt deleted file mode 100644 index 4d4b2fc305e..00000000000 --- a/res/cardsfolder/brassclaw_orcs.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brassclaw Orcs -ManaCost:2 R -Types:Creature Orc -Text:no text -PT:3/2 -K:CARDNAME can't block creatures with power 2 or greater. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brassclaw_orcs.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/213.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/100.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/bravado.txt b/res/cardsfolder/bravado.txt deleted file mode 100644 index b40de69f2c8..00000000000 --- a/res/cardsfolder/bravado.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bravado -ManaCost:1 R -Types:Enchantment Aura -Text:Enchanted creature gets +1/+1 for each other creature you control. -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$Valid Creature.YouCtrl/Minus.1 -SVar:BuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bravado.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brave_the_elements.txt b/res/cardsfolder/brave_the_elements.txt deleted file mode 100644 index e73e37753be..00000000000 --- a/res/cardsfolder/brave_the_elements.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Brave the Elements -ManaCost:W -Types:Instant -Text:Choose a color. White creatures you control gain protection from the chosen color until end of turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brave_the_elements.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brawn.txt b/res/cardsfolder/brawn.txt deleted file mode 100644 index f84845d4c86..00000000000 --- a/res/cardsfolder/brawn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brawn -ManaCost:3 G -Types:Creature Incarnation -Text:As long as Brawn is in your graveyard and you control a Forest, creatures you control have trample. -PT:3/3 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brawn.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/breach.txt b/res/cardsfolder/breach.txt deleted file mode 100644 index e9f108d1ddf..00000000000 --- a/res/cardsfolder/breach.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Breach -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ Fear | SpellDescription$ Target creature gets +2/+0 and gains fear until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/breach.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/120.jpg -End diff --git a/res/cardsfolder/break_asunder.txt b/res/cardsfolder/break_asunder.txt deleted file mode 100644 index e6b03ead33b..00000000000 --- a/res/cardsfolder/break_asunder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Break Asunder -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/break_asunder.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/113.jpg -End diff --git a/res/cardsfolder/breath_of_life.txt b/res/cardsfolder/breath_of_life.txt deleted file mode 100644 index 036198711d4..00000000000 --- a/res/cardsfolder/breath_of_life.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Breath of Life -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 W | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card13112.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/135.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/10.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/172.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/breath_of_malfegor.txt b/res/cardsfolder/breath_of_malfegor.txt deleted file mode 100644 index a364501f9a1..00000000000 --- a/res/cardsfolder/breath_of_malfegor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Breath of Malfegor -ManaCost:3 B R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 B R | Defined$ Opponent | NumDmg$ 5 | SpellDescription$ Breath of Malfegor deals 5 damage to each opponent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/breath_of_malfegor.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/breathstealer.txt b/res/cardsfolder/breathstealer.txt deleted file mode 100644 index c2b32a8112b..00000000000 --- a/res/cardsfolder/breathstealer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Breathstealer -ManaCost:2 B -Types:Creature Nightstalker -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/breathstealer.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/7.jpg -End diff --git a/res/cardsfolder/breeding_pit.txt b/res/cardsfolder/breeding_pit.txt deleted file mode 100644 index 8b13d13f0ac..00000000000 --- a/res/cardsfolder/breeding_pit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Breeding Pit -ManaCost:2 B B -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B B -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your end step, put a 0/1 black Thrull creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ B 0 1 Thrull | TokenName$ Thrull | TokenColors$ Black | TokenTypes$ Creature,Thrull | TokenPower$ 0 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/breeding_pit.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/10.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/breeding_pool.txt b/res/cardsfolder/breeding_pool.txt deleted file mode 100644 index f949e55ab41..00000000000 --- a/res/cardsfolder/breeding_pool.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Breeding Pool -ManaCost:no cost -Types:Land Forest Island -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97088.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/briar_patch.txt b/res/cardsfolder/briar_patch.txt deleted file mode 100644 index c007aafb1b4..00000000000 --- a/res/cardsfolder/briar_patch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Briar Patch -ManaCost:1 G G -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature attacks you, it gets -1/-0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ -1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/briar_patch.jpg -SVar:Rarity:Uncommon -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/232.jpg -End diff --git a/res/cardsfolder/briar_shield.txt b/res/cardsfolder/briar_shield.txt deleted file mode 100644 index e6e398f1a07..00000000000 --- a/res/cardsfolder/briar_shield.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Briar Shield -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | Defined$ Enchanted | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Enchanted creature gets +3/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/briar_shield.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/briarberry_cohort.txt b/res/cardsfolder/briarberry_cohort.txt deleted file mode 100644 index 55e04b85169..00000000000 --- a/res/cardsfolder/briarberry_cohort.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Briarberry Cohort -ManaCost:1 U -Types:Creature Faerie Soldier -Text:no text -PT:1/1 -K:Flying -K:stPumpSelf:Creature:1/1:isPresent Creature.Blue+Other+YouCtrl:CARDNAME gets +1/+1 as long as you control another blue creature. -SVar:BuffedBy:Creature.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/briarberry_cohort.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/briarhorn.txt b/res/cardsfolder/briarhorn.txt deleted file mode 100644 index 25f58b680bc..00000000000 --- a/res/cardsfolder/briarhorn.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Briarhorn -ManaCost:3 G -Types:Creature Elemental -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +3/+3 until end of turn. -K:Evoke:1 G -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:PlayMain1:TRUE -K:Flash -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/briarhorn.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/briarknit_kami.txt b/res/cardsfolder/briarknit_kami.txt deleted file mode 100644 index 7a2baafb7f6..00000000000 --- a/res/cardsfolder/briarknit_kami.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Briarknit Kami -ManaCost:3 G G -Types:Creature Spirit -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, put a +1/+1 counter on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/briarknit_kami.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bribery.txt b/res/cardsfolder/bribery.txt deleted file mode 100644 index 5e9f663f699..00000000000 --- a/res/cardsfolder/bribery.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bribery -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 U U | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Creature | ChangeNum$ 1 | GainControl$ True | IsCurse$ True | SpellDescription$ 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. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card21300.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/64.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bridge_from_below.txt b/res/cardsfolder/bridge_from_below.txt deleted file mode 100644 index db4a358ae40..00000000000 --- a/res/cardsfolder/bridge_from_below.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bridge from Below -ManaCost:B B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | TriggerZones$ Graveyard | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, if CARDNAME is in your graveyard, put a 2/2 black Zombie creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Creature.YouDontOwn | Execute$ TrigChange | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile Bridge from Below. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bridge_from_below.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brighthearth_banneret.txt b/res/cardsfolder/brighthearth_banneret.txt deleted file mode 100644 index befedf019da..00000000000 --- a/res/cardsfolder/brighthearth_banneret.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brighthearth Banneret -ManaCost:1 R -Types:Creature Elemental Warrior -Text:Elemental spells and Warrior spells you cast cost 1 less to cast. -PT:1/1 -K:CostChange:Player:Less:1:Spell:All:Elemental/Warrior:OnlyOneBonus -A:AB$ PutCounter | Cost$ 1 R Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | ActivatingZone$ Hand | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brighthearth_banneret.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brightstone_ritual.txt b/res/cardsfolder/brightstone_ritual.txt deleted file mode 100644 index cb5e97b9b5c..00000000000 --- a/res/cardsfolder/brightstone_ritual.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brightstone Ritual -ManaCost:R -Types:Instant -Text:no text -A:SP$ Mana | Cost$ R | Produced$ R | Amount$ X | SpellDescription$ Add R to your mana pool for each Goblin on the battlefield. -SVar:X:Count$TypeOnBattlefield.Goblin -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brightstone_ritual.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brilliant_halo.txt b/res/cardsfolder/brilliant_halo.txt deleted file mode 100644 index d56ea27bbea..00000000000 --- a/res/cardsfolder/brilliant_halo.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Brilliant Halo -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brilliant_halo.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brilliant_plan.txt b/res/cardsfolder/brilliant_plan.txt deleted file mode 100644 index 5c77de66d67..00000000000 --- a/res/cardsfolder/brilliant_plan.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Brilliant Plan -ManaCost:4 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 4 U | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/brilliant_plan.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brilliant_ultimatum.txt b/res/cardsfolder/brilliant_ultimatum.txt deleted file mode 100644 index 2a5d67f8a58..00000000000 --- a/res/cardsfolder/brilliant_ultimatum.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Brilliant Ultimatum -ManaCost:W W U U U B B -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brilliant_ultimatum.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brimstone_dragon.txt b/res/cardsfolder/brimstone_dragon.txt deleted file mode 100644 index 762d5069d4f..00000000000 --- a/res/cardsfolder/brimstone_dragon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brimstone Dragon -ManaCost:6 R R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6605.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brimstone_mage.txt b/res/cardsfolder/brimstone_mage.txt deleted file mode 100644 index 49eb651512c..00000000000 --- a/res/cardsfolder/brimstone_mage.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Brimstone Mage -ManaCost:2 R -Types:Creature Human Shaman -Text:no text -PT:2/2 -K:stSetPT:2:2:LevelGE1:2:3:LevelGE3:2:4:LEVEL 1-2 2/3 tap: Brimstone Mage deals 1 damage to target creature or player. LEVEL 3+ 2/4 tap: Brimstone Mage deals 3 damage to target creature or player. -K:stPumpSelf:Creature.countersGE1LEVEL+countersLT3LEVEL:0/0/SVar=Ping:No Condition:no text -K:stPumpSelf:Creature.countersGE3LEVEL:0/0/SVar=Bolt:No Condition:no text -K:Level up:3 R -K:maxLevel:3 -SVar:Ping:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Bolt:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brimstone_mage.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brindle_boar.txt b/res/cardsfolder/brindle_boar.txt deleted file mode 100644 index 34cf15fc3e9..00000000000 --- a/res/cardsfolder/brindle_boar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Brindle Boar -ManaCost:2 G -Types:Creature Boar -Text:no text -PT:2/2 -A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brindle_boar.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brine_shaman.txt b/res/cardsfolder/brine_shaman.txt deleted file mode 100644 index d24422ceaa7..00000000000 --- a/res/cardsfolder/brine_shaman.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Brine Shaman -ManaCost:1 B -Types:Creature Human Cleric Shaman -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +2/+2 until end of turn. -A:AB$ Counter | Cost$ 1 U U Sac<1/Creature> | TargetType$ Spell | ValidTgts$ Creature | TgtPrompt$ Select target Creature Spell | SpellDescription$ Counter target creature spell. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brine_shaman.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bringer_of_the_black_dawn.txt b/res/cardsfolder/bringer_of_the_black_dawn.txt deleted file mode 100644 index dde10e8e32a..00000000000 --- a/res/cardsfolder/bringer_of_the_black_dawn.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Bringer of the Black Dawn -ManaCost:7 B B -Types:Creature Bringer -Text:no text -PT:5/5 -K:Trample -SVar:AltCost:W U B R G -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ PayLife<2> | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_black_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bringer_of_the_blue_dawn.txt b/res/cardsfolder/bringer_of_the_blue_dawn.txt deleted file mode 100644 index 2eadced3d16..00000000000 --- a/res/cardsfolder/bringer_of_the_blue_dawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bringer of the Blue Dawn -ManaCost:7 U U -Types:Creature Bringer -Text:no text -PT:5/5 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, you may draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -SVar:AltCost:W U B R G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_blue_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bringer_of_the_green_dawn.txt b/res/cardsfolder/bringer_of_the_green_dawn.txt deleted file mode 100644 index 81d9199512f..00000000000 --- a/res/cardsfolder/bringer_of_the_green_dawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bringer of the Green Dawn -ManaCost:7 G G -Types:Creature Bringer -Text:no text -PT:5/5 -K:Trample -SVar:AltCost:W U B R G -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may put a 3/3 green Beast creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_green_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bringer_of_the_red_dawn.txt b/res/cardsfolder/bringer_of_the_red_dawn.txt deleted file mode 100644 index 421ba0f011b..00000000000 --- a/res/cardsfolder/bringer_of_the_red_dawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bringer of the Red Dawn -ManaCost:7 R R -Types:Creature Bringer -Text:no text -PT:5/5 -K:Trample -SVar:AltCost:W U B R G -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$GainControl | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_red_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bringer_of_the_white_dawn.txt b/res/cardsfolder/bringer_of_the_white_dawn.txt deleted file mode 100644 index 913f04bf71f..00000000000 --- a/res/cardsfolder/bringer_of_the_white_dawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bringer of the White Dawn -ManaCost:7 W W -Types:Creature Bringer -Text:no text -PT:5/5 -K:Trample -SVar:AltCost:W U B R G -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return target artifact card from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.YouCtrl | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bringer_of_the_white_dawn.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brink_of_madness.txt b/res/cardsfolder/brink_of_madness.txt deleted file mode 100644 index 4437d070543..00000000000 --- a/res/cardsfolder/brink_of_madness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brink of Madness -ManaCost:2 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigSacDiscard | TriggerDescription$ At the beginning of your upkeep, if you have no cards in hand, sacrifice CARDNAME and target opponent discards his or her hand. -SVar:TrigSacDiscard:AB$Sacrifice | Cost$ 0 | Defined$ Self | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Opponent | Mode$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brink_of_madness.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brion_stoutarm.txt b/res/cardsfolder/brion_stoutarm.txt deleted file mode 100644 index c095c417c93..00000000000 --- a/res/cardsfolder/brion_stoutarm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Brion Stoutarm -ManaCost:2 R W -Types:Legendary Creature Giant Warrior -Text:no text -PT:4/4 -K:Lifelink -A:AB$ DealDamage | Cost$ R T Sac<1/Creature.Other> | Tgt$ TgtP | NumDmg$ X | CostDesc$ R T, Sacrifice a creature other than Brion Stoutarm: | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to target player. -SVar:X:Sacrificed$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brion_stoutarm.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brittle_effigy.txt b/res/cardsfolder/brittle_effigy.txt deleted file mode 100644 index b6f2fafabc4..00000000000 --- a/res/cardsfolder/brittle_effigy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Brittle Effigy -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 4 T Exile<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brittle_effigy.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broken_ambitions.txt b/res/cardsfolder/broken_ambitions.txt deleted file mode 100644 index 6eba11cf1f5..00000000000 --- a/res/cardsfolder/broken_ambitions.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Broken Ambitions -ManaCost:X U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ X U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SubAbility$ SVar=DBClash | SpellDescription$ 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. -SVar:DBClash:DB$Clash | WinSubAbility$ DBMill -SVar:DBMill:DB$Mill | Defined$ TargetedController | NumCards$ 4 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/broken_ambitions.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broken_dam.txt b/res/cardsfolder/broken_dam.txt deleted file mode 100644 index 1160c37b4c1..00000000000 --- a/res/cardsfolder/broken_dam.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Broken Dam -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Tap | Cost$ U | TargetMin$ 1 | TargetMax$ 2 | TgtPrompt$ Choose target creature without horsemanship | ValidTgts$ Creature.withoutHorsemanship | SpellDescription$ Tap one or two target creatures without horsemanship. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/broken_dam.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broken_fall.txt b/res/cardsfolder/broken_fall.txt deleted file mode 100644 index dde7f56f737..00000000000 --- a/res/cardsfolder/broken_fall.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Broken Fall -ManaCost:2 G -Types:Enchantment -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ Return<1/CARDNAME> | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/broken_fall.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broken_visage.txt b/res/cardsfolder/broken_visage.txt deleted file mode 100644 index c20cf35a588..00000000000 --- a/res/cardsfolder/broken_visage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Broken Visage -ManaCost:4 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Creature.attacking+nonArtifact | TgtPrompt$ Select target nonartifact attacking creature | NoRegen$ True | SpellDescription$ 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. | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | Defined$Targeted | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ Black | TokenPower$ dX | TokenToughness$ dY | TokenKeywords$ At the beginning of the end step, sacrifice CARDNAME. -SVar:dX:Targeted$CardPower -SVar:dY:Targeted$CardToughness -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/broken_visage.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/3.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brood_birthing.txt b/res/cardsfolder/brood_birthing.txt deleted file mode 100644 index c10318b3284..00000000000 --- a/res/cardsfolder/brood_birthing.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Brood Birthing -ManaCost:1 R -Types:Sorcery -Text: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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brood_birthing.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brood_of_cockroaches.txt b/res/cardsfolder/brood_of_cockroaches.txt deleted file mode 100644 index 87f2cf31ec1..00000000000 --- a/res/cardsfolder/brood_of_cockroaches.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Brood of Cockroaches -ManaCost:1 B -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | DelayedTrigger$ DelTrigLeaves | TriggerDescription$ When CARDNAME is put into your graveyard from the battlefield, at the beginning of the next end step, you lose 1 life and return CARDNAME to your hand. -SVar:DelTrigLeaves:Mode$ Phase | Phase$ End of Turn | Execute$ TrigChange | TriggerDescription$ Lose 1 life and return CARDNAME to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 -SVar:SacMe:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brood_of_cockroaches.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brood_sliver.txt b/res/cardsfolder/brood_sliver.txt deleted file mode 100644 index 1ba2c88ae9a..00000000000 --- a/res/cardsfolder/brood_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brood Sliver -ManaCost:4 G -Types:Creature Sliver -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Sliver | ValidTarget$ Player | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigToken | OptionalDecider$ TriggeredSourceController | TriggerDescription$ Whenever a Sliver deals combat damage to a player, its controller may put a 1/1 colorless Sliver creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenImage$ c 1 1 sliver | TokenName$ Sliver | TokenColors$ Colorless | TokenTypes$ Creature,Sliver | TokenPower$ 1 | TokenToughness$ 1 | TokenController$ TriggeredSourceController -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brood_sliver.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broodhatch_nantuko.txt b/res/cardsfolder/broodhatch_nantuko.txt deleted file mode 100644 index c6157892e36..00000000000 --- a/res/cardsfolder/broodhatch_nantuko.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Broodhatch Nantuko -ManaCost:1 G -Types:Creature Insect Druid -Text:no text -PT:1/1 -K:Morph:2 G -T:Mode$ DamageDone | Execute$ TrigToken | ValidTarget$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME is dealt damage, you may put that many 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/broodhatch_nantuko.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broodmate_dragon.txt b/res/cardsfolder/broodmate_dragon.txt deleted file mode 100644 index f560a9e9159..00000000000 --- a/res/cardsfolder/broodmate_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Broodmate Dragon -ManaCost:3 B R G -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 4/4 red Dragon creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ You | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/broodmate_dragon.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broodstar.txt b/res/cardsfolder/broodstar.txt deleted file mode 100644 index d54ab410af0..00000000000 --- a/res/cardsfolder/broodstar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Broodstar -ManaCost:8 U U -Types:Creature Beast -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:*/* -K:Flying -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -K:stSetPT:Count$NumTypeYouCtrl.Artifact:Count$NumTypeYouCtrl.Artifact:Broodstar's power and toughness are each equal to the number of artifacts you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/broodstar.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/broodwarden.txt b/res/cardsfolder/broodwarden.txt deleted file mode 100644 index a5ef7a2c9fa..00000000000 --- a/res/cardsfolder/broodwarden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Broodwarden -ManaCost:3 G G -Types:Creature Eldrazi Drone -Text:no text -PT:4/4 -K:stPumpAll:Creature.Eldrazi+Spawn+YouCtrl:2/1:No Condition:Eldrazi Spawn creatures you control get +2/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/broodwarden.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brothers_of_fire.txt b/res/cardsfolder/brothers_of_fire.txt deleted file mode 100644 index 7288444a710..00000000000 --- a/res/cardsfolder/brothers_of_fire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Brothers of Fire -ManaCost:1 R R -Types:Creature Human Shaman -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 1 R R | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or player and 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brothers_of_fire.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/214.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/58.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/197.jpg -End diff --git a/res/cardsfolder/brown_ouphe.txt b/res/cardsfolder/brown_ouphe.txt deleted file mode 100644 index 321b1034f84..00000000000 --- a/res/cardsfolder/brown_ouphe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brown Ouphe -ManaCost:G -Types:Creature Ouphe -Text:no text -PT:1/1 -A:AB$Counter | Cost$ 1 G T | TargetType$ Activated | TgtPrompt$ Select target activated ability from an artifact source | ValidTgts$ Artifact | SpellDescription$ Counter target activated ability from an artifact source. (Mana abilities can't be targeted.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/brown_ouphe.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/115.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/browse.txt b/res/cardsfolder/browse.txt deleted file mode 100644 index 3ff4c8e0760..00000000000 --- a/res/cardsfolder/browse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Browse -ManaCost:2 U U -Types:Enchantment -Text:no text -A:AB$ Dig | Cost$ 2 U U | DigNum$ 5 | ChangeNum$ 1 | DestinationZone2$ Exile | SpellDescription$ Look at the top five cards of your library, put one of them into your hand, and exile the rest. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/browse.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/59.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brush_with_death.txt b/res/cardsfolder/brush_with_death.txt deleted file mode 100644 index 7c28b1de543..00000000000 --- a/res/cardsfolder/brush_with_death.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brush with Death -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 2 B | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Buyback:2 B B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/brush_with_death.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/2.jpg -End diff --git a/res/cardsfolder/brushland.txt b/res/cardsfolder/brushland.txt deleted file mode 100644 index f1fb59903dd..00000000000 --- a/res/cardsfolder/brushland.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Brushland -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brushland.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/326.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/412.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/319.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/327.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/349.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brushwagg.txt b/res/cardsfolder/brushwagg.txt deleted file mode 100644 index 0397a639ccc..00000000000 --- a/res/cardsfolder/brushwagg.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Brushwagg -ManaCost:1 G G -Types:Creature Brushwagg -Text:no text -PT:3/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -2/+2 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -2 | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/brushwagg.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brutal_nightstalker.txt b/res/cardsfolder/brutal_nightstalker.txt deleted file mode 100644 index 5110c5d0bac..00000000000 --- a/res/cardsfolder/brutal_nightstalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Brutal Nightstalker -ManaCost:3 B B -Types:Creature Nightstalker -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, you may have target opponent discard a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/brutal_nightstalker.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/brute_force.txt b/res/cardsfolder/brute_force.txt deleted file mode 100644 index acb5ac30c40..00000000000 --- a/res/cardsfolder/brute_force.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Brute Force -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122373.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/116.jpg -End diff --git a/res/cardsfolder/bubble_matrix.txt b/res/cardsfolder/bubble_matrix.txt deleted file mode 100644 index caeb7b6a7c7..00000000000 --- a/res/cardsfolder/bubble_matrix.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bubble Matrix -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature:0/0/HIDDEN Prevent all damage that would be dealt to CARDNAME.:No Condition:Prevent all damage that would be dealt to creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/bubble_matrix.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bubbling_beebles.txt b/res/cardsfolder/bubbling_beebles.txt deleted file mode 100644 index 2bf1d25384f..00000000000 --- a/res/cardsfolder/bubbling_beebles.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bubbling Beebles -ManaCost:4 U -Types:Creature Beeble -Text:no text -PT:3/3 -K:stPumpSelf:Creature:0/0/HIDDEN Unblockable:isPresent Enchantment.YouDontCtrl:CARDNAME is unblockable as long as defending player controls an enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bubbling_beebles.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bubbling_muck.txt b/res/cardsfolder/bubbling_muck.txt deleted file mode 100644 index e0ba439e2e7..00000000000 --- a/res/cardsfolder/bubbling_muck.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bubbling Muck -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Effect | Cost$ B | Name$ Bubbling Muck Effect | Triggers$ SwampTrigger | SVars$ TrigMana | SpellDescription$ 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). -SVar:SwampTrigger:Mode$ TapsForMana | ValidCard$ Swamp | Execute$ TrigMana | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ B | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bubbling_muck.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bull_aurochs.txt b/res/cardsfolder/bull_aurochs.txt deleted file mode 100644 index 7064bf7c67d..00000000000 --- a/res/cardsfolder/bull_aurochs.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Bull Aurochs -ManaCost:1 G -Types:Creature Aurochs -Text:no text -PT:2/1 -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+0 until end of turn for each other attacking Aurochs. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Aurochs.attacking+Other -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bull_aurochs.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bull_cerodon.txt b/res/cardsfolder/bull_cerodon.txt deleted file mode 100644 index 28e8de89359..00000000000 --- a/res/cardsfolder/bull_cerodon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Bull Cerodon -ManaCost:4 R W -Types:Creature Beast -Text:no text -PT:5/5 -K:Vigilance -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bull_cerodon.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bull_hippo.txt b/res/cardsfolder/bull_hippo.txt deleted file mode 100644 index 2e4214f2218..00000000000 --- a/res/cardsfolder/bull_hippo.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Bull Hippo -ManaCost:3 G -Types:Creature Hippo -Text:no text -PT:3/3 -K:Islandwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card13103.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/239.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/126.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/bull_rush.txt b/res/cardsfolder/bull_rush.txt deleted file mode 100644 index 30e1a9e5bbe..00000000000 --- a/res/cardsfolder/bull_rush.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Bull Rush -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/bull_rush.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/73.jpg -End diff --git a/res/cardsfolder/bullwhip.txt b/res/cardsfolder/bullwhip.txt deleted file mode 100644 index dbcefc8f48e..00000000000 --- a/res/cardsfolder/bullwhip.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Bullwhip -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ CARDNAME deals 1 damage to target creature. That creature attacks this turn if able. -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME attacks each turn if able. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/bullwhip.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/buoyancy.txt b/res/cardsfolder/buoyancy.txt deleted file mode 100644 index 4584e911124..00000000000 --- a/res/cardsfolder/buoyancy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Buoyancy -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Flash -K:enPump:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/buoyancy.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burden_of_greed.txt b/res/cardsfolder/burden_of_greed.txt deleted file mode 100644 index 7c8e4ab2503..00000000000 --- a/res/cardsfolder/burden_of_greed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Burden of Greed -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ LoseLife | Cost$ 3 B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SpellDescription$ Target player loses 1 life for each tapped artifact he or she controls. -SVar:X:TargetedPlayer$Valid Artifact.tapped+YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burden_of_greed.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burgeoning.txt b/res/cardsfolder/burgeoning.txt deleted file mode 100644 index 07fc143af1d..00000000000 --- a/res/cardsfolder/burgeoning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Burgeoning -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ LandPlayed | ValidCard$ Land.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDropLand | TriggerDescription$ Whenever an opponent plays a land, you may put a land card from your hand onto the battlefield. -SVar:TrigDropLand:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/burgeoning.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/buried_alive.txt b/res/cardsfolder/buried_alive.txt deleted file mode 100644 index b77d11197f0..00000000000 --- a/res/cardsfolder/buried_alive.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Buried Alive -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Library | Destination$ Graveyard | ChangeType$ Creature | ChangeNum$ 3 | SpellDescription$ Search your library for up to three creature cards and put them into your graveyard. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/buried_alive.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/5.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burn_the_impure.txt b/res/cardsfolder/burn_the_impure.txt deleted file mode 100644 index bc7906bef6d..00000000000 --- a/res/cardsfolder/burn_the_impure.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Burn the Impure -ManaCost:1 R -Types:Instant -Text:no text -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burn_the_impure.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burning_cloak.txt b/res/cardsfolder/burning_cloak.txt deleted file mode 100644 index 861bc273aa0..00000000000 --- a/res/cardsfolder/burning_cloak.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Burning Cloak -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ Target creature gets +2/+0 until end of turn. CARDNAME deals 2 damage to that creature. -SVar:DBDealDamage:DB$DealDamage | Defined$ Targeted | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/burning_cloak.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/125.jpg -End diff --git a/res/cardsfolder/burning_fields.txt b/res/cardsfolder/burning_fields.txt deleted file mode 100644 index 66b90c873ae..00000000000 --- a/res/cardsfolder/burning_fields.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Burning Fields -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Opponent | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target opponent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_fields.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burning_inquiry.txt b/res/cardsfolder/burning_inquiry.txt deleted file mode 100644 index d4d8095a856..00000000000 --- a/res/cardsfolder/burning_inquiry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Burning Inquiry -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ R | Defined$ Each | NumCards$ 3 | SubAbility$ SVar=DBDiscard3 | SpellDescription$ Each player draws three cards, then discards three cards at random. -SVar:DBDiscard3:DB$Discard | Defined$ Each | Mode$ Random | NumCards$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_inquiry.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burning_shield_askari.txt b/res/cardsfolder/burning_shield_askari.txt deleted file mode 100644 index fc73c633e6e..00000000000 --- a/res/cardsfolder/burning_shield_askari.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Burning Shield Askari -ManaCost:2 R -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ Pump | Cost$ R R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_shield_askari.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/162.jpg -End diff --git a/res/cardsfolder/burr_grafter.txt b/res/cardsfolder/burr_grafter.txt deleted file mode 100644 index 41ed7cee55d..00000000000 --- a/res/cardsfolder/burr_grafter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Burr Grafter -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -K:Soulshift:3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burr_grafter.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/203.jpg -End diff --git a/res/cardsfolder/burrenton_bombardier.txt b/res/cardsfolder/burrenton_bombardier.txt deleted file mode 100644 index a9bfda38135..00000000000 --- a/res/cardsfolder/burrenton_bombardier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Burrenton Bombardier -ManaCost:2 W -Types:Creature Kithkin Soldier -Text:no text -K:Flying -A:AB$ PutCounter | Cost$ 2 W Discard<1/CARDNAME> | Tgt$ TgtC | CounterType$ P1P1 | ActivatingZone$ Hand | CounterNum$ 2 | SpellDescription$ Put two +1/+1 counters on target creature. -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burrenton_bombardier.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burrowing.txt b/res/cardsfolder/burrowing.txt deleted file mode 100644 index 3d91c737955..00000000000 --- a/res/cardsfolder/burrowing.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Burrowing -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Mountainwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/burrowing.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/139.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/140.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/198.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/170.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/139.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burst_lightning.txt b/res/cardsfolder/burst_lightning.txt deleted file mode 100644 index 7a331a53c15..00000000000 --- a/res/cardsfolder/burst_lightning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Burst Lightning -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. If CARDNAME was kicked, it deals 4 damage to that creature or player instead. -A:SP$ DealDamage | Cost$ 4 R | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ Kicker 4 (You may pay an additional 4 as you cast this spell.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burst_lightning.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burst_of_energy.txt b/res/cardsfolder/burst_of_energy.txt deleted file mode 100644 index 5455216092c..00000000000 --- a/res/cardsfolder/burst_of_energy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Burst of Energy -ManaCost:W -Types:Instant -Text:no text -A:SP$ Untap | Cost$ W | TgtPrompt$ Choose target permanent | ValidTgts$ Permanent | SpellDescription$ Untap target Permanent. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burst_of_energy.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/burst_of_speed.txt b/res/cardsfolder/burst_of_speed.txt deleted file mode 100644 index c5b59adba0d..00000000000 --- a/res/cardsfolder/burst_of_speed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Burst of Speed -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ R | ValidCards$ Creature.YouCtrl | KW$ Haste | SpellDescription$ Creatures you control gain haste until end of turn. -SVar:RemAIDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/burst_of_speed.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/butcher_of_malakir.txt b/res/cardsfolder/butcher_of_malakir.txt deleted file mode 100644 index 0bb4d5193dc..00000000000 --- a/res/cardsfolder/butcher_of_malakir.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Butcher of Malakir -ManaCost:5 B B -Types:Creature Vampire Warrior -Text:no text -PT:5/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME or another creature you control is put into a graveyard from the battlefield, each opponent sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | SacValid$ Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/butcher_of_malakir.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_archon.txt b/res/cardsfolder/cabal_archon.txt deleted file mode 100644 index b3373b333d5..00000000000 --- a/res/cardsfolder/cabal_archon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cabal Archon -ManaCost:2 B -Types:Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ B Sac<1/Cleric> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_archon.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/129.jpg -End diff --git a/res/cardsfolder/cabal_coffers.txt b/res/cardsfolder/cabal_coffers.txt deleted file mode 100644 index 89f2cda35ef..00000000000 --- a/res/cardsfolder/cabal_coffers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cabal Coffers -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each Swamp you control. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_coffers.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_conditioning.txt b/res/cardsfolder/cabal_conditioning.txt deleted file mode 100644 index ca7ee615ff7..00000000000 --- a/res/cardsfolder/cabal_conditioning.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cabal Conditioning -ManaCost:6 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 6 B | ValidTgts$ Player | TgtPrompt$ Select target player | TargetMin$ 0 | TargetMax$ 2 | NumCards$ X | Mode$ TgtChoose | SpellDescription$ Any number of target players each discard a number of cards equal to the highest converted mana cost among permanents you control. -SVar:X:Count$MaxCMCYouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_conditioning.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_executioner.txt b/res/cardsfolder/cabal_executioner.txt deleted file mode 100644 index f1720d71eb6..00000000000 --- a/res/cardsfolder/cabal_executioner.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cabal Executioner -ManaCost:2 B B -Types:Creature Human Cleric -Text:no text -PT:2/2 -K:Morph:3 B B -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | SacValid$ Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_executioner.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_inquisitor.txt b/res/cardsfolder/cabal_inquisitor.txt deleted file mode 100644 index 4df4b605fc8..00000000000 --- a/res/cardsfolder/cabal_inquisitor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cabal Inquisitor -ManaCost:1 B -Types:Creature Human Minion -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ 1 B T ExileFromGrave<2/Card> | ValidTgts$ Player | Threshold$ True | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ 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. | PrecostDesc$ Threshold - -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_inquisitor.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_patriarch.txt b/res/cardsfolder/cabal_patriarch.txt deleted file mode 100644 index 586262e6f0e..00000000000 --- a/res/cardsfolder/cabal_patriarch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cabal Patriarch -ManaCost:3 B B B -Types:Legendary Creature Human Wizard -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ 2 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -A:AB$ Pump | Cost$ 2 B ExileFromGrave<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_patriarch.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/120.jpg -End diff --git a/res/cardsfolder/cabal_pit.txt b/res/cardsfolder/cabal_pit.txt deleted file mode 100644 index c25ac054b32..00000000000 --- a/res/cardsfolder/cabal_pit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cabal Pit -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Pump | Cost$ B T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ Target creature gets -2/-2 until end of turn. Activate this ability only if seven or more cards are in your graveyard. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_pit.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_ritual.txt b/res/cardsfolder/cabal_ritual.txt deleted file mode 100644 index d88c7f44bab..00000000000 --- a/res/cardsfolder/cabal_ritual.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cabal Ritual -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Mana | Cost$ 1 B | Produced$ B | Amount$ X | SpellDescription$ 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. -SVar:X:Count$Threshold.5.3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_ritual.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_slaver.txt b/res/cardsfolder/cabal_slaver.txt deleted file mode 100644 index a5db2fa83a0..00000000000 --- a/res/cardsfolder/cabal_slaver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cabal Slaver -ManaCost:2 B -Types:Creature Human Cleric -Text:no text -PT:2/1 -T:Mode$ DamageDone | ValidSource$ Card.Goblin | ValidTarget$ Opponent | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigDiscardOpp | TriggerDescription$ Whenever a Goblin deals combat damage to a player, that player discards a card. -SVar:TrigDiscardOpp:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -T:Mode$ DamageDone | ValidSource$ Card.Goblin | ValidTarget$ You | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigDiscardYou | Secondary$ True -SVar:TrigDiscardYou:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_slaver.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_surgeon.txt b/res/cardsfolder/cabal_surgeon.txt deleted file mode 100644 index b1d97d52964..00000000000 --- a/res/cardsfolder/cabal_surgeon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cabal Surgeon -ManaCost:2 B B -Types:Creature Human Minion -Text:no text -PT:2/1 -A:AB$ ChangeZone | Cost$ 2 B B T ExileFromGrave<2/Card> | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_surgeon.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/52.jpg -End diff --git a/res/cardsfolder/cabal_torturer.txt b/res/cardsfolder/cabal_torturer.txt deleted file mode 100644 index ef28b07448b..00000000000 --- a/res/cardsfolder/cabal_torturer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cabal Torturer -ManaCost:1 B B -Types:Creature Human Minion -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B T | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -1/-1 until end of turn. -A:AB$ Pump | Cost$ 3 B B T | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | Threshold$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. Activate this ability only if seven or more cards are in your graveyard. | PrecostDesc$ Threshold - -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_torturer.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cabal_trainee.txt b/res/cardsfolder/cabal_trainee.txt deleted file mode 100644 index fe151bbc12b..00000000000 --- a/res/cardsfolder/cabal_trainee.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cabal Trainee -ManaCost:B -Types:Creature Human Minion -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | NumAtt$ -2 | IsCurse$ True | TgtPrompt$ Select target creature | ValidTgts$ Creature | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cabal_trainee.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cache_raiders.txt b/res/cardsfolder/cache_raiders.txt deleted file mode 100644 index b9211ecc122..00000000000 --- a/res/cardsfolder/cache_raiders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cache Raiders -ManaCost:3 U U -Types:Creature Merfolk Rogue -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return a permanent you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeType$ Permanent.YouCtrl | ChangeNum$ 1 | Mandatory$ True | Hidden$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cache_raiders.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cackling_fiend.txt b/res/cardsfolder/cackling_fiend.txt deleted file mode 100644 index ea85cafe54b..00000000000 --- a/res/cardsfolder/cackling_fiend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cackling Fiend -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cackling_fiend.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cackling_flames.txt b/res/cardsfolder/cackling_flames.txt deleted file mode 100644 index 0e0f8c9b5ef..00000000000 --- a/res/cardsfolder/cackling_flames.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cackling Flames -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals 3 damage to target creature or player. Hellbent - CARDNAME deals 5 damage to that creature or player instead if you have no cards in hand. -SVar:X:Count$Hellbent.5.3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card107258.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/59.jpg -End diff --git a/res/cardsfolder/cackling_imp.txt b/res/cardsfolder/cackling_imp.txt deleted file mode 100644 index 6aaf4193708..00000000000 --- a/res/cardsfolder/cackling_imp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cackling Imp -ManaCost:2 B B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -A:AB$ LoseLife | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card73597.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/44.jpg -End diff --git a/res/cardsfolder/cackling_witch.txt b/res/cardsfolder/cackling_witch.txt deleted file mode 100755 index 2ef85fe413f..00000000000 --- a/res/cardsfolder/cackling_witch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cackling Witch -ManaCost:1 B -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ X B T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cackling_witch.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cadaver_imp.txt b/res/cardsfolder/cadaver_imp.txt deleted file mode 100644 index 18b6cbd8067..00000000000 --- a/res/cardsfolder/cadaver_imp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cadaver Imp -ManaCost:1 B B -Types:Creature Imp -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target creature card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cadaver_imp.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cadaverous_bloom.txt b/res/cardsfolder/cadaverous_bloom.txt deleted file mode 100644 index 0883c9c7f74..00000000000 --- a/res/cardsfolder/cadaverous_bloom.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cadaverous Bloom -ManaCost:3 B G -Types:Enchantment -Text:no text -A:AB$ Mana | Cost$ ExileFromHand<1/Card> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -A:AB$ Mana | Cost$ ExileFromHand<1/Card> | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cadaverous_bloom.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cadaverous_knight.txt b/res/cardsfolder/cadaverous_knight.txt deleted file mode 100644 index 7af13755c29..00000000000 --- a/res/cardsfolder/cadaverous_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cadaverous Knight -ManaCost:2 B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ Regenerate | Cost$ 1 B B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cadaverous_knight.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cage_of_hands.txt b/res/cardsfolder/cage_of_hands.txt deleted file mode 100644 index 401bb1e321a..00000000000 --- a/res/cardsfolder/cage_of_hands.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cage of Hands -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -A:AB$ ChangeZone | Cost$ 1 W | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cage_of_hands.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cagemail.txt b/res/cardsfolder/cagemail.txt deleted file mode 100644 index 4acfb0500e6..00000000000 --- a/res/cardsfolder/cagemail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cagemail -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:+2/+2/HIDDEN CARDNAME can't attack.:Enchanted creature gets +2/+2 and can't attack. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cagemail.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/calciderm.txt b/res/cardsfolder/calciderm.txt deleted file mode 100644 index b07b1c7ac0e..00000000000 --- a/res/cardsfolder/calciderm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Calciderm -ManaCost:2 W W -Types:Creature Beast -Text:no text -K:Vanishing:4 -PT:5/5 -K:Shroud -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/calciderm.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/calciform_pools.txt b/res/cardsfolder/calciform_pools.txt deleted file mode 100644 index a7cec233753..00000000000 --- a/res/cardsfolder/calciform_pools.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Calciform Pools -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/calciform_pools.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/calcite_snapper.txt b/res/cardsfolder/calcite_snapper.txt deleted file mode 100644 index 270b7e1132f..00000000000 --- a/res/cardsfolder/calcite_snapper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Calcite Snapper -ManaCost:1 U U -Types:Creature Turtle -Text:no text -PT:1/4 -K:Shroud -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may switch CARDNAME power and toughness until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/calcite_snapper.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caldera_hellion.txt b/res/cardsfolder/caldera_hellion.txt deleted file mode 100644 index 852de5152bc..00000000000 --- a/res/cardsfolder/caldera_hellion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Caldera Hellion -ManaCost:3 R R -Types:Creature Hellion -Text:no text -PT:3/3 -K:Devour:1 -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to each creature. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature | ValidDescription$ each creature. | NumDmg$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/caldera_hellion.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caldera_lake.txt b/res/cardsfolder/caldera_lake.txt deleted file mode 100644 index 1795bcbffd7..00000000000 --- a/res/cardsfolder/caldera_lake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Caldera Lake -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/caldera_lake.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_for_blood.txt b/res/cardsfolder/call_for_blood.txt deleted file mode 100644 index 980cb7a6279..00000000000 --- a/res/cardsfolder/call_for_blood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Call for Blood -ManaCost:4 B -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ 4 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_for_blood.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_of_the_herd.txt b/res/cardsfolder/call_of_the_herd.txt deleted file mode 100644 index cfffa0fa55c..00000000000 --- a/res/cardsfolder/call_of_the_herd.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Call of the Herd -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenOwner$ You | SpellDescription$ Put a 3/3 green Elephant creature token onto the battlefield. -A:SP$ Token | Cost$ 3 G | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenOwner$ You | Flashback$ True | CostDesc$ Flashback 3 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_of_the_herd.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/231.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_of_the_wild.txt b/res/cardsfolder/call_of_the_wild.txt deleted file mode 100644 index 23806d3c0aa..00000000000 --- a/res/cardsfolder/call_of_the_wild.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Call of the Wild -ManaCost:2 G G -Types:Enchantment -Text:no text -A:AB$ Dig | Cost$ 2 G G | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top card of your library. If it's a creature card, put it onto the battlefield. Otherwise, put it into your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_of_the_wild.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/235.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/64.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_the_skybreaker.txt b/res/cardsfolder/call_the_skybreaker.txt deleted file mode 100644 index 487015c54a2..00000000000 --- a/res/cardsfolder/call_the_skybreaker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Call the Skybreaker -ManaCost:5 UR UR -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 5 UR UR | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Blue,Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying | SpellDescription$ Put a 5/5 blue and red Elemental creature token with flying onto the battlefield. -A:SP$ Token | Cost$ 5 UR UR Discard<1/Land> | ActivatingZone$ Graveyard | CostDesc$ Retrace | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Blue,Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_the_skybreaker.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_to_glory.txt b/res/cardsfolder/call_to_glory.txt deleted file mode 100644 index efa7c3190d0..00000000000 --- a/res/cardsfolder/call_to_glory.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Call to Glory -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ UntapAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. Samurai creatures you control get +1/+1 until end of turn. | SubAbility$ SVar=DBPumpYourSamurai -SVar:DBPumpYourSamurai:DB$ PumpAll | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$+1 | NumDef$ +1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_glory.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_to_heel.txt b/res/cardsfolder/call_to_heel.txt deleted file mode 100644 index cda2677ee60..00000000000 --- a/res/cardsfolder/call_to_heel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Call to Heel -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBDraw | SpellDescription$ Return target creature to its owner's hand. Its controller draws a card. -SVar:DBDraw:DB$Draw | Defined$ TargetedController | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_heel.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_to_mind.txt b/res/cardsfolder/call_to_mind.txt deleted file mode 100644 index 8766862000d..00000000000 --- a/res/cardsfolder/call_to_mind.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Call to Mind -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Return target instant or sorcery card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_mind.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_to_the_grave.txt b/res/cardsfolder/call_to_the_grave.txt deleted file mode 100644 index 3e4bebb2233..00000000000 --- a/res/cardsfolder/call_to_the_grave.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Call to the Grave -ManaCost:4 B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a non-Zombie creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Creature.nonZombie | Defined$ TriggeredPlayer -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSacSelf | TriggerDescription$ At the beginning of the end step, if no creatures are on the battlefield, sacrifice CARDNAME. -SVar:TrigSacSelf:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_the_grave.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/call_to_the_netherworld.txt b/res/cardsfolder/call_to_the_netherworld.txt deleted file mode 100644 index 72fc409ed00..00000000000 --- a/res/cardsfolder/call_to_the_netherworld.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Call to the Netherworld -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target black creature card in your graveyard | ValidTgts$ Creature.Black+YouCtrl | SpellDescription$ Return target black creature card from your graveyard to your hand. -K:Madness:0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/call_to_the_netherworld.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caller_of_gales.txt b/res/cardsfolder/caller_of_gales.txt deleted file mode 100644 index 32127e3b3f6..00000000000 --- a/res/cardsfolder/caller_of_gales.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Caller of Gales -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/caller_of_gales.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/43.jpg -End diff --git a/res/cardsfolder/caller_of_the_claw.txt b/res/cardsfolder/caller_of_the_claw.txt deleted file mode 100644 index 004bb45d02a..00000000000 --- a/res/cardsfolder/caller_of_the_claw.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Caller of the Claw -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:2/2 -K:Flash -T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenOwner$ You | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.nonToken+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card42187.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/callous_giant.txt b/res/cardsfolder/callous_giant.txt deleted file mode 100644 index eb5db456153..00000000000 --- a/res/cardsfolder/callous_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Callous Giant -ManaCost:4 R R -Types:Creature Giant -Text:If a source would deal 3 or less damage to Callous Giant, prevent that damage. -PT:4/4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/callous_giant.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/calming_verse.txt b/res/cardsfolder/calming_verse.txt deleted file mode 100644 index 39d901241c0..00000000000 --- a/res/cardsfolder/calming_verse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Calming Verse -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Enchantment.YouDontCtrl | SubAbility$ SVar=DBDestroyAll | SpellDescription$ Destroy all enchantments you don't control. Then, if you control an untapped land, destroy all enchantments you control. -SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Enchantment.YouCtrl | ConditionPresent$ Land.untapped+YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control an untapped land, -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/calming_verse.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caltrops.txt b/res/cardsfolder/caltrops.txt deleted file mode 100644 index 9ec9f921aa3..00000000000 --- a/res/cardsfolder/caltrops.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Caltrops -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks, CARDNAME deals 1 damage to it. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredAttacker | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/caltrops.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/129.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/288.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cancel.txt b/res/cardsfolder/cancel.txt deleted file mode 100644 index c6536d618dd..00000000000 --- a/res/cardsfolder/cancel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cancel -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cancel.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/44.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/71.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/48.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/44.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/33.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/candelabra_of_tawnos.txt b/res/cardsfolder/candelabra_of_tawnos.txt deleted file mode 100644 index 23ce851f56e..00000000000 --- a/res/cardsfolder/candelabra_of_tawnos.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Candelabra of Tawnos -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target Land | SpellDescription$ Untap X target lands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/candelabra_of_tawnos.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canker_abomination.txt b/res/cardsfolder/canker_abomination.txt deleted file mode 100644 index 53465896216..00000000000 --- a/res/cardsfolder/canker_abomination.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Canker Abomination -ManaCost:2 BG BG -Types:Creature Treefolk Horror -Text:no text -PT:6/6 -K:etbCounter:M1M1:X:no Condition:As CARDNAME enters the battlefield, choose an opponent. CARDNAME enters the battlefield with a -1/-1 counter on it for each creature that player controls. -SVar:X:Count$Valid Creature.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/canker_abomination.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canopy_cover.txt b/res/cardsfolder/canopy_cover.txt deleted file mode 100644 index 009c929f134..00000000000 --- a/res/cardsfolder/canopy_cover.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Canopy Cover -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN CARDNAME can't be blocked except by creatures with flying or reach. & HIDDEN CARDNAME can't be the target of spells or abilities your opponents control.: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/canopy_cover.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canopy_spider.txt b/res/cardsfolder/canopy_spider.txt deleted file mode 100644 index 61abd1f8ffb..00000000000 --- a/res/cardsfolder/canopy_spider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Canopy Spider -ManaCost:1 G -Types:Creature Spider -Text:no text -PT:1/3 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card135185.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/236.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/111.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/254.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cantivore.txt b/res/cardsfolder/cantivore.txt deleted file mode 100644 index 3df4ae6e5ab..00000000000 --- a/res/cardsfolder/cantivore.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cantivore -ManaCost:1 W W -Types:Creature Lhurgoyf -Text:no text -PT:*/* -K:Vigilance -K:stSetPT:Count$TypeInAllYards.Enchantment:Count$TypeInAllYards.Enchantment:Cantivore's power and toughness are each equal to the number of enchantment cards in all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cantivore.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canyon_drake.txt b/res/cardsfolder/canyon_drake.txt deleted file mode 100644 index d8f3dcc607c..00000000000 --- a/res/cardsfolder/canyon_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Canyon Drake -ManaCost:2 R R -Types:Creature Drake -Text:no text -PT:1/2 -K:Flying -A:AB$ Pump | Cost$ 1 Discard<1/Random> | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/canyon_drake.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canyon_minotaur.txt b/res/cardsfolder/canyon_minotaur.txt deleted file mode 100644 index cb80536ac8a..00000000000 --- a/res/cardsfolder/canyon_minotaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Canyon Minotaur -ManaCost:3 R -Types:Creature Minotaur Warrior -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/canyon_minotaur.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/126.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/130.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/canyon_wildcat.txt b/res/cardsfolder/canyon_wildcat.txt deleted file mode 100644 index a2c0a416dbc..00000000000 --- a/res/cardsfolder/canyon_wildcat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Canyon Wildcat -ManaCost:1 R -Types:Creature Cat -Text:no text -PT:2/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45353.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/181.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cao_cao_lord_of_wei.txt b/res/cardsfolder/cao_cao_lord_of_wei.txt deleted file mode 100644 index 9aac3da0d69..00000000000 --- a/res/cardsfolder/cao_cao_lord_of_wei.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cao Cao, Lord of Wei -ManaCost:3 B B -Types:Legendary Creature Human Soldier -Text:no text -PT:3/3 -A:AB$ Discard | Cost$ T | ValidTgts$ Opponent | NumCards$ 2 | Mode$ TgtChoose | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Target opponent discards two cards. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10548.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cao_ren_wei_commander.txt b/res/cardsfolder/cao_ren_wei_commander.txt deleted file mode 100644 index 7a0b259a933..00000000000 --- a/res/cardsfolder/cao_ren_wei_commander.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cao Ren, Wei Commander -ManaCost:2 B B -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:3/3 -K:Horsemanship -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$When CARDNAME enters the battlefield, you lose 3 life. -SVar:TrigLoseLife:DB$LoseLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cao_ren_wei_commander.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/capashen_knight.txt b/res/cardsfolder/capashen_knight.txt deleted file mode 100644 index 4d20a42a2f7..00000000000 --- a/res/cardsfolder/capashen_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Capashen Knight -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:1/1 -K:First Strike -A:AB$ Pump | Cost$ 1 W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/capashen_knight.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/3.jpg -End diff --git a/res/cardsfolder/capashen_standard.txt b/res/cardsfolder/capashen_standard.txt deleted file mode 100644 index 3024a1d8fbf..00000000000 --- a/res/cardsfolder/capashen_standard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Capashen Standard -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/capashen_standard.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/capashen_templar.txt b/res/cardsfolder/capashen_templar.txt deleted file mode 100644 index 39aaa0eea73..00000000000 --- a/res/cardsfolder/capashen_templar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Capashen Templar -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/capashen_templar.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/5.jpg -End diff --git a/res/cardsfolder/capashen_unicorn.txt b/res/cardsfolder/capashen_unicorn.txt deleted file mode 100644 index f8a3f813de4..00000000000 --- a/res/cardsfolder/capashen_unicorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Capashen Unicorn -ManaCost:1 W -Types:Creature Unicorn -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ 1 W T Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/capashen_unicorn.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/10.jpg -End diff --git a/res/cardsfolder/capricious_sorcerer.txt b/res/cardsfolder/capricious_sorcerer.txt deleted file mode 100644 index c748bc4cb4e..00000000000 --- a/res/cardsfolder/capricious_sorcerer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Capricious Sorcerer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4250.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/capsize.txt b/res/cardsfolder/capsize.txt deleted file mode 100644 index cac5c69731a..00000000000 --- a/res/cardsfolder/capsize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Capsize -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/capsize.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/captain_of_the_watch.txt b/res/cardsfolder/captain_of_the_watch.txt deleted file mode 100644 index d84c65e7f15..00000000000 --- a/res/cardsfolder/captain_of_the_watch.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Captain of the Watch -ManaCost:4 W W -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:Vigilance -K:stPumpAll:Creature.Soldier+Other+YouCtrl:1/1/Vigilance:No Condition:Other Soldier creatures you control get +1/+1 and have vigilance. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 1/1 white Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/captain_of_the_watch.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/captain_sisay.txt b/res/cardsfolder/captain_sisay.txt deleted file mode 100644 index 523533888ba..00000000000 --- a/res/cardsfolder/captain_sisay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Captain Sisay -ManaCost:2 G W -Types:Legendary Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ T | Origin$ Library | Destination$ Hand | ChangeType$ Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card25976.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/captivating_vampire.txt b/res/cardsfolder/captivating_vampire.txt deleted file mode 100644 index 0c816c9a732..00000000000 --- a/res/cardsfolder/captivating_vampire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Captivating Vampire -ManaCost:1 B B -Types:Creature Vampire -Text:no text -PT:2/2 -K:stPumpAll:Creature.Vampire+Other+YouCtrl:1/1:No Condition:Other Vampire creatures you control get +1/+1. -A:AB$ GainControl | Cost$ tapXType<5/Vampire> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=Animate | SpellDescription$ Gain control of target creature. It becomes a Vampire in addition to its other types. -SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Permanent$ True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/captivating_vampire.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/captive_flame.txt b/res/cardsfolder/captive_flame.txt deleted file mode 100644 index 316b175a7c6..00000000000 --- a/res/cardsfolder/captive_flame.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Captive Flame -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/captive_flame.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/capture_of_jingzhou.txt b/res/cardsfolder/capture_of_jingzhou.txt deleted file mode 100644 index 9c883d31160..00000000000 --- a/res/cardsfolder/capture_of_jingzhou.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Capture of Jingzhou -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 3 U U | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/capture_of_jingzhou.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/captured_sunlight.txt b/res/cardsfolder/captured_sunlight.txt deleted file mode 100644 index 74d3e04316e..00000000000 --- a/res/cardsfolder/captured_sunlight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Captured Sunlight -ManaCost:2 G W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 G W | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -K:Cascade -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/captured_sunlight.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carapace_forger.txt b/res/cardsfolder/carapace_forger.txt deleted file mode 100644 index fe0ab7673d9..00000000000 --- a/res/cardsfolder/carapace_forger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Carapace Forger -ManaCost:1 G -Types:Creature Elf Artificer -Text:no text -PT:2/2 -K:stPumpSelf:Permanent:2/2:Metalcraft:Metalcraft - Carapace Forger gets +2/+2 as long as you control three or more artifacts. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/carapace_forger.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caravan_escort.txt b/res/cardsfolder/caravan_escort.txt deleted file mode 100644 index 421a57e6abf..00000000000 --- a/res/cardsfolder/caravan_escort.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Caravan Escort -ManaCost:W -Types:Creature Human Knight -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:2:2:LevelGE5:5:5:LEVEL 1-4 2/2 LEVEL 5+ 5/5 First Strike -K:stPumpSelf:Creature.countersGE5LEVEL:0/0/First Strike:No Condition:no text -K:Level up:2 -K:maxLevel:5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/caravan_escort.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caravan_hurda.txt b/res/cardsfolder/caravan_hurda.txt deleted file mode 100644 index b17d5f80e7e..00000000000 --- a/res/cardsfolder/caravan_hurda.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Caravan Hurda -ManaCost:4 W -Types:Creature Giant -Text:no text -PT:1/5 -K:Lifelink -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/caravan_hurda.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carbonize.txt b/res/cardsfolder/carbonize.txt deleted file mode 100644 index 50261164369..00000000000 --- a/res/cardsfolder/carbonize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Carbonize -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 3 damage to target creature or player. That creature can't be regenerated this turn. If the creature would be put into a graveyard this turn, exile it instead. -SVar:DB:DB$Pump | KW$ HIDDEN CARDNAME can't be regenerated. & HIDDEN If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carbonize.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/careful_consideration.txt b/res/cardsfolder/careful_consideration.txt deleted file mode 100644 index a5335a0d332..00000000000 --- a/res/cardsfolder/careful_consideration.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Careful Consideration -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U U | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ SVar=DBDiscard | SpellDescription$ 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. -SVar:DBDiscard:DB$Discard | NumCards$ X | Mode$ TgtChoose | Defined$ Targeted -SVar:X:Count$IfMainPhase.2.3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/careful_consideration.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/careful_study.txt b/res/cardsfolder/careful_study.txt deleted file mode 100644 index 8fb0644407a..00000000000 --- a/res/cardsfolder/careful_study.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Careful Study -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 2 | SpellDescription$ Draw two cards, then discard two cards. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/careful_study.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caress_of_phyrexia.txt b/res/cardsfolder/caress_of_phyrexia.txt deleted file mode 100644 index 941aa600738..00000000000 --- a/res/cardsfolder/caress_of_phyrexia.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Caress of Phyrexia -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 B B | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ SVar=DBLoseLife | SpellDescription$ Target player draws three cards, loses 3 life, and gets three poison counters. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 3 | Defined$ Targeted | SubAbility$ SVar=DBPoison -SVar:DBPoison:DB$Poison | Num$ 3 | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/caress_of_phyrexia.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caribou_range.txt b/res/cardsfolder/caribou_range.txt deleted file mode 100644 index 391eafb4996..00000000000 --- a/res/cardsfolder/caribou_range.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Caribou Range -ManaCost:2 W W -Types:Enchantment Aura -Text:no text -K:Enchant Land you control -K:stPumpAll:Card.AttachedBy:0/0/SVar=Token:no Condition:Enchanted land has "W W, Tap: Put a 0/1 white Caribou creature token onto the battlefield." -SVar:Token:AB$Token | Cost$ W W T | TokenAmount$ 1 | TokenName$ Caribou | TokenTypes$ Creature,Caribou | TokenColors$ White | TokenPower$ 0 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Put a 0/1 white Caribou creature token onto the battlefield. -A:AB$ GainLife | Cost$ Sac<1/Caribou.token> | CostDesc$ Sacrifice a Caribou token: | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/caribou_range.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/290.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnage_altar.txt b/res/cardsfolder/carnage_altar.txt deleted file mode 100644 index 2e10f552213..00000000000 --- a/res/cardsfolder/carnage_altar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Carnage Altar -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 3 Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carnage_altar.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnassid.txt b/res/cardsfolder/carnassid.txt deleted file mode 100644 index fc8be7ff3c4..00000000000 --- a/res/cardsfolder/carnassid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Carnassid -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:5/4 -K:Trample -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5217.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnifex_demon.txt b/res/cardsfolder/carnifex_demon.txt deleted file mode 100644 index 42c2b5b2c80..00000000000 --- a/res/cardsfolder/carnifex_demon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carnifex Demon -ManaCost:4 B B -Types:Creature Demon -Text:no text -PT:6/6 -K:Flying -K:etbCounter:M1M1:2 -A:AB$ PutCounterAll | Cost$ B SubCounter<1/M1M1> | ValidCards$ Creature.Other | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on each other creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/carnifex_demon.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnival_of_souls.txt b/res/cardsfolder/carnival_of_souls.txt deleted file mode 100644 index b0be14f42f6..00000000000 --- a/res/cardsfolder/carnival_of_souls.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carnival of Souls -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature enters the battlefield, you lose 1 life and add B to your mana pool. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 | SubAbility$ SVar=DBMana -SVar:DBMana:DB$Mana | Produced$ B -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/carnival_of_souls.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnivorous_plant.txt b/res/cardsfolder/carnivorous_plant.txt deleted file mode 100644 index f6035559984..00000000000 --- a/res/cardsfolder/carnivorous_plant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Carnivorous Plant -ManaCost:3 G -Types:Creature Plant Wall -Text:no text -PT:4/5 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2202.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/38.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carnophage.txt b/res/cardsfolder/carnophage.txt deleted file mode 100644 index e5ccd84bd55..00000000000 --- a/res/cardsfolder/carnophage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Carnophage -ManaCost:B -Types:Creature Zombie -Text:At the beginning of your upkeep, tap Carnophage unless you pay 1 life -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/carnophage.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carrier_pigeons.txt b/res/cardsfolder/carrier_pigeons.txt deleted file mode 100644 index 1602dfb79c7..00000000000 --- a/res/cardsfolder/carrier_pigeons.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carrier Pigeons -ManaCost:3 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrier_pigeons.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/125.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/carrion.txt b/res/cardsfolder/carrion.txt deleted file mode 100644 index 8c33d41663f..00000000000 --- a/res/cardsfolder/carrion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Carrion -ManaCost:1 B B -Types:Instant -Text:no text -A:SP$ Token | Cost$ 1 B B Sac<1/Creature> | TokenName$ Insect | TokenColors$ Black | TokenTypes$ Creature,Insect | TokenPower$ 0 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ X | SpellDescription$ Put X 0/1 black Insect creature tokens onto the battlefield, where X is the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carrion_ants.txt b/res/cardsfolder/carrion_ants.txt deleted file mode 100644 index da9dd9ee2df..00000000000 --- a/res/cardsfolder/carrion_ants.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carrion Ants -ManaCost:2 B B -Types:Creature Insect -Text:no text -PT:0/1 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_ants.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/12.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/9.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/4.jpg -End diff --git a/res/cardsfolder/carrion_call.txt b/res/cardsfolder/carrion_call.txt deleted file mode 100644 index c4a49287d26..00000000000 --- a/res/cardsfolder/carrion_call.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Carrion Call -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Token | Cost$ 3 G | TokenImage$ G 1 1 Insect Infect | TokenAmount$ 2 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Infect | SpellDescription$ Put two 1/1 green Insect creature tokens with infect onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_call.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carrion_feeder.txt b/res/cardsfolder/carrion_feeder.txt deleted file mode 100644 index 19f2375fc15..00000000000 --- a/res/cardsfolder/carrion_feeder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Carrion Feeder -ManaCost:B -Types:Creature Zombie -Text:no text -PT:1/1 -K:CARDNAME can't block. -A:AB$ PutCounter | Cost$ Sac<1/Creature> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_feeder.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carrion_howler.txt b/res/cardsfolder/carrion_howler.txt deleted file mode 100644 index 4f05d5fb41f..00000000000 --- a/res/cardsfolder/carrion_howler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Carrion Howler -ManaCost:3 B -Types:Creature Zombie Wolf -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ PayLife<1> | NumAtt$ +2 | NumDef$ -1 | SpellDescription$ CARDNAME gets +2/-1 until end of turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_howler.jpg -SVar:Rarity:Uncommon -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/79.jpg -End diff --git a/res/cardsfolder/carrion_thrash.txt b/res/cardsfolder/carrion_thrash.txt deleted file mode 100644 index c15ad581366..00000000000 --- a/res/cardsfolder/carrion_thrash.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Carrion Thrash -ManaCost:2 B R G -Types:Creature Viashino Warrior -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay 2. If you do, return another target creature card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.Other+YouCtrl | Cost$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_thrash.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carrion_wall.txt b/res/cardsfolder/carrion_wall.txt deleted file mode 100644 index 472d5350edf..00000000000 --- a/res/cardsfolder/carrion_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carrion Wall -ManaCost:1 B B -Types:Creature Wall -Text:no text -PT:3/2 -K:Defender -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carrion_wall.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/121.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cartographer.txt b/res/cardsfolder/cartographer.txt deleted file mode 100644 index 12bf026dfe2..00000000000 --- a/res/cardsfolder/cartographer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cartographer -ManaCost:2 G -Types:Creature Human -Text: -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target land card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Land.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cartographer.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/107.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/carven_caryatid.txt b/res/cardsfolder/carven_caryatid.txt deleted file mode 100644 index fb8035da6a7..00000000000 --- a/res/cardsfolder/carven_caryatid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Carven Caryatid -ManaCost:1 G G -Types:Creature Spirit -Text:no text -PT:2/5 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/carven_caryatid.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cascade_bluffs.txt b/res/cardsfolder/cascade_bluffs.txt deleted file mode 100644 index d5f66749b7e..00000000000 --- a/res/cardsfolder/cascade_bluffs.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cascade Bluffs -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ UR T | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -A:AB$ Mana | Cost$ UR T | Produced$ U R | SpellDescription$ Add U R to your mana pool. -A:AB$ Mana | Cost$ UR T | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cascade_bluffs.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/castigate.txt b/res/cardsfolder/castigate.txt deleted file mode 100644 index bb2d0407b25..00000000000 --- a/res/cardsfolder/castigate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Castigate -ManaCost:W B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ W B | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/castigate.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/casting_of_bones.txt b/res/cardsfolder/casting_of_bones.txt deleted file mode 100644 index 2f7a19a23bf..00000000000 --- a/res/cardsfolder/casting_of_bones.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Casting of Bones -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigDraw | TriggerDescription$ When enchanted creature is put into a graveyard, draw three cards, then discard one of them. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 3 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/casting_of_bones.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/2.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/castle.txt b/res/cardsfolder/castle.txt deleted file mode 100644 index 196eff51552..00000000000 --- a/res/cardsfolder/castle.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Castle -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.untapped+YouCtrl:0/2:No Condition:Untapped creatures you control get +0/+2. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/castle.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/193.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/194.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/5.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/291.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/262.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/6.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/192.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/castle_raptors.txt b/res/cardsfolder/castle_raptors.txt deleted file mode 100644 index 582ee6a90a5..00000000000 --- a/res/cardsfolder/castle_raptors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Castle Raptors -ManaCost:4 W -Types:Creature Bird Soldier -Text:no text -PT:3/3 -K:Flying -K:stPumpSelf:Creature:0/2:isUntapped:As long as CARDNAME is untapped, it gets +0/+2. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card113614.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/castle_sengir.txt b/res/cardsfolder/castle_sengir.txt deleted file mode 100644 index 834ff83a88b..00000000000 --- a/res/cardsfolder/castle_sengir.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Castle Sengir -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/castle_sengir.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cat_burglar.txt b/res/cardsfolder/cat_burglar.txt deleted file mode 100644 index f11c1aeea07..00000000000 --- a/res/cardsfolder/cat_burglar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cat Burglar -ManaCost:3 B -Types:Creature Kor Rogue Minion -Text:no text -PT:2/2 -A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cat_burglar.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cat_warriors.txt b/res/cardsfolder/cat_warriors.txt deleted file mode 100644 index f58261b8c03..00000000000 --- a/res/cardsfolder/cat_warriors.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cat Warriors -ManaCost:1 G G -Types:Creature Cat Warrior -Text:no text -PT:2/2 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card16450.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/144.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/219.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/catalog.txt b/res/cardsfolder/catalog.txt deleted file mode 100644 index d167acc7b21..00000000000 --- a/res/cardsfolder/catalog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Catalog -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/catalog.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/catapult_master.txt b/res/cardsfolder/catapult_master.txt deleted file mode 100644 index 2f596bf2bb3..00000000000 --- a/res/cardsfolder/catapult_master.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Catapult Master -ManaCost:3 W W -Types:Creature Human Soldier -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ tapXType<5/Soldier> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/catapult_master.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/catapult_squad.txt b/res/cardsfolder/catapult_squad.txt deleted file mode 100644 index 8d0e6959012..00000000000 --- a/res/cardsfolder/catapult_squad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Catapult Squad -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ tapXType<2/Soldier> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/catapult_squad.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/catastrophe.txt b/res/cardsfolder/catastrophe.txt deleted file mode 100644 index bf344eaffe8..00000000000 --- a/res/cardsfolder/catastrophe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Catastrophe -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Land | SpellDescription$ Destroy all lands. -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature | NoRegen$ True | SpellDescription$ Destroy all creatures. Creatures destroyed this way can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/catastrophe.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_brute.txt b/res/cardsfolder/cateran_brute.txt deleted file mode 100644 index d2a4921896f..00000000000 --- a/res/cardsfolder/cateran_brute.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cateran Brute -ManaCost:2 B -Types:Creature Horror Mercenary -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 2 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_brute.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_enforcer.txt b/res/cardsfolder/cateran_enforcer.txt deleted file mode 100644 index 0d897e44a4a..00000000000 --- a/res/cardsfolder/cateran_enforcer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cateran Enforcer -ManaCost:3 B B -Types:Creature Horror Mercenary -Text:no text -PT:4/3 -K:Fear -A:AB$ ChangeZone | Cost$ 4 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE4 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_enforcer.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_kidnappers.txt b/res/cardsfolder/cateran_kidnappers.txt deleted file mode 100644 index 38e3f08735e..00000000000 --- a/res/cardsfolder/cateran_kidnappers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cateran Kidnappers -ManaCost:2 B B -Types:Creature Human Mercenary -Text:no text -PT:4/2 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_kidnappers.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_overlord.txt b/res/cardsfolder/cateran_overlord.txt deleted file mode 100644 index 4d0d5793418..00000000000 --- a/res/cardsfolder/cateran_overlord.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cateran Overlord -ManaCost:4 B B B -Types:Creature Horror Mercenary -Text:no text -PT:7/5 -A:AB$ ChangeZone | Cost$ 6 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE6 | ChangeNum$ 1 | SpellDescription$ 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. -A:AB$ Regenerate | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_overlord.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_persuader.txt b/res/cardsfolder/cateran_persuader.txt deleted file mode 100644 index 2d56b27cf02..00000000000 --- a/res/cardsfolder/cateran_persuader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cateran Persuader -ManaCost:B B -Types:Creature Human Mercenary -Text:no text -PT:2/1 -A:AB$ ChangeZone | Cost$ 1 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE1 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_persuader.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_slaver.txt b/res/cardsfolder/cateran_slaver.txt deleted file mode 100644 index 63ab145d392..00000000000 --- a/res/cardsfolder/cateran_slaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cateran Slaver -ManaCost:4 B B -Types:Creature Horror Mercenary -Text:no text -PT:5/5 -K:Swampwalk -A:AB$ ChangeZone | Cost$ 5 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE5 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_slaver.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cateran_summons.txt b/res/cardsfolder/cateran_summons.txt deleted file mode 100644 index 13637f91160..00000000000 --- a/res/cardsfolder/cateran_summons.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cateran Summons -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Hand | ChangeType$ Mercenary | ChangeNum$ 1 | SpellDescription$ Search your library for a Mercenary card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cateran_summons.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cathartic_adept.txt b/res/cardsfolder/cathartic_adept.txt deleted file mode 100644 index e3765e8bf2d..00000000000 --- a/res/cardsfolder/cathartic_adept.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cathartic Adept -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Mill | Cost$ T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cathartic_adept.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cathodion.txt b/res/cardsfolder/cathodion.txt deleted file mode 100644 index 7ba70c11293..00000000000 --- a/res/cardsfolder/cathodion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cathodion -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigAddMana | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, add 3 to your mana pool. -SVar:TrigAddMana:AB$Mana | Cost$ 0 | Produced$ 1 | Amount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cathodion.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cauldron_haze.txt b/res/cardsfolder/cauldron_haze.txt deleted file mode 100644 index 6e84e30e285..00000000000 --- a/res/cardsfolder/cauldron_haze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cauldron Haze -ManaCost:1 WB -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 WB | ValidTgts$ Creature | KW$ Persist | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target creature | SpellDescription$ Choose any number of target creatures. Each of those creatures gains persist until end of turn. (When it's put into a graveyard from the battlefield, 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.) -SVar:X:Count$Valid Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cauldron_haze.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cauldron_of_souls.txt b/res/cardsfolder/cauldron_of_souls.txt deleted file mode 100644 index 31e812f55a1..00000000000 --- a/res/cardsfolder/cauldron_of_souls.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cauldron of Souls -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target creature | KW$ Persist | SpellDescription$ Choose any number of target creatures. Each of those creatures gains persist until end of turn. -SVar:X:Count$Valid Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cauldron_of_souls.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caustic_crawler.txt b/res/cardsfolder/caustic_crawler.txt deleted file mode 100644 index f0f4491091d..00000000000 --- a/res/cardsfolder/caustic_crawler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Caustic Crawler -ManaCost:3 B B -Types:Creature Insect -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may have target creature get -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Caustic_Crawler.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caustic_hound.txt b/res/cardsfolder/caustic_hound.txt deleted file mode 100644 index 79010b4bca3..00000000000 --- a/res/cardsfolder/caustic_hound.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Caustic Hound -ManaCost:5 B -Types:Creature Hound -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player loses 4 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | LifeAmount$ 4 | Defined$ Each -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_hound.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caustic_rain.txt b/res/cardsfolder/caustic_rain.txt deleted file mode 100644 index 31c1ec49dd2..00000000000 --- a/res/cardsfolder/caustic_rain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Caustic Rain -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B B | ValidTgts$ Land | TgtPrompt$ Select target land | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_rain.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caustic_tar.txt b/res/cardsfolder/caustic_tar.txt deleted file mode 100644 index 05e9024745b..00000000000 --- a/res/cardsfolder/caustic_tar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Caustic Tar -ManaCost:4 B B -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpAll:Card.AttachedBy:0/0/SVar=LoseLife:No Condition:Enchanted land has "tap: Target player loses 3 life." -SVar:LoseLife:AB$LoseLife | Cost$ T | ValidTgts$ Player | LifeAmount$ 3 | TgtPrompt$ Target a player to lose life | SpellDescription$ Target player loses 3 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_tar.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caustic_wasps.txt b/res/cardsfolder/caustic_wasps.txt deleted file mode 100644 index bde69b06b9c..00000000000 --- a/res/cardsfolder/caustic_wasps.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Caustic Wasps -ManaCost:2 G -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target artifact that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select an artifact your opponent controls. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/caustic_wasps.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cavalry_master.txt b/res/cardsfolder/cavalry_master.txt deleted file mode 100644 index 3c55a68f506..00000000000 --- a/res/cardsfolder/cavalry_master.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cavalry Master -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:3/3 -K:Flanking -K:stPumpAll:Creature.Other+withFlanking+YouCtrl:0/0/Flanking:No Condition:Other creatures you control with flanking have flanking. (Each instance of flanking triggers separately.) -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cavalry_master.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cave_in.txt b/res/cardsfolder/cave_in.txt deleted file mode 100644 index 3733d154c0f..00000000000 --- a/res/cardsfolder/cave_in.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cave-In -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 R R | NumDmg$ 2 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. -SVar:AltCost:ExileFromHand<1/Card.Red>$You may exile a red card from your hand rather than pay Cave-In's mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cave_in.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cave_people.txt b/res/cardsfolder/cave_people.txt deleted file mode 100644 index a983be465c6..00000000000 --- a/res/cardsfolder/cave_people.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cave People -ManaCost:1 R R -Types:Creature Human -Text:no text -PT:1/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/-2 until end of turn. -A:AB$ Pump | Cost$ 1 R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Mountainwalk | SpellDescription$ Target creature gains mountainwalk until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ -2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cave_people.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/215.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/59.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/199.jpg -End diff --git a/res/cardsfolder/cave_sense.txt b/res/cardsfolder/cave_sense.txt deleted file mode 100644 index d2a1af308cc..00000000000 --- a/res/cardsfolder/cave_sense.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cave Sense -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1/Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cave_sense.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cave_tiger.txt b/res/cardsfolder/cave_tiger.txt deleted file mode 100644 index 7b9ff809d9c..00000000000 --- a/res/cardsfolder/cave_tiger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cave Tiger -ManaCost:2 G -Types:Creature Cat -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME get +1/+1 until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cave_tiger.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cavern_crawler.txt b/res/cardsfolder/cavern_crawler.txt deleted file mode 100644 index 599ff9c75e3..00000000000 --- a/res/cardsfolder/cavern_crawler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cavern Crawler -ManaCost:2 R -Types:Creature Insect -Text:no text -PT:0/3 -K:Mountainwalk -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cavern_crawler.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/181.jpg -End diff --git a/res/cardsfolder/cavern_harpy.txt b/res/cardsfolder/cavern_harpy.txt deleted file mode 100644 index e946312be86..00000000000 --- a/res/cardsfolder/cavern_harpy.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cavern Harpy -ManaCost:U B -Types:Creature Harpy Beast -Text:no text -PT:2/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand. -A:AB$ ChangeZone | Cost$ PayLife<1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Blue+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cavern_harpy.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cavern_thoctar.txt b/res/cardsfolder/cavern_thoctar.txt deleted file mode 100644 index 72c5b979d0d..00000000000 --- a/res/cardsfolder/cavern_thoctar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cavern Thoctar -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cavern_thoctar.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/125.jpg -End diff --git a/res/cardsfolder/caverns_of_despair.txt b/res/cardsfolder/caverns_of_despair.txt deleted file mode 100644 index 97ec7312d9a..00000000000 --- a/res/cardsfolder/caverns_of_despair.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Caverns of Despair -ManaCost:2 R R -Types:World Enchantment -Text:No more than two creatures can attack each combat. No more than two creatures can block each combat. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/caverns_of_despair.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/caves_of_koilos.txt b/res/cardsfolder/caves_of_koilos.txt deleted file mode 100644 index 4d73af4a3ba..00000000000 --- a/res/cardsfolder/caves_of_koilos.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Caves of Koilos -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/caves_of_koilos.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/140.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/320.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/350.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_ancient.txt b/res/cardsfolder/celestial_ancient.txt deleted file mode 100644 index 8423d34fb84..00000000000 --- a/res/cardsfolder/celestial_ancient.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Celestial Ancient -ManaCost:3 W W -Types:Creature Elemental -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounters | TriggerDescription$ Whenever you cast an enchantment spell, put a +1/+1 counter on each creature you control. -SVar:TrigCounters:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_ancient.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_colonnade.txt b/res/cardsfolder/celestial_colonnade.txt deleted file mode 100644 index 6b628c6821a..00000000000 --- a/res/cardsfolder/celestial_colonnade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Celestial Colonnade -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Animate | Cost$ 3 W U | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Colors$ White,Blue | Keywords$ Flying & Vigilance | SpellDescription$ Until end of turn, CARDNAME becomes a 4/4 white and blue Elemental creature with flying and vigilance. It's still a land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_colonnade.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_crusader.txt b/res/cardsfolder/celestial_crusader.txt deleted file mode 100644 index 7272e45a3ff..00000000000 --- a/res/cardsfolder/celestial_crusader.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Celestial Crusader -ManaCost:2 W W -Types:Creature Spirit -Text:no text -PT:2/2 -K:stPumpAll:Creature.White+Other:1/1:no Condition:Other white creatures get +1/+1. -K:Split second -K:Flying -K:Flash -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_crusader.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_gatekeeper.txt b/res/cardsfolder/celestial_gatekeeper.txt deleted file mode 100644 index 99c7971eab9..00000000000 --- a/res/cardsfolder/celestial_gatekeeper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Celestial Gatekeeper -ManaCost:3 W W -Types:Creature Bird Cleric -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile it, then return up to two target Bird and/or Cleric permanent cards from your graveyard to the battlefield. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Exile | SubAbility$ SVar=DBChangeZone -SVar:DBChangeZone:DB$ChangeZone | ChangeType$ Permanent.Bird+YouCtrl,Permanent.Cleric+YouCtrl | ChangeNum$ 2 | Hidden$ True | Origin$ Hand | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_gatekeeper.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_kirin.txt b/res/cardsfolder/celestial_kirin.txt deleted file mode 100644 index 9f134fd9dca..00000000000 --- a/res/cardsfolder/celestial_kirin.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Celestial Kirin -ManaCost:2 W W -Types:Legendary Creature Kirin Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidControllingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, destroy all permanents with that spell's converted mana cost. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Permanent.cmcEQX -SVar:X:TriggeredCard$CardManaCost -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_kirin.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_mantle.txt b/res/cardsfolder/celestial_mantle.txt deleted file mode 100644 index 30991c748ae..00000000000 --- a/res/cardsfolder/celestial_mantle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Celestial Mantle -ManaCost:3 W W W -Types:Enchantment Aura -Text:Whenever enchanted creature deals combat damage to a player, double its controller's life total. -K:Enchant creature -K:enPump:+3/+3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_mantle.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_prism.txt b/res/cardsfolder/celestial_prism.txt deleted file mode 100644 index 0b0a3ebb85b..00000000000 --- a/res/cardsfolder/celestial_prism.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Celestial Prism -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_prism.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/234.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/236.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/239.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/322.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_purge.txt b/res/cardsfolder/celestial_purge.txt deleted file mode 100644 index ed05236e291..00000000000 --- a/res/cardsfolder/celestial_purge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Celestial Purge -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Permanent.Black,Permanent.Red | TgtPrompt$ Select target black or red permanent | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target black or red permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_purge.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/9.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/7.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/celestial_sword.txt b/res/cardsfolder/celestial_sword.txt deleted file mode 100644 index 601afd3c582..00000000000 --- a/res/cardsfolder/celestial_sword.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Celestial Sword -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | NumAtt$ +3 | NumDef$ +3 | KW$ HIDDEN At the beginning of the end step, sacrifice CARDNAME. | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SpellDescription$ Target creature you control gets +3/+3 until end of turn. Its controller sacrifices it at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/celestial_sword.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cemetery_gate.txt b/res/cardsfolder/cemetery_gate.txt deleted file mode 100644 index 1f084739114..00000000000 --- a/res/cardsfolder/cemetery_gate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cemetery Gate -ManaCost:2 B -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_gate.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/4.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/cemetery_reaper.txt b/res/cardsfolder/cemetery_reaper.txt deleted file mode 100644 index c8984e1eaf5..00000000000 --- a/res/cardsfolder/cemetery_reaper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cemetery Reaper -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/2 -K:stPumpAll:Creature.Zombie+Other+YouCtrl:1/1:No Condition:Other Zombie creatures you control get +1/+1. -A:AB$ ChangeZone | Cost$ 2 B T | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | SubAbility$ SVar=DBToken | SpellDescription$ Exile target creature card from a graveyard. Put a 2/2 black Zombie creature token onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cemetery_reaper.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/87.jpg -End diff --git a/res/cardsfolder/cenns_enlistment.txt b/res/cardsfolder/cenns_enlistment.txt deleted file mode 100644 index a72392d577d..00000000000 --- a/res/cardsfolder/cenns_enlistment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cenn's Enlistment -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 W | TokenImage$ W 1 1 Kithkin Soldier | TokenAmount$ 2 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 white Kithkin Soldier creature tokens onto the battlefield. -A:SP$ Token | Cost$ 3 W Discard<1/Land> | CostDesc$ Retrace | TokenImage$ W 1 1 Kithkin Soldier | TokenAmount$ 2 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | ActivatingZone$ Graveyard | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cenns_enlistment.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cenns_heir.txt b/res/cardsfolder/cenns_heir.txt deleted file mode 100644 index 512d9d08c93..00000000000 --- a/res/cardsfolder/cenns_heir.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cenn's Heir -ManaCost:1 W -Types:Creature Kithkin Soldier -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn for each other attacking Kithkin. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Kithkin.attacking+Other -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cenns_heir.jpg -SetInfo:LRW|Common|http://magiccards.info/lw/en/8.html -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_archer.txt b/res/cardsfolder/centaur_archer.txt deleted file mode 100644 index 46b3313d728..00000000000 --- a/res/cardsfolder/centaur_archer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Centaur Archer -ManaCost:1 R G -Types:Creature Centaur Archer -Text:no text -PT:3/2 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_archer.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/360.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_chieftain.txt b/res/cardsfolder/centaur_chieftain.txt deleted file mode 100644 index 8d7e68b86b7..00000000000 --- a/res/cardsfolder/centaur_chieftain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Centaur Chieftain -ManaCost:3 G -Types:Creature Centaur -Text:no text -PT:3/3 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "When CARDNAME enters the battlefield, creatures you control get +1/+1 and gain trample until end of turn." -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Trample -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_chieftain.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_courser.txt b/res/cardsfolder/centaur_courser.txt deleted file mode 100644 index 7fbe8a0ab5d..00000000000 --- a/res/cardsfolder/centaur_courser.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Centaur Courser -ManaCost:2 G -Types:Creature Centaur Warrior -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_courser.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_garden.txt b/res/cardsfolder/centaur_garden.txt deleted file mode 100644 index 1c7328a3b7d..00000000000 --- a/res/cardsfolder/centaur_garden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Centaur Garden -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Pump | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ Target creature gets +3/+3 until end of turn. Activate this ability only if seven or more cards are in your graveyard. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_garden.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_glade.txt b/res/cardsfolder/centaur_glade.txt deleted file mode 100644 index 685f047b1ea..00000000000 --- a/res/cardsfolder/centaur_glade.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Centaur Glade -ManaCost:3 G G -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 2 G G | TokenAmount$ 1 | TokenOwner$ You | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Centaur creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_glade.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_omenreader.txt b/res/cardsfolder/centaur_omenreader.txt deleted file mode 100644 index cfdc89f4783..00000000000 --- a/res/cardsfolder/centaur_omenreader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Centaur Omenreader -ManaCost:3 G -Types:Snow Creature Centaur Shaman -Text:As long as Centaur Omenreader is tapped, creature spells you cast cost 2 less to cast. -PT:3/3 -K:CostChange:Player:Less:2:Spell:All:Creature:CardIsTapped -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_omenreader.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_rootcaster.txt b/res/cardsfolder/centaur_rootcaster.txt deleted file mode 100644 index 305f35ec7c2..00000000000 --- a/res/cardsfolder/centaur_rootcaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Centaur Rootcaster -ManaCost:3 G -Types:Creature Centaur Druid -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigChange | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_rootcaster.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_safeguard.txt b/res/cardsfolder/centaur_safeguard.txt deleted file mode 100644 index 4f529785dde..00000000000 --- a/res/cardsfolder/centaur_safeguard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Centaur Safeguard -ManaCost:2 GW -Types:Creature Centaur Warrior -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_safeguard.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/centaur_veteran.txt b/res/cardsfolder/centaur_veteran.txt deleted file mode 100644 index 3afb5087bd4..00000000000 --- a/res/cardsfolder/centaur_veteran.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Centaur Veteran -ManaCost:5 G -Types:Creature Centaur -Text:no text -PT:3/3 -K:Trample -A:AB$ Regenerate | Cost$ G Discard<1/Card> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/centaur_veteran.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_aristocrat.txt b/res/cardsfolder/cephalid_aristocrat.txt deleted file mode 100644 index 0ee57064c90..00000000000 --- a/res/cardsfolder/cephalid_aristocrat.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cephalid Aristocrat -ManaCost:4 U -Types:Creature Cephalid -Text:no text -PT:3/3 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put the top two cards of your library into your graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 2 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_aristocrat.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_broker.txt b/res/cardsfolder/cephalid_broker.txt deleted file mode 100644 index 3e409fa1f7b..00000000000 --- a/res/cardsfolder/cephalid_broker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cephalid Broker -ManaCost:3 U -Types:Creature Cephalid -Text:no text -PT:2/2 -A:AB$ Draw | Cost$ T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws two cards, then discards two cards. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_broker.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_coliseum.txt b/res/cardsfolder/cephalid_coliseum.txt deleted file mode 100644 index d8580682355..00000000000 --- a/res/cardsfolder/cephalid_coliseum.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cephalid Coliseum -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Draw | Cost$ U T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 3 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ Target player draws three cards, then discards three cards. Activate this ability only if seven or more cards are in your graveyard. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 3 | Mode$ TgtChoose | Defined$ Targeted -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_coliseum.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_illusionist.txt b/res/cardsfolder/cephalid_illusionist.txt deleted file mode 100644 index 59777953cb0..00000000000 --- a/res/cardsfolder/cephalid_illusionist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cephalid Illusionist -ManaCost:1 U -Types:Creature Cephalid Wizard -Text:no text -PT:1/1 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put the top three cards of your library into your graveyard. -A:AB$ Pump | Cost$ 2 U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by target creature you control this turn. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 3 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_illusionist.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_inkshrouder.txt b/res/cardsfolder/cephalid_inkshrouder.txt deleted file mode 100644 index a44d729208b..00000000000 --- a/res/cardsfolder/cephalid_inkshrouder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cephalid Inkshrouder -ManaCost:2 U -Types:Creature Cephalid -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Shroud & HIDDEN Unblockable | SpellDescription$ CARDNAME gains shroud until end of turn and is unblockable this turn. (A permanent with shroud can't be the target of spells or abilities.) -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_inkshrouder.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_looter.txt b/res/cardsfolder/cephalid_looter.txt deleted file mode 100644 index 9e66005466e..00000000000 --- a/res/cardsfolder/cephalid_looter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cephalid Looter -ManaCost:2 U -Types:Creature Cephalid Rogue -Text:no text -PT:2/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws a card, then discards a card.| SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_looter.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_pathmage.txt b/res/cardsfolder/cephalid_pathmage.txt deleted file mode 100644 index 24f7d85e92e..00000000000 --- a/res/cardsfolder/cephalid_pathmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cephalid Pathmage -ManaCost:2 U -Types:Creature Cephalid Wizard -Text:no text -PT:1/2 -K:Unblockable -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Target creature is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_pathmage.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_retainer.txt b/res/cardsfolder/cephalid_retainer.txt deleted file mode 100644 index 9fc21a5f241..00000000000 --- a/res/cardsfolder/cephalid_retainer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cephalid Retainer -ManaCost:2 U U -Types:Creature Cephalid -Text:no text -PT:2/3 -A:AB$ Tap | Cost$ U U | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying | SpellDescription$ Tap target creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_retainer.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/73.jpg -End diff --git a/res/cardsfolder/cephalid_sage.txt b/res/cardsfolder/cephalid_sage.txt deleted file mode 100644 index ecd26de4af4..00000000000 --- a/res/cardsfolder/cephalid_sage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cephalid Sage -ManaCost:3 U -Types:Creature Cephalid -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "When CARDNAME enters the battlefield, draw three cards, then discard two cards." -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 3 | SubAbility$ SVar=DBDiscard -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.YouCtrl -SVar:DBDiscard:DB$Discard | NumCards$ 2 | Mode$ TgtChoose | Defined$ You -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_sage.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_scout.txt b/res/cardsfolder/cephalid_scout.txt deleted file mode 100644 index b71069fb274..00000000000 --- a/res/cardsfolder/cephalid_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cephalid Scout -ManaCost:1 U -Types:Creature Cephalid Wizard Scout -Text:no text -PT:1/1 -K:Flying -A:AB$ Draw | Cost$ 2 U Sac<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_scout.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/74.jpg -End diff --git a/res/cardsfolder/cephalid_snitch.txt b/res/cardsfolder/cephalid_snitch.txt deleted file mode 100644 index 01c4717d0f1..00000000000 --- a/res/cardsfolder/cephalid_snitch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cephalid Snitch -ManaCost:1 U -Types:Creature Cephalid Wizard -Text:no text -PT:1/1 -A:AB$ Debuff | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Protection from black | SpellDescription$ Target creature loses protection from black until end of turn. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_snitch.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cephalid_vandal.txt b/res/cardsfolder/cephalid_vandal.txt deleted file mode 100644 index f742eb0ecda..00000000000 --- a/res/cardsfolder/cephalid_vandal.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cephalid Vandal -ManaCost:1 U -Types:Creature Cephalid Rogue -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a shred counter on CARDNAME. Then put the top card of your library into your graveyard for each shred counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SHRED | CounterNum$ 1 | SubAbility$ DBMill -SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ X -SVar:X:Count$CardCounters.SHRED -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cephalid_vandal.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cerebral_eruption.txt b/res/cardsfolder/cerebral_eruption.txt deleted file mode 100644 index 5736dc26330..00000000000 --- a/res/cardsfolder/cerebral_eruption.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Cerebral Eruption -ManaCost:2 R R -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cerebral_eruption.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ceremonial_guard.txt b/res/cardsfolder/ceremonial_guard.txt deleted file mode 100755 index 10caf9a3079..00000000000 --- a/res/cardsfolder/ceremonial_guard.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ceremonial Guard -ManaCost:2 R -Types:Creature Human Soldier -Text:no text -PT:3/4 -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, destroy it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, destroy it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigSacrifice | TriggerDescription$ Destroy CARDNAME at end of combat. -SVar:TrigSacrifice:AB$Destroy | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ceremonial_guard.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cerodon_yearling.txt b/res/cardsfolder/cerodon_yearling.txt deleted file mode 100644 index ba6671a02f3..00000000000 --- a/res/cardsfolder/cerodon_yearling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cerodon Yearling -ManaCost:R W -Types:Creature Beast -Text:no text -PT:2/2 -K:Vigilance -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cerodon_yearling.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cerulean_sphinx.txt b/res/cardsfolder/cerulean_sphinx.txt deleted file mode 100644 index 675df17d1ff..00000000000 --- a/res/cardsfolder/cerulean_sphinx.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cerulean Sphinx -ManaCost:4 U U -Types:Creature Sphinx -Text:no text -PT:5/5 -K:Flying -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SpellDescription$ CARDNAME's owner shuffles it into his or her library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cerulean_sphinx.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cerulean_wisps.txt b/res/cardsfolder/cerulean_wisps.txt deleted file mode 100644 index 2cc2640f707..00000000000 --- a/res/cardsfolder/cerulean_wisps.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cerulean Wisps -ManaCost:U -Types:Instant -Text:no text -A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature becomes blue until end of turn. Untap that creature. Draw a card. -SVar:DBDraw:DB$Draw | SubAbility$ SVar=DBUntap | NumCards$ 1 -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cerulean_wisps.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cerulean_wyvern.txt b/res/cardsfolder/cerulean_wyvern.txt deleted file mode 100644 index 8317753363e..00000000000 --- a/res/cardsfolder/cerulean_wyvern.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cerulean Wyvern -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -K:Protection from green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cerulean_wyvern.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cessation.txt b/res/cardsfolder/cessation.txt deleted file mode 100644 index b0b198fe316..00000000000 --- a/res/cardsfolder/cessation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cessation -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack.:Enchanted creature can't attack. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cessation.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ceta_disciple.txt b/res/cardsfolder/ceta_disciple.txt deleted file mode 100644 index 50187e26c6c..00000000000 --- a/res/cardsfolder/ceta_disciple.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Ceta Disciple -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -A:AB$ Mana | Cost$ G T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ceta_disciple.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ceta_sanctuary.txt b/res/cardsfolder/ceta_sanctuary.txt deleted file mode 100644 index 8be5a650a83..00000000000 --- a/res/cardsfolder/ceta_sanctuary.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ceta Sanctuary -ManaCost:2 U -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://wizards.com/global/images/magic/general/ceta_sanctuary.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chain_reaction.txt b/res/cardsfolder/chain_reaction.txt deleted file mode 100644 index c0dec5498e1..00000000000 --- a/res/cardsfolder/chain_reaction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chain Reaction -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 R R | NumDmg$ X | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals X damage to each creature, where X is the number of creatures on the battlefield. -SVar:X:Count$TypeOnBattlefield.Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chain_reaction.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chainbreaker.txt b/res/cardsfolder/chainbreaker.txt deleted file mode 100644 index 966c4c44b9e..00000000000 --- a/res/cardsfolder/chainbreaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chainbreaker -ManaCost:2 -Types:Artifact Creature Scarecrow -Text:no text -PT:3/3 -K:etbCounter:M1M1:2 -A:AB$ RemoveCounter | Cost$ 3 T | ValidTgts$ Creature.countersGE1M1M1 | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Remove a -1/-1 counter from target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chainbreaker.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chained_throatseeker.txt b/res/cardsfolder/chained_throatseeker.txt deleted file mode 100644 index 422ccde6b91..00000000000 --- a/res/cardsfolder/chained_throatseeker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chained Throatseeker -ManaCost:5 U -Types:Creature Horror -Text:no text -PT:5/5 -K:Infect -K:stPumpSelf:Creature:0/0/CARDNAME can't attack.:OppNotPoisoned:Chained Throatseeker can't attack unless defending player is poisoned. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chained_throatseeker.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chainer_dementia_master.txt b/res/cardsfolder/chainer_dementia_master.txt deleted file mode 100644 index 25de81541ef..00000000000 --- a/res/cardsfolder/chainer_dementia_master.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Chainer, Dementia Master -ManaCost:3 B B -Types:Legendary Creature Human Minion -Text:no text -PT:3/3 -K:stPumpAll:Creature.Nightmare:1/1:No Condition:Nightmare creatures get +1/+1. -A:AB$ ChangeZone | Cost$ B B B PayLife<3> | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ SVar=DBAnimate| SpellDescription$ 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. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Nightmare | Colors$ Black -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, exile all Nightmares. -SVar:TrigExile:AB$ ChangeZoneAll | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | ChangeType$ Nightmare -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chainer_dementia_master.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chainers_edict.txt b/res/cardsfolder/chainers_edict.txt deleted file mode 100644 index 0be8321f008..00000000000 --- a/res/cardsfolder/chainers_edict.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chainer's Edict -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target player sacrifices a creature. -A:SP$ Sacrifice | Cost$ 5 B B | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | Flashback$ True | CostDesc$ Flashback 5 B B | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chainers_edict.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chainflinger.txt b/res/cardsfolder/chainflinger.txt deleted file mode 100644 index d48c3018f0b..00000000000 --- a/res/cardsfolder/chainflinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chainflinger -ManaCost:3 R -Types:Creature Beast -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Chainflinger deals 1 damage to target creature or player. -A:AB$ DealDamage | Cost$ 2 R T | Tgt$ TgtCP | NumDmg$ 2 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ CARDNAME deals 2 damage to target creature or player. Activate this ability only if seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chainflinger.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chalice_of_the_void.txt b/res/cardsfolder/chalice_of_the_void.txt deleted file mode 100644 index 8ad615d6e10..00000000000 --- a/res/cardsfolder/chalice_of_the_void.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Chalice of the Void -ManaCost:X X -Types:Artifact -Text:no text -K:etbCounter:CHARGE:X -T:Mode$ SpellCast | ValidCard$ Card.cmcEQY | ValidActivatingPlayer$ Each | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever a player casts a spell with converted mana cost equal to the number of charge counters on CARDNAME, counter that spell. -SVar:TrigCounter:AB$Counter | Cost$ 0 | Defined$ TriggeredSpellAbility -SVar:X:Count$xPaid -SVar:Y:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chalice_of_the_void.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chambered_nautilus.txt b/res/cardsfolder/chambered_nautilus.txt deleted file mode 100644 index 1fb06cb8d4b..00000000000 --- a/res/cardsfolder/chambered_nautilus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chambered Nautilus -ManaCost:2 U -Types:Creature Nautilus Beast -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chambered_nautilus.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chameleon_colossus.txt b/res/cardsfolder/chameleon_colossus.txt deleted file mode 100644 index 5f06bbc21d0..00000000000 --- a/res/cardsfolder/chameleon_colossus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Chameleon Colossus -ManaCost:2 G G -Types:Creature Shapeshifter -Text:no text -PT:4/4 -K:Changeling -K:Protection from black -A:AB$ Pump | Cost$ 2 G G | NumAtt$ +X | NumDef$ +X | SpellDescription$ CARDNAME gets +X/+X until end of turn, where X is its power. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chameleon_colossus.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/116.jpg -End diff --git a/res/cardsfolder/champion_lancer.txt b/res/cardsfolder/champion_lancer.txt deleted file mode 100644 index 1721a5691ef..00000000000 --- a/res/cardsfolder/champion_lancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Champion Lancer -ManaCost:4 W W -Types:Creature Human Knight -Text:Prevent all damage that would be dealt to CARDNAME by creatures. -PT:3/3 -K:PreventAllDamageBy Creature -SVar:Rarity:Rare -SVar:Picture:http://magiccards.info/scans/en/st/11.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/champions_drake.txt b/res/cardsfolder/champions_drake.txt deleted file mode 100644 index 24c8d9cc0be..00000000000 --- a/res/cardsfolder/champions_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Champion's Drake -ManaCost:1 U -Types:Creature Drake -Text:no text -PT:1/1 -K:Flying -K:stPumpSelf:Permanent:3/3:isPresent Creature.countersGE3LEVEL+YouCtrl:CARDNAME gets +3/+3 as long as you control a creature with three or more level counters on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/champions_drake.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/champions_victory.txt b/res/cardsfolder/champions_victory.txt deleted file mode 100644 index edb600b8c13..00000000000 --- a/res/cardsfolder/champions_victory.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Champion's Victory -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Hand | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/champions_victory.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chandler.txt b/res/cardsfolder/chandler.txt deleted file mode 100644 index 1846a04a891..00000000000 --- a/res/cardsfolder/chandler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chandler -ManaCost:4 R -Types:Legendary Creature Human Rogue -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ R R R T | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | SpellDescription$ Destroy target artifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chandler.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/88.jpg -End diff --git a/res/cardsfolder/chandra_nalaar.txt b/res/cardsfolder/chandra_nalaar.txt deleted file mode 100644 index ddcc604e1fb..00000000000 --- a/res/cardsfolder/chandra_nalaar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chandra Nalaar -ManaCost:3 R R -Types:Planeswalker Chandra -Text:no text -Loyalty:6 -SVar:Rarity:Mythic -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card140176.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/127.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/132.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chandras_outrage.txt b/res/cardsfolder/chandras_outrage.txt deleted file mode 100644 index f8425b69511..00000000000 --- a/res/cardsfolder/chandras_outrage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chandra's Outrage -ManaCost:2 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SubAbility$ SVar=DBDealDamage | SpellDescription$ Chandra's Outrage deals 4 damage to target creature and 2 damage to that creature's controller. -SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chandras_outrage.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/128.jpg -End diff --git a/res/cardsfolder/chandras_spitfire.txt b/res/cardsfolder/chandras_spitfire.txt deleted file mode 100644 index 82ad29d75db..00000000000 --- a/res/cardsfolder/chandras_spitfire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chandra's Spitfire -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:1/3 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card | CombatDamage$ False | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever an opponent is dealt noncombat damage, CARDNAME gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ +3 | NumDef$ +0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chandras_spitfire.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/change_of_heart.txt b/res/cardsfolder/change_of_heart.txt deleted file mode 100644 index 8942ec3fbf7..00000000000 --- a/res/cardsfolder/change_of_heart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Change of Heart -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't attack. | IsCurse$ True | SpellDescription$ Target creature can't attack this turn. -SVar:Buyback:3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/change_of_heart.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/changeling_berserker.txt b/res/cardsfolder/changeling_berserker.txt deleted file mode 100644 index 649ed5f6bde..00000000000 --- a/res/cardsfolder/changeling_berserker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Changeling Berserker -ManaCost:3 R -Types:Creature Shapeshifter -Text:no text -PT:5/3 -K:Changeling -K:Haste -K:Champion:Creature -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_berserker.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/changeling_hero.txt b/res/cardsfolder/changeling_hero.txt deleted file mode 100644 index 9a35ec30f94..00000000000 --- a/res/cardsfolder/changeling_hero.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Changeling Hero -ManaCost:4 W -Types:Creature Shapeshifter -Text:no text -PT:4/4 -K:Changeling -K:Lifelink -K:Champion:Creature -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_hero.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/changeling_sentinel.txt b/res/cardsfolder/changeling_sentinel.txt deleted file mode 100644 index 84d67b4d58c..00000000000 --- a/res/cardsfolder/changeling_sentinel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Changeling Sentinel -ManaCost:3 W -Types:Creature Shapeshifter -Text:no text -PT:3/2 -K:Changeling -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_sentinel.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/changeling_titan.txt b/res/cardsfolder/changeling_titan.txt deleted file mode 100644 index 40adde3a92b..00000000000 --- a/res/cardsfolder/changeling_titan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Changeling Titan -ManaCost:4 G -Types:Creature Shapeshifter -Text:no text -PT:7/7 -K:Changeling -K:Champion:Creature -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/changeling_titan.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/channel.txt b/res/cardsfolder/channel.txt deleted file mode 100644 index 2a46cd7f1d7..00000000000 --- a/res/cardsfolder/channel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Channel -ManaCost:G G -Types:Sorcery -Text:no text -A:SP$ Effect | Cost$ G G | Name$ Channel Effect | Abilities$ ABMana | SpellDescription$ 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. -SVar:ABMana:AB$Mana | Cost$ PayLife<1> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/channel.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/97.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/97.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/95.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/120.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/channel_the_suns.txt b/res/cardsfolder/channel_the_suns.txt deleted file mode 100644 index 619d4de36c1..00000000000 --- a/res/cardsfolder/channel_the_suns.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Channel the Suns -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Mana | Cost$ 3 G | Produced$ W U B R G | SpellDescription$ Add W U B R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/channel_the_suns.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chaos_charm.txt b/res/cardsfolder/chaos_charm.txt deleted file mode 100644 index 5fab41c4d7e..00000000000 --- a/res/cardsfolder/chaos_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chaos Charm -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Wall | TgtPrompt$ Select target wall | PrecostDesc$ Choose one - | SpellDescription$ Destroy target Wall; -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ or CARDNAME deals 1 damage to target creature; -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | KW$ Haste | TgtPrompt$ Select target creature | SpellDescription$ or target creature gains haste until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chaos_charm.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chaosphere.txt b/res/cardsfolder/chaosphere.txt deleted file mode 100644 index f4becc75270..00000000000 --- a/res/cardsfolder/chaosphere.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chaosphere -ManaCost:2 R -Types:World Enchantment -Text:no text -K:stPumpAll:Creature.withFlying:0/0/HIDDEN CARDNAME can block only creatures with flying.:No Condition:Creatures with flying can block only creatures with flying. -K:stPumpAll:Creature.withoutFlying:0/0/Reach:No Condition:Creatures without flying have reach. (They can block creatures with flying.) -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chaosphere.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/char.txt b/res/cardsfolder/char.txt deleted file mode 100644 index 5369ccc50bd..00000000000 --- a/res/cardsfolder/char.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Char -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature or player and 2 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 2 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87942.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/117.jpg -End diff --git a/res/cardsfolder/char_rumbler.txt b/res/cardsfolder/char_rumbler.txt deleted file mode 100644 index 2c43b89de84..00000000000 --- a/res/cardsfolder/char_rumbler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Char-Rumbler -ManaCost:2 R R -Types:Creature Elemental -Text:no text -PT:-1/3 -K:Double Strike -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/char_rumbler.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/96.jpg -End diff --git a/res/cardsfolder/charcoal_diamond.txt b/res/cardsfolder/charcoal_diamond.txt deleted file mode 100644 index 14278542168..00000000000 --- a/res/cardsfolder/charcoal_diamond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Charcoal Diamond -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/charcoal_diamond.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/276.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/261.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charging_bandits.txt b/res/cardsfolder/charging_bandits.txt deleted file mode 100644 index cd6125fd5b0..00000000000 --- a/res/cardsfolder/charging_bandits.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Charging Bandits -ManaCost:4 B -Types:Creature Human Rogue -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/charging_bandits.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charging_paladin.txt b/res/cardsfolder/charging_paladin.txt deleted file mode 100644 index 21ff7b701da..00000000000 --- a/res/cardsfolder/charging_paladin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Charging Paladin -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +0/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/charging_paladin.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/4.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/12.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charging_rhino.txt b/res/cardsfolder/charging_rhino.txt deleted file mode 100644 index a1d5824fe51..00000000000 --- a/res/cardsfolder/charging_rhino.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Charging Rhino -ManaCost:3 G G -Types:Creature Rhino -Text:no text -PT:4/4 -K:CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/charging_rhino.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charging_slateback.txt b/res/cardsfolder/charging_slateback.txt deleted file mode 100644 index f258131d4c7..00000000000 --- a/res/cardsfolder/charging_slateback.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Charging Slateback -ManaCost:4 R -Types:Creature Beast -Text:no text -PT:4/3 -K:CARDNAME can't block. -K:Morph:4 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/charging_slateback.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charging_troll.txt b/res/cardsfolder/charging_troll.txt deleted file mode 100644 index 073634a696d..00000000000 --- a/res/cardsfolder/charging_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Charging Troll -ManaCost:2 W G -Types:Creature Troll -Text:no text -PT:3/3 -K:Vigilance -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/charging_troll.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charmed_griffin.txt b/res/cardsfolder/charmed_griffin.txt deleted file mode 100755 index b70acab0c70..00000000000 --- a/res/cardsfolder/charmed_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Charmed Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, each other player may put an artifact or enchantment card onto the battlefield from his or her hand. (NOTE: Auras not supported at the moment) -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact,Enchantment.nonAura | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/charmed_griffin.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/charnelhoard_wurm.txt b/res/cardsfolder/charnelhoard_wurm.txt deleted file mode 100644 index 9d1d38cfff9..00000000000 --- a/res/cardsfolder/charnelhoard_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Charnelhoard Wurm -ManaCost:4 B R G -Types:Creature Wurm -Text:no text -PT:6/6 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may return target card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.YouCtrl | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/charnelhoard_wurm.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chartooth_cougar.txt b/res/cardsfolder/chartooth_cougar.txt deleted file mode 100644 index adb92913bc7..00000000000 --- a/res/cardsfolder/chartooth_cougar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chartooth Cougar -ManaCost:5 R -Types:Creature Cat Beast -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -K:TypeCycling:Mountain:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chartooth_cougar.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/84.jpg -End diff --git a/res/cardsfolder/chastise.txt b/res/cardsfolder/chastise.txt deleted file mode 100644 index 723c57c701b..00000000000 --- a/res/cardsfolder/chastise.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Chastise -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target attacking creature. You gain life equal to its power. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chastise.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/9.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/9.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/8.jpg -End diff --git a/res/cardsfolder/chatter_of_the_squirrel.txt b/res/cardsfolder/chatter_of_the_squirrel.txt deleted file mode 100644 index cc40101ecc7..00000000000 --- a/res/cardsfolder/chatter_of_the_squirrel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chatter of the Squirrel -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ G | TokenAmount$ 1 | TokenName$ Squirrel | TokenColors$ Green | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Squirrel creature token onto the battlefield. -A:SP$ Token | Cost$ 1 G | TokenAmount$ 1 | TokenName$ Squirrel | TokenColors$ Green | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | Flashback$ True | CostDesc$ Flashback 1 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chatter_of_the_squirrel.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chieftain_en_dal.txt b/res/cardsfolder/chieftain_en_dal.txt deleted file mode 100644 index d7085bc4096..00000000000 --- a/res/cardsfolder/chieftain_en_dal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chieftain en-Dal -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, attacking creatures gain first strike until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking | KW$ First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chieftain_en_dal.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/child_of_alara.txt b/res/cardsfolder/child_of_alara.txt deleted file mode 100644 index 51ec3ea739c..00000000000 --- a/res/cardsfolder/child_of_alara.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Child of Alara -ManaCost:W U B R G -Types:Legendary Creature Avatar -Text:no text -PT:6/6 -K:Trample -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy all nonland permanents. They can't be regenerated. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Permanent.nonLand | NoRegen$ True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/child_of_alara.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/child_of_gaea.txt b/res/cardsfolder/child_of_gaea.txt deleted file mode 100644 index c1d4a9710a7..00000000000 --- a/res/cardsfolder/child_of_gaea.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Child of Gaea -ManaCost:3 G G G -Types:Creature Elemental -Text:no text -PT:7/7 -K:Trample -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G G -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/child_of_gaea.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/child_of_night.txt b/res/cardsfolder/child_of_night.txt deleted file mode 100644 index e72fc082bc5..00000000000 --- a/res/cardsfolder/child_of_night.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Child of Night -ManaCost:1 B -Types:Creature Vampire -Text:no text -PT:2/1 -K:Lifelink -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/child_of_night.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/88.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/child_of_thorns.txt b/res/cardsfolder/child_of_thorns.txt deleted file mode 100644 index 415ccfb7d8a..00000000000 --- a/res/cardsfolder/child_of_thorns.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Child of Thorns -ManaCost:G -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/child_of_thorns.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/123.jpg -End diff --git a/res/cardsfolder/childhood_horror.txt b/res/cardsfolder/childhood_horror.txt deleted file mode 100644 index bcc9c5651ff..00000000000 --- a/res/cardsfolder/childhood_horror.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Childhood Horror -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Creature:2/2/CARDNAME can't block.:Threshold:Threshold - As long as seven or more cards are in your graveyard, Childhood Horror gets +2/+2 and can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/childhood_horror.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chill.txt b/res/cardsfolder/chill.txt deleted file mode 100644 index ce093ee8035..00000000000 --- a/res/cardsfolder/chill.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chill -ManaCost:1 U -Types:Enchantment -Text:Red spells cost 2 more to cast. -K:CostChange:All:More:2:Spell:red:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chill.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/56.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chill_to_the_bone.txt b/res/cardsfolder/chill_to_the_bone.txt deleted file mode 100644 index e8d4f3376ab..00000000000 --- a/res/cardsfolder/chill_to_the_bone.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Chill to the Bone -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature.nonSnow | TgtPrompt$ Select target nonsnow creature | SpellDescription$ Destroy target nonsnow creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chill_to_the_bone.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/52.jpg -End diff --git a/res/cardsfolder/chilling_apparition.txt b/res/cardsfolder/chilling_apparition.txt deleted file mode 100644 index c479be15a3f..00000000000 --- a/res/cardsfolder/chilling_apparition.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chilling Apparition -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chilling_apparition.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chilling_shade.txt b/res/cardsfolder/chilling_shade.txt deleted file mode 100644 index 5ec0d048ba5..00000000000 --- a/res/cardsfolder/chilling_shade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chilling Shade -ManaCost:2 B -Types:Snow Creature Shade -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ S | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chilling_shade.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/53.jpg -End diff --git a/res/cardsfolder/chime_of_night.txt b/res/cardsfolder/chime_of_night.txt deleted file mode 100644 index b5f5a5864f2..00000000000 --- a/res/cardsfolder/chime_of_night.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chime of Night -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy target nonblack creature. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chime_of_night.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimeric_coils.txt b/res/cardsfolder/chimeric_coils.txt deleted file mode 100644 index 1b378fd5feb..00000000000 --- a/res/cardsfolder/chimeric_coils.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chimeric Coils -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | Keywords$ At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_coils.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimeric_egg.txt b/res/cardsfolder/chimeric_egg.txt deleted file mode 100644 index 85660c047e9..00000000000 --- a/res/cardsfolder/chimeric_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chimeric Egg -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.nonArtifact | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts a nonartifact spell, put a charge counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -A:AB$ Animate | Cost$ SubCounter<3/CHARGE> | Defined$ Self | Power$ 6 | Toughness$ 6 | Types$ Creature,Artifact,Construct | Keywords$ Trample | SpellDescription$ CARDNAME becomes a 6/6 Construct artifact creature with trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_egg.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimeric_idol.txt b/res/cardsfolder/chimeric_idol.txt deleted file mode 100644 index af440c25bf5..00000000000 --- a/res/cardsfolder/chimeric_idol.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chimeric Idol -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ TapAll | Cost$ 0 | ValidCards$ Land.YouCtrl | SubAbility$ SVar=DBAnimate | SpellDescription$ Tap all lands you control. CARDNAME becomes a 3/3 Turtle artifact creature until end of turn. -SVar:DBAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Artifact,Turtle -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_idol.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimeric_mass.txt b/res/cardsfolder/chimeric_mass.txt deleted file mode 100644 index fe0e0a57d94..00000000000 --- a/res/cardsfolder/chimeric_mass.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Chimeric Mass -ManaCost:X -Types:Artifact -Text:no text -#CARDNAME enters the battlefield with X charge counters on it. -K:etbCounter:CHARGE:X -SVar:X:Count$xPaid -A:AB$ Animate | Cost$ 1 | Defined$ Self | Power$ Y | Toughness$ Y | Types$ Creature,Artifact,Construct | Keywords$ This creature's power and toughness are each equal to the number of charge counters on it. | SpellDescription$ Until end of turn, CARDNAME becomes a Construct artifact creature with "This creature's power and toughness are each equal to the number of charge counters on it." -SVar:This creature's power and toughness are each equal to the number of charge counters on it.:stSetPT:Count$CardCounters.CHARGE:Count$CardCounters.CHARGE:This creature's power and toughness are each equal to the number of charge counters on it. -SVar:Y:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_mass.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimeric_staff.txt b/res/cardsfolder/chimeric_staff.txt deleted file mode 100644 index 8afac89834d..00000000000 --- a/res/cardsfolder/chimeric_staff.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chimeric Staff -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ X | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_staff.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/288.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chimney_imp.txt b/res/cardsfolder/chimney_imp.txt deleted file mode 100644 index 4e020ce8598..00000000000 --- a/res/cardsfolder/chimney_imp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Chimney Imp -ManaCost:4 B -Types:Creature Imp -Text:no text -PT:1/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target opponent puts a card from his or her hand on top of his or her library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Opponent | ChangeType$ Card | ChangeNum$ 1 | Chooser$ Opponent | Mandatory$ True | IsCurse$ True -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chimney_imp.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chittering_rats.txt b/res/cardsfolder/chittering_rats.txt deleted file mode 100644 index 429ccc8c577..00000000000 --- a/res/cardsfolder/chittering_rats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chittering Rats -ManaCost:1 B B -Types:Creature Rat -Text: -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, target opponent puts a card from his or her hand on top of his or her library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Opponent | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | Chooser$ Opponent -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46096.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cho_arrim_bruiser.txt b/res/cardsfolder/cho_arrim_bruiser.txt deleted file mode 100755 index ed7711060ae..00000000000 --- a/res/cardsfolder/cho_arrim_bruiser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cho-Arrim Bruiser -ManaCost:5 W -Types:Creature Ogre Rebel -Text:no text -PT:3/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME attacks, you may tap up to two target creatures. -SVar:TrigTap:AB$Tap | Cost$ 0 | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cho_arrim_bruiser.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cho_manno_revolutionary.txt b/res/cardsfolder/cho_manno_revolutionary.txt deleted file mode 100644 index 722d58f0e17..00000000000 --- a/res/cardsfolder/cho_manno_revolutionary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cho-Manno, Revolutionary -ManaCost:2 W W -Types:Legendary Creature Human Rebel -Text:no text -PT:2/2 -K:Prevent all damage that would be dealt to CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cho_manno_revolutionary.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/11.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/choke.txt b/res/cardsfolder/choke.txt deleted file mode 100644 index 5c52e6ced9c..00000000000 --- a/res/cardsfolder/choke.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Choke -ManaCost:2 G -Types:Enchantment -Text:Islands don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Island -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/choke.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/237.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/choking_fumes.txt b/res/cardsfolder/choking_fumes.txt deleted file mode 100644 index 4b4928882dd..00000000000 --- a/res/cardsfolder/choking_fumes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Choking Fumes -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PutCounterAll | Cost$ 2 W | ValidCards$ Creature.attacking | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on each attacking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/choking_fumes.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/choking_sands.txt b/res/cardsfolder/choking_sands.txt deleted file mode 100644 index a0ec0e1ef1a..00000000000 --- a/res/cardsfolder/choking_sands.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Choking Sands -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Land.nonSwamp | TgtPrompt$ Select target non-Swamp land | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target non-Swamp land. If that land was nonbasic, CARDNAME deals 2 damage to the land's controller. -SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Land.Basic | ConditionCompare$ EQ0 | ConditionDescription$ If that land is nonbasic, -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/choking_sands.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/choking_tethers.txt b/res/cardsfolder/choking_tethers.txt deleted file mode 100644 index 786ade8407c..00000000000 --- a/res/cardsfolder/choking_tethers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Choking Tethers -ManaCost:3 U -Types:Instant -Text:no text -K:Cycling:1 U -A:SP$ Tap | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 4 | SpellDescription$ Tap up to four target creatures. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may tap target creature -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/choking_tethers.jpg -SVar:Rarity:Common -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/74.jpg -End diff --git a/res/cardsfolder/chorus_of_woe.txt b/res/cardsfolder/chorus_of_woe.txt deleted file mode 100644 index 01df08ca848..00000000000 --- a/res/cardsfolder/chorus_of_woe.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chorus of Woe -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ B | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6564.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/5.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/68.jpg -End - - diff --git a/res/cardsfolder/chromatic_sphere.txt b/res/cardsfolder/chromatic_sphere.txt deleted file mode 100644 index a5ebbcff474..00000000000 --- a/res/cardsfolder/chromatic_sphere.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Chromatic Sphere -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ W | SubAbility$ SVar=DBDraw | SpellDescription$ Add W to your mana pool. Draw a card. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ U | SubAbility$ SVar=DBDraw | SpellDescription$ Add U to your mana pool. Draw a card. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ B | SubAbility$ SVar=DBDraw | SpellDescription$ Add B to your mana pool. Draw a card. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ R | SubAbility$ SVar=DBDraw | SpellDescription$ Add R to your mana pool. Draw a card. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ G | SubAbility$ SVar=DBDraw | SpellDescription$ Add G to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chromatic_sphere.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/151.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chromatic_star.txt b/res/cardsfolder/chromatic_star.txt deleted file mode 100644 index a35ae3e90da..00000000000 --- a/res/cardsfolder/chromatic_star.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Chromatic Star -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemAIDeck:True -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chromatic_star.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/251.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/314.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chrome_steed.txt b/res/cardsfolder/chrome_steed.txt deleted file mode 100644 index 7baf58b401e..00000000000 --- a/res/cardsfolder/chrome_steed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chrome Steed -ManaCost:4 -Types:Artifact Creature Horse -Text:no text -PT:2/2 -K:stPumpSelf:Creature:2/2:Metalcraft:Metalcraft - Chrome Steed gets +2/+2 as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chrome_steed.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chromescale_drake.txt b/res/cardsfolder/chromescale_drake.txt deleted file mode 100644 index 75ac4db750a..00000000000 --- a/res/cardsfolder/chromescale_drake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Chromescale Drake -ManaCost:6 U U U -Types:Creature Drake -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:3/4 -K:Flying -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 3 | Reveal$ True | ChangeNum$ All | ChangeValid$ Artifact | DestinationZone2$ Graveyard -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chromescale_drake.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chromium.txt b/res/cardsfolder/chromium.txt deleted file mode 100644 index df30a62c85d..00000000000 --- a/res/cardsfolder/chromium.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chromium -ManaCost:2 W W U U B B -Types:Legendary Creature Elder Dragon -Text:no text -PT:7/7 -K:Flying -K:Rampage 2 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay W U B -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chromium.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chronatog.txt b/res/cardsfolder/chronatog.txt deleted file mode 100644 index 6f94bd50ac4..00000000000 --- a/res/cardsfolder/chronatog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Chronatog -ManaCost:1 U -Types:Creature Atog -Text:no text -PT:1/2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chronatog.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chronatog_totem.txt b/res/cardsfolder/chronatog_totem.txt deleted file mode 100644 index 8ed925fb743..00000000000 --- a/res/cardsfolder/chronatog_totem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Chronatog Totem -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Animate | Cost$ 1 U | Defined$ Self | Power$ 1 | Toughness$ 2 | Types$ Creature,Artifact,Atog | Colors$ Blue | SpellDescription$ CARDNAME becomes a 1/2 blue Atog artifact creature until end of turn. -A:AB$ Pump | Cost$ 0 | Defined$ Self | NumAtt$ +3 | NumDef$ +3 | IsPresent$ Card.Self+Creature | ActivationLimit$ 1 | SubAbility$ SVar=SkipTurn | SpellDescription$ CARDNAME gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn and only if CARDNAME is a creature. -SVar:SkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/chronatog_totem.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chronosavant.txt b/res/cardsfolder/chronosavant.txt deleted file mode 100644 index 749950b2c22..00000000000 --- a/res/cardsfolder/chronosavant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Chronosavant -ManaCost:5 W -Types:Creature Giant -Text:no text -PT:5/5 -A:AB$ ChangeZone | Cost$ 1 W | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | ActivatingZone$ Graveyard | SubAbility$ SVar=SkipTurn | SpellDescription$ Return CARDNAME from your graveyard to the battlefield tapped. You skip your next turn. -SVar:SkipTurn:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/chronosavant.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/chub_toad.txt b/res/cardsfolder/chub_toad.txt deleted file mode 100644 index 9a7a4d976fe..00000000000 --- a/res/cardsfolder/chub_toad.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Chub Toad -ManaCost:2 G -Types:Creature Toad -Text:no text -PT:1/1 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +2/+2 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/chub_toad.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/145.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/churning_eddy.txt b/res/cardsfolder/churning_eddy.txt deleted file mode 100644 index 52b3e3a19c1..00000000000 --- a/res/cardsfolder/churning_eddy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Churning Eddy -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 U | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Return target creature and target land to their owners' hands. | SubAbility$ SVar=spBounce -SVar:spBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/churning_eddy.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_crawler.txt b/res/cardsfolder/cinder_crawler.txt deleted file mode 100644 index 2ceb8c90345..00000000000 --- a/res/cardsfolder/cinder_crawler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cinder Crawler -ManaCost:1 R -Types:Creature Salamander -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ R | Defined$ Self | IsPresent$ Card.Self+blocked | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only if CARDNAME is blocked. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_crawler.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_elemental.txt b/res/cardsfolder/cinder_elemental.txt deleted file mode 100644 index 6b240e3ee88..00000000000 --- a/res/cardsfolder/cinder_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cinder Elemental -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ X R T Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_elemental.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_giant.txt b/res/cardsfolder/cinder_giant.txt deleted file mode 100644 index 137e87e11f7..00000000000 --- a/res/cardsfolder/cinder_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cinder Giant -ManaCost:3 R -Types:Creature Giant -Text:no text -PT:5/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 2 damage to each other creature you control. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.YouCtrl+Other | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_giant.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_marsh.txt b/res/cardsfolder/cinder_marsh.txt deleted file mode 100644 index 1fc32af0445..00000000000 --- a/res/cardsfolder/cinder_marsh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cinder Marsh -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add B to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add R to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_marsh.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/307.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_pyromancer.txt b/res/cardsfolder/cinder_pyromancer.txt deleted file mode 100644 index 58e908c1d38..00000000000 --- a/res/cardsfolder/cinder_pyromancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cinder Pyromancer -ManaCost:2 R -Types:Creature Elemental Shaman -Text:no text -PT:0/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player. -T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a red spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_pyromancer.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinder_shade.txt b/res/cardsfolder/cinder_shade.txt deleted file mode 100644 index 7de1a581feb..00000000000 --- a/res/cardsfolder/cinder_shade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cinder Shade -ManaCost:1 B R -Types:Creature Shade -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_shade.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/240.jpg -End diff --git a/res/cardsfolder/cinder_storm.txt b/res/cardsfolder/cinder_storm.txt deleted file mode 100644 index 549be8fb06b..00000000000 --- a/res/cardsfolder/cinder_storm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cinder Storm -ManaCost:6 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 6 R | Tgt$ TgtCP | NumDmg$ 7 | SpellDescription$ CARDNAME deals 7 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_storm.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/93.jpg -End diff --git a/res/cardsfolder/cinder_wall.txt b/res/cardsfolder/cinder_wall.txt deleted file mode 100644 index 8626e8c1f3f..00000000000 --- a/res/cardsfolder/cinder_wall.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Cinder Wall -ManaCost:R -Types:Creature Wall -Text:no text -PT:3/3 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME blocks, destroy it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy CARDNAME at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinder_wall.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/182.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinderbones.txt b/res/cardsfolder/cinderbones.txt deleted file mode 100644 index bbdee701ad0..00000000000 --- a/res/cardsfolder/cinderbones.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cinderbones -ManaCost:2 B -Types:Creature Elemental Skeleton -Text:no text -PT:1/1 -K:Wither -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinderbones.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cinderhaze_wretch.txt b/res/cardsfolder/cinderhaze_wretch.txt deleted file mode 100644 index b07791cb2fc..00000000000 --- a/res/cardsfolder/cinderhaze_wretch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cinderhaze Wretch -ManaCost:4 B -Types:Creature Elemental Shaman -Text:no text -PT:3/2 -A:AB$ Discard | Cost$ T | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | PlayerTurn$ True | SpellDescription$ Target player discards a card. Activate this ability only during your turn. -A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cinderhaze_wretch.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/circular_logic.txt b/res/cardsfolder/circular_logic.txt deleted file mode 100644 index 482483eaaca..00000000000 --- a/res/cardsfolder/circular_logic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Circular Logic -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Counter target spell unless its controller pays 1 for each card in your graveyard. -K:Madness:U -SVar:X:Count$InYourYard -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/circular_logic.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/citanul_centaurs.txt b/res/cardsfolder/citanul_centaurs.txt deleted file mode 100644 index 28dd0254011..00000000000 --- a/res/cardsfolder/citanul_centaurs.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Citanul Centaurs -ManaCost:3 G -Types:Creature Centaur -Text:no text -PT:6/3 -K:Echo:3 G -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_centaurs.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/citanul_druid.txt b/res/cardsfolder/citanul_druid.txt deleted file mode 100644 index 275bcf6571c..00000000000 --- a/res/cardsfolder/citanul_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Citanul Druid -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts an artifact spell, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_druid.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/citanul_flute.txt b/res/cardsfolder/citanul_flute.txt deleted file mode 100644 index e2afabc6f5a..00000000000 --- a/res/cardsfolder/citanul_flute.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Citanul Flute -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ X T | Origin$ Library | Destination$ Hand | ChangeType$ Creature.cmcLEX | ChangeNum$ 1 | SpellDescription$ 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. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_flute.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/289.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/citanul_hierophants.txt b/res/cardsfolder/citanul_hierophants.txt deleted file mode 100644 index 00325f14b63..00000000000 --- a/res/cardsfolder/citanul_hierophants.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Citanul Hierophants -ManaCost:3 G -Types:Creature Human Druid -Text:no text -PT:3/2 -K:stPumpAll:Creature.YouCtrl:0/0/SVar=Mana:no Condition:Creatures you control have "Tap: Add G to your mana pool." -SVar:Mana:AB$Mana | Cost$ T | Produced$ G | Amount$ 1 | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_hierophants.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/citanul_woodreaders.txt b/res/cardsfolder/citanul_woodreaders.txt deleted file mode 100644 index 35eff5eccf8..00000000000 --- a/res/cardsfolder/citanul_woodreaders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Citanul Woodreaders -ManaCost:2 G -Types:Creature Human Druid -Text:no text -PT:1/4 -K:Kicker:2 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, draw two cards. -SVar:TrigKicker:AB$Draw | Cost$ 0 | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/citanul_woodreaders.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/city_of_brass.txt b/res/cardsfolder/city_of_brass.txt deleted file mode 100644 index c7139302daf..00000000000 --- a/res/cardsfolder/city_of_brass.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:City of Brass -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes tapped, it deals 1 damage to you. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/city_of_brass.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/322.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/413.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/321.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/85.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/city_of_shadows.txt b/res/cardsfolder/city_of_shadows.txt deleted file mode 100644 index 314e6eddc34..00000000000 --- a/res/cardsfolder/city_of_shadows.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:City of Shadows -ManaCost:no cost -Types:Land -Text:no text -A:AB$ PutCounter | Cost$ T Exile<1/Creature> | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ X | SpellDescription$ Add X to your mana pool, where X is the number of storage counters on City of Shadows. -SVar:X:Count$CardCounters.STORAGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/city_of_shadows.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/city_of_traitors.txt b/res/cardsfolder/city_of_traitors.txt deleted file mode 100644 index fc3dd7871d8..00000000000 --- a/res/cardsfolder/city_of_traitors.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:City of Traitors -ManaCost:no cost -Types:Land -Text:When you play another land, sacrifice CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/city_of_traitors.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/civic_guildmage.txt b/res/cardsfolder/civic_guildmage.txt deleted file mode 100644 index d534fbd358e..00000000000 --- a/res/cardsfolder/civic_guildmage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Civic Guildmage -ManaCost:W -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +1 | SpellDescription$ Target creature gets +0/+1 until end of turn. -A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/civic_guildmage.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/civic_wayfinder.txt b/res/cardsfolder/civic_wayfinder.txt deleted file mode 100644 index 5eccef61ee1..00000000000 --- a/res/cardsfolder/civic_wayfinder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Civic Wayfinder -ManaCost:2 G -Types:Creature Elf Warrior Druid -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/civic_wayfinder.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/157.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clairvoyance.txt b/res/cardsfolder/clairvoyance.txt deleted file mode 100644 index ab5d99b0f91..00000000000 --- a/res/cardsfolder/clairvoyance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Clairvoyance -ManaCost:U -Types:Instant -Text:no text -A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ SVar=DBDraw | SpellDescription$ Look at target player's hand. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next turn's upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clairvoyance.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/claws_of_gix.txt b/res/cardsfolder/claws_of_gix.txt deleted file mode 100644 index 700979d25dd..00000000000 --- a/res/cardsfolder/claws_of_gix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Claws of Gix -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 1 Sac<1/Permanent> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/claws_of_gix.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/290.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/claws_of_valakut.txt b/res/cardsfolder/claws_of_valakut.txt deleted file mode 100644 index 324800ad3e2..00000000000 --- a/res/cardsfolder/claws_of_valakut.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Claws of Valakut -ManaCost:1 R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike:Enchanted creature gets +1/+0 for each Mountain you control and has first strike. -K:stPumpEnchanted:Creature:X/0:no Condition:no text -SVar:X:Count$TypeYouCtrl.Mountain -SVar:BuffedBy:Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/claws_of_valakut.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/claws_of_wirewood.txt b/res/cardsfolder/claws_of_wirewood.txt deleted file mode 100644 index 352cabf35aa..00000000000 --- a/res/cardsfolder/claws_of_wirewood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Claws of Wirewood -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 G | NumDmg$ 3 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals 3 damage to each creature with flying and each player. -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/claws_of_wirewood.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clay_statue.txt b/res/cardsfolder/clay_statue.txt deleted file mode 100644 index 4a9bcc11e33..00000000000 --- a/res/cardsfolder/clay_statue.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Clay Statue -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:3/1 -A:AB$ Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clay_statue.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/355.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/323.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cleanfall.txt b/res/cardsfolder/cleanfall.txt deleted file mode 100644 index 1ca2878c6dc..00000000000 --- a/res/cardsfolder/cleanfall.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cleanfall -ManaCost:2 W -Types:Sorcery Arcane -Text:no text -A:SP$ DestroyAll | Cost$ 2 W | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cleanfall.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/6.jpg -End diff --git a/res/cardsfolder/cleanse.txt b/res/cardsfolder/cleanse.txt deleted file mode 100644 index 8f4ae9c199d..00000000000 --- a/res/cardsfolder/cleanse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cleanse -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature.Black | SpellDescription$ Destroy all black creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cleanse.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/174.jpg -End diff --git a/res/cardsfolder/clear.txt b/res/cardsfolder/clear.txt deleted file mode 100644 index daded9d3695..00000000000 --- a/res/cardsfolder/clear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Clear -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/clear.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/7.jpg -End diff --git a/res/cardsfolder/clearwater_goblet.txt b/res/cardsfolder/clearwater_goblet.txt deleted file mode 100644 index 3e902d26a9c..00000000000 --- a/res/cardsfolder/clearwater_goblet.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Clearwater Goblet -ManaCost:5 -Types:Artifact -Text:no text -K:Sunburst -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, you may gain life equal to the number of charge counters on CARDNAME. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/clearwater_goblet.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clergy_en_vec.txt b/res/cardsfolder/clergy_en_vec.txt deleted file mode 100644 index e004cee14e6..00000000000 --- a/res/cardsfolder/clergy_en_vec.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Clergy en-Vec -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clergy_en_vec.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clickslither.txt b/res/cardsfolder/clickslither.txt deleted file mode 100644 index ec5e0214dbf..00000000000 --- a/res/cardsfolder/clickslither.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Clickslither -ManaCost:1 R R R -Types:Creature Insect -Text:no text -PT:3/3 -K:Haste -A:AB$ Pump | Cost$ Sac<1/Goblin> | NumAtt$ +2 | NumDef$ +2 | KW$ Trample | SpellDescription$ CARDNAME gets +2/+2 and gains trample until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/clickslither.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cliff_threader.txt b/res/cardsfolder/cliff_threader.txt deleted file mode 100644 index 8a77a6d764a..00000000000 --- a/res/cardsfolder/cliff_threader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cliff Threader -ManaCost:1 W -Types:Creature Kor Scout -Text:no text -PT:2/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cliff_threader.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cliffrunner_behemoth.txt b/res/cardsfolder/cliffrunner_behemoth.txt deleted file mode 100644 index 98b27637e62..00000000000 --- a/res/cardsfolder/cliffrunner_behemoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cliffrunner Behemoth -ManaCost:3 G -Types:Creature Rhino Beast -Text:no text -PT:5/3 -K:stPumpSelf:Creature:0/0/Haste:isPresent Permanent.Red+YouCtrl:Cliffrunner Behemoth has haste as long as you control a red permanent. -K:stPumpSelf:Creature:0/0/Lifelink:isPresent Permanent.White+YouCtrl:Cliffrunner Behemoth has lifelink as long as you control a white permanent. -SVar:BuffedBy:Creature.White,Creature.Red -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cliffrunner_behemoth.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clinging_darkness.txt b/res/cardsfolder/clinging_darkness.txt deleted file mode 100644 index 5d20f2bbd86..00000000000 --- a/res/cardsfolder/clinging_darkness.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Clinging Darkness -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-4/-1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clinging_darkness.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloak_of_feathers.txt b/res/cardsfolder/cloak_of_feathers.txt deleted file mode 100644 index 36d7dcb2ac2..00000000000 --- a/res/cardsfolder/cloak_of_feathers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cloak of Feathers -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloak_of_feathers.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/45.jpg -End diff --git a/res/cardsfolder/cloak_of_mists.txt b/res/cardsfolder/cloak_of_mists.txt deleted file mode 100644 index d8a771f3555..00000000000 --- a/res/cardsfolder/cloak_of_mists.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cloak of Mists -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN Unblockable:Enchanted creature is unblockable. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloak_of_mists.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clock_of_omens.txt b/res/cardsfolder/clock_of_omens.txt deleted file mode 100644 index 3ba2ad54fce..00000000000 --- a/res/cardsfolder/clock_of_omens.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Clock of Omens -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ tapXType<2/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/clock_of_omens.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/110.jpg -End diff --git a/res/cardsfolder/clockwork_beetle.txt b/res/cardsfolder/clockwork_beetle.txt deleted file mode 100644 index 9a7953cd19d..00000000000 --- a/res/cardsfolder/clockwork_beetle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Clockwork Beetle -ManaCost:1 -Types:Artifact Creature Insect -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigRemoveCounter | TriggerDescription$ Remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_beetle.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clockwork_condor.txt b/res/cardsfolder/clockwork_condor.txt deleted file mode 100644 index 85afa8bafc2..00000000000 --- a/res/cardsfolder/clockwork_condor.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Clockwork Condor -ManaCost:4 -Types:Artifact Creature Bird -Text:no text -PT:0/0 -K:Flying -K:etbCounter:P1P1:3 -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigRemoveCounter | TriggerDescription$ Remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_condor.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clockwork_dragon.txt b/res/cardsfolder/clockwork_dragon.txt deleted file mode 100644 index e1692da639c..00000000000 --- a/res/cardsfolder/clockwork_dragon.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Clockwork Dragon -ManaCost:7 -Types:Artifact Creature Dragon -Text:no text -PT:0/0 -K:Flying -K:etbCounter:P1P1:6 -A:AB$ PutCounter | Cost$ 3 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigRemoveCounter | TriggerDescription$ Remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_dragon.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clockwork_gnomes.txt b/res/cardsfolder/clockwork_gnomes.txt deleted file mode 100644 index ea801f78275..00000000000 --- a/res/cardsfolder/clockwork_gnomes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Clockwork Gnomes -ManaCost:4 -Types:Artifact Creature Gnome -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ 3 T | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature. | SpellDescription$ Regenerate target artifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_gnomes.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clockwork_vorrac.txt b/res/cardsfolder/clockwork_vorrac.txt deleted file mode 100644 index 48938e699fa..00000000000 --- a/res/cardsfolder/clockwork_vorrac.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Clockwork Vorrac -ManaCost:5 -Types:Artifact Creature Boar Beast -Text:no text -PT:0/0 -K:etbCounter:P1P1:4 -A:AB$ PutCounter | Cost$ T | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, remove a +1/+1 counter from it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigRemoveCounter | TriggerDescription$ Remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_vorrac.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clone.txt b/res/cardsfolder/clone.txt deleted file mode 100644 index 03348a9267a..00000000000 --- a/res/cardsfolder/clone.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Clone -ManaCost:3 U -Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. -PT:0/0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/clone.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/52.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/52.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/67.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/73.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/49.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/45.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/51.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/75.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/close_quarters.txt b/res/cardsfolder/close_quarters.txt deleted file mode 100644 index 19d8f5369e8..00000000000 --- a/res/cardsfolder/close_quarters.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Close Quarters -ManaCost:2 R R -Types:Enchantment -Text:no text -T:Mode$ AttackerBlocked | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a creature you control becomes blocked, CARDNAME deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/close_quarters.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clot_sliver.txt b/res/cardsfolder/clot_sliver.txt deleted file mode 100644 index 5f26db25505..00000000000 --- a/res/cardsfolder/clot_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Clot Sliver -ManaCost:1 B -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=Pump:no Condition:All Slivers have "2: Regenerate this permanent." -SVar:Pump:AB$Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clot_sliver.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_crusader.txt b/res/cardsfolder/cloud_crusader.txt deleted file mode 100644 index c16f6f297e0..00000000000 --- a/res/cardsfolder/cloud_crusader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloud Crusader -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:2/3 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_crusader.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_djinn.txt b/res/cardsfolder/cloud_djinn.txt deleted file mode 100644 index bf0f8e3e375..00000000000 --- a/res/cardsfolder/cloud_djinn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloud Djinn -ManaCost:5 U -Types:Creature Djinn -Text:no text -PT:5/4 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_djinn.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_dragon.txt b/res/cardsfolder/cloud_dragon.txt deleted file mode 100644 index 2016e1dd472..00000000000 --- a/res/cardsfolder/cloud_dragon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloud Dragon -ManaCost:5 U -Types:Creature Illusion Dragon -Text:no text -PT:5/4 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_dragon.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_elemental.txt b/res/cardsfolder/cloud_elemental.txt deleted file mode 100644 index 94e36bebeda..00000000000 --- a/res/cardsfolder/cloud_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cloud Elemental -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:2/3 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_elemental.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/50.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/29.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_of_faeries.txt b/res/cardsfolder/cloud_of_faeries.txt deleted file mode 100644 index 9623655602e..00000000000 --- a/res/cardsfolder/cloud_of_faeries.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cloud of Faeries -ManaCost:1 U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -K:Cycling:2 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap up to two lands. -SVar:TrigUntap:AB$ Untap | Cost$ 0 | UntapUpTo$ True | UntapType$ Land | Amount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/gu/en-us/card11588.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_pirates.txt b/res/cardsfolder/cloud_pirates.txt deleted file mode 100644 index d827e6a35b8..00000000000 --- a/res/cardsfolder/cloud_pirates.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloud Pirates -ManaCost:U -Types:Creature Human Pirate -Text:no text -PT:1/1 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_pirates.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_spirit.txt b/res/cardsfolder/cloud_spirit.txt deleted file mode 100644 index 33f83de442f..00000000000 --- a/res/cardsfolder/cloud_spirit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cloud Spirit -ManaCost:2 U -Types:Creature Spirit -Text:no text -PT:3/1 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_spirit.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/48.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloud_sprite.txt b/res/cardsfolder/cloud_sprite.txt deleted file mode 100644 index 2c5e85780c8..00000000000 --- a/res/cardsfolder/cloud_sprite.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cloud Sprite -ManaCost:U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_sprite.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/67.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudchaser_eagle.txt b/res/cardsfolder/cloudchaser_eagle.txt deleted file mode 100644 index 690bced3a40..00000000000 --- a/res/cardsfolder/cloudchaser_eagle.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cloudchaser Eagle -ManaCost:3 W -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudchaser_eagle.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/227.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudchaser_kestrel.txt b/res/cardsfolder/cloudchaser_kestrel.txt deleted file mode 100644 index 7153dd3d865..00000000000 --- a/res/cardsfolder/cloudchaser_kestrel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cloudchaser Kestrel -ManaCost:1 W W -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. -A:AB$ Animate | Cost$ W | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ White | OverwriteColors$ True | SpellDescription$ Target permanent becomes white until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudchaser_kestrel.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudcrest_lake.txt b/res/cardsfolder/cloudcrest_lake.txt deleted file mode 100644 index ccb194eed24..00000000000 --- a/res/cardsfolder/cloudcrest_lake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cloudcrest Lake -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add W to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add U to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudcrest_lake.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudcrown_oak.txt b/res/cardsfolder/cloudcrown_oak.txt deleted file mode 100644 index b7b0b01a651..00000000000 --- a/res/cardsfolder/cloudcrown_oak.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cloudcrown Oak -ManaCost:2 G G -Types:Creature Treefolk Warrior -Text:no text -PT:3/4 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139492.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudgoat_ranger.txt b/res/cardsfolder/cloudgoat_ranger.txt deleted file mode 100644 index 92a7975aa78..00000000000 --- a/res/cardsfolder/cloudgoat_ranger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cloudgoat Ranger -ManaCost:3 W W -Types:Creature Giant Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 1/1 white Kithkin Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -A:AB$ Pump | Cost$ tapXType<3/Kithkin> | NumAtt$ +2 | KW$ Flying | SpellDescription$ CARDNAME gets +2/+0 and gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudgoat_ranger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudheath_drake.txt b/res/cardsfolder/cloudheath_drake.txt deleted file mode 100644 index 514562df1d1..00000000000 --- a/res/cardsfolder/cloudheath_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloudheath Drake -ManaCost:4 U -Types:Artifact Creature Drake -Text:no text -PT:3/3 -K:Flying -A:AB$ Pump | Cost$ 1 W | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudheath_drake.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/35.jpg -End diff --git a/res/cardsfolder/cloudhoof_kirin.txt b/res/cardsfolder/cloudhoof_kirin.txt deleted file mode 100644 index b2625e6f98b..00000000000 --- a/res/cardsfolder/cloudhoof_kirin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cloudhoof Kirin -ManaCost:3 U U -Types:Legendary Creature Kirin Spirit -Text:no text -PT:4/4 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMill | TriggerDescription$ 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. -SVar:TrigMill:AB$Mill | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X -SVar:X:TriggeredCard$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudhoof_kirin.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudpost.txt b/res/cardsfolder/cloudpost.txt deleted file mode 100644 index d9d83892e67..00000000000 --- a/res/cardsfolder/cloudpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cloudpost -ManaCost:no cost -Types:Land Locus -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ X | SpellDescription$ Add 1 to your mana pool for each Locus on the battlefield. -SVar:X:Count$Valid Locus -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudpost.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudreach_cavalry.txt b/res/cardsfolder/cloudreach_cavalry.txt deleted file mode 100644 index 42b2f7342ee..00000000000 --- a/res/cardsfolder/cloudreach_cavalry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloudreach Cavalry -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Creature:2/2/Flying:isPresent Bird.YouCtrl:As long as you control a Bird, Cloudreach Cavalry gets +2/+2 and has flying. -SVar:BuffedBy:Bird -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudreach_cavalry.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudseeder.txt b/res/cardsfolder/cloudseeder.txt deleted file mode 100644 index 55b161e6330..00000000000 --- a/res/cardsfolder/cloudseeder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloudseeder -ManaCost:1 U -Types:Creature Faerie Spellshaper -Text:no text -PT:1/1 -K:Flying -A:AB$ Token | Cost$ U T Discard<1/Card> | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Cloud Sprite | TokenTypes$ Creature,Faerie | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>CARDNAME can block only creatures with flying. | SpellDescription$ 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." -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130309.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudskate.txt b/res/cardsfolder/cloudskate.txt deleted file mode 100644 index 93b028fb871..00000000000 --- a/res/cardsfolder/cloudskate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cloudskate -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:2/2 -K:Flying -K:Fading:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudskate.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cloudthresher.txt b/res/cardsfolder/cloudthresher.txt deleted file mode 100644 index de43370dc99..00000000000 --- a/res/cardsfolder/cloudthresher.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Cloudthresher -ManaCost:2 G G G G -Types:Creature Elemental -Text:no text -PT:7/7 -K:Flash -K:Reach -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAllFlyersAndPlayers | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to each creature with flying and each player. -K:Evoke:2 G G -SVar:TrigDamageAllFlyersAndPlayers:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | NumDmg$ 2 | ValidDescription$ each creature with flying and each player. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloudthresher.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clout_of_the_dominus.txt b/res/cardsfolder/clout_of_the_dominus.txt deleted file mode 100644 index 3b410e15c97..00000000000 --- a/res/cardsfolder/clout_of_the_dominus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Clout of the Dominus -ManaCost:UR -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Blue:1/1/Shroud:No Condition:As long as enchanted creature is blue, it gets +1/+1 and has shroud. (It can't be the target of spells or abilities.) -K:stPumpEnchanted:Creature.Red:1/1/Haste:No Condition:As long as enchanted creature is red, it gets +1/+1 and has haste. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clout_of_the_dominus.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clutch_of_the_undercity.txt b/res/cardsfolder/clutch_of_the_undercity.txt deleted file mode 100644 index 9416082e19e..00000000000 --- a/res/cardsfolder/clutch_of_the_undercity.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Clutch of the Undercity -ManaCost:1 U U B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U U B | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. Its controller loses 3 life. | SubAbility$ SVar=DBDrain -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 3 -K:Transmute: 1 U B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/clutch_of_the_undercity.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/clutch_of_undeath.txt b/res/cardsfolder/clutch_of_undeath.txt deleted file mode 100644 index a15e4beb1ac..00000000000 --- a/res/cardsfolder/clutch_of_undeath.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Clutch of Undeath -ManaCost:3 B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Zombie:3/3:No Condition:Enchanted creature gets +3/+3 as long as it's a Zombie. Otherwise, it gets -3/-3. -K:stPumpEnchanted:Creature.nonZombie:-3/-3:No Condition:no text -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/clutch_of_undeath.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coal_golem.txt b/res/cardsfolder/coal_golem.txt deleted file mode 100644 index fdf4bd6abed..00000000000 --- a/res/cardsfolder/coal_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coal Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 3 Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coal_golem.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coast_watcher.txt b/res/cardsfolder/coast_watcher.txt deleted file mode 100644 index ff5f622d0c1..00000000000 --- a/res/cardsfolder/coast_watcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coast Watcher -ManaCost:1 U -Types:Creature Bird Soldier -Text:no text -PT:1/1 -K:Flying -K:Protection from green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coast_watcher.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coastal_drake.txt b/res/cardsfolder/coastal_drake.txt deleted file mode 100644 index 29ea1a777c6..00000000000 --- a/res/cardsfolder/coastal_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coastal Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ 1 U T | ValidTgts$ Kavu | TgtPrompt$ Select target Kavu | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Kavu to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coastal_drake.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coastal_hornclaw.txt b/res/cardsfolder/coastal_hornclaw.txt deleted file mode 100644 index 3f951e7bf70..00000000000 --- a/res/cardsfolder/coastal_hornclaw.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coastal Hornclaw -ManaCost:4 U -Types:Creature Bird -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ Sac<1/Land> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24574.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/66.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coastal_piracy.txt b/res/cardsfolder/coastal_piracy.txt deleted file mode 100644 index 78b794d4efa..00000000000 --- a/res/cardsfolder/coastal_piracy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coastal Piracy -ManaCost:2 U U -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature you control deals combat damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coastal_piracy.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/67.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coastal_tower.txt b/res/cardsfolder/coastal_tower.txt deleted file mode 100644 index 730ee54e38c..00000000000 --- a/res/cardsfolder/coastal_tower.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coastal Tower -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coastal_tower.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/323.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coat_of_arms.txt b/res/cardsfolder/coat_of_arms.txt deleted file mode 100644 index ebeb850faec..00000000000 --- a/res/cardsfolder/coat_of_arms.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Coat of Arms -ManaCost:5 -Types:Artifact -Text: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.) -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coat_of_arms.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/294.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/290.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/131.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/291.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/316.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cobalt_golem.txt b/res/cardsfolder/cobalt_golem.txt deleted file mode 100644 index 9a7a5e48c9b..00000000000 --- a/res/cardsfolder/cobalt_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cobalt Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ 1 U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cobalt_golem.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/157.jpg -End diff --git a/res/cardsfolder/cockatrice.txt b/res/cardsfolder/cockatrice.txt deleted file mode 100644 index 1f7d498e9c5..00000000000 --- a/res/cardsfolder/cockatrice.txt +++ /dev/null @@ -1,22 +0,0 @@ -Name:Cockatrice -ManaCost:3 G G -Types:Creature Cockatrice -Text:no text -PT:2/4 -K:Flying -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.nonWall | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonWall | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cockatrice.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/98.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/98.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/121.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/75.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/96.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/146.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coercion.txt b/res/cardsfolder/coercion.txt deleted file mode 100644 index 22fbce34b75..00000000000 --- a/res/cardsfolder/coercion.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Coercion -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ 1 | SpellDescription$ Target opponent reveals his or her hand. You choose a card from it. That player discards that card. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83034.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/122.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/7.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/70.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/4.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/118.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/6.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/119.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coffin_puppets.txt b/res/cardsfolder/coffin_puppets.txt deleted file mode 100644 index 19beffdce89..00000000000 --- a/res/cardsfolder/coffin_puppets.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coffin Puppets -ManaCost:3 B B -Types:Creature Zombie -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ Sac<2/Land> | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | PlayerTurn$ True | ActivatingPhases$ Upkeep | IsPresent$ Swamp.YouCtrl | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control a Swamp. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coffin_puppets.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coffin_purge.txt b/res/cardsfolder/coffin_purge.txt deleted file mode 100644 index 8cdd3218ad9..00000000000 --- a/res/cardsfolder/coffin_purge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coffin Purge -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | Flashback$ True | CostDesc$ Flashback B | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coffin_purge.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cognivore.txt b/res/cardsfolder/cognivore.txt deleted file mode 100644 index 23a04bfffe6..00000000000 --- a/res/cardsfolder/cognivore.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cognivore -ManaCost:6 U U -Types:Creature Lhurgoyf -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$TypeInAllYards.Instant:Count$TypeInAllYards.Instant:CARDNAME's power and toughness are each equal to the number of instant cards in all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cognivore.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coiled_tinviper.txt b/res/cardsfolder/coiled_tinviper.txt deleted file mode 100644 index f41f1bfa4d5..00000000000 --- a/res/cardsfolder/coiled_tinviper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Coiled Tinviper -ManaCost:3 -Types:Artifact Creature Snake -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coiled_tinviper.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coiling_oracle.txt b/res/cardsfolder/coiling_oracle.txt deleted file mode 100644 index 19e62d699c6..00000000000 --- a/res/cardsfolder/coiling_oracle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coiling Oracle -ManaCost:G U -Types:Creature Snake Elf Druid -Text:no text -PT:1/1 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | DestinationZone2$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coiling_oracle.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coiling_woodworm.txt b/res/cardsfolder/coiling_woodworm.txt deleted file mode 100644 index 371cb800d8c..00000000000 --- a/res/cardsfolder/coiling_woodworm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Coiling Woodworm -ManaCost:2 G -Types:Creature Insect Worm -Text:no text -PT:*/1 -K:stSetPT:Count$Valid Forest:1:Coiling Woodworm's power is equal to the number of Forests on the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coiling_woodworm.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cold_eyed_selkie.txt b/res/cardsfolder/cold_eyed_selkie.txt deleted file mode 100644 index 24bcb986a02..00000000000 --- a/res/cardsfolder/cold_eyed_selkie.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cold-Eyed Selkie -ManaCost:1 GU GU -Types:Creature Merfolk Rogue -Text:no text -PT:1/1 -K:Islandwalk -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDraw | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw that many cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cold_eyed_selkie.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/collective_restraint.txt b/res/cardsfolder/collective_restraint.txt deleted file mode 100644 index aaacc37e985..00000000000 --- a/res/cardsfolder/collective_restraint.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Collective Restraint -ManaCost:3 U -Types:Enchantment -Text: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. -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/collective_restraint.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/collective_unconscious.txt b/res/cardsfolder/collective_unconscious.txt deleted file mode 100644 index 0e15dd4fd9d..00000000000 --- a/res/cardsfolder/collective_unconscious.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Collective Unconscious -ManaCost:4 G G -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 4 G G | NumCards$ X | SpellDescription$ Draw a card for each creature you control. -SVar:X:Count$TypeYouCtrl.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/collective_unconscious.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/238.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/236.jpg -End diff --git a/res/cardsfolder/colos_yearling.txt b/res/cardsfolder/colos_yearling.txt deleted file mode 100644 index f5693c178ce..00000000000 --- a/res/cardsfolder/colos_yearling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Colos Yearling -ManaCost:2 R -Types:Creature Goat Beast -Text:no text -PT:1/1 -K:Mountainwalk -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/colos_yearling.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/colossal_might.txt b/res/cardsfolder/colossal_might.txt deleted file mode 100644 index c7a61e7f381..00000000000 --- a/res/cardsfolder/colossal_might.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Colossal Might -ManaCost:R G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +4/+2 and gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/colossal_might.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/51.jpg -End diff --git a/res/cardsfolder/colossus_of_sardia.txt b/res/cardsfolder/colossus_of_sardia.txt deleted file mode 100644 index 07b327fea38..00000000000 --- a/res/cardsfolder/colossus_of_sardia.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Colossus of Sardia -ManaCost:9 -Types:Artifact Creature Golem -Text:no text -PT:9/9 -K:Trample -K:CARDNAME doesn't untap during your untap step. -A:AB$ Untap | Cost$ 9 | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Untap CARDNAME. Activate this ability only during your upkeep. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/colossus_of_sardia.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/358.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/11.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/326.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/combat_medic.txt b/res/cardsfolder/combat_medic.txt deleted file mode 100644 index f3ecb7d2e38..00000000000 --- a/res/cardsfolder/combat_medic.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Combat Medic -ManaCost:2 W -Types:Creature Human Cleric Soldier -Text:no text -PT:0/2 -A:AB$ PreventDamage | Cost$ 1 W | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/combat_medic.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/133.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/combust.txt b/res/cardsfolder/combust.txt deleted file mode 100644 index 6058a313c39..00000000000 --- a/res/cardsfolder/combust.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Combust -ManaCost:1 R -Types:Instant -Text:no text -K:CARDNAME can't be countered. -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.White,Creature.Blue | NumDmg$ 5 | NoPrevention$ True | TgtPrompt$ Select target white or blue creature. | SpellDescription$ CARDNAME deals 5 damage to target white or blue creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/combust.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/command_of_unsummoning.txt b/res/cardsfolder/command_of_unsummoning.txt deleted file mode 100644 index d4e5611ca43..00000000000 --- a/res/cardsfolder/command_of_unsummoning.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Command of Unsummoning -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | TargetMin$ 1 | TargetMax$ 2 | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Hand | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME 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. -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/command_of_unsummoning.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/commander_eesha.txt b/res/cardsfolder/commander_eesha.txt deleted file mode 100644 index 8c3eaea2cc7..00000000000 --- a/res/cardsfolder/commander_eesha.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Commander Eesha -ManaCost:2 W W -Types:Legendary Creature Bird Soldier -Text:no text -PT:2/4 -K:Flying -K:Protection from creatures -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/commander_eesha.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/commander_greven_il_vec.txt b/res/cardsfolder/commander_greven_il_vec.txt deleted file mode 100644 index f1d3336f9c8..00000000000 --- a/res/cardsfolder/commander_greven_il_vec.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Commander Greven il-Vec -ManaCost:3 B B B -Types:Legendary Creature Human Warrior -Text:no text -PT:7/5 -K:Fear -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/commander_greven_il_vec.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/commune_with_nature.txt b/res/cardsfolder/commune_with_nature.txt deleted file mode 100644 index e4452acd49e..00000000000 --- a/res/cardsfolder/commune_with_nature.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Commune with Nature -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ G | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/commune_with_nature.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/204.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/complex_automaton.txt b/res/cardsfolder/complex_automaton.txt deleted file mode 100644 index 1d3056a8da8..00000000000 --- a/res/cardsfolder/complex_automaton.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Complex Automaton -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.YouCtrl | PresentCompare$ GE7 | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, if you control seven or more permanents, return CARDNAME to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/complex_automaton.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/composite_golem.txt b/res/cardsfolder/composite_golem.txt deleted file mode 100644 index d5e86ec8e9c..00000000000 --- a/res/cardsfolder/composite_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Composite Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:4/4 -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ W U B R G | SpellDescription$ Add W U B R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/composite_golem.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/111.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/compost.txt b/res/cardsfolder/compost.txt deleted file mode 100644 index 592c2d75d64..00000000000 --- a/res/cardsfolder/compost.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Compost -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card.Black+YouDontCtrl | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a black card is put into an opponent's graveyard from anywhere, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/compost.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/102.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/compulsion.txt b/res/cardsfolder/compulsion.txt deleted file mode 100644 index 7a4be06b740..00000000000 --- a/res/cardsfolder/compulsion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Compulsion -ManaCost:1 U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 1 U Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ Draw | Cost$ 1 U Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/compulsion.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/compulsive_research.txt b/res/cardsfolder/compulsive_research.txt deleted file mode 100644 index dfef136a390..00000000000 --- a/res/cardsfolder/compulsive_research.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Compulsive Research -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws three cards. Then that player discards two cards unless he or she discards a land card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/compulsive_research.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/concentrate.txt b/res/cardsfolder/concentrate.txt deleted file mode 100644 index 30daef22d3a..00000000000 --- a/res/cardsfolder/concentrate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Concentrate -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U U | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45262.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conch_horn.txt b/res/cardsfolder/conch_horn.txt deleted file mode 100644 index 0e48464173f..00000000000 --- a/res/cardsfolder/conch_horn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Conch Horn -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 1 T Sac<1/CARDNAME> | NumCards$ 2 | SubAbility$ SVar=DBTop | SpellDescription$ Draw two cards, then put a card from your hand on top of your library. -SVar:DBTop:DB$ChangeZone | Origin$ Hand | Destination$ Library | ChangeType$ Card | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/conch_horn.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/concordant_crossroads.txt b/res/cardsfolder/concordant_crossroads.txt deleted file mode 100644 index 2876c71f94d..00000000000 --- a/res/cardsfolder/concordant_crossroads.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Concordant Crossroads -ManaCost:G -Types:World Enchantment -Text:no text -K:stPumpAll:Creature:0/0/Haste:No Condition:All creatures have haste. -SVar:BuffedBy:Creature -SVar:AntiBuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/concordant_crossroads.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/condemn.txt b/res/cardsfolder/condemn.txt deleted file mode 100644 index 270e00f53a2..00000000000 --- a/res/cardsfolder/condemn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Condemn -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Put target attacking creature on the bottom of its owner's library. Its controller gains life equal to its toughness. -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/condemn.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/11.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/13.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/condescend.txt b/res/cardsfolder/condescend.txt deleted file mode 100644 index 09877a2be5b..00000000000 --- a/res/cardsfolder/condescend.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Condescend -ManaCost:X U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ X U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/condescend.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/confiscate.txt b/res/cardsfolder/confiscate.txt deleted file mode 100644 index 5d232edef29..00000000000 --- a/res/cardsfolder/confiscate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Confiscate -ManaCost:4 U U -Types:Enchantment Aura -Text:You control enchanted permanent. -K:Enchant permanent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/confiscate.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/69.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/66.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/68.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conflux.txt b/res/cardsfolder/conflux.txt deleted file mode 100644 index 88d2499cbe0..00000000000 --- a/res/cardsfolder/conflux.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Conflux -ManaCost:3 W U B R G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 W U B R G | Origin$ Library | Destination$ Hand | ChangeType$ Card.White | ChangeNum$ 1 |SubAbility$ SVar=DBBlue | SpellDescription$ 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. -SVar:DBBlue:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Blue | ChangeNum$ 1 | SubAbility$ SVar=DBBlack -SVar:DBBlack:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Black | ChangeNum$ 1 | SubAbility$ SVar=DBRed -SVar:DBRed:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Red | ChangeNum$ 1 | SubAbility$ SVar=DBGreen -SVar:DBGreen:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.Green | ChangeNum$ 1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/conflux.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/confound.txt b/res/cardsfolder/confound.txt deleted file mode 100644 index 7ce7f74dc6f..00000000000 --- a/res/cardsfolder/confound.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Confound -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell that targets one or more creatures. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/confound.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/congregate.txt b/res/cardsfolder/congregate.txt deleted file mode 100644 index ba1ab19d198..00000000000 --- a/res/cardsfolder/congregate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Congregate -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 3 W | LifeAmount$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 2 life for each creature on the battlefield. -SVar:X:Count$TypeOnBattlefield.Creature/Times.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/congregate.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/8.jpg -End diff --git a/res/cardsfolder/congregation_at_dawn.txt b/res/cardsfolder/congregation_at_dawn.txt deleted file mode 100644 index 7f89d12e1a0..00000000000 --- a/res/cardsfolder/congregation_at_dawn.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Congregation at Dawn -ManaCost:G G W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ G G W | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature | ChangeNum$ 3 | SpellDescription$ Search your library for up to three creature cards and reveal them. Shuffle you library, then put those cards on top of it in any order. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/congregation_at_dawn.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conjurers_bauble.txt b/res/cardsfolder/conjurers_bauble.txt deleted file mode 100644 index f87c1b83eff..00000000000 --- a/res/cardsfolder/conjurers_bauble.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Conjurer's Bauble -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | ValidTgts$ Card.YouCtrl | TgtPrompt$ Select target card from your graveyard | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Put up to one target card from your graveyard on the bottom of your library. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/conjurers_bauble.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conquering_manticore.txt b/res/cardsfolder/conquering_manticore.txt deleted file mode 100644 index 7126bba3bf7..00000000000 --- a/res/cardsfolder/conquering_manticore.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Conquering Manticore -ManaCost:4 R R -Types:Creature Manticore -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$GainControl | Cost$ 0 | TgtPrompt$ Choose target creature you don't control | ValidTgts$ Creature.YouDontCtrl | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/conquering_manticore.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conquerors_pledge.txt b/res/cardsfolder/conquerors_pledge.txt deleted file mode 100644 index cee00c8f038..00000000000 --- a/res/cardsfolder/conquerors_pledge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Conqueror's Pledge -ManaCost:2 W W W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2 W W W | TokenAmount$ 6 | TokenName$ Kor Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put six 1/1 white Kor Soldier creature tokens onto the battlefield. If CARDNAME was kicked, put twelve of those tokens onto the battlefield instead. -A:SP$ Token | Cost$ 8 W W W | TokenAmount$ 12 | TokenName$ Kor Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Kicker 6 (You may pay an additional 6 as you cast this spell.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/conquerors_pledge.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/consecrated_sphinx.txt b/res/cardsfolder/consecrated_sphinx.txt deleted file mode 100644 index 9f6a58e91d4..00000000000 --- a/res/cardsfolder/consecrated_sphinx.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Consecrated Sphinx -ManaCost:4 U U -Types:Creature Sphinx -Text:no text -PT:4/6 -K:Flying -T:Mode$ Drawn | ValidCard$ Card.YouDontOwn | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent draws a card, you may draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 2 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/consecrated_sphinx.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conservator.txt b/res/cardsfolder/conservator.txt deleted file mode 100644 index 3cd05ddabf1..00000000000 --- a/res/cardsfolder/conservator.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Conservator -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PreventDamage | Cost$ 3 T | Defined$ You | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to you this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/conservator.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/237.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/239.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/241.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/327.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conspiracy.txt b/res/cardsfolder/conspiracy.txt deleted file mode 100644 index 793a91f69ae..00000000000 --- a/res/cardsfolder/conspiracy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Conspiracy -ManaCost:3 B B -Types:Enchantment -Text:As CARDNAME enters the battlefield, choose a creature type.\r\nCreature cards you own that aren't on the battlefield, creature spells you control, and creatures you control are the chosen type. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/conspiracy.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/39.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/constant_mists.txt b/res/cardsfolder/constant_mists.txt deleted file mode 100644 index 13615c12eb8..00000000000 --- a/res/cardsfolder/constant_mists.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Constant Mists -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 G | SpellDescription$ Prevent all combat damage that would be dealt this turn. -A:SP$ Fog | Cost$ 1 G Sac<1/Land> | CostDesc$ Buyback | SubAbility$ SVar=DBBuyback | SpellDescription$ - sacrifice a land -SVar:DBBuyback:DB$ ChangeZone | Origin$ Stack | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/constant_mists.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/constricting_tendrils.txt b/res/cardsfolder/constricting_tendrils.txt deleted file mode 100644 index d46f0b4f310..00000000000 --- a/res/cardsfolder/constricting_tendrils.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Constricting Tendrils -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-0 until end of turn. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/constricting_tendrils.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/22.jpg -End diff --git a/res/cardsfolder/consult_the_necrosages.txt b/res/cardsfolder/consult_the_necrosages.txt deleted file mode 100644 index ddcd73be3f1..00000000000 --- a/res/cardsfolder/consult_the_necrosages.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Consult the Necrosages -ManaCost:1 U B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 U B | ValidTgts$ Player | NumCards$ 2 | SpellDescription$ Choose one - Target player draws two cards; -A:SP$ Discard | Cost$ 1 U B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ or target player discards two cards. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/consult_the_necrosages.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/consume_the_meek.txt b/res/cardsfolder/consume_the_meek.txt deleted file mode 100644 index 383dd9bfc8d..00000000000 --- a/res/cardsfolder/consume_the_meek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Consume the Meek -ManaCost:3 B B -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 3 B B | ValidCards$ Creature.cmcLE3 | NoRegen$ True | SpellDescription$ Destroy each creature with converted mana cost 3 or less. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/consume_the_meek.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/100.jpg -End diff --git a/res/cardsfolder/consuming_bonfire.txt b/res/cardsfolder/consuming_bonfire.txt deleted file mode 100644 index 147e3593d3f..00000000000 --- a/res/cardsfolder/consuming_bonfire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Consuming Bonfire -ManaCost:3 R R -Types:Tribal Sorcery Elemental -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature.nonElemental | NumDmg$ 4 | PrecostDesc$ Choose one - | SpellDescription$ CARDNAME deals 4 damage to target non-Elemental creature; -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature.Treefolk | NumDmg$ 7 | SpellDescription$ or CARDNAME deals 7 damage to target Treefolk creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/consuming_bonfire.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/consumptive_goo.txt b/res/cardsfolder/consumptive_goo.txt deleted file mode 100644 index f68f6f90ddf..00000000000 --- a/res/cardsfolder/consumptive_goo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Consumptive Goo -ManaCost:B B -Types:Creature Ooze -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 2 B B | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Target creature gets -1/-1 until end of turn. Put a +1/+1 counter on CARDNAME. | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/consumptive_goo.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contagion.txt b/res/cardsfolder/contagion.txt deleted file mode 100644 index 6d62bf1573b..00000000000 --- a/res/cardsfolder/contagion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Contagion -ManaCost:3 B B -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ 3 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | CounterType$ M2M1 | CounterNum$ 1 | SubAbility$ SVar=DBPutCounter | IsCurse$ True | SpellDescription$ Distribute two -2/-1 counters among one or two target creatures. -SVar:DBPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | CounterType$ M2M1 | IsCurse$ True | CounterNum$ 1 -SVar:AltCost:PayLife<1> ExileFromHand<1/Card.Black>$You may pay 1 life and exile a black card from your hand rather than pay Contagion's mana cost. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/contagion.jpg -SVar:Rarity:Uncommon -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contagion_clasp.txt b/res/cardsfolder/contagion_clasp.txt deleted file mode 100644 index de89992095f..00000000000 --- a/res/cardsfolder/contagion_clasp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Contagion Clasp -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on target creature. -A:AB$ Proliferate | Cost$ 4 T | SpellDescription$ Proliferate. -SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/contagion_clasp.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contagion_engine.txt b/res/cardsfolder/contagion_engine.txt deleted file mode 100644 index 1e58ad18599..00000000000 --- a/res/cardsfolder/contagion_engine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Contagion Engine -ManaCost:6 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on each creature target player controls. -A:AB$ Proliferate | Cost$ 4 T | SubAbility$ SVar=DBProliferate | SpellDescription$ Proliferate, then proliferate again. -SVar:DBProliferate:DB$Proliferate | Cost$ 0 -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | IsCurse$ True | CounterType$ M1M1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/contagion_engine.jpg -SVar:Rarity:Rare -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contagious_nim.txt b/res/cardsfolder/contagious_nim.txt deleted file mode 100644 index 5883699bf06..00000000000 --- a/res/cardsfolder/contagious_nim.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Contagious Nim -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/2 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/contagious_nim.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contaminated_bond.txt b/res/cardsfolder/contaminated_bond.txt deleted file mode 100644 index 5f4c0d99964..00000000000 --- a/res/cardsfolder/contaminated_bond.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Contaminated Bond -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:+0/+0 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLoseLifeAttack | TriggerDescription$ Whenever enchanted creature attacks or blocks, its controller loses 3 life. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLoseLifeBlock | Secondary$ True | TriggerDescription$ Whenever enchanted creature attacks or blocks, its controller loses 3 life. -SVar:TrigLoseLifeAttack:AB$LoseLife | Cost$ 0 | Defined$ TriggeredAttackerController | LifeAmount$ 3 -SVar:TrigLoseLifeBlock:AB$LoseLife | Cost$ 0 | Defined$ TriggeredBlockerController | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/contaminated_bond.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/61.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/120.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contaminated_ground.txt b/res/cardsfolder/contaminated_ground.txt deleted file mode 100644 index 992c5a8c96e..00000000000 --- a/res/cardsfolder/contaminated_ground.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Contaminated Ground -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Land Curse -K:stAnimateEnchanted:Land:no change/no change/Overwrite:Land,Swamp,RemoveSubTypes:no colors:Overwrite:No Condition:Enchanted land is a Swamp. -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever enchanted land becomes tapped, its controller loses 2 life. -SVar:TrigLose:AB$LoseLife | Cost$ 0 | Defined$ EnchantedController | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/contaminated_ground.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contemplation.txt b/res/cardsfolder/contemplation.txt deleted file mode 100644 index 268e47e0a34..00000000000 --- a/res/cardsfolder/contemplation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Contemplation -ManaCost:1 W W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast a spell, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/contemplation.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/contested_war_zone.txt b/res/cardsfolder/contested_war_zone.txt deleted file mode 100644 index 04d7883c169..00000000000 --- a/res/cardsfolder/contested_war_zone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Contested War Zone -ManaCost:no cost -Types:Land -Text:Whenever a creature deals combat damage to you, that creature's controller gains control of CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PumpAll | Cost$ 1 T | ValidCards$ Creature.attacking | NumAtt$ +1 | SpellDescription$ Attacking creatures get +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/contested_war_zone.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/control_magic.txt b/res/cardsfolder/control_magic.txt deleted file mode 100644 index 19d70d2b04f..00000000000 --- a/res/cardsfolder/control_magic.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Control Magic -ManaCost:2 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/control_magic.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/53.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/53.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/52.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/64.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/control_of_the_court.txt b/res/cardsfolder/control_of_the_court.txt deleted file mode 100644 index 66604cc5318..00000000000 --- a/res/cardsfolder/control_of_the_court.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Control of the Court -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 R | NumCards$ 4 | SpellDescription$ Draw four cards, then discard three cards at random. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ Random -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/control_of_the_court.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/controvert.txt b/res/cardsfolder/controvert.txt deleted file mode 100644 index 5078bde6d76..00000000000 --- a/res/cardsfolder/controvert.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Controvert -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -K:Recover:2 U U -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/controvert.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/convalescence.txt b/res/cardsfolder/convalescence.txt deleted file mode 100644 index b230d8469ce..00000000000 --- a/res/cardsfolder/convalescence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Convalescence -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | LifeTotal$ You | LifeAmount$ LE10 | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if you have 10 life or less, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/convalescence.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/convalescent_care.txt b/res/cardsfolder/convalescent_care.txt deleted file mode 100644 index d16abddb673..00000000000 --- a/res/cardsfolder/convalescent_care.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Convalescent Care -ManaCost:1 W W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | LifeTotal$ You | LifeAmount$ LE5 | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if you have 5 life or less, you gain 3 life and draw a card. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/convalescent_care.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conversion.txt b/res/cardsfolder/conversion.txt deleted file mode 100644 index 0e1e17f688a..00000000000 --- a/res/cardsfolder/conversion.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Conversion -ManaCost:2 W W -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay W W -K:stAnimateAll:Mountain:no change/no change/Overwrite:Land,Plains,RemoveSubTypes:no colors:Overwrite:No Condition:All Mountains are Plains. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/conversion.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/199.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/201.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/198.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/269.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conversion_chamber.txt b/res/cardsfolder/conversion_chamber.txt deleted file mode 100644 index bcb50286acd..00000000000 --- a/res/cardsfolder/conversion_chamber.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Conversion Chamber -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ChangeZone | Cost$ 2 T | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Artifact | TgtPrompt$ Select target artifact card in a graveyard | SubAbility$ SVar=DBPutCounter | SpellDescription$ Exile target artifact card from a graveyard. Put a charge counter on CARDNAME. -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -A:AB$ Token | Cost$ 2 T SubCounter<1/CHARGE> | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 | TokenOwner$ You | SpellDescription$ Put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/conversion_chamber.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/conviction.txt b/res/cardsfolder/conviction.txt deleted file mode 100644 index 7e5cf39dc50..00000000000 --- a/res/cardsfolder/conviction.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Conviction -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+3 -A:AB$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/conviction.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/convincing_mirage.txt b/res/cardsfolder/convincing_mirage.txt deleted file mode 100644 index 22fd5642f1f..00000000000 --- a/res/cardsfolder/convincing_mirage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Convincing Mirage -ManaCost:1 U -Types:Enchantment Aura -Text:As CARDNAME enters the battlefield, choose a basic land type.\r\nEnchanted land is the chosen type. -K:Enchant land -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/convincing_mirage.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/convolute.txt b/res/cardsfolder/convolute.txt deleted file mode 100644 index eba54961473..00000000000 --- a/res/cardsfolder/convolute.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Convolute -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 4 | SpellDescription$ Counter target spell unless its controller pays 4. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/convolute.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copper_carapace.txt b/res/cardsfolder/copper_carapace.txt deleted file mode 100644 index 9e06d5f878c..00000000000 --- a/res/cardsfolder/copper_carapace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Copper Carapace -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and can't block. -K:eqPump 3:+2/+2/HIDDEN CARDNAME can't block. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_carapace.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copper_gnomes.txt b/res/cardsfolder/copper_gnomes.txt deleted file mode 100644 index a14d93aa3a1..00000000000 --- a/res/cardsfolder/copper_gnomes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Copper Gnomes -ManaCost:2 -Types:Artifact Creature Gnome -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 4 Sac<1/CARDNAME> | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | OptionalDecider$ You | SpellDescription$ You may put an artifact card from your hand onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_gnomes.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copper_leaf_angel.txt b/res/cardsfolder/copper_leaf_angel.txt deleted file mode 100644 index 9daa00b2bee..00000000000 --- a/res/cardsfolder/copper_leaf_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Copper-Leaf Angel -ManaCost:5 -Types:Artifact Creature Angel -Text:no text -PT:2/2 -K:Flying -A:AB$PutCounter | Cost$ T Sac | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SpellDescription$ Put X +1/+1 counters on CARDNAME. -SVar:X:Sacrificed$Amount -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_leaf_angel.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copper_myr.txt b/res/cardsfolder/copper_myr.txt deleted file mode 100644 index bfef18617c7..00000000000 --- a/res/cardsfolder/copper_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Copper Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_myr.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/158.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copper_tablet.txt b/res/cardsfolder/copper_tablet.txt deleted file mode 100644 index 0bbcce614f0..00000000000 --- a/res/cardsfolder/copper_tablet.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Copper Tablet -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 1 damage to that player. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigDamageOpp | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 1 damage to that player. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/copper_tablet.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/238.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/240.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copperhorn_scout.txt b/res/cardsfolder/copperhorn_scout.txt deleted file mode 100644 index c17c4a61edf..00000000000 --- a/res/cardsfolder/copperhorn_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Copperhorn Scout -ManaCost:G -Types:Creature Elf Scout -Text:no text -PT:1/1 -T:Mode$Attacks | ValidCard$ Card.Self | Execute$ TrigUntapAll | TriggerDescription$ Whenever CARDNAME attacks, untap each other creature you control. -SVar:TrigUntapAll:AB$UntapAll | Cost$ 0 | ValidCards$ Creature.Other+YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/copperhorn_scout.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copperline_gorge.txt b/res/cardsfolder/copperline_gorge.txt deleted file mode 100644 index fce0735fcd5..00000000000 --- a/res/cardsfolder/copperline_gorge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Copperline Gorge -ManaCost:no cost -Types:Land -text:Copperline Gorge enters the battlefield tapped unless you control two or fewer other lands. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped unless you control two or fewer other lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/copperline_gorge.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/copy_artifact.txt b/res/cardsfolder/copy_artifact.txt deleted file mode 100644 index 7a4afcd27e5..00000000000 --- a/res/cardsfolder/copy_artifact.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Copy Artifact -ManaCost:1 U -Types:Enchantment -Text:You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield, except it's an enchantment in addition to its other types. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/copy_artifact.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/54.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/54.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/53.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_atoll.txt b/res/cardsfolder/coral_atoll.txt deleted file mode 100644 index efed406538f..00000000000 --- a/res/cardsfolder/coral_atoll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coral Atoll -ManaCost:no cost -Types:Land -Text:When CARDNAME enters the battlefield, sacrifice it unless you return an untapped Island you control to its owner's hand. -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 U | SpellDescription$ Add 1 U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_atoll.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_eel.txt b/res/cardsfolder/coral_eel.txt deleted file mode 100644 index 5ca3d91bb41..00000000000 --- a/res/cardsfolder/coral_eel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coral Eel -ManaCost:1 U -Types:Creature Eel -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84073.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/70.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/33.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/50.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9eb/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_fighters.txt b/res/cardsfolder/coral_fighters.txt deleted file mode 100644 index a3123f8e458..00000000000 --- a/res/cardsfolder/coral_fighters.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coral Fighters -ManaCost:1 U -Types:Creature Merfolk Soldier -Text:no text -PT:1/1 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | Defined$ Opponent | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_fighters.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_helm.txt b/res/cardsfolder/coral_helm.txt deleted file mode 100644 index 7530997a0d3..00000000000 --- a/res/cardsfolder/coral_helm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coral Helm -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_helm.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/359.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/328.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/12.jpg -End diff --git a/res/cardsfolder/coral_merfolk.txt b/res/cardsfolder/coral_merfolk.txt deleted file mode 100644 index 81fa8c9bb58..00000000000 --- a/res/cardsfolder/coral_merfolk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Coral Merfolk -ManaCost:1 U -Types:Creature Merfolk -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5613.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/67.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/47.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_reef.txt b/res/cardsfolder/coral_reef.txt deleted file mode 100644 index cdb7b8f7676..00000000000 --- a/res/cardsfolder/coral_reef.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coral Reef -ManaCost:U U -Types:Enchantment -Text:no text -K:etbCounter:POLYP:4 -A:AB$ PutCounter | Cost$ Sac<1/Island> | CounterType$ POLYP | CounterNum$ 2 | SpellDescription$ Put two polyp counters on CARDNAME. -A:AB$ PutCounter | Cost$ U tapXType<1/Creature.Blue> SubCounter<1/POLYP> | CounterType$ P0P1 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CostDesc$ U, Tap an untapped blue creature you control, Remove a polyp counter from CARDNAME: | SpellDescription$ Put a +0/+1 counter on target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_reef.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coral_trickster.txt b/res/cardsfolder/coral_trickster.txt deleted file mode 100644 index 65b674310cd..00000000000 --- a/res/cardsfolder/coral_trickster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Coral Trickster -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:2/1 -K:Morph:U -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigTapOrUntap | TriggerDescription$ When CARDNAME is turned face up, you may tap or untap target permanent. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/coral_trickster.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coralhelm_commander.txt b/res/cardsfolder/coralhelm_commander.txt deleted file mode 100644 index 976558d849c..00000000000 --- a/res/cardsfolder/coralhelm_commander.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Coralhelm Commander -ManaCost:U U -Types:Creature Merfolk Soldier -Text:no text -PT:2/2 -K:stSetPT:2:2:LevelGE2:3:3:LevelGE4:4:4:LEVEL 2-3 3/3 Flying LEVEL 4+ 4/4 Flying, Other Merfolk creatures you control get +1/+1. -K:stPumpSelf:Creature.countersGE2LEVEL:0/0/Flying:no Condition:no text. -K:stPumpAll:Creature.Merfolk+YouCtrl+Other:1/1:isPresent Creature.countersGE4LEVEL+Self:no text. -K:Level up:1 -K:maxLevel:4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/coralhelm_commander.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/core_prowler.txt b/res/cardsfolder/core_prowler.txt deleted file mode 100644 index fa3abd3eb31..00000000000 --- a/res/cardsfolder/core_prowler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Core Prowler -ManaCost:4 -Types:Artifact Creature Horror -Text:no text -PT:2/2 -K:Infect -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, proliferate. -SVar:TrigProliferate:AB$Proliferate | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/core_prowler.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/coretapper.txt b/res/cardsfolder/coretapper.txt deleted file mode 100644 index c3b4893b1e3..00000000000 --- a/res/cardsfolder/coretapper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Coretapper -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ PutCounter | Cost$ T | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on target artifact. -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 2 | SpellDescription$ Put two charge counters on target artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/coretapper.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corpse_connoisseur.txt b/res/cardsfolder/corpse_connoisseur.txt deleted file mode 100644 index 33dd1d2a980..00000000000 --- a/res/cardsfolder/corpse_connoisseur.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Corpse Connoisseur -ManaCost:4 B -Types:Creature Zombie Wizard -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Graveyard | ChangeType$ Creature | ChangeNum$ 1 -K:Unearth:3 B -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_connoisseur.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corpse_cur.txt b/res/cardsfolder/corpse_cur.txt deleted file mode 100644 index 5d313f0c272..00000000000 --- a/res/cardsfolder/corpse_cur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Corpse Cur -ManaCost:4 -Types:Artifact Creature Hound -Text:no text -PT:2/2 -K:Infect -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target creature card with infect from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.withInfect | TgtPrompt$ Choose target creature with Infect in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_cur.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corpse_harvester.txt b/res/cardsfolder/corpse_harvester.txt deleted file mode 100644 index 4ae97b8a116..00000000000 --- a/res/cardsfolder/corpse_harvester.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Corpse Harvester -ManaCost:3 B B -Types:Creature Zombie Wizard -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ 1 B T Sac<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Zombie | ChangeNum$ 1 | SubAbility$ SVar=DBSwamp | SpellDescription$ Search your library for a Zombie card and a Swamp card, reveal them, and put them into your hand. Then shuffle your library. -SVar:DBSwamp:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Swamp | ChangeNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_harvester.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corpsehatch.txt b/res/cardsfolder/corpsehatch.txt deleted file mode 100644 index b6556f899a3..00000000000 --- a/res/cardsfolder/corpsehatch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corpsehatch -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Choose target nonblack creature. | SubAbility$ SVar=DBToken | SpellDescription$ 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." -SVar:DBToken:DB$Token | TokenAmount$ 2 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpsehatch.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corpulent_corpse.txt b/res/cardsfolder/corpulent_corpse.txt deleted file mode 100644 index 26c2ffa2153..00000000000 --- a/res/cardsfolder/corpulent_corpse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corpulent Corpse -ManaCost:5 B -Types:Creature Zombie -Text:no text -PT:3/3 -K:Fear -K:Suspend:5:B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpulent_corpse.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrosive_gale.txt b/res/cardsfolder/corrosive_gale.txt deleted file mode 100644 index 46657c4e251..00000000000 --- a/res/cardsfolder/corrosive_gale.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Corrosive Gale -ManaCost:X PG -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X PG | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature with flying. -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrosive_gale.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrosive_mentor.txt b/res/cardsfolder/corrosive_mentor.txt deleted file mode 100644 index bf1a899bd9b..00000000000 --- a/res/cardsfolder/corrosive_mentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corrosive Mentor -ManaCost:2 B -Types:Creature Elemental Rogue -Text:no text -PT:1/3 -K:stPumpAll:Creature.Black+YouCtrl:0/0/Wither:No Condition:Black creatures you control have wither. (They deal damage to creatures in the form of -1/-1 counters.) -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrosive_mentor.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupt.txt b/res/cardsfolder/corrupt.txt deleted file mode 100644 index e25b6581c9d..00000000000 --- a/res/cardsfolder/corrupt.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Corrupt -ManaCost:5 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 5 B | Tgt$ TgtCP | NumDmg$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ 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. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$TypeYouCtrl.Swamp -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/89.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/124.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/62.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/124.jpg -End diff --git a/res/cardsfolder/corrupt_court_official.txt b/res/cardsfolder/corrupt_court_official.txt deleted file mode 100644 index 6e9d4d2ad14..00000000000 --- a/res/cardsfolder/corrupt_court_official.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corrupt Court Official -ManaCost:1 B -Types:Creature Human Advisor -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_court_official.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupt_eunuchs.txt b/res/cardsfolder/corrupt_eunuchs.txt deleted file mode 100644 index 697ac85f2d3..00000000000 --- a/res/cardsfolder/corrupt_eunuchs.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Corrupt Eunuchs -ManaCost:3 R -Types:Creature Human Advisor -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target creature. -SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_eunuchs.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupt_official.txt b/res/cardsfolder/corrupt_official.txt deleted file mode 100644 index 844afe06c43..00000000000 --- a/res/cardsfolder/corrupt_official.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Corrupt Official -ManaCost:4 B -Types:Creature Human Minion -Text:no text -PT:3/1 -A:AB$ Regenerate | Cost$ 2 B | SpellDescription$ Regenerate CARDNAME. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player discards a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ Random -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupt_official.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupted_conscience.txt b/res/cardsfolder/corrupted_conscience.txt deleted file mode 100644 index 7971a5c133b..00000000000 --- a/res/cardsfolder/corrupted_conscience.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corrupted Conscience -ManaCost:3 U U -Types:Enchantment Aura -Text:You control enchanted creature.\r\nEnchanted creature has infect. (It deals damage to creatures in the form of -1/-1 counters and to players in the form of poison counters.) -K:Enchant creature -K:enControlCreature -K:enPump:+0/+0/Infect -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_conscience.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupted_harvester.txt b/res/cardsfolder/corrupted_harvester.txt deleted file mode 100644 index 10de3bba20e..00000000000 --- a/res/cardsfolder/corrupted_harvester.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Corrupted Harvester -ManaCost:4 B B -Types:Creature Horror -Text:no text -PT:6/3 -A:AB$ Regenerate | Cost$ B Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_harvester.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/corrupted_zendikon.txt b/res/cardsfolder/corrupted_zendikon.txt deleted file mode 100644 index 4c8c013ab74..00000000000 --- a/res/cardsfolder/corrupted_zendikon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Corrupted Zendikon -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:3/3:Creature,Ooze:Black:No Abilities:isPresent Card.AttachedBy:Enchanted land is a 3/3 black Ooze creature. It's still a land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land is put into a graveyard, return that card to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/corrupted_zendikon.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cosis_ravager.txt b/res/cardsfolder/cosis_ravager.txt deleted file mode 100644 index ec2f86296fc..00000000000 --- a/res/cardsfolder/cosis_ravager.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cosi's Ravager -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may have CARDNAME deal 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cosis_ravager.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cosis_trickster.txt b/res/cardsfolder/cosis_trickster.txt deleted file mode 100644 index 3ad9374e761..00000000000 --- a/res/cardsfolder/cosis_trickster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cosi's Trickster -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -T:Mode$ Shuffled | ValidPlayer$ Opponent | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent shuffles his or her library, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cosis_trickster.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cosmic_horror.txt b/res/cardsfolder/cosmic_horror.txt deleted file mode 100644 index 3f86bd25b64..00000000000 --- a/res/cardsfolder/cosmic_horror.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cosmic Horror -ManaCost:3 B B B -Types:Creature Horror -Text:If Cosmic is destroyed this way, it deals 7 damage to you. -PT:7/7 -K:First Strike -K:At the beginning of your upkeep, destroy CARDNAME unless you pay 3 B B B -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cosmic_horror.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/10.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/council_of_advisors.txt b/res/cardsfolder/council_of_advisors.txt deleted file mode 100644 index 2d54c9bde24..00000000000 --- a/res/cardsfolder/council_of_advisors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Council of Advisors -ManaCost:2 U -Types:Creature Human Advisor -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Three_Kingdoms/council_of_advisors.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/counsel_of_the_soratami.txt b/res/cardsfolder/counsel_of_the_soratami.txt deleted file mode 100644 index 67ad58ceddd..00000000000 --- a/res/cardsfolder/counsel_of_the_soratami.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Counsel of the Soratami -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83390.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/55.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/counterbalance.txt b/res/cardsfolder/counterbalance.txt deleted file mode 100644 index 157b53aa7b2..00000000000 --- a/res/cardsfolder/counterbalance.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Counterbalance -ManaCost:U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigReveal | TriggerDescription$ 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. -SVar:TrigReveal:AB$Dig | Cost$ 0 | DigNum$ 1 | Reveal$ True | DestinationZone$ Library | LibraryPosition$ 0 | LibraryPosition2$ 0 | SubAbility$ SVar=DBCounter -SVar:DBCounter:DB$Counter | Cost$ 0 | Defined$ TriggeredSpellAbility | ConditionPresent$ Card.cmcEQX | ConditionDefined$ TriggeredCard | ConditionCompare$ GE1 -SVar:X:Count$TopOfLibraryCMC -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/counterbalance.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/counterintelligence.txt b/res/cardsfolder/counterintelligence.txt deleted file mode 100644 index 8156bf43c30..00000000000 --- a/res/cardsfolder/counterintelligence.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Counterintelligence -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U U | TargetMin$ 1 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return one or two target creatures to their owners' hands. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/counterintelligence.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/counterspell.txt b/res/cardsfolder/counterspell.txt deleted file mode 100644 index 67c32404258..00000000000 --- a/res/cardsfolder/counterspell.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Counterspell -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19570.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/57.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/55.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/55.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/67.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/65.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/69.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/64.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/61.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/54.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/77.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/34.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/countersquall.txt b/res/cardsfolder/countersquall.txt deleted file mode 100644 index 6dcde608a16..00000000000 --- a/res/cardsfolder/countersquall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Countersquall -ManaCost:U B -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U B | TargetType$ Spell | ValidTgts$ Card.nonCreature | TgtPrompt$ Select target nonCreature spell | SubAbility$ SVar=DBDrain | SpellDescription$ Counter target noncreature spell. Its controller loses 2 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/countersquall.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/courier_hawk.txt b/res/cardsfolder/courier_hawk.txt deleted file mode 100644 index 69f1c486cc6..00000000000 --- a/res/cardsfolder/courier_hawk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Courier Hawk -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87913.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/couriers_capsule.txt b/res/cardsfolder/couriers_capsule.txt deleted file mode 100644 index f744d1c0df6..00000000000 --- a/res/cardsfolder/couriers_capsule.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Courier's Capsule -ManaCost:1 U -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 1 U T Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/couriers_capsule.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/court_archers.txt b/res/cardsfolder/court_archers.txt deleted file mode 100644 index 4438ef05fdf..00000000000 --- a/res/cardsfolder/court_archers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Court Archers -ManaCost:2 G -Types:Creature Human Archers -Text:no text -PT:1/3 -K:Reach -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/court_archers.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/court_homunculus.txt b/res/cardsfolder/court_homunculus.txt deleted file mode 100644 index cb720fff857..00000000000 --- a/res/cardsfolder/court_homunculus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Court Homunculus -ManaCost:W -Types:Artifact Creature Homunculus -Text:no text -PT:1/1 -K:stPumpSelf:Creature:1/1:isPresent Artifact.Other+YouCtrl:Court Homunculus gets +1/+1 as long as you control another artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/court_homunculus.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cover_of_darkness.txt b/res/cardsfolder/cover_of_darkness.txt deleted file mode 100644 index f92f983e2a2..00000000000 --- a/res/cardsfolder/cover_of_darkness.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cover of Darkness -ManaCost:1 B -Types:Enchantment -Text:As CARDNAME enters the battlefield, choose a creature type. -K:stPumpAll:Creature.ChosenType:0/0/Fear:No Condition:Creatures of the chosen type have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cover_of_darkness.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/covert_operative.txt b/res/cardsfolder/covert_operative.txt deleted file mode 100644 index 63619fd0899..00000000000 --- a/res/cardsfolder/covert_operative.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Covert Operative -ManaCost:4 U -Types:Creature Human Wizard -Text:no text -PT:3/2 -K:Unblockable -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card30659.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/covetous_dragon.txt b/res/cardsfolder/covetous_dragon.txt deleted file mode 100644 index 18f6dd26964..00000000000 --- a/res/cardsfolder/covetous_dragon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Covetous Dragon -ManaCost:4 R -Types:Creature Dragon -Text:no text -PT:6/5 -K:Flying -K:When you control no artifacts, sacrifice CARDNAME. -SVar:NeedsToPlay:Artifact.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/covetous_dragon.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cowardice.txt b/res/cardsfolder/cowardice.txt deleted file mode 100644 index b5cc5cc71cc..00000000000 --- a/res/cardsfolder/cowardice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cowardice -ManaCost:3 U U -Types:Enchantment -Text: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.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cowardice.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/71.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/70.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crab_umbra.txt b/res/cardsfolder/crab_umbra.txt deleted file mode 100644 index aa093a42251..00000000000 --- a/res/cardsfolder/crab_umbra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crab Umbra -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:0/0 -A:AB$ Untap | Cost$ 2 U | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crab_umbra.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crabapple_cohort.txt b/res/cardsfolder/crabapple_cohort.txt deleted file mode 100644 index 96d3ee8ff7c..00000000000 --- a/res/cardsfolder/crabapple_cohort.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crabapple Cohort -ManaCost:4 G -Types:Creature Treefolk Warrior -Text:no text -PT:4/4 -K:stPumpSelf:Creature:1/1:isPresent Creature.Green+Other+YouCtrl:CARDNAME gets +1/+1 as long as you control another green creature. -SVar:BuffedBy:Creature.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crabapple_cohort.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crack_the_earth.txt b/res/cardsfolder/crack_the_earth.txt deleted file mode 100644 index fa686ad7527..00000000000 --- a/res/cardsfolder/crack_the_earth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crack the Earth -ManaCost:R -Types:Sorcery Arcane -A:SP$ Sacrifice | Cost$ R | SacValid$ Permanent | Defined$ Each | SpellDescription$ Each player sacrifices a permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crack_the_earth.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crackdown.txt b/res/cardsfolder/crackdown.txt deleted file mode 100644 index de34f64f82b..00000000000 --- a/res/cardsfolder/crackdown.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crackdown -ManaCost:2 W -Types:Enchantment -Text:Nonwhite creatures with power 3 or greater don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Creature.powerGE3+nonWhite -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crackdown.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crackling_club.txt b/res/cardsfolder/crackling_club.txt deleted file mode 100644 index 66840db5bcc..00000000000 --- a/res/cardsfolder/crackling_club.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crackling Club -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+0 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crackling_club.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cradle_guard.txt b/res/cardsfolder/cradle_guard.txt deleted file mode 100644 index 2741bbc810b..00000000000 --- a/res/cardsfolder/cradle_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cradle Guard -ManaCost:1 G G -Types:Creature Treefolk -Text:no text -PT:4/4 -K:Trample -K:Echo:1 G G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cradle_guard.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cradle_of_vitality.txt b/res/cardsfolder/cradle_of_vitality.txt deleted file mode 100644 index e8d4db26b78..00000000000 --- a/res/cardsfolder/cradle_of_vitality.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cradle of Vitality -ManaCost:3 W -Types:Enchantment -Text:no text -T:Mode$ LifeGained | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ 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. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 1 W | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ X -SVar:X:TriggerCount$LifeAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cradle_of_vitality.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cradle_to_grave.txt b/res/cardsfolder/cradle_to_grave.txt deleted file mode 100644 index 18146124546..00000000000 --- a/res/cardsfolder/cradle_to_grave.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cradle to Grave -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonBlack+enteredBattlefieldThisTurn | TgtPrompt$ Select target nonblack creature that entered the battlefield this turn | SpellDescription$ Destroy target nonblack creature that entered the battlefield this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cradle_to_grave.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/67.jpg -End diff --git a/res/cardsfolder/crafty_pathmage.txt b/res/cardsfolder/crafty_pathmage.txt deleted file mode 100644 index bfbf2dfa603..00000000000 --- a/res/cardsfolder/crafty_pathmage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crafty Pathmage -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerLE2 | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. | TgtPrompt$ Select target creature with power 2 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crafty_pathmage.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/77.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/71.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crag_puca.txt b/res/cardsfolder/crag_puca.txt deleted file mode 100644 index 66243e7ffec..00000000000 --- a/res/cardsfolder/crag_puca.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crag Puca -ManaCost:UR UR UR -Types:Creature Shapeshifter -Text:no text -PT:2/4 -A:AB$ Pump | Cost$ UR | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crag_puca.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cranial_extraction.txt b/res/cardsfolder/cranial_extraction.txt deleted file mode 100644 index a76b4c2c13e..00000000000 --- a/res/cardsfolder/cranial_extraction.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Cranial Extraction -ManaCost:3 B -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80281.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crash.txt b/res/cardsfolder/crash.txt deleted file mode 100644 index 8137f82c96c..00000000000 --- a/res/cardsfolder/crash.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crash -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:AltCost:Sac<1/Mountain> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crash.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crash_landing.txt b/res/cardsfolder/crash_landing.txt deleted file mode 100644 index c4092dc1d6e..00000000000 --- a/res/cardsfolder/crash_landing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crash Landing -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Debuff | Cost$ 2 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | Keywords$ Flying | SubAbility$ DBDamage | SpellDescription$ Target creature with flying loses flying until end of turn. CARDNAME deals damage to that creature equal to the number of Forests you control. -SVar:DBDamage:DB$ DealDamage | Defined$ Targeted | NumDmg$ X -SVar:X:Count$Valid Forest.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crash_landing.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crash_of_rhinos.txt b/res/cardsfolder/crash_of_rhinos.txt deleted file mode 100644 index b297a898dce..00000000000 --- a/res/cardsfolder/crash_of_rhinos.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crash of Rhinos -ManaCost:6 G G -Types:Creature Rhino -Text:no text -PT:8/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3379.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crashing_centaur.txt b/res/cardsfolder/crashing_centaur.txt deleted file mode 100644 index a9cd77c7ba8..00000000000 --- a/res/cardsfolder/crashing_centaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crashing Centaur -ManaCost:4 G G -Types:Creature Centaur -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ G Discard<1/Card> | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -K:stPumpSelf:Creature:2/2/Shroud:Threshold: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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crashing_centaur.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/235.jpg -End diff --git a/res/cardsfolder/crater_hellion.txt b/res/cardsfolder/crater_hellion.txt deleted file mode 100644 index f69ca217291..00000000000 --- a/res/cardsfolder/crater_hellion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crater Hellion -ManaCost:4 R R -Types:Creature Hellion -Text:no text -PT:6/6 -K:Echo:4 R R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME enters the battlefield, it deals 4 damage to each other creature. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.Other | NumDmg$ 4 | ValidDescription$ each other creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crater_hellion.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/craven_giant.txt b/res/cardsfolder/craven_giant.txt deleted file mode 100644 index e7fd53de60d..00000000000 --- a/res/cardsfolder/craven_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Craven Giant -ManaCost:2 R -Types:Creature Giant -Text:no text -PT:4/1 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5130.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/126.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/craven_knight.txt b/res/cardsfolder/craven_knight.txt deleted file mode 100644 index f5204b1878a..00000000000 --- a/res/cardsfolder/craven_knight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Craven Knight -ManaCost:1 B -Types:Creature Human Knight -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4213.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/craw_giant.txt b/res/cardsfolder/craw_giant.txt deleted file mode 100644 index 28321f3e6bf..00000000000 --- a/res/cardsfolder/craw_giant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Craw Giant -ManaCost:3 G G G G -Types:Creature Giant -Text:no text -PT:6/4 -K:Trample -K:Rampage 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/craw_giant.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/147.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/76.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/craw_wurm.txt b/res/cardsfolder/craw_wurm.txt deleted file mode 100644 index 1a76d275c58..00000000000 --- a/res/cardsfolder/craw_wurm.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Craw Wurm -ManaCost:4 G G -Types:Creature Wurm -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83040.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/239.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/99.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/99.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/148.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/122.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/233.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/257.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/173.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/97.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crawling_filth.txt b/res/cardsfolder/crawling_filth.txt deleted file mode 100644 index 72f2aa3384a..00000000000 --- a/res/cardsfolder/crawling_filth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crawling Filth -ManaCost:5 B -Types:Creature Spirit -Text:no text -PT:2/2 -K:Fear -K:Soulshift:5 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crawling_filth.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crawlspace.txt b/res/cardsfolder/crawlspace.txt deleted file mode 100644 index d3a31cc2628..00000000000 --- a/res/cardsfolder/crawlspace.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Crawlspace -ManaCost:3 -Types:Artifact -Text:No more than two creatures can attack you each combat. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crawlspace.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crazed_armodon.txt b/res/cardsfolder/crazed_armodon.txt deleted file mode 100644 index 3fefd05a884..00000000000 --- a/res/cardsfolder/crazed_armodon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crazed Armodon -ManaCost:2 G G -Types:Creature Elephant -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ G | NumAtt$ +3 | KW$ Trample & HIDDEN At the beginning of the end step, destroy CARDNAME. | ActivationLimit$ 1 | SpellDescription$ CARDNAME 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_armodon.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crazed_goblin.txt b/res/cardsfolder/crazed_goblin.txt deleted file mode 100644 index 8b97f5b5e49..00000000000 --- a/res/cardsfolder/crazed_goblin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crazed Goblin -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crazed_goblin.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crazed_skirge.txt b/res/cardsfolder/crazed_skirge.txt deleted file mode 100644 index 2d8649772e4..00000000000 --- a/res/cardsfolder/crazed_skirge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crazed Skirge -ManaCost:3 B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5555.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/creakwood_ghoul.txt b/res/cardsfolder/creakwood_ghoul.txt deleted file mode 100644 index e9482909947..00000000000 --- a/res/cardsfolder/creakwood_ghoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Creakwood Ghoul -ManaCost:4 B -Types:Creature Plant Zombie -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ BG BG | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ SVar=DBGainLife | SpellDescription$ Exile target card from a graveyard. You gain 1 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/creakwood_ghoul.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/creakwood_liege.txt b/res/cardsfolder/creakwood_liege.txt deleted file mode 100644 index 4e1e3de37a8..00000000000 --- a/res/cardsfolder/creakwood_liege.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Creakwood Liege -ManaCost:1 BG BG BG -Types:Creature Horror -Text:no text -PT:2/2 -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -K:stPumpAll:Creature.Black+Other+YouCtrl:1/1:No Condition:Other black creatures you control get +1/+1. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may put a 1/1 black and green Worm creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Worm | TokenTypes$ Creature,Worm | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/creakwood_liege.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cream_of_the_crop.txt b/res/cardsfolder/cream_of_the_crop.txt deleted file mode 100644 index f83871755b2..00000000000 --- a/res/cardsfolder/cream_of_the_crop.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cream of the Crop -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ X | ChangeNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 -SVar:X:TriggeredCard$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cream_of_the_crop.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/creeping_corrosion.txt b/res/cardsfolder/creeping_corrosion.txt deleted file mode 100644 index 0bdfc1215c3..00000000000 --- a/res/cardsfolder/creeping_corrosion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Creeping Corrosion -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 G G | ValidCards$ Artifact | SpellDescription$ Destroy all artifacts. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/creeping_corrosion.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/78.jpg -End diff --git a/res/cardsfolder/creeping_mold.txt b/res/cardsfolder/creeping_mold.txt deleted file mode 100644 index 65068168dd1..00000000000 --- a/res/cardsfolder/creeping_mold.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Creeping Mold -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Artifact,Enchantment,Land | TgtPrompt$ Select target artifact, enchantment or land | SpellDescription$ Destroy target artifact, enchantment or land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/creeping_mold.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/240.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/236.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/234.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/258.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/53.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/220.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/117.jpg -End diff --git a/res/cardsfolder/creeping_tar_pit.txt b/res/cardsfolder/creeping_tar_pit.txt deleted file mode 100644 index 0367dd8d53e..00000000000 --- a/res/cardsfolder/creeping_tar_pit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Creeping Tar Pit -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Animate | Cost$ 1 U B | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Elemental | Colors$ Blue,Black | Keywords$ HIDDEN Unblockable | SpellDescription$ Until end of turn, CARDNAME becomes a 3/2 blue and black Elemental creature and is unblockable. It's still a land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/creeping_tar_pit.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cremate.txt b/res/cardsfolder/cremate.txt deleted file mode 100644 index 7dbee4af838..00000000000 --- a/res/cardsfolder/cremate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cremate -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cremate.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/45.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crenellated_wall.txt b/res/cardsfolder/crenellated_wall.txt deleted file mode 100644 index 8ead4505dc4..00000000000 --- a/res/cardsfolder/crenellated_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crenellated Wall -ManaCost:4 -Types:Artifact Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +4 | SpellDescription$ Target creature gets +0/+4 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crenellated_wall.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/290.jpg -End diff --git a/res/cardsfolder/crevasse.txt b/res/cardsfolder/crevasse.txt deleted file mode 100644 index 364af882c83..00000000000 --- a/res/cardsfolder/crevasse.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crevasse -ManaCost:2 R -Types:Enchantment -Text:Creatures with mountainwalk can be blocked as though they didn't have mountainwalk. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crevasse.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crib_swap.txt b/res/cardsfolder/crib_swap.txt deleted file mode 100644 index 482fa9e731a..00000000000 --- a/res/cardsfolder/crib_swap.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crib Swap -ManaCost:2 W -Types:Tribal Instant Shapeshifter -Text:no text -K:Changeling -A:SP$ ChangeZone | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | IsCurse$ True | SubAbility$ SVar=DBToken | SpellDescription$ Exile target creature. Its controller puts a 1/1 colorless Shapeshifter creature token with changeling onto the battlefield. -SVar:DBToken:DB$Token | TokenImage$ C 1 1 Shapeshifter | TokenColors$ Colorless | TokenAmount$ 1 | TokenName$ Changeling | TokenTypes$ Creature,Shapeshifter | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Changeling | TokenOwner$ TargetedController -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crib_swap.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crimson_acolyte.txt b/res/cardsfolder/crimson_acolyte.txt deleted file mode 100644 index b2eedcfbcfc..00000000000 --- a/res/cardsfolder/crimson_acolyte.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crimson Acolyte -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Protection from red -A:AB$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from red | SpellDescription$ Target creature gains protection from red until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crimson_acolyte.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/11.jpg -End diff --git a/res/cardsfolder/crimson_kobolds.txt b/res/cardsfolder/crimson_kobolds.txt deleted file mode 100644 index b822a5e602d..00000000000 --- a/res/cardsfolder/crimson_kobolds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crimson Kobolds -ManaCost:0 -Types:Creature Kobold -Text:no text -PT:0/1 -K:CARDNAME is red. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crimson_kobolds.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crimson_manticore.txt b/res/cardsfolder/crimson_manticore.txt deleted file mode 100644 index ab42b655e18..00000000000 --- a/res/cardsfolder/crimson_manticore.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crimson Manticore -ManaCost:2 R R -Types:Creature Manticore -Text:no text -PT:2/2 -K:Flying -A:AB$ DealDamage | Cost$ R T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crimson_manticore.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/217.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/201.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crimson_roc.txt b/res/cardsfolder/crimson_roc.txt deleted file mode 100644 index c7a3ae96952..00000000000 --- a/res/cardsfolder/crimson_roc.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crimson Roc -ManaCost:4 R -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.withoutFlying | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature without flying, CARDNAME gets +1/+0 and gains first strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | KW$ First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crimson_roc.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crimson_wisps.txt b/res/cardsfolder/crimson_wisps.txt deleted file mode 100644 index 4ea3bd2e481..00000000000 --- a/res/cardsfolder/crimson_wisps.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crimson Wisps -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature becomes red and gains haste until end of turn. Draw a card. -SVar:DBDraw:DB$Draw | SubAbility$ SVar=DBColor | NumCards$ 1 -SVar:DBColor:DB$Animate | Colors$ Red | OverwriteColors$ True | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crimson_wisps.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crippling_fatigue.txt b/res/cardsfolder/crippling_fatigue.txt deleted file mode 100644 index 2a5d36c33e2..00000000000 --- a/res/cardsfolder/crippling_fatigue.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crippling Fatigue -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -A:SP$ Pump | Cost$ 1 B PayLife<3> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | Flashback$ True | CostDesc$ Flashback 1 B, Pay 3 life | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crippling_fatigue.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cromat.txt b/res/cardsfolder/cromat.txt deleted file mode 100644 index cf91734fdb5..00000000000 --- a/res/cardsfolder/cromat.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cromat -ManaCost:W U B R G -Types:Legendary Creature Illusion -Text:no text -PT:5/5 -A:AB$ Destroy | Cost$ W B | ValidTgts$ Creature.blockingSource,Creature.blockedBySource | TgtPrompt$ Select target creature blocking or blocked by Cromat | SpellDescription$ Destroy target creature blocking or blocked by CARDNAME. -A:AB$ Pump | Cost$ U R | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Regenerate | Cost$ B G | SpellDescription$ Regenerate CARDNAME. -A:AB$ Pump | Cost$ R W | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ ChangeZone | Cost$ G U | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put CARDNAME on top of its owner's library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cromat.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crookclaw_elder.txt b/res/cardsfolder/crookclaw_elder.txt deleted file mode 100644 index 909a2efe83b..00000000000 --- a/res/cardsfolder/crookclaw_elder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crookclaw Elder -ManaCost:5 U -Types:Creature Bird Wizard -Text:no text -PT:3/2 -K:Flying -A:AB$ Draw | Cost$ tapXType<2/Bird> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ Pump | Cost$ tapXType<2/Wizard> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crookclaw_elder.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/34.jpg -End diff --git a/res/cardsfolder/crookclaw_transmuter.txt b/res/cardsfolder/crookclaw_transmuter.txt deleted file mode 100644 index 639bf5baae8..00000000000 --- a/res/cardsfolder/crookclaw_transmuter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Crookclaw Transmuter -ManaCost:3 U -Types:Creature Bird Wizard -Text:no text -PT:3/1 -K:Flash -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, switch target creature's power and toughness until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crookclaw_transmuter.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crookshank_kobolds.txt b/res/cardsfolder/crookshank_kobolds.txt deleted file mode 100644 index 4c0be8893ff..00000000000 --- a/res/cardsfolder/crookshank_kobolds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crookshank Kobolds -ManaCost:0 -Types:Creature Kobold -Text:no text -PT:0/1 -K:CARDNAME is red. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crookshank_kobolds.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crop_rotation.txt b/res/cardsfolder/crop_rotation.txt deleted file mode 100644 index 83ee7586365..00000000000 --- a/res/cardsfolder/crop_rotation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crop Rotation -ManaCost:G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ G Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ Search your library for a land card and put that card onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crop_rotation.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crosiss_attendant.txt b/res/cardsfolder/crosiss_attendant.txt deleted file mode 100644 index e6f1caa175e..00000000000 --- a/res/cardsfolder/crosiss_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crosis's Attendant -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ U B R | SpellDescription$ Add U B R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crosiss_attendant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crosiss_catacombs.txt b/res/cardsfolder/crosiss_catacombs.txt deleted file mode 100644 index 7ce971fd219..00000000000 --- a/res/cardsfolder/crosiss_catacombs.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crosis's Catacombs -ManaCost:no cost -Types:Land Lair -Text:When CARDNAME enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:NeedsToPlay:Land.nonLair+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crosiss_catacombs.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crosiss_charm.txt b/res/cardsfolder/crosiss_charm.txt deleted file mode 100644 index f03c65a83ea..00000000000 --- a/res/cardsfolder/crosiss_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crosis's Charm -ManaCost:U B R -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U B R | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | PrecostDesc$ Choose one - | SpellDescription$ Return target permanent to its owner's hand; -A:SP$ Destroy | Cost$ U B R | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ or destroy target nonblack creature, and it can't be regenerated; -A:SP$ Destroy | Cost$ U B R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ or destroy target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crosiss_charm.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crossbow_ambush.txt b/res/cardsfolder/crossbow_ambush.txt deleted file mode 100644 index 608f5eb8b2c..00000000000 --- a/res/cardsfolder/crossbow_ambush.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crossbow Ambush -ManaCost:G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ G | ValidCards$ Creature.YouCtrl | KW$ Reach | SpellDescription$ Creatures you control gain reach until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crossbow_ambush.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/55.jpg -End - - diff --git a/res/cardsfolder/crossbow_infantry.txt b/res/cardsfolder/crossbow_infantry.txt deleted file mode 100644 index 38519135cfa..00000000000 --- a/res/cardsfolder/crossbow_infantry.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crossbow Infantry -ManaCost:1 W -Types:Creature Human Soldier Archer -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crossbow_infantry.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/15.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/16.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/12.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crosswinds.txt b/res/cardsfolder/crosswinds.txt deleted file mode 100644 index a073b729ef4..00000000000 --- a/res/cardsfolder/crosswinds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crosswinds -ManaCost:2 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.withFlying:-2/0/:No Condition:Creatures with flying get -2/-0. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crosswinds.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crovax_ascendant_hero.txt b/res/cardsfolder/crovax_ascendant_hero.txt deleted file mode 100644 index d5147cb6f9a..00000000000 --- a/res/cardsfolder/crovax_ascendant_hero.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crovax, Ascendant Hero -ManaCost:4 W W -Types:Legendary Creature Human -Text:no text -PT:4/4 -K:stPumpAll:Creature.White+Other:1/1:No Condition:Other white creatures get +1/+1. -K:stPumpAll:Creature.nonWhite:-1/-1:No Condition:Nonwhite creatures get -1/-1. -A:AB$ ChangeZone | Cost$ PayLife<2> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crovax_ascendant_hero.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crowd_favorites.txt b/res/cardsfolder/crowd_favorites.txt deleted file mode 100644 index fb3894eeac7..00000000000 --- a/res/cardsfolder/crowd_favorites.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crowd Favorites -ManaCost:6 W -Types:Creature Human Soldier -Text:no text -PT:4/4 -A:AB$ Tap | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -A:AB$ Pump | Cost$ 3 W | NumDef$ +5 | SpellDescription$ CARDNAME gets +0/+5 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crowd_favorites.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/15.jpg -End diff --git a/res/cardsfolder/crowd_of_cinders.txt b/res/cardsfolder/crowd_of_cinders.txt deleted file mode 100644 index 950145af9dc..00000000000 --- a/res/cardsfolder/crowd_of_cinders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crowd of Cinders -ManaCost:3 B -Types:Creature Elemental -Text:no text -PT:*/* -K:Fear -K:stSetPT:Count$Valid Permanent.Black+YouCtrl:Count$Valid Permanent.Black+YouCtrl:Crowd of Cinders's power and toughness are each equal to the number of black permanents you control. -SVar:BuffedBy:Permanent.Black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crowd_of_cinders.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crown_of_flames.txt b/res/cardsfolder/crown_of_flames.txt deleted file mode 100644 index 74e8358e4e9..00000000000 --- a/res/cardsfolder/crown_of_flames.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crown of Flames -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -A:AB$ ChangeZone | Cost$ R | Origin$ Battlefield | Destination$ Hand | Defined$ Self | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crown_of_flames.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/169.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crucible_of_fire.txt b/res/cardsfolder/crucible_of_fire.txt deleted file mode 100644 index e42af2818d3..00000000000 --- a/res/cardsfolder/crucible_of_fire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crucible of Fire -ManaCost:3 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Dragon+YouCtrl:3/3:No Condition:Dragon creatures you control get +3/+3. -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crucible_of_fire.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crucible_of_worlds.txt b/res/cardsfolder/crucible_of_worlds.txt deleted file mode 100644 index d1811f6011e..00000000000 --- a/res/cardsfolder/crucible_of_worlds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crucible of Worlds -ManaCost:3 -Types:Artifact -Text:You may play land cards from your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crucible_of_worlds.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/114.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crude_rampart.txt b/res/cardsfolder/crude_rampart.txt deleted file mode 100644 index b706658449c..00000000000 --- a/res/cardsfolder/crude_rampart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crude Rampart -ManaCost:3 W -Types:Creature Wall -Text:no text -PT:4/5 -K:Defender -K:Morph:4 W -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crude_rampart.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_bargain.txt b/res/cardsfolder/cruel_bargain.txt deleted file mode 100644 index 6d565cb7cf9..00000000000 --- a/res/cardsfolder/cruel_bargain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cruel Bargain -ManaCost:B B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ B B B | NumCards$ 4 | SubAbility$ SVar=DBLoseLife | SpellDescription$ Draw four cards. You lose half your life, rounded up. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ X -SVar:X:Count$YourLifeTotal/HalfUp -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4214.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_edict.txt b/res/cardsfolder/cruel_edict.txt deleted file mode 100644 index 2802cb52bfb..00000000000 --- a/res/cardsfolder/cruel_edict.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cruel Edict -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target opponent sacrifices a creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cruel_edict.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/7.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/121.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_fate.txt b/res/cardsfolder/cruel_fate.txt deleted file mode 100644 index 4d3f9a674ab..00000000000 --- a/res/cardsfolder/cruel_fate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cruel Fate -ManaCost:4 U -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 4 U | ValidTgts$ Opponent | DigNum$ 5 | ChangeNum$ 1 | DestinationZone$ Graveyard | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/cruel_fate.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_revival.txt b/res/cardsfolder/cruel_revival.txt deleted file mode 100644 index 14adc73724e..00000000000 --- a/res/cardsfolder/cruel_revival.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cruel Revival -ManaCost:4 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Creature.nonZombie | TgtPrompt$ Select target non-Zombie creature | NoRegen$ True | SubAbility$ SVar=DBReturn | SpellDescription$ Destroy target non-Zombie creature. It can't be regenerated. Return up to one target Zombie card from your graveyard to your hand. -SVar:DBReturn:DB$ChangeZone | Cost$ 0 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target Zombie card in your graveyard | ValidTgts$ Zombie.YouCtrl | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cruel_revival.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_tutor.txt b/res/cardsfolder/cruel_tutor.txt deleted file mode 100644 index b2a1b04ca5b..00000000000 --- a/res/cardsfolder/cruel_tutor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cruel Tutor -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SubAbility$ SVar=DBLoseLife | SpellDescription$ Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/cruel_tutor.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cruel_ultimatum.txt b/res/cardsfolder/cruel_ultimatum.txt deleted file mode 100644 index 6da5a10728d..00000000000 --- a/res/cardsfolder/cruel_ultimatum.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cruel Ultimatum -ManaCost:U U B B B R R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ U U B B B R R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SacValid$ Creature | SubAbility$ SVar=DBDiscardOpp | SpellDescription$ 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. -SVar:DBDiscardOpp:DB$Discard | Defined$ Targeted | NumCards$ 3 | Mode$ TgtChoose | SubAbility$ SVar=DBLoseLifeOpp -SVar:DBLoseLifeOpp:DB$LoseLife | Defined$ Targeted | LifeAmount$ 5 | SubAbility$ SVar=DBResurrectYou -SVar:DBResurrectYou:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Mandatory$ True | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ SVar=DBDrawYou -SVar:DBDrawYou:DB$Draw | NumCards$ 3 | SubAbility$ SVar=DBGainLifeYou -SVar:DBGainLifeYou:DB$GainLife | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cruel_ultimatum.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crumble.txt b/res/cardsfolder/crumble.txt deleted file mode 100644 index 403555c2b10..00000000000 --- a/res/cardsfolder/crumble.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Crumble -ManaCost:G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | NoRegen$ True | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target artifact. It can't be regenerated. That artifact's controller gains life equal to its converted mana cost. -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crumble.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/149.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/98.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/123.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/62.jpg -End diff --git a/res/cardsfolder/crumbling_ashes.txt b/res/cardsfolder/crumbling_ashes.txt deleted file mode 100644 index f09230dfeef..00000000000 --- a/res/cardsfolder/crumbling_ashes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crumbling Ashes -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your upkeep, destroy target creature with a -1/-1 counter on it. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.countersGE1M1M1 | TgtPrompt$ Select target creature with a -1/-1 counter on it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crumbling_ashes.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crumbling_necropolis.txt b/res/cardsfolder/crumbling_necropolis.txt deleted file mode 100644 index 9397338e080..00000000000 --- a/res/cardsfolder/crumbling_necropolis.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crumbling Necropolis -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crumbling_necropolis.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crumbling_sanctuary.txt b/res/cardsfolder/crumbling_sanctuary.txt deleted file mode 100644 index 7197647e08c..00000000000 --- a/res/cardsfolder/crumbling_sanctuary.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crumbling Sanctuary -ManaCost:5 -Types:Artifact -Text:For each 1 damage that would be dealt to a player, that player exiles the top card of his or her library instead. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crumbling_sanctuary.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crusade.txt b/res/cardsfolder/crusade.txt deleted file mode 100644 index b9df7489a42..00000000000 --- a/res/cardsfolder/crusade.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Crusade -ManaCost:W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White:1/1:No Condition:White creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crusade.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/200.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/202.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/298.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/270.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/13.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/199.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crusading_knight.txt b/res/cardsfolder/crusading_knight.txt deleted file mode 100644 index 3ef1cd8657a..00000000000 --- a/res/cardsfolder/crusading_knight.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crusading Knight -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Protection from black -K:stPumpSelf:Creature:X/X:no Condition:Crusading Knight gets +1/+1 for each Swamp your opponents control. -SVar:X:Count$Valid Swamp.YouDontCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crusading_knight.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crush.txt b/res/cardsfolder/crush.txt deleted file mode 100644 index 987ef4bdfc5..00000000000 --- a/res/cardsfolder/crush.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crush -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Destroy target noncreature artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crush.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/61.jpg -End diff --git a/res/cardsfolder/crush_of_wurms.txt b/res/cardsfolder/crush_of_wurms.txt deleted file mode 100644 index 3c851d45204..00000000000 --- a/res/cardsfolder/crush_of_wurms.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crush of Wurms -ManaCost:6 G G G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 6 G G G | TokenAmount$ 3 | TokenName$ Wurm | TokenColors$ Green | TokenTypes$ Creature,Wurm | TokenOwner$ You | TokenPower$ 6 | TokenToughness$ 6 | SpellDescription$ Put three 6/6 green Wurm creature tokens onto the battlefield. -A:SP$ Token | Cost$ 9 G G G | TokenAmount$ 3 | TokenName$ Wurm | TokenColors$ Green | TokenTypes$ Creature,Wurm | TokenOwner$ You | TokenPower$ 6 | TokenToughness$ 6 | Flashback$ True | CostDesc$ Flashback 9 G G G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crush_of_wurms.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crusher_zendikon.txt b/res/cardsfolder/crusher_zendikon.txt deleted file mode 100644 index 9cf7fc4f8f0..00000000000 --- a/res/cardsfolder/crusher_zendikon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crusher Zendikon -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:4/2/Trample:Creature,Beast:Red:No Abilities:isPresent Card.AttachedBy:Enchanted land is a 4/2 red Beast creature with trample. It's still a land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land is put into a graveyard, return that card to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crusher_zendikon.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crushing_pain.txt b/res/cardsfolder/crushing_pain.txt deleted file mode 100644 index 6392b07e7f4..00000000000 --- a/res/cardsfolder/crushing_pain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Crushing Pain -ManaCost:1 R -Types:Instant Arcane -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.wasDealtDamageThisTurn | TgtPrompt$ Select target creature that was dealt damage this turn | NumDmg$ 6 | SpellDescription$ CARDNAME deals 6 damage to target creature that was dealt damage this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crushing_pain.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cryoclasm.txt b/res/cardsfolder/cryoclasm.txt deleted file mode 100644 index 9f547765e65..00000000000 --- a/res/cardsfolder/cryoclasm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cryoclasm -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Plains,Island | TgtPrompt$ Choose target plains or island. | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy target Plains or Island. CARDNAME deals 3 damage to that land's controller. -SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cryoclasm.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/79.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crypt_angel.txt b/res/cardsfolder/crypt_angel.txt deleted file mode 100644 index 1659e7c97bf..00000000000 --- a/res/cardsfolder/crypt_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crypt Angel -ManaCost:4 B -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -K:Protection from white -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target blue or red creature card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.Blue+YouCtrl,Creature.Red+YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_angel.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crypt_cobra.txt b/res/cardsfolder/crypt_cobra.txt deleted file mode 100644 index 8495e65a555..00000000000 --- a/res/cardsfolder/crypt_cobra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crypt Cobra -ManaCost:3 B -Types:Creature Snake -Text:no text -PT:3/3 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ Opponent | Num$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_cobra.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crypt_creeper.txt b/res/cardsfolder/crypt_creeper.txt deleted file mode 100644 index 6671baf15c9..00000000000 --- a/res/cardsfolder/crypt_creeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crypt Creeper -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/1 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_creeper.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crypt_of_agadeem.txt b/res/cardsfolder/crypt_of_agadeem.txt deleted file mode 100644 index 384289875e5..00000000000 --- a/res/cardsfolder/crypt_of_agadeem.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Crypt of Agadeem -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each black creature card in your graveyard. -SVar:X:Count$TypeInYourYard.Creature.Black -#gotta test that -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_of_agadeem.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crypt_ripper.txt b/res/cardsfolder/crypt_ripper.txt deleted file mode 100644 index 62228d9c3e9..00000000000 --- a/res/cardsfolder/crypt_ripper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crypt Ripper -ManaCost:2 B B -Types:Creature Shade -Text:no text -PT:2/2 -K:Haste -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_ripper.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/85.jpg -End diff --git a/res/cardsfolder/crypt_sliver.txt b/res/cardsfolder/crypt_sliver.txt deleted file mode 100644 index b667f64038c..00000000000 --- a/res/cardsfolder/crypt_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crypt Sliver -ManaCost:1 B -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=Regen:no Condition:All Slivers have "Tap, Regenerate target Sliver." -SVar:Regen:AB$Regenerate | Cost$ T | ValidTgts$ Sliver | TgtPrompt$ Select a target Sliver. | SpellDescription$ Regenerate a target Sliver. -SVar:BuffedBy:Sliver -SVar:Picture:http://www.wizards.com/global/images/magic/general/crypt_sliver.jpg -SVar:Rarity:Common -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cryptic_annelid.txt b/res/cardsfolder/cryptic_annelid.txt deleted file mode 100644 index 91f747ed6de..00000000000 --- a/res/cardsfolder/cryptic_annelid.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cryptic Annelid -ManaCost:3 U -Types:Creature Worm Beast -Text:no text -PT:1/4 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1, then scry 2, then scry 3. -SVar:TrigScry:AB$Scry | Cost$ 0 | ScryNum$ 1 | SubAbility$ SVar=DBScry2 -SVar:DBScry2:DB$Scry | ScryNum$ 2 | SubAbility$ SVar=DBScry3 -SVar:DBScry3:DB$Scry | ScryNum$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptic_annelid.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cryptic_command.txt b/res/cardsfolder/cryptic_command.txt deleted file mode 100644 index 80971687420..00000000000 --- a/res/cardsfolder/cryptic_command.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cryptic Command -ManaCost:1 U U U -Types:Instant -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptic_command.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cryptwailing.txt b/res/cardsfolder/cryptwailing.txt deleted file mode 100644 index 3d2031bf49c..00000000000 --- a/res/cardsfolder/cryptwailing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cryptwailing -ManaCost:3 B -Types:Enchantment -Text:no text -A:AB$ Discard | Cost$ 1 ExileFromGrave<2/Creature> | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cryptwailing.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/47.jpg -End - diff --git a/res/cardsfolder/crystal_ball.txt b/res/cardsfolder/crystal_ball.txt deleted file mode 100644 index 266aeddc48c..00000000000 --- a/res/cardsfolder/crystal_ball.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crystal Ball -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Scry | Cost$ 1 T | ScryNum$ 2 |SpellDescription$ 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.) -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_ball.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_chimes.txt b/res/cardsfolder/crystal_chimes.txt deleted file mode 100644 index 8d8d4898f5a..00000000000 --- a/res/cardsfolder/crystal_chimes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Crystal Chimes -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ ChangeZoneAll | Cost$ 3 T Sac<1/CARDNAME> | ChangeType$ Enchantment.YouOwn | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return all enchantment cards from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_chimes.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_quarry.txt b/res/cardsfolder/crystal_quarry.txt deleted file mode 100644 index 1afdd27053c..00000000000 --- a/res/cardsfolder/crystal_quarry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crystal Quarry -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 5 T | Produced$ W U B R G | SpellDescription$ Add W U B R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_quarry.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_rod.txt b/res/cardsfolder/crystal_rod.txt deleted file mode 100644 index 0e9332b735b..00000000000 --- a/res/cardsfolder/crystal_rod.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Crystal Rod -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a blue spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_rod.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/295.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/239.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/241.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/291.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/361.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/329.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/277.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/242.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_seer.txt b/res/cardsfolder/crystal_seer.txt deleted file mode 100644 index 7b209634b33..00000000000 --- a/res/cardsfolder/crystal_seer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Crystal Seer -ManaCost:4 U -Types:Creature Vedalken Wizard -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 4 U | Origin$ Battlefield | Destination$ Hand | Defined$ Self | SpellDescription$ Return CARDNAME to it's owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -Svar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_seer.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_shard.txt b/res/cardsfolder/crystal_shard.txt deleted file mode 100644 index 56a828d1ab8..00000000000 --- a/res/cardsfolder/crystal_shard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crystal Shard -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Return target creature to its owner's hand unless its controller pays 1. -A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Return target creature to its owner's hand unless its controller pays 1. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_shard.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystal_vein.txt b/res/cardsfolder/crystal_vein.txt deleted file mode 100644 index 7d8795cae2f..00000000000 --- a/res/cardsfolder/crystal_vein.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Crystal Vein -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystal_vein.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/322.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/290.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystalline_sliver.txt b/res/cardsfolder/crystalline_sliver.txt deleted file mode 100644 index 82c442ec5aa..00000000000 --- a/res/cardsfolder/crystalline_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crystalline Sliver -ManaCost:W U -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Shroud:no Condition:All Slivers have shroud. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystalline_sliver.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/crystallization.txt b/res/cardsfolder/crystallization.txt deleted file mode 100644 index f510726e142..00000000000 --- a/res/cardsfolder/crystallization.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Crystallization -ManaCost:GU W -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -K:When enchanted creature becomes the target of a spell or ability, exile that creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/crystallization.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cudgel_troll.txt b/res/cardsfolder/cudgel_troll.txt deleted file mode 100644 index 3323cbec12e..00000000000 --- a/res/cardsfolder/cudgel_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cudgel Troll -ManaCost:2 G G -Types:Creature Troll -Text:no text -PT:4/3 -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cudgel_troll.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/167.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/culling_dais.txt b/res/cardsfolder/culling_dais.txt deleted file mode 100644 index 364b234355e..00000000000 --- a/res/cardsfolder/culling_dais.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Culling Dais -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T Sac<1/Creature> | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ X | SpellDescription$ Draw a card for each charge counter on Culling Dais. -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_dais.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/culling_sun.txt b/res/cardsfolder/culling_sun.txt deleted file mode 100644 index ce86d514469..00000000000 --- a/res/cardsfolder/culling_sun.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Culling Sun -ManaCost:2 W W B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 W W B | ValidCards$ Creature.cmcLE3 | SpellDescription$ Destroy each creature with converted manacost 3 or less. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_sun.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/109.jpg -End diff --git a/res/cardsfolder/culling_the_weak.txt b/res/cardsfolder/culling_the_weak.txt deleted file mode 100644 index 23799946d76..00000000000 --- a/res/cardsfolder/culling_the_weak.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Culling the Weak -ManaCost:B -Types:Instant -Text:no text -A:SP$ Mana | Cost$ B Sac<1/Creature> | Produced$ B | Amount$ 4 | SpellDescription$ Add B B B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/culling_the_weak.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cultbrand_cinder.txt b/res/cardsfolder/cultbrand_cinder.txt deleted file mode 100644 index ff5acfe4157..00000000000 --- a/res/cardsfolder/cultbrand_cinder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cultbrand Cinder -ManaCost:4 BR -Types:Creature Elemental Shaman -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on target creature. -SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cultbrand_cinder.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cultivate.txt b/res/cardsfolder/cultivate.txt deleted file mode 100644 index f6174557ded..00000000000 --- a/res/cardsfolder/cultivate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cultivate -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SubAbility$ SVar=DBChangeZone | SpellDescription$ 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. -SVar:DBChangeZone:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cultivate.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cumber_stone.txt b/res/cardsfolder/cumber_stone.txt deleted file mode 100644 index 4e4588570ba..00000000000 --- a/res/cardsfolder/cumber_stone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cumber Stone -ManaCost:3 U -Types:Artifact -Text:no text -K:stPumpAll:Creature.YouDontCtrl:-1/0:No Condition:Creatures your opponents control get -1/-0. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cumber_stone.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cunning.txt b/res/cardsfolder/cunning.txt deleted file mode 100644 index da34fe7372c..00000000000 --- a/res/cardsfolder/cunning.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Cunning -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | DelayedTrigger$ DelayedTrig | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice CARDNAME at the beginning of the next cleanup step. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield| DelayedTrigger$ DelayedTrig | Secondary$ True | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice CARDNAME at the beginning of the next cleanup step. -SVar:DelayedTrig:Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Each | Execute$ TrigSac | TriggerDescription$ Sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cunning_advisor.txt b/res/cardsfolder/cunning_advisor.txt deleted file mode 100644 index 167f95bf46f..00000000000 --- a/res/cardsfolder/cunning_advisor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cunning Advisor -ManaCost:3 B -Types:Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ T | ValidTgts$ Opponent | NumCards$ 1 | Mode$ TgtChoose | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Target opponent discards a card. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_advisor.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cunning_lethemancer.txt b/res/cardsfolder/cunning_lethemancer.txt deleted file mode 100644 index 4c32600b749..00000000000 --- a/res/cardsfolder/cunning_lethemancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cunning Lethemancer -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of your upkeep, each player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_lethemancer.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cunning_sparkmage.txt b/res/cardsfolder/cunning_sparkmage.txt deleted file mode 100644 index 28a73b9a662..00000000000 --- a/res/cardsfolder/cunning_sparkmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cunning Sparkmage -ManaCost:2 R -Types:Creature Human Shaman -Text:no text -PT:0/1 -K:Haste -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning_sparkmage.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/curfew.txt b/res/cardsfolder/curfew.txt deleted file mode 100644 index 2a4ef24b9b0..00000000000 --- a/res/cardsfolder/curfew.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Curfew -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | Hidden$ True | IsCurse$ True | SubAbility$ SVar=DBChangeZone | SpellDescription$ Each player returns a creature he or she controls to its owner's hand. -SVar:DBChangeZone:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Opponent | ChangeType$ Creature | ChangeNum$ 1 | Hidden$ True | IsCurse$ True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/curfew.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/curiosity.txt b/res/cardsfolder/curiosity.txt deleted file mode 100644 index 66205f1f65e..00000000000 --- a/res/cardsfolder/curiosity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Curiosity -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Opponent | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/curiosity.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/72.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/curse_of_chains.txt b/res/cardsfolder/curse_of_chains.txt deleted file mode 100644 index f296b54b774..00000000000 --- a/res/cardsfolder/curse_of_chains.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Curse of Chains -ManaCost:1 WU -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ At the beginning of each upkeep, tap enchanted creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ Enchanted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_chains.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/curse_of_marit_lage.txt b/res/cardsfolder/curse_of_marit_lage.txt deleted file mode 100644 index 87305ceb2fc..00000000000 --- a/res/cardsfolder/curse_of_marit_lage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Curse of Marit Lage -ManaCost:3 R R -Types:Enchantment -Text:Islands don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Island -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all Islands. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Island -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_marit_lage.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/curse_of_wizardry.txt b/res/cardsfolder/curse_of_wizardry.txt deleted file mode 100644 index 5ec47b33133..00000000000 --- a/res/cardsfolder/curse_of_wizardry.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Curse of Wizardry -ManaCost:2 B B -Types:Enchantment -Text:As Curse of Wizardry enters the battlefield, choose a color.\r\nWhenever a player casts a spell of the chosen color, that player loses 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/curse_of_wizardry.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursecatcher.txt b/res/cardsfolder/cursecatcher.txt deleted file mode 100644 index c7cf0611520..00000000000 --- a/res/cardsfolder/cursecatcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cursecatcher -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target Instant or Sorcery Spell | UnlessCost$ 1 | SpellDescription$ Counter target instant or sorcery spell unless its controller pays 1. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursecatcher.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursed_flesh.txt b/res/cardsfolder/cursed_flesh.txt deleted file mode 100644 index 4e13684313a..00000000000 --- a/res/cardsfolder/cursed_flesh.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cursed Flesh -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:-1/-1/Fear -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_flesh.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/56.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursed_land.txt b/res/cardsfolder/cursed_land.txt deleted file mode 100644 index d4678a4e8c1..00000000000 --- a/res/cardsfolder/cursed_land.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Cursed Land -ManaCost:2 B B -Types:Enchantment Aura -Text:no text -K:Enchant Land Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted land's controller, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_land.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/6.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/6.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/14.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/11.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/6.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursed_rack.txt b/res/cardsfolder/cursed_rack.txt deleted file mode 100644 index f7ba1d0d483..00000000000 --- a/res/cardsfolder/cursed_rack.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cursed Rack -ManaCost:4 -Types:Artifact -Text:As Cursed Rack enters the battlefield, choose an opponent. The chosen player's maximum hand size is four. -K:HandSize = 4 Opponent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_rack.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/330.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursed_ronin.txt b/res/cardsfolder/cursed_ronin.txt deleted file mode 100644 index b2db4015e31..00000000000 --- a/res/cardsfolder/cursed_ronin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cursed Ronin -ManaCost:3 B -Types:Creature Human Samurai -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_ronin.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/107.jpg -End diff --git a/res/cardsfolder/cursed_scroll.txt b/res/cardsfolder/cursed_scroll.txt deleted file mode 100644 index 344412332a3..00000000000 --- a/res/cardsfolder/cursed_scroll.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Cursed Scroll -ManaCost:1 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_scroll.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cursed_totem.txt b/res/cardsfolder/cursed_totem.txt deleted file mode 100644 index c7e829b69fe..00000000000 --- a/res/cardsfolder/cursed_totem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Cursed Totem -ManaCost:2 -Types:Artifact -Text:no text -K:stPumpAll:Creature:0/0/HIDDEN CARDNAME's activated abilities can't be activated.:No Condition:Activated abilities of creatures can't be activated. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_totem.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/278.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/customs_depot.txt b/res/cardsfolder/customs_depot.txt deleted file mode 100755 index b0e89287600..00000000000 --- a/res/cardsfolder/customs_depot.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Customs Depot -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, you may pay 1. If you do, draw a card, then discard a card. -SVar:TrigLoot:AB$Draw | Cost$ 1 | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/customs_depot.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cut_the_earthly_bond.txt b/res/cardsfolder/cut_the_earthly_bond.txt deleted file mode 100644 index 802d727d58e..00000000000 --- a/res/cardsfolder/cut_the_earthly_bond.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cut the Earthly Bond -ManaCost:U -Types:Instant Arcane -Text:no text -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Permanent.enchanted | TgtPrompt$ Select target enchanted permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target enchanted permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cut_the_earthly_bond.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cutthroat_il_dal.txt b/res/cardsfolder/cutthroat_il_dal.txt deleted file mode 100644 index fe7690eaae8..00000000000 --- a/res/cardsfolder/cutthroat_il_dal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cutthroat il-Dal -ManaCost:3 B -Types:Creature Human Rogue -Text:no text -PT:4/1 -K:stPumpSelf:Creature:0/0/Shadow:Hellbent: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.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cutthroat_il_dal.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cyclical_evolution.txt b/res/cardsfolder/cyclical_evolution.txt deleted file mode 100644 index 5a4c5506501..00000000000 --- a/res/cardsfolder/cyclical_evolution.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Cyclical Evolution -ManaCost:3 G G -Types:Sorcery -Text:no text -K:Suspend:3:2 G -A:SP$ Pump | Cost$ 3 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SubAbility$ SVar=DBTimeCounters | SpellDescription$ Target creature gets +3/+3 until end of turn. Exile CARDNAME with three time counters on it. -SVar:DBTimeCounters:DB$PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 3 | SubAbility$ SVar=DBExile -SVar:DBExile:DB$ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclical_evolution.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cyclopean_mummy.txt b/res/cardsfolder/cyclopean_mummy.txt deleted file mode 100644 index 52edd5a0183..00000000000 --- a/res/cardsfolder/cyclopean_mummy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Cyclopean Mummy -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile CARDNAME. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclopean_mummy.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/12.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cyclopean_snare.txt b/res/cardsfolder/cyclopean_snare.txt deleted file mode 100644 index ad6cceea794..00000000000 --- a/res/cardsfolder/cyclopean_snare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cyclopean Snare -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature, then return CARDNAME to its owner's hand. | SubAbility$ SVar=DBBounce -SVar:DBBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclopean_snare.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cylian_elf.txt b/res/cardsfolder/cylian_elf.txt deleted file mode 100644 index eaa60b47d1e..00000000000 --- a/res/cardsfolder/cylian_elf.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Cylian Elf -ManaCost:1 G -Types:Creature Elf Scout -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cylian_elf.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/cylian_sunsinger.txt b/res/cardsfolder/cylian_sunsinger.txt deleted file mode 100644 index e1a4e9d4e5f..00000000000 --- a/res/cardsfolder/cylian_sunsinger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cylian Sunsinger -ManaCost:1 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -A:AB$ PumpAll | Cost$ R G W | NumAtt$ +3 | NumDef$ +3 | ValidCards$ Creature.sameName | SpellDescription$ CARDNAME and each other creature with the same name as it get +3/+3 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/cylian_sunsinger.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/80.jpg -End diff --git a/res/cardsfolder/cystbearer.txt b/res/cardsfolder/cystbearer.txt deleted file mode 100644 index 1620fc999d5..00000000000 --- a/res/cardsfolder/cystbearer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Cystbearer -ManaCost:2 G -Types:Creature Beast -Text:no text -PT:2/3 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/cystbearer.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daggerback_basilisk.txt b/res/cardsfolder/daggerback_basilisk.txt deleted file mode 100644 index a1fc9ed3b4a..00000000000 --- a/res/cardsfolder/daggerback_basilisk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Daggerback Basilisk -ManaCost:2 G -Types:Creature Basilisk -Text:no text -PT:2/2 -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daggerback_basilisk.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daggerclaw_imp.txt b/res/cardsfolder/daggerclaw_imp.txt deleted file mode 100644 index 0558e310cb8..00000000000 --- a/res/cardsfolder/daggerclaw_imp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Daggerclaw Imp -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:3/1 -K:Flying -K:CARDNAME can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96949.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daily_regimen.txt b/res/cardsfolder/daily_regimen.txt deleted file mode 100644 index 806663e0304..00000000000 --- a/res/cardsfolder/daily_regimen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Daily Regimen -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ PutCounter | Cost$ 1 W | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/daily_regimen.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakkon_blackblade.txt b/res/cardsfolder/dakkon_blackblade.txt deleted file mode 100644 index 2f8c7f4ce93..00000000000 --- a/res/cardsfolder/dakkon_blackblade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dakkon Blackblade -ManaCost:2 B U U W -Types:Legendary Creature Human Warrior -Text:no text -PT:*/* -K:stSetPT:Count$NumTypeYouCtrl.Land:Count$NumTypeYouCtrl.Land:Dakkon Blackblade's power and toughness are each equal to the number of lands you control. -SVar:BuffedBy:Land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dakkon_blackblade.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_bat.txt b/res/cardsfolder/dakmor_bat.txt deleted file mode 100644 index c09175903e7..00000000000 --- a/res/cardsfolder/dakmor_bat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dakmor Bat -ManaCost:1 B -Types:Creature Bat -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dakmor_bat.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_ghoul.txt b/res/cardsfolder/dakmor_ghoul.txt deleted file mode 100644 index 39fc429786d..00000000000 --- a/res/cardsfolder/dakmor_ghoul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dakmor Ghoul -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ When CARDNAME enters the battlefield, target opponent loses 2 life and you gain 2 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Starter_1999/dakmor_ghoul.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_lancer.txt b/res/cardsfolder/dakmor_lancer.txt deleted file mode 100644 index 40f9ec7029f..00000000000 --- a/res/cardsfolder/dakmor_lancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dakmor Lancer -ManaCost:4 B B -Types:Creature Human Knight -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonblack creature. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dakmor_lancer.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/71.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_plague.txt b/res/cardsfolder/dakmor_plague.txt deleted file mode 100644 index 97262bc56e4..00000000000 --- a/res/cardsfolder/dakmor_plague.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dakmor Plague -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 B B | NumDmg$ 3 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 3 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/dakmor_plague.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/9.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_salvage.txt b/res/cardsfolder/dakmor_salvage.txt deleted file mode 100644 index 9ee87378431..00000000000 --- a/res/cardsfolder/dakmor_salvage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dakmor Salvage -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -K:Dredge 2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dakmor_salvage.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_scorpion.txt b/res/cardsfolder/dakmor_scorpion.txt deleted file mode 100644 index d4effa826a3..00000000000 --- a/res/cardsfolder/dakmor_scorpion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dakmor Scorpion -ManaCost:1 B -Types:Creature Scorpion -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20383.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/10.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dakmor_sorceress.txt b/res/cardsfolder/dakmor_sorceress.txt deleted file mode 100644 index dff3aacfd22..00000000000 --- a/res/cardsfolder/dakmor_sorceress.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dakmor Sorceress -ManaCost:5 B -Types:Creature Human Wizard -Text:no text -PT:*/4 -K:stSetPT:Count$Valid Swamp.YouCtrl:4:CARDNAME's power is equal to the number of Swamps you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dakmor_sorceress.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/74.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/damnation.txt b/res/cardsfolder/damnation.txt deleted file mode 100644 index 961aa836f0f..00000000000 --- a/res/cardsfolder/damnation.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Damnation -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 B B | ValidCards$ Creature | NoRegen$ True | SpellDescription$ Destroy all creatures. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122423.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/85.jpg -End diff --git a/res/cardsfolder/damping_field.txt b/res/cardsfolder/damping_field.txt deleted file mode 100644 index f4f3251c675..00000000000 --- a/res/cardsfolder/damping_field.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Damping Field -ManaCost:2 W -Types:Enchantment -Text:Players can't untap more than one artifact during their untap steps. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/damping_field.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dance_of_many.txt b/res/cardsfolder/dance_of_many.txt deleted file mode 100644 index 0bcf68808b3..00000000000 --- a/res/cardsfolder/dance_of_many.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Dance of Many -ManaCost:U U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigCopy | TriggerDescription$ When CARDNAME enters the battlefield, put a token that's a copy of target nontoken creature onto the battlefield. -SVar:TrigCopy:AB$ CopyPermanent | Cost$ 0 | ValidTgts$ Creature.nonToken | TgtPrompt$ Select target nontoken creature -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME leaves the battlefield, exile the token. -SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | Defined$ Clones | Origin$ Battlefield | Destination$ Exile -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Cloned | Execute$ TrigSac | TriggerDescription$ When the token leaves the battlefield, sacrifice CARDNAME. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ Self -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U U -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dance_of_many.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/78.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dance_of_shadows.txt b/res/cardsfolder/dance_of_shadows.txt deleted file mode 100644 index 3aa62d840fe..00000000000 --- a/res/cardsfolder/dance_of_shadows.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dance of Shadows -ManaCost:3 B B -Types:Sorcery Arcane -Text:no text -A:SP$ PumpAll | Cost$ 3 B B | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Fear | SpellDescription$ Creatures you control get +1/+0 and gain fear until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79094.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/108.jpg -End - - diff --git a/res/cardsfolder/dance_of_the_dead.txt b/res/cardsfolder/dance_of_the_dead.txt deleted file mode 100644 index bc74bef2f7c..00000000000 --- a/res/cardsfolder/dance_of_the_dead.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dance of the Dead -ManaCost:1 B -Types:Enchantment Aura -Text:Enchant creature card in a graveyard\r\n\r\nWhen CARDNAME 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 CARDNAME." Return enchanted creature card to the battlefield tapped under your control and attach CARDNAME to it. When CARDNAME leaves the battlefield, that creature's controller sacrifices it.\r\n\r\nAt the beginning of the upkeep of enchanted creature's controller, that player may pay 1 B. If he or she does, untap that creature. -K:stPumpEnchanted:Creature:1/1/CARDNAME doesn't untap during your untap step.:No Condition:Enchanted creature gets +1/+1 and doesn't untap during its controller's untap step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dance_of_the_dead.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dancing_scimitar.txt b/res/cardsfolder/dancing_scimitar.txt deleted file mode 100644 index 94be6ddf10b..00000000000 --- a/res/cardsfolder/dancing_scimitar.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dancing Scimitar -ManaCost:4 -Types:Artifact Creature Spirit -Text:no text -PT:1/5 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84114.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/362.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/331.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/292.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/279.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/243.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dandan.txt b/res/cardsfolder/dandan.txt deleted file mode 100644 index 16519c62eee..00000000000 --- a/res/cardsfolder/dandan.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dandan -ManaCost:U U -Types:Creature Fish -Text:no text -PT:4/1 -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card106631.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/79.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/19.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daraja_griffin.txt b/res/cardsfolder/daraja_griffin.txt deleted file mode 100644 index b18a24373f2..00000000000 --- a/res/cardsfolder/daraja_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Daraja Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | SpellDescription$ Destroy target black creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/daraja_griffin.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/102.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/14.jpg -End diff --git a/res/cardsfolder/darba.txt b/res/cardsfolder/darba.txt deleted file mode 100644 index 887e959b29c..00000000000 --- a/res/cardsfolder/darba.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darba -ManaCost:3 G -Types:Creature Bird Beast -Text:no text -PT:5/4 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darba.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darien_king_of_kjeldor.txt b/res/cardsfolder/darien_king_of_kjeldor.txt deleted file mode 100644 index df393680fd2..00000000000 --- a/res/cardsfolder/darien_king_of_kjeldor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Darien, King of Kjeldor -ManaCost:4 W W -Types:Legendary Creature Human Soldier -Text:no text -PT:3/3 -T:Mode$ DamageDone | Execute$ TrigToken | ValidTarget$ You | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you're dealt damage, you may put that many 1/1 white Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darien_king_of_kjeldor.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darigaazs_attendant.txt b/res/cardsfolder/darigaazs_attendant.txt deleted file mode 100644 index 4378c66f248..00000000000 --- a/res/cardsfolder/darigaazs_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darigaaz's Attendant -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ B R G | SpellDescription$ Add B R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darigaazs_attendant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darigaazs_caldera.txt b/res/cardsfolder/darigaazs_caldera.txt deleted file mode 100644 index 5bee0946d73..00000000000 --- a/res/cardsfolder/darigaazs_caldera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Darigaaz's Caldera -ManaCost:no cost -Types:Land Lair -Text:When CARDNAME enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:NeedsToPlay:Land.nonLair+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darigaazs_caldera.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darigaazs_charm.txt b/res/cardsfolder/darigaazs_charm.txt deleted file mode 100644 index cbaa70071db..00000000000 --- a/res/cardsfolder/darigaazs_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Darigaaz's Charm -ManaCost:B R G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B R G | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature | Origin$ Graveyard | Destination$ Hand | PrecostDesc$ Choose one - | SpellDescription$ Return target creature card from your graveyard to your hand; -A:SP$ DealDamage | Cost$ B R G | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ or CARDNAME deals 3 damage to target creature or player; -A:SP$ Pump | Cost$ B R G | ValidTgts$ Creature | NumAtt$ +3 | NumDef$ +3 | TgtPrompt$ Select target creature | SpellDescription$ or target creature gets +3/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darigaazs_charm.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daring_apprentice.txt b/res/cardsfolder/daring_apprentice.txt deleted file mode 100644 index f78e2e8f314..00000000000 --- a/res/cardsfolder/daring_apprentice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Daring Apprentice -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ T Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/daring_apprentice.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/73.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/62.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/60.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/72.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daring_leap.txt b/res/cardsfolder/daring_leap.txt deleted file mode 100644 index 49f382084d4..00000000000 --- a/res/cardsfolder/daring_leap.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Daring Leap -ManaCost:1 W U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ Flying & First Strike | SpellDescription$ Target creature gets +1/+1 and gains flying and first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daring_leap.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/101.jpg -End diff --git a/res/cardsfolder/dark_banishing.txt b/res/cardsfolder/dark_banishing.txt deleted file mode 100644 index 65b94a647c6..00000000000 --- a/res/cardsfolder/dark_banishing.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dark Banishing -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83046.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/123.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/11.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/127.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/122.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/7.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/13.jpg -End diff --git a/res/cardsfolder/dark_confidant.txt b/res/cardsfolder/dark_confidant.txt deleted file mode 100644 index 2da4e6e68ac..00000000000 --- a/res/cardsfolder/dark_confidant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dark Confidant -ManaCost:1 B -Types:Creature Human Wizard -Text: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. -PT:2/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_confidant.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_depths.txt b/res/cardsfolder/dark_depths.txt deleted file mode 100644 index e440fd4c85e..00000000000 --- a/res/cardsfolder/dark_depths.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Dark Depths -ManaCost:no cost -Types:Legendary Snow Land -Text:Dark Depths enters the battlefield with ten ice counters on it.\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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_depths.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_hatchling.txt b/res/cardsfolder/dark_hatchling.txt deleted file mode 100644 index 3f47d238d2c..00000000000 --- a/res/cardsfolder/dark_hatchling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dark Hatchling -ManaCost:4 B B -Types:Creature Horror -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonblack creature. It can't be regenerated. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_hatchling.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_heart_of_the_wood.txt b/res/cardsfolder/dark_heart_of_the_wood.txt deleted file mode 100644 index 4479a14552d..00000000000 --- a/res/cardsfolder/dark_heart_of_the_wood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dark Heart of the Wood -ManaCost:B G -Types:Enchantment -Text:no text -A:AB$ GainLife | Cost$ Sac<1/Forest> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_heart_of_the_wood.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/200.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/117.jpg -End diff --git a/res/cardsfolder/dark_maze.txt b/res/cardsfolder/dark_maze.txt deleted file mode 100644 index 18aa86dcb50..00000000000 --- a/res/cardsfolder/dark_maze.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dark Maze -ManaCost:4 U -Types:Creature Wall -Text:no text -PT:4/5 -K:Defender -A:AB$ Pump | Cost$ 0 | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. & HIDDEN At the beginning of the end step, exile CARDNAME. | SpellDescription$ CARDNAME can attack this turn as though it didn't have defender. Exile it at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_maze.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/30.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_offering.txt b/res/cardsfolder/dark_offering.txt deleted file mode 100644 index b6ccb7a9350..00000000000 --- a/res/cardsfolder/dark_offering.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dark Offering -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target nonblack creature. You gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/dark_offering.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/12.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_privilege.txt b/res/cardsfolder/dark_privilege.txt deleted file mode 100644 index fb89b679193..00000000000 --- a/res/cardsfolder/dark_privilege.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dark Privilege -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -A:AB$ Regenerate | Cost$ Sac<1/Creature> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_privilege.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_ritual.txt b/res/cardsfolder/dark_ritual.txt deleted file mode 100644 index 8c68e1c34f3..00000000000 --- a/res/cardsfolder/dark_ritual.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Dark Ritual -ManaCost:B -Types:Instant -Text:no text -A:SP$ Mana | Cost$ B | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_ritual.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/127.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/12.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/7.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/7.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/13.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/129.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/8.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/7.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/15.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/14.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_temper.txt b/res/cardsfolder/dark_temper.txt deleted file mode 100644 index 1468c717dc9..00000000000 --- a/res/cardsfolder/dark_temper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dark Temper -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature| TgtPrompt$ Creature | NumDmg$ 2 | SubAbility$ SVar=DBDestroy | ConditionPresent$ Permanent.Black+YouCtrl | ConditionCompare$ EQ0 | SpellDescription$ CARDNAME deals 2 damage to target creature. If you control a black permanent, destroy the creature instead. -SVar:DBDestroy:DB$ Destroy | Defined$ Targeted | ConditionPresent$ Permanent.Black+YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a black permanent, -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_temper.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_triumph.txt b/res/cardsfolder/dark_triumph.txt deleted file mode 100755 index 2c5804c713b..00000000000 --- a/res/cardsfolder/dark_triumph.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dark Triumph -ManaCost:4 B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 4 B | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SpellDescription$ Creatures you control get +2/+0 until end of turn. -A:SP$ PumpAll | Cost$ Sac<1/Creature> | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | IsPresent$ Swamp.YouCtrl | CostDesc$ If you control a Swamp, you may sacrifice a creature | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_triumph.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/55.jpg -End diff --git a/res/cardsfolder/dark_tutelage.txt b/res/cardsfolder/dark_tutelage.txt deleted file mode 100644 index aecc83e2358..00000000000 --- a/res/cardsfolder/dark_tutelage.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Dark Tutelage -ManaCost:2 B -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_tutelage.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dark_withering.txt b/res/cardsfolder/dark_withering.txt deleted file mode 100644 index c809521c9c9..00000000000 --- a/res/cardsfolder/dark_withering.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dark Withering -ManaCost:4 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 4 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -K:Madness:B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_withering.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/101.jpg -End diff --git a/res/cardsfolder/darkblast.txt b/res/cardsfolder/darkblast.txt deleted file mode 100644 index 1ecf95361e9..00000000000 --- a/res/cardsfolder/darkblast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darkblast -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -K:Dredge 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkblast.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/82.jpg -End diff --git a/res/cardsfolder/darkest_hour.txt b/res/cardsfolder/darkest_hour.txt deleted file mode 100644 index 9bc7aea8090..00000000000 --- a/res/cardsfolder/darkest_hour.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darkest Hour -ManaCost:B -Types:Enchantment -Text:no text -K:stAnimateAll:Creature:no changes:no types:Black,Overwrite:No Abilities:No Condition:All creatures are black. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkest_hour.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/128.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkheart_sliver.txt b/res/cardsfolder/darkheart_sliver.txt deleted file mode 100644 index 31773a79337..00000000000 --- a/res/cardsfolder/darkheart_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Darkheart Sliver -ManaCost:B G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=GainLife:no Condition:All Slivers have "Sacrifice this permanent: You gain 3 life." -SVar:GainLife:AB$GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ 3 | Defined$ You | SpellDescription$ You gain 3 life. -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkheart_sliver.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkling_stalker.txt b/res/cardsfolder/darkling_stalker.txt deleted file mode 100644 index f4e090acf55..00000000000 --- a/res/cardsfolder/darkling_stalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darkling Stalker -ManaCost:3 B -Types:Creature Shade Spirit -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Darkling Stalker gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkling_stalker.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/13.jpg -End diff --git a/res/cardsfolder/darklit_gargoyle.txt b/res/cardsfolder/darklit_gargoyle.txt deleted file mode 100644 index ae492ccac4b..00000000000 --- a/res/cardsfolder/darklit_gargoyle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darklit Gargoyle -ManaCost:1 W -Types:Artifact Creature Gargoyle -Text:no text -PT:1/2 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +2 | NumDef$ -1 | SpellDescription$ CARDNAME gets +2/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darklit_gargoyle.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/7.jpg -End diff --git a/res/cardsfolder/darkness.txt b/res/cardsfolder/darkness.txt deleted file mode 100644 index c60c39d035a..00000000000 --- a/res/cardsfolder/darkness.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darkness -ManaCost:B -Types:Instant -Text:no text -A:SP$ Fog | Cost$ B | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkness.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/40.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/8.jpg -End diff --git a/res/cardsfolder/darkslick_drake.txt b/res/cardsfolder/darkslick_drake.txt deleted file mode 100644 index ecc77ccb912..00000000000 --- a/res/cardsfolder/darkslick_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Darkslick Drake -ManaCost:2 U U -Types:Creature Drake -Text:no text -PT:2/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredCardController -SVar:SacMe:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkslick_drake.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkslick_shores.txt b/res/cardsfolder/darkslick_shores.txt deleted file mode 100644 index 4e927820a45..00000000000 --- a/res/cardsfolder/darkslick_shores.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darkslick Shores -ManaCost:no cost -Types:Land -text:Darkslick Shores enters the battlefield tapped unless you control two or fewer other lands. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:CARDNAME enters the battlefield tapped unless you control two or fewer other lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkslick_shores.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_axe.txt b/res/cardsfolder/darksteel_axe.txt deleted file mode 100644 index 99211c05f45..00000000000 --- a/res/cardsfolder/darksteel_axe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Axe -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +2/+0. -K:Indestructible -K:eqPump 2:+2/+0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_axe.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_brute.txt b/res/cardsfolder/darksteel_brute.txt deleted file mode 100644 index 013a3f080b1..00000000000 --- a/res/cardsfolder/darksteel_brute.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Brute -ManaCost:2 -Types:Artifact -Text:no text -K:Indestructible -A:AB$ Animate | Cost$ 3 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Artifact,Beast | SpellDescription$ CARDNAME becomes a 2/2 Beast artifact creature until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_brute.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_citadel.txt b/res/cardsfolder/darksteel_citadel.txt deleted file mode 100644 index 24a3a612143..00000000000 --- a/res/cardsfolder/darksteel_citadel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Citadel -ManaCost:no cost -Types:Artifact Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -K:Indestructible -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_citadel.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_colossus.txt b/res/cardsfolder/darksteel_colossus.txt deleted file mode 100644 index ffc89ceb2dc..00000000000 --- a/res/cardsfolder/darksteel_colossus.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Darksteel Colossus -ManaCost:11 -Types:Artifact Creature Golem -Text:no text -PT:11/11 -K:Trample -K:Indestructible -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead. -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card48158.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/208.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_forge.txt b/res/cardsfolder/darksteel_forge.txt deleted file mode 100644 index 35e5c5af09e..00000000000 --- a/res/cardsfolder/darksteel_forge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Darksteel Forge -ManaCost:9 -Types:Artifact -Text:no text -K:stPumpAll:Artifact.YouCtrl:0/0/HIDDEN Indestructible:No Condition:Artifacts you control are indestructible. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_forge.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_gargoyle.txt b/res/cardsfolder/darksteel_gargoyle.txt deleted file mode 100644 index 3286aa45fe9..00000000000 --- a/res/cardsfolder/darksteel_gargoyle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darksteel Gargoyle -ManaCost:7 -Types:Artifact Creature Gargoyle -Text:no text -PT:3/3 -K:Flying -K:Indestructible -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46136.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_ingot.txt b/res/cardsfolder/darksteel_ingot.txt deleted file mode 100644 index 4d76dea8efe..00000000000 --- a/res/cardsfolder/darksteel_ingot.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Darksteel Ingot -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Indestructible -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_ingot.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_juggernaut.txt b/res/cardsfolder/darksteel_juggernaut.txt deleted file mode 100644 index cad654a4a01..00000000000 --- a/res/cardsfolder/darksteel_juggernaut.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Darksteel Juggernaut -ManaCost:5 -Types:Artifact Creature Juggernaut -Text:no text -PT:0/1 -K:Indestructible -K:CARDNAME attacks each turn if able. -K:stSetPT:Count$NumTypeYouCtrl.Artifact:Count$NumTypeYouCtrl.Artifact:Darksteel Juggernaut's power and toughness are each equal to the number of artifacts you control. -SVar:BuffedBy:Artifact -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_juggernaut.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_myr.txt b/res/cardsfolder/darksteel_myr.txt deleted file mode 100644 index 09355865a71..00000000000 --- a/res/cardsfolder/darksteel_myr.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Myr -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:0/1 -K:Indestructible -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_myr.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_pendant.txt b/res/cardsfolder/darksteel_pendant.txt deleted file mode 100644 index ce4c26a7dbd..00000000000 --- a/res/cardsfolder/darksteel_pendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darksteel Pendant -ManaCost:2 -Types:Artifact -Text:no text -K:Indestructible -A:AB$ Dig | Cost$ 1 T | DigNum$ 1 | DestinationZone$ Library | Optional$ True | LibraryPosition$ -1 | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. You may put that card on the bottom of your library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_pendant.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_plate.txt b/res/cardsfolder/darksteel_plate.txt deleted file mode 100644 index 7035699fccc..00000000000 --- a/res/cardsfolder/darksteel_plate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Plate -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature is indestructible. -K:Indestructible -K:eqPump 2:HIDDEN Indestructible -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_plate.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_relic.txt b/res/cardsfolder/darksteel_relic.txt deleted file mode 100644 index c37a25915e0..00000000000 --- a/res/cardsfolder/darksteel_relic.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darksteel Relic -ManaCost:0 -Types:Artifact -Text:no text -K:Indestructible -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_relic.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darksteel_sentinel.txt b/res/cardsfolder/darksteel_sentinel.txt deleted file mode 100644 index a7b9ab122d2..00000000000 --- a/res/cardsfolder/darksteel_sentinel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Darksteel Sentinel -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -K:Vigilance -K:Indestructible -K:Flash -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darksteel_sentinel.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkwatch_elves.txt b/res/cardsfolder/darkwatch_elves.txt deleted file mode 100644 index 69141c9caba..00000000000 --- a/res/cardsfolder/darkwatch_elves.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darkwatch Elves -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:2/2 -K:Protection from black -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkwatch_elves.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkwater_catacombs.txt b/res/cardsfolder/darkwater_catacombs.txt deleted file mode 100644 index 656b138e357..00000000000 --- a/res/cardsfolder/darkwater_catacombs.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darkwater Catacombs -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ U B | SpellDescription$ Add U B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkwater_catacombs.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darkwater_egg.txt b/res/cardsfolder/darkwater_egg.txt deleted file mode 100644 index 8d722b044ba..00000000000 --- a/res/cardsfolder/darkwater_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Darkwater Egg -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ U B | SubAbility$ SVar=DBDraw | SpellDescription$ Add U B to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/darkwater_egg.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/darting_merfolk.txt b/res/cardsfolder/darting_merfolk.txt deleted file mode 100644 index 35324ea227c..00000000000 --- a/res/cardsfolder/darting_merfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Darting Merfolk -ManaCost:1 U -Types:Creature Merfolk -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/darting_merfolk.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_cavalier.txt b/res/cardsfolder/daru_cavalier.txt deleted file mode 100644 index d3a9530583e..00000000000 --- a/res/cardsfolder/daru_cavalier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Daru Cavalier -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a card named CARDNAME, reveal it, and put it into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedDaru Cavalier | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_cavalier.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_encampment.txt b/res/cardsfolder/daru_encampment.txt deleted file mode 100644 index b8ab698edc9..00000000000 --- a/res/cardsfolder/daru_encampment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Daru Encampment -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ W T | ValidTgts$ Creature.Soldier | TgtPrompt$ Select target Soldier creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target Soldier creature gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_encampment.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_healer.txt b/res/cardsfolder/daru_healer.txt deleted file mode 100644 index cde098f75b6..00000000000 --- a/res/cardsfolder/daru_healer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Daru Healer -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -K:Morph:W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_healer.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_lancer.txt b/res/cardsfolder/daru_lancer.txt deleted file mode 100644 index 872f63fa820..00000000000 --- a/res/cardsfolder/daru_lancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Daru Lancer -ManaCost:4 W W -Types:Creature Human Soldier -Text:no text -PT:3/4 -K:First Strike -K:Morph:2 W W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_lancer.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_mender.txt b/res/cardsfolder/daru_mender.txt deleted file mode 100644 index c0d27a928f8..00000000000 --- a/res/cardsfolder/daru_mender.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Daru Mender -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Morph:W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigRegenerate | TriggerDescription$ When CARDNAME is turned face up, regenerate target creature. -SVar:TrigRegenerate:AB$Regenerate | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_mender.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_sanctifier.txt b/res/cardsfolder/daru_sanctifier.txt deleted file mode 100644 index a8531265f5a..00000000000 --- a/res/cardsfolder/daru_sanctifier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Daru Sanctifier -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:1/4 -K:Morph:1 W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is turned face up, destroy target enchantment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_sanctifier.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daru_warchief.txt b/res/cardsfolder/daru_warchief.txt deleted file mode 100644 index 8d4cb7a37c2..00000000000 --- a/res/cardsfolder/daru_warchief.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Daru Warchief -ManaCost:2 W W -Types:Creature Human Soldier -Text:Soldier spells you cast cost 1 less to cast.\r\n -PT:1/1 -K:CostChange:Player:Less:1:Spell:All:Soldier:NoSpecial -K:stPumpAll:Creature.Soldier+YouCtrl:1/2:No Condition:Soldier creatures you control get +1/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/daru_warchief.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daunting_defender.txt b/res/cardsfolder/daunting_defender.txt deleted file mode 100644 index d0a0498b02f..00000000000 --- a/res/cardsfolder/daunting_defender.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Daunting Defender -ManaCost:4 W -Types:Creature Human Cleric -Text:no text -K:stPreventDamage:Creature.Cleric+YouCtrl:Card:1:If a source would deal damage to a Cleric creature you control, prevent 1 of that damage. -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daunting_defender.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauntless_dourbark.txt b/res/cardsfolder/dauntless_dourbark.txt deleted file mode 100644 index 718d33d9a34..00000000000 --- a/res/cardsfolder/dauntless_dourbark.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dauntless Dourbark -ManaCost:3 G -Types:Creature Treefolk Warrior -Text:no text -PT:*/* -K:stSetPT:Count$Valid Forest.YouCtrl,Treefolk.YouCtrl:Count$Valid Forest.YouCtrl,Treefolk.YouCtrl:Dauntless Dourbark's power and toughness are each equal to the number of Forests you control plus the number of Treefolk you control. -K:stPumpSelf:Creature:0/0/Trample:isPresent Permanent.Treefolk+YouCtrl+Other:CARDNAME has trample as long as you control another Treefolk. -SVar:BuffedBy:Forest -SVar:BuffedBy:Treefolk -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauntless_dourbark.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauntless_escort.txt b/res/cardsfolder/dauntless_escort.txt deleted file mode 100644 index 9d6ae0e81d7..00000000000 --- a/res/cardsfolder/dauntless_escort.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauntless Escort -ManaCost:1 W G -Types:Creature Rhino Soldier -Text:no text -PT:3/3 -A:AB$ Effect | Cost$ Sac<1/CARDNAME> | Name$ Dauntless Escort Effect | Keywords$ KWPump | SpellDescription$ Creatures you control are indestructible this turn. -SVar:KWPump:stPumpAll:Creature.YouCtrl:0/0/HIDDEN Indestructible:no Condition:Creatures you control are indestructible this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauntless_escort.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_cutthroat.txt b/res/cardsfolder/dauthi_cutthroat.txt deleted file mode 100644 index c7361e4e22b..00000000000 --- a/res/cardsfolder/dauthi_cutthroat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauthi Cutthroat -ManaCost:1 B -Types:Creature Dauthi Minion -Text:no text -PT:1/1 -K:Shadow -A:AB$ Destroy | Cost$ 1 B T | ValidTgts$ Creature.withShadow | TgtPrompt$ Select target creature with shadow | SpellDescription$ Destroy target creature with shadow. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_cutthroat.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/57.jpg -End diff --git a/res/cardsfolder/dauthi_embrace.txt b/res/cardsfolder/dauthi_embrace.txt deleted file mode 100644 index deb779cce03..00000000000 --- a/res/cardsfolder/dauthi_embrace.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dauthi Embrace -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Shadow | SpellDescription$ Target creature gains shadow until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_embrace.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/14.jpg -End diff --git a/res/cardsfolder/dauthi_ghoul.txt b/res/cardsfolder/dauthi_ghoul.txt deleted file mode 100644 index b1be9550d33..00000000000 --- a/res/cardsfolder/dauthi_ghoul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dauthi Ghoul -ManaCost:1 B -Types:Creature Dauthi Zombie -Text:no text -PT:1/1 -K:Shadow -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.withShadow | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature with shadow is put into a graveyard from the battlefield, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_ghoul.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_horror.txt b/res/cardsfolder/dauthi_horror.txt deleted file mode 100644 index fe9279404e4..00000000000 --- a/res/cardsfolder/dauthi_horror.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauthi Horror -ManaCost:1 B -Types:Creature Dauthi Horror -Text:CARDNAME can't be blocked by white creatures. -PT:2/1 -K:Shadow -K:CantBeBlockedBy Creature.White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_horror.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_jackal.txt b/res/cardsfolder/dauthi_jackal.txt deleted file mode 100644 index 11b7ed56772..00000000000 --- a/res/cardsfolder/dauthi_jackal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauthi Jackal -ManaCost:2 B -Types:Creature Dauthi Hound -Text:no text -PT:2/1 -K:Shadow -A:AB$ Destroy | Cost$ B B Sac<1/CARDNAME> | ValidTgts$ Creature.blocking | TgtPrompt$ Select target blocking creature | SpellDescription$ Destroy target blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_jackal.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_marauder.txt b/res/cardsfolder/dauthi_marauder.txt deleted file mode 100644 index d33041d0639..00000000000 --- a/res/cardsfolder/dauthi_marauder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dauthi Marauder -ManaCost:2 B -Types:Creature Dauthi Minion -Text:no text -PT:3/1 -K:Shadow -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_marauder.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_mercenary.txt b/res/cardsfolder/dauthi_mercenary.txt deleted file mode 100644 index a820f7bb47b..00000000000 --- a/res/cardsfolder/dauthi_mercenary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauthi Mercenary -ManaCost:2 B -Types:Creature Dauthi Knight Mercenary -Text:no text -PT:2/1 -K:Shadow -A:AB$ Pump | Cost$ 1 B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_mercenary.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/18.jpg -End diff --git a/res/cardsfolder/dauthi_mindripper.txt b/res/cardsfolder/dauthi_mindripper.txt deleted file mode 100644 index 866050de1fe..00000000000 --- a/res/cardsfolder/dauthi_mindripper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dauthi Mindripper -ManaCost:3 B -Types:Creature Dauthi Minion -Text:no text -PT:2/1 -K:Shadow -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. -SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ Opponent | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_mindripper.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_slayer.txt b/res/cardsfolder/dauthi_slayer.txt deleted file mode 100644 index 255d558ca30..00000000000 --- a/res/cardsfolder/dauthi_slayer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dauthi Slayer -ManaCost:B B -Types:Creature Dauthi Soldier -Text:no text -PT:2/2 -K:Shadow -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_slayer.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/20.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dauthi_trapper.txt b/res/cardsfolder/dauthi_trapper.txt deleted file mode 100644 index 530b80c7d5a..00000000000 --- a/res/cardsfolder/dauthi_trapper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dauthi Trapper -ManaCost:2 B -Types:Creature Dauthi Minion -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Shadow | SpellDescription$ Target creature gains shadow until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_trapper.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/6.jpg -End diff --git a/res/cardsfolder/dauthi_warlord.txt b/res/cardsfolder/dauthi_warlord.txt deleted file mode 100644 index 7036c1769ca..00000000000 --- a/res/cardsfolder/dauthi_warlord.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dauthi Warlord -ManaCost:1 B -Types:Creature Dauthi Soldier -Text:no text -PT:*/1 -K:Shadow -K:stSetPT:Count$Valid Creature.withShadow:1:CARDNAME's power is equal to the number of creatures with shadow on the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_warlord.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/davenant_archer.txt b/res/cardsfolder/davenant_archer.txt deleted file mode 100644 index 073a22848a5..00000000000 --- a/res/cardsfolder/davenant_archer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:D'Avenant Archer -ManaCost:2 W -Types:Creature Human Soldier Archer -Text:no text -PT:1/2 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/davenant_archer.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/299.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/15.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/davenant_healer.txt b/res/cardsfolder/davenant_healer.txt deleted file mode 100644 index 146a89464ac..00000000000 --- a/res/cardsfolder/davenant_healer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:D'Avenant Healer -ManaCost:1 W W -Types:Creature Human Cleric Archer -Text:no text -PT:1/2 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/davenant_healer.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawn_elemental.txt b/res/cardsfolder/dawn_elemental.txt deleted file mode 100644 index 25d74e6da8e..00000000000 --- a/res/cardsfolder/dawn_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dawn Elemental -ManaCost:W W W W -Types:Creature Elemental -Text:no text -PT:3/3 -K:Flying -K:Prevent all damage that would be dealt to CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawn_elemental.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawn_of_the_dead.txt b/res/cardsfolder/dawn_of_the_dead.txt deleted file mode 100644 index 9084c9136e3..00000000000 --- a/res/cardsfolder/dawn_of_the_dead.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dawn of the Dead -ManaCost:2 B B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste & HIDDEN At the beginning of the end step, exile CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawn_of_the_dead.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawnglare_invoker.txt b/res/cardsfolder/dawnglare_invoker.txt deleted file mode 100644 index 3cbe25cc85a..00000000000 --- a/res/cardsfolder/dawnglare_invoker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dawnglare Invoker -ManaCost:2 W -Types:Creature Kor Wizard -Text:8: Tap all creatures target player controls. -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnglare_invoker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawning_purist.txt b/res/cardsfolder/dawning_purist.txt deleted file mode 100644 index f8d7c5d2090..00000000000 --- a/res/cardsfolder/dawning_purist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dawning Purist -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:2/2 -K:Morph:1 W -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDestroy | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target enchantment that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Enchantment.YouDontCtrl | TgtPrompt$ Select an enchantment your opponent controls. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawning_purist.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawnray_archer.txt b/res/cardsfolder/dawnray_archer.txt deleted file mode 100644 index 91afe468d69..00000000000 --- a/res/cardsfolder/dawnray_archer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dawnray Archer -ManaCost:2 U -Types:Creature Human Archer -Text:no text -PT:1/1 -K:Exalted -A:AB$ DealDamage | Cost$ W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnray_archer.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dawnstrider.txt b/res/cardsfolder/dawnstrider.txt deleted file mode 100644 index 61d95f6f00c..00000000000 --- a/res/cardsfolder/dawnstrider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dawnstrider -ManaCost:1 G -Types:Creature Dryad Spellshaper -Text:no text -PT:1/1 -A:AB$ Fog | Cost$ G T Discard<1/Card> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dawnstrider.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/day_of_destiny.txt b/res/cardsfolder/day_of_destiny.txt deleted file mode 100644 index 0e2835b8f0e..00000000000 --- a/res/cardsfolder/day_of_destiny.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Day of Destiny -ManaCost:3 W -Types:Legendary Enchantment -Text:no text -K:stPumpAll:Creature.Legendary+YouCtrl:2/2:No Condition:Legendary creatures you control get +2/+2. -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_destiny.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/1.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/day_of_judgment.txt b/res/cardsfolder/day_of_judgment.txt deleted file mode 100644 index 8c81852814d..00000000000 --- a/res/cardsfolder/day_of_judgment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Day of Judgment -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature | SpellDescription$ Destroy all creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_judgment.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/12.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/9.jpg -End diff --git a/res/cardsfolder/day_of_the_dragons.txt b/res/cardsfolder/day_of_the_dragons.txt deleted file mode 100644 index 13150643251..00000000000 --- a/res/cardsfolder/day_of_the_dragons.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Day of the Dragons -ManaCost:4 U U U -Types:Enchantment -Text:When CARDNAME enters the battlefield, exile all creatures you control. Then put that many 5/5 red Dragon creature tokens with flying onto the battlefield.\r\nWhen CARDNAME leaves the battlefield, sacrifice all Dragons you control. Then return the exiled cards to the battlefield under your control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/day_of_the_dragons.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/daze.txt b/res/cardsfolder/daze.txt deleted file mode 100644 index 079cc170bf6..00000000000 --- a/res/cardsfolder/daze.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Daze -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -A:SP$ Counter | Cost$ Return<1/Island> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | CostDesc$ You may return an Island you control to its owner's hand | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/daze.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadapult.txt b/res/cardsfolder/deadapult.txt deleted file mode 100644 index d3986ff062c..00000000000 --- a/res/cardsfolder/deadapult.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Deadapult -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ R Sac<1/Zombie> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadapult.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadfall.txt b/res/cardsfolder/deadfall.txt deleted file mode 100644 index ef4c9ba6390..00000000000 --- a/res/cardsfolder/deadfall.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Deadfall -ManaCost:2 G -Types:Enchantment -Text:Creatures with forestwalk can be blocked as though they didn't have forestwalk. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadfall.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadly_grub.txt b/res/cardsfolder/deadly_grub.txt deleted file mode 100644 index f6ce5ad21fc..00000000000 --- a/res/cardsfolder/deadly_grub.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deadly Grub -ManaCost:2 B -Types:Creature Insect -Text:When Deadly Grub is put into a graveyard from the battlefield, 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.) -PT:3/1 -K:Vanishing:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_grub.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadly_insect.txt b/res/cardsfolder/deadly_insect.txt deleted file mode 100644 index 06e8619c9a9..00000000000 --- a/res/cardsfolder/deadly_insect.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deadly Insect -ManaCost:4 G -Types:Creature Insect -Text:no text -PT:6/1 -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_insect.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/64.jpg|2 -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadly_recluse.txt b/res/cardsfolder/deadly_recluse.txt deleted file mode 100644 index 277da5d2eb8..00000000000 --- a/res/cardsfolder/deadly_recluse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deadly Recluse -ManaCost:1 G -Types:Creature Spider -Text:no text -PT:1/2 -K:Reach -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadly_recluse.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadshot_minotaur.txt b/res/cardsfolder/deadshot_minotaur.txt deleted file mode 100644 index c1a19f192da..00000000000 --- a/res/cardsfolder/deadshot_minotaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Deadshot Minotaur -ManaCost:3 R G -Types:Creature Minotaur -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to target creature with flying. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.withFlying | NumDmg$ 3 -K:Cycling:RG -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadshot_minotaur.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deadwood_treefolk.txt b/res/cardsfolder/deadwood_treefolk.txt deleted file mode 100644 index 18ad11df615..00000000000 --- a/res/cardsfolder/deadwood_treefolk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deadwood Treefolk -ManaCost:5 G -Types:Creature Treefolk -Text:no text -PT:3/6 -K:Vanishing:3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.Other+YouCtrl | SpellDescription$ When CARDNAME enters the battlefield or leaves the battlefield, return another target creature card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deadwood_treefolk.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_baron.txt b/res/cardsfolder/death_baron.txt deleted file mode 100644 index 8f81716af02..00000000000 --- a/res/cardsfolder/death_baron.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Death Baron -ManaCost:1 B B -Types:Creature Zombie Wizard -Text:no text -PT:2/2 -K:stPumpAll:Creature.Zombie+Other+YouCtrl,Creature.Skeleton+YouCtrl:1/1/Deathtouch:No Condition:Skeleton creatures you control and other Zombie creatures you control get +1/+1 and have deathtouch. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_baron.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_bomb.txt b/res/cardsfolder/death_bomb.txt deleted file mode 100644 index 6ee14085c86..00000000000 --- a/res/cardsfolder/death_bomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Death Bomb -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 B Sac<1/Creature> | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature | SubAbility$ SVar=DBDrain | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. Its controller loses 2 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_bomb.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_cloud.txt b/res/cardsfolder/death_cloud.txt deleted file mode 100644 index d6fb5c6bf9b..00000000000 --- a/res/cardsfolder/death_cloud.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Death Cloud -ManaCost:X B B B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ X B B B | Defined$ Each | LifeAmount$ X | SpellDescription$ Each player loses X life, then discards X cards, then sacrifices X creatures, then sacrifices X lands. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ X | Mode$ TgtChoose | Defined$ Each | SubAbility$ SVar=DBSacCreature -SVar:DBSacCreature:DB$Sacrifice | Amount$ X | SacValid$ Creature | Defined$ Each | SubAbility$ SVar=DBSacLand -SVar:DBSacLand:DB$Sacrifice | Amount$ X | SacValid$ Land | Defined$ Each -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_cloud.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_cultist.txt b/res/cardsfolder/death_cultist.txt deleted file mode 100644 index 976f617e48b..00000000000 --- a/res/cardsfolder/death_cultist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Death Cultist -ManaCost:B -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SubAbility$ SVar=DB1 | SpellDescription$ Target player loses 1 life and you gain 1 life. -SVar:DB1:DB$GainLife | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_cultist.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_denied.txt b/res/cardsfolder/death_denied.txt deleted file mode 100644 index 12f61525f51..00000000000 --- a/res/cardsfolder/death_denied.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Death Denied -ManaCost:X B B -Types:Instant Arcane -Text:no text -A:SP$ ChangeZone | Cost$ X B B | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature in your graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return X target creature cards from your graveyard to your hand. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_denied.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_grasp.txt b/res/cardsfolder/death_grasp.txt deleted file mode 100644 index a29d18885b7..00000000000 --- a/res/cardsfolder/death_grasp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Death Grasp -ManaCost:X W B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X W B | Tgt$ TgtCP | NumDmg$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals X damage to target creature or player. You gain X life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Count$xPaid -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_grasp.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_hood_cobra.txt b/res/cardsfolder/death_hood_cobra.txt deleted file mode 100644 index 837e7283494..00000000000 --- a/res/cardsfolder/death_hood_cobra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Death-Hood Cobra -ManaCost:1 G -Types:Creature Snake -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 G | KW$ Reach | SpellDescription$ CARDNAME gains reach until end of turn. (It can block creatures with flying.) -A:AB$ Pump | Cost$ 1 G | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. (Any amount of damage it deals to a creature is enough to destroy it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_hood_cobra.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_mutation.txt b/res/cardsfolder/death_mutation.txt deleted file mode 100644 index 6b4ecec9492..00000000000 --- a/res/cardsfolder/death_mutation.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Death Mutation -ManaCost:6 B G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 6 B G | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ SVar=TrigToken | SpellDescription$ 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. -#X will be the Converted Mana Cost of the target of Mutation -SVar:TrigToken:DB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_mutation.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/96.jpg -End diff --git a/res/cardsfolder/death_of_a_thousand_stings.txt b/res/cardsfolder/death_of_a_thousand_stings.txt deleted file mode 100644 index 7df6cb6be84..00000000000 --- a/res/cardsfolder/death_of_a_thousand_stings.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Death of a Thousand Stings -ManaCost:4 B -Types:Instant Arcane -Text:no text -A:SP$ LoseLife | Cost$ 4 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 1 life and you gain 1 life. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LTX | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return CARDNAME from your graveyard to your hand. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:X:Count$InYourHand -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_of_a_thousand_stings.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/64.jpg -End diff --git a/res/cardsfolder/death_pits_of_rath.txt b/res/cardsfolder/death_pits_of_rath.txt deleted file mode 100644 index a66ef9d9148..00000000000 --- a/res/cardsfolder/death_pits_of_rath.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Death Pits of Rath -ManaCost:3 B B -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/HIDDEN When CARDNAME is dealt damage, destroy it. It can't be regenerated.:No Condition:Whenever a creature is dealt damage, destroy it. It can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_pits_of_rath.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/125.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/21.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_pulse.txt b/res/cardsfolder/death_pulse.txt deleted file mode 100644 index 7be91d579d6..00000000000 --- a/res/cardsfolder/death_pulse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Death Pulse -ManaCost:2 B B -Types:Instant -Text:no text -K:Cycling:1 B B -A:SP$ Pump | Cost$ 2 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. -T:Mode$ Cycled | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ When you cycle CARDNAME, you may have target creature get -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_pulse.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_speakers.txt b/res/cardsfolder/death_speakers.txt deleted file mode 100644 index f19046266ac..00000000000 --- a/res/cardsfolder/death_speakers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Death Speakers -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_speakers.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/109.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/death_stroke.txt b/res/cardsfolder/death_stroke.txt deleted file mode 100644 index d47f5ed4174..00000000000 --- a/res/cardsfolder/death_stroke.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Death Stroke -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ B B | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | SpellDescription$ Destroy target tapped creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_stroke.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/7.jpg -End diff --git a/res/cardsfolder/death_ward.txt b/res/cardsfolder/death_ward.txt deleted file mode 100644 index 53e3f7a8615..00000000000 --- a/res/cardsfolder/death_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Death Ward -ManaCost:W -Types:Instant -Text:no text -A:SP$ Regenerate | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/death_ward.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/201.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/203.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/301.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/271.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/243.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/200.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathbringer_liege.txt b/res/cardsfolder/deathbringer_liege.txt deleted file mode 100644 index d4932ab1e4d..00000000000 --- a/res/cardsfolder/deathbringer_liege.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Deathbringer Liege -ManaCost:2 WB WB WB -Types:Creature Horror -Text:no text -PT:3/4 -K:stPumpAll:Creature.White+Other+YouCtrl:1/1:No Condition:Other white creatures you control get +1/+1. -K:stPumpAll:Creature.Black+Other+YouCtrl:1/1:No Condition:Other black creatures you control get +1/+1. -T:Mode$ SpellCast | ValidCard$ Card.Black+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever you cast a black spell, you may destroy target creature if it's tapped. -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ Whenever you cast a white spell, you may tap target creature. -SVar:TrigTap:AB$ Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature to tap -SVar:TrigDestroy:AB$ Destroy | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature to destroy | ConditionDefined$ Targeted | ConditionPresent$ Creature.tapped -SVar:BuffedBy:Spell.White,Spell.Black -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathbringer_liege.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathbringer_thoctar.txt b/res/cardsfolder/deathbringer_thoctar.txt deleted file mode 100644 index b13a7de17d9..00000000000 --- a/res/cardsfolder/deathbringer_thoctar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Deathbringer Thoctar -ManaCost:4 B R -Types:Creature Zombie Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -A:AB$ DealDamage | Cost$ SubCounter<1/P1P1> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathbringer_thoctar.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathforge_shaman.txt b/res/cardsfolder/deathforge_shaman.txt deleted file mode 100644 index 20fb3e75997..00000000000 --- a/res/cardsfolder/deathforge_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deathforge Shaman -ManaCost:4 R -Types:Creature Ogre Shaman -Text:no text -PT:4/3 -K:Multikicker R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage to target player equal to twice the number of times it was kicked. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ X -SVar:X:Count$TimesKicked/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Deathforge_Shaman.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathgazer.txt b/res/cardsfolder/deathgazer.txt deleted file mode 100644 index e3ebfbf8c5a..00000000000 --- a/res/cardsfolder/deathgazer.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Deathgazer -ManaCost:3 B -Types:Creature Lizard -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathgazer.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/126.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/130.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathgreeter.txt b/res/cardsfolder/deathgreeter.txt deleted file mode 100644 index 561faebbb42..00000000000 --- a/res/cardsfolder/deathgreeter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deathgreeter -ManaCost:B -Types:Creature Human Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathgreeter.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathgrip.txt b/res/cardsfolder/deathgrip.txt deleted file mode 100644 index 9dd7f9cb498..00000000000 --- a/res/cardsfolder/deathgrip.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Deathgrip -ManaCost:B B -Types:Enchantment -Text:no text -A:AB$ Counter | Cost$ B B | TargetType$ Spell | TgtPrompt$ Select target Green Spell | ValidTgts$ Card.Green | SpellDescription$ Counter target green spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathgrip.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/9.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/9.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/16.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/14.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/9.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathknell_kami.txt b/res/cardsfolder/deathknell_kami.txt deleted file mode 100644 index c4f807c9517..00000000000 --- a/res/cardsfolder/deathknell_kami.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deathknell Kami -ManaCost:1 B -Types:Creature Spirit -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | NumDef$ +1 | KW$ At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Sacrifice it at the beginning of the next end step. -K:Soulshift:1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathknell_kami.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/65.jpg -End diff --git a/res/cardsfolder/deathless_angel.txt b/res/cardsfolder/deathless_angel.txt deleted file mode 100644 index 09a69a0374d..00000000000 --- a/res/cardsfolder/deathless_angel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deathless Angel -ManaCost:4 W W -Types:Creature Angel -Text:no text -PT:5/7 -K:Flying -A:AB$ Pump | Cost$ W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Indestructible | SpellDescription$ Target creature is indestructible this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathless_angel.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/17.jpg -End diff --git a/res/cardsfolder/deathmark.txt b/res/cardsfolder/deathmark.txt deleted file mode 100644 index 26897448c7d..00000000000 --- a/res/cardsfolder/deathmark.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Deathmark -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.Green,Creature.White | TgtPrompt$ Select target green or white creature | SpellDescription$ Destroy target green or white creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathmark.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/91.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/90.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/54.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/134.jpg -End diff --git a/res/cardsfolder/deathmark_prelate.txt b/res/cardsfolder/deathmark_prelate.txt deleted file mode 100644 index 9775c330847..00000000000 --- a/res/cardsfolder/deathmark_prelate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deathmark Prelate -ManaCost:3 B -Types:Creature Human Cleric -Text:no text -PT:2/3 -A:AB$ Destroy | Cost$ 2 B T Sac<1/Zombie> | ValidTgts$ Creature.nonZombie | TgtPrompt$ Select target non-Zombie creature | SorcerySpeed$ True | NoRegen$ True | SpellDescription$ Destroy target non-Zombie creature. It can't be regenerated. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathmark_prelate.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathmask_nezumi.txt b/res/cardsfolder/deathmask_nezumi.txt deleted file mode 100644 index 7f692bf38e3..00000000000 --- a/res/cardsfolder/deathmask_nezumi.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deathmask Nezumi -ManaCost:2 B -Types:Creature Rat Shaman -Text:no text -PT:2/2 -K:stPumpSelf:Creature:2/1/Fear:CardsInHandMore/7:As long as you have seven or more cards in hand, Deathmask Nezumi gets +2/+1 and has fear. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathmask_nezumi.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deaths_duet.txt b/res/cardsfolder/deaths_duet.txt deleted file mode 100644 index 1854030ba54..00000000000 --- a/res/cardsfolder/deaths_duet.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Death's Duet -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return two target creature cards from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deaths_duet.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deaths_head_buzzard.txt b/res/cardsfolder/deaths_head_buzzard.txt deleted file mode 100644 index 7f9870fdfca..00000000000 --- a/res/cardsfolder/deaths_head_buzzard.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Death's-Head Buzzard -ManaCost:1 B B -Types:Creature Bird -Text:no text -PT:2/1 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, all creatures get -1/-1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deaths_head_buzzard.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deaths_shadow.txt b/res/cardsfolder/deaths_shadow.txt deleted file mode 100644 index 00e2b7f4957..00000000000 --- a/res/cardsfolder/deaths_shadow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Death's Shadow -ManaCost:B -Types:Creature Avatar -Text:no text -PT:13/13 -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets -X/-X, where X is your life total. -SVar:X:Count$YourLifeTotal/Times.-1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deaths_shadow.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deathspore_thallid.txt b/res/cardsfolder/deathspore_thallid.txt deleted file mode 100644 index 7c9936cfa32..00000000000 --- a/res/cardsfolder/deathspore_thallid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deathspore Thallid -ManaCost:1 B -Types:Creature Zombie Fungus -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Pump | Cost$ Sac<1/Saproling> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathspore_thallid.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/102.jpg -End diff --git a/res/cardsfolder/debtors_knell.txt b/res/cardsfolder/debtors_knell.txt deleted file mode 100644 index 4b8eb917087..00000000000 --- a/res/cardsfolder/debtors_knell.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Debtors' Knell -ManaCost:4 WB WB WB -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, put target creature card from a graveyard onto the battlefield under your control. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ChangeNum$ 1 | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/debtors_knell.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deception.txt b/res/cardsfolder/deception.txt deleted file mode 100644 index fce5c83b1e8..00000000000 --- a/res/cardsfolder/deception.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Deception -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Opponent | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target opponent discards two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deception.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/decimate.txt b/res/cardsfolder/decimate.txt deleted file mode 100644 index cabd67c085d..00000000000 --- a/res/cardsfolder/decimate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Decimate -ManaCost:2 R G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DestroyCreature | SpellDescription$ Destroy target artifact, target creature, target enchantment, and target land. -SVar:DestroyCreature:DB$ Destroy | Cost$ 0 | ValidTgts$ Creature | SubAbility$ SVar=DestroyEnch | TgtPrompt$ Select target creature -SVar:DestroyEnch:DB$ Destroy | Cost$ 0 | ValidTgts$ Enchantment | SubAbility$ SVar=DestroyLand | TgtPrompt$ Select target enchantment -SVar:DestroyLand:DB$ Destroy | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/decimate.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/decimator_web.txt b/res/cardsfolder/decimator_web.txt deleted file mode 100644 index a01fd26339a..00000000000 --- a/res/cardsfolder/decimator_web.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Decimator Web -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ LoseLife | Cost$ 4 T | LifeAmount$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player to decimate | SubAbility$ SVar=DBPoison | SpellDescription$ Target player loses 2 life, gets a poison counter, then puts the top six cards of his or her library into his or her graveyard. -SVar:DBPoison:DB$Poison | Num$ 1 | Defined$ Targeted | SubAbility$ SVar=DBMill -SVar:DBMill:DB$Mill | NumCards$ 6 | Defined$ Targeted -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/decimator_web.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deconstruct.txt b/res/cardsfolder/deconstruct.txt deleted file mode 100644 index 29b89dc67ba..00000000000 --- a/res/cardsfolder/deconstruct.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deconstruct -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBMana | SpellDescription$ Destroy target artifact. Add G G G to your mana pool. -SVar:DBMana:DB$Mana | Produced$ G | Amount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deconstruct.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/decree_of_annihilation.txt b/res/cardsfolder/decree_of_annihilation.txt deleted file mode 100644 index 8d281c1a829..00000000000 --- a/res/cardsfolder/decree_of_annihilation.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Decree of Annihilation -ManaCost:8 R R -Types:Sorcery -Text:no text -K:Cycling:5 R R -A:SP$ ChangeZoneAll | Cost$ 8 R R | ChangeType$ Artifact,Land,Creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ SVar=DBExileHand | SpellDescription$ Exile all artifacts, creatures, and lands from the battlefield, all cards from all graveyards, and all cards from all hands. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When you cycle CARDNAME, destroy all lands -SVar:DBExileHand:DB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Hand | Destination$ Exile | SubAbility$ SVar=DBExileGraveyard -SVar:DBExileGraveyard:DB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_annihilation.jpg -SVar:Rarity:Rare -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/85.jpg -End - diff --git a/res/cardsfolder/decree_of_justice.txt b/res/cardsfolder/decree_of_justice.txt deleted file mode 100644 index 2606f2395c7..00000000000 --- a/res/cardsfolder/decree_of_justice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Decree of Justice -ManaCost:X X 2 W W -Types:Sorcery -Text:no text -K:Cycling:2 W -A:SP$ Token | Cost$ X X 2 W W | TokenAmount$ X | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | SpellDescription$ Put X 4/4 white Angel creature tokens with flying onto the battlefield. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may pay X. If you do, put X 1/1 white Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ X | TokenAmount$ X | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_justice.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/decree_of_savagery.txt b/res/cardsfolder/decree_of_savagery.txt deleted file mode 100644 index 5ac02b3031d..00000000000 --- a/res/cardsfolder/decree_of_savagery.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Decree of Savagery -ManaCost:7 G G -Types:Instant -Text:no text -K:Cycling:4 G G -A:SP$ PutCounterAll | Cost$ 7 G G | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 4 | SpellDescription$ Put four +1/+1 counters on each creature you control. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When you cycle CARDNAME, you may put four +1/+1 counters on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 4 -SVar:Picture:http://www.wizards.com/global/images/magic/general/decree_of_savagery.jpg -SVar:Rarity:Rare -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/115.jpg -End diff --git a/res/cardsfolder/dedicated_martyr.txt b/res/cardsfolder/dedicated_martyr.txt deleted file mode 100644 index d2d8325582e..00000000000 --- a/res/cardsfolder/dedicated_martyr.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dedicated Martyr -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ W Sac<1/CARDNAME> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dedicated_martyr.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deep_analysis.txt b/res/cardsfolder/deep_analysis.txt deleted file mode 100644 index 9519da9eda5..00000000000 --- a/res/cardsfolder/deep_analysis.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deep Analysis -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | SpellDescription$ Target player draws two cards. -A:SP$ Draw | Cost$ 1 U PayLife<3> | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Flashback$ True | CostDesc$ Flashback 1 U, Pay 3 life | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_analysis.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deep_reconnaissance.txt b/res/cardsfolder/deep_reconnaissance.txt deleted file mode 100644 index 5c3821127c9..00000000000 --- a/res/cardsfolder/deep_reconnaissance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deep Reconnaissance -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -A:SP$ ChangeZone | Cost$ 4 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | Flashback$ True | CostDesc$ Flashback 4 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_reconnaissance.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deep_sea_serpent.txt b/res/cardsfolder/deep_sea_serpent.txt deleted file mode 100644 index 69962256fa3..00000000000 --- a/res/cardsfolder/deep_sea_serpent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deep-Sea Serpent -ManaCost:4 U U -Types:Creature Serpent -Text:no text -PT:5/5 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/deep_sea_serpent.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deep_slumber_titan.txt b/res/cardsfolder/deep_slumber_titan.txt deleted file mode 100644 index e2e57dea2a7..00000000000 --- a/res/cardsfolder/deep_slumber_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deep-Slumber Titan -ManaCost:2 R R -Types:Creature Giant Warrior -Text:no text -PT:7/7 -K:CARDNAME enters the battlefield tapped. -K:CARDNAME doesn't untap during your untap step. -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME is dealt damage, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deep_slumber_titan.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deepchannel_mentor.txt b/res/cardsfolder/deepchannel_mentor.txt deleted file mode 100644 index 3005cb16704..00000000000 --- a/res/cardsfolder/deepchannel_mentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deepchannel Mentor -ManaCost:5 U -Types:Creature Merfolk Rogue -Text:no text -PT:2/2 -K:stPumpAll:Creature.Blue+YouCtrl:0/0/Unblockable:No Condition:Blue creatures you control are unblockable. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deepchannel_mentor.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deeptread_merrow.txt b/res/cardsfolder/deeptread_merrow.txt deleted file mode 100644 index 17d3d64170c..00000000000 --- a/res/cardsfolder/deeptread_merrow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deeptread Merrow -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ U | KW$ Islandwalk | SpellDescription$ CARDNAME gains islandwalk until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deeptread_merrow.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/57.jpg -End diff --git a/res/cardsfolder/deepwood_drummer.txt b/res/cardsfolder/deepwood_drummer.txt deleted file mode 100644 index 493225655bf..00000000000 --- a/res/cardsfolder/deepwood_drummer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deepwood Drummer -ManaCost:1 G -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ G T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_drummer.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/239.jpg -End diff --git a/res/cardsfolder/deepwood_ghoul.txt b/res/cardsfolder/deepwood_ghoul.txt deleted file mode 100755 index 2e3d035dbb9..00000000000 --- a/res/cardsfolder/deepwood_ghoul.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deepwood Ghoul -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/1 -A:AB$ Regenerate | Cost$ PayLife<2> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_ghoul.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/8e/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deepwood_tantiv.txt b/res/cardsfolder/deepwood_tantiv.txt deleted file mode 100644 index 709daf58491..00000000000 --- a/res/cardsfolder/deepwood_tantiv.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deepwood Tantiv -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:2/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigGain | TriggerDescription$ Whenever CARDNAME becomes blocked, you gain 2 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_tantiv.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deepwood_wolverine.txt b/res/cardsfolder/deepwood_wolverine.txt deleted file mode 100644 index d87c2a8e95f..00000000000 --- a/res/cardsfolder/deepwood_wolverine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deepwood Wolverine -ManaCost:G -Types:Creature Wolverine -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deepwood_wolverine.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defender_of_chaos.txt b/res/cardsfolder/defender_of_chaos.txt deleted file mode 100644 index aa518ec50c9..00000000000 --- a/res/cardsfolder/defender_of_chaos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Defender of Chaos -ManaCost:2 R -Types:Creature Human Knight -Text:no text -PT:2/1 -K:Flash -K:Protection from white -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/defender_of_chaos.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defender_of_law.txt b/res/cardsfolder/defender_of_law.txt deleted file mode 100644 index 700eff1b7dc..00000000000 --- a/res/cardsfolder/defender_of_law.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Defender of Law -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/1 -K:Flash -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/defender_of_law.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defender_of_the_order.txt b/res/cardsfolder/defender_of_the_order.txt deleted file mode 100644 index 8ae3b24bcd1..00000000000 --- a/res/cardsfolder/defender_of_the_order.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Defender of the Order -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:2/4 -K:Morph:W W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is turned face up, creatures you control get +0/+2 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumDef$ +2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/defender_of_the_order.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defense_grid.txt b/res/cardsfolder/defense_grid.txt deleted file mode 100644 index f1009aa15e6..00000000000 --- a/res/cardsfolder/defense_grid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Defense Grid -ManaCost:2 -Types:Artifact -Text:Each spell costs 3 more to cast except during its controller's turn. -K:CostChange:All:More:3:Spell:All:All:OpponentTurn -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/defense_grid.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/296.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/293.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defense_of_the_heart.txt b/res/cardsfolder/defense_of_the_heart.txt deleted file mode 100644 index f902a3aa027..00000000000 --- a/res/cardsfolder/defense_of_the_heart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Defense of the Heart -ManaCost:3 G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | IsPresent$ Creature.YouDontCtrl | PresentCompare$ GE3 | TriggerDescription$ At the beginning of your upkeep, if an opponent controls three or more creatures, sacrifice CARDNAME, search your library for up to two creature cards, and put those cards onto the battlefield. Then shuffle your library. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SubAbility$ SVar=DBChange -SVar:DBChange:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/defense_of_the_heart.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defensive_stance.txt b/res/cardsfolder/defensive_stance.txt deleted file mode 100644 index 4047d6f009b..00000000000 --- a/res/cardsfolder/defensive_stance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Defensive Stance -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:-1/+1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/defensive_stance.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defiant_elf.txt b/res/cardsfolder/defiant_elf.txt deleted file mode 100644 index 1fd8bb74531..00000000000 --- a/res/cardsfolder/defiant_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Defiant Elf -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card39707.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defiant_falcon.txt b/res/cardsfolder/defiant_falcon.txt deleted file mode 100644 index e2f6b5f932a..00000000000 --- a/res/cardsfolder/defiant_falcon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Defiant Falcon -ManaCost:1 W -Types:Creature Rebel Bird -Text:no text -PT:1/1 -K:Flying -K:SearchRebel:4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/defiant_falcon.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defiler_of_souls.txt b/res/cardsfolder/defiler_of_souls.txt deleted file mode 100644 index c0eb3db1832..00000000000 --- a/res/cardsfolder/defiler_of_souls.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Defiler of Souls -ManaCost:3 B B R -Types:Creature Demon -Text:no text -PT:5/5 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a monocolored creature. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature.MonoColor | Defined$ TriggeredPlayer | SacMessage$ monocolored creature -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/defiler_of_souls.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deft_duelist.txt b/res/cardsfolder/deft_duelist.txt deleted file mode 100644 index c2cf92f1323..00000000000 --- a/res/cardsfolder/deft_duelist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Deft Duelist -ManaCost:W U -Types:Creature Human Rogue -Text:no text -PT:2/1 -K:First Strike -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deft_duelist.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/defy_gravity.txt b/res/cardsfolder/defy_gravity.txt deleted file mode 100644 index fcd64c25209..00000000000 --- a/res/cardsfolder/defy_gravity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Defy Gravity -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | Flashback$ True | CostDesc$ Flashback U | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/defy_gravity.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dega_disciple.txt b/res/cardsfolder/dega_disciple.txt deleted file mode 100644 index 302113b1302..00000000000 --- a/res/cardsfolder/dega_disciple.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dega Disciple -ManaCost:W -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -2 | SpellDescription$ Target creature gets -2/-0 until end of turn. -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/-0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dega_disciple.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dega_sanctuary.txt b/res/cardsfolder/dega_sanctuary.txt deleted file mode 100644 index 9674ba74c5b..00000000000 --- a/res/cardsfolder/dega_sanctuary.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dega Sanctuary -ManaCost:2 W -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://wizards.com/global/images/magic/general/dega_sanctuary.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deglamer.txt b/res/cardsfolder/deglamer.txt deleted file mode 100644 index 3514b9f3e5a..00000000000 --- a/res/cardsfolder/deglamer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Deglamer -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SpellDescription$ Choose target artifact or enchantment. Its owner shuffles it into his or her library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deglamer.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dehydration.txt b/res/cardsfolder/dehydration.txt deleted file mode 100644 index 733108fb1f3..00000000000 --- a/res/cardsfolder/dehydration.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dehydration -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dehydration.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/75.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/73.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/73.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deity_of_scars.txt b/res/cardsfolder/deity_of_scars.txt deleted file mode 100644 index 4b825c99c0d..00000000000 --- a/res/cardsfolder/deity_of_scars.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Deity of Scars -ManaCost:BG BG BG BG BG -Types:Creature Spirit Avatar -Text:no text -PT:7/7 -K:Trample -K:etbCounter:M1M1:2 -A:AB$ Regenerate | Cost$ BG SubCounter<1/M1M1> | SpellDescription$ Regenerate Deity of Scars. -SVar:Rarity:Rare -SVar:Picture:http://wizards.com/global/images/magic/general/deity_of_scars.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deja_vu.txt b/res/cardsfolder/deja_vu.txt deleted file mode 100644 index 5bbd8d8be65..00000000000 --- a/res/cardsfolder/deja_vu.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deja Vu -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target sorcery card in your graveyard | ValidTgts$ Sorcery.YouCtrl | SpellDescription$ Return target sorcery card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/deja_vu.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/35.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/delirium.txt b/res/cardsfolder/delirium.txt deleted file mode 100644 index c37af4c8b7b..00000000000 --- a/res/cardsfolder/delirium.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Delirium -ManaCost:1 B R -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 1 B R | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | OpponentTurn$ True | SubAbility$ SVar=DBDamage | SpellDescription$ Cast CARDNAME 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. -SVar:DBDamage:DB$DealDamage | Defined$ Opponent | NumDmg$ X | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. -SVar:X:Targeted$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/delirium.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/delirium_skeins.txt b/res/cardsfolder/delirium_skeins.txt deleted file mode 100644 index e50d959724e..00000000000 --- a/res/cardsfolder/delirium_skeins.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Delirium Skeins -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | Mode$ TgtChoose | Defined$ You | NumCards$ 3 | SubAbility$ SVar=DBDiscardOpp | SpellDescription$ Each player discards three cards. -SVar:DBDiscardOpp:DB$Discard | Mode$ TgtChoose | Defined$ Opponent | NumCards$ 3 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/delirium_skeins.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/delraich.txt b/res/cardsfolder/delraich.txt deleted file mode 100644 index de68a1d17a3..00000000000 --- a/res/cardsfolder/delraich.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Delraich -ManaCost:6 B -Types:Creature Horror -Text:no text -PT:6/6 -K:Trample -SVar:AltCost:Sac<3/Creature.Black>$You may sacrifice three black creatures rather than pay Delraich's mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/delraich.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deluge.txt b/res/cardsfolder/deluge.txt deleted file mode 100644 index ac64633dd88..00000000000 --- a/res/cardsfolder/deluge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deluge -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ 2 U | ValidCards$ Creature.withoutFlying | SpellDescription$ Tap all creatures without flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/deluge.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/80.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/delusions_of_mediocrity.txt b/res/cardsfolder/delusions_of_mediocrity.txt deleted file mode 100644 index 48a1e63ac1a..00000000000 --- a/res/cardsfolder/delusions_of_mediocrity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Delusions of Mediocrity -ManaCost:3 U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 10 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME leaves the battlefield, you lose 10 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 10 -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 10 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/delusions_of_mediocrity.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/30.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dematerialize.txt b/res/cardsfolder/dematerialize.txt deleted file mode 100644 index b8815cb8ae5..00000000000 --- a/res/cardsfolder/dematerialize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dematerialize -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -A:SP$ ChangeZone | Cost$ 5 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | Flashback$ True | CostDesc$ Flashback 5 U U | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dematerialize.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dementia_bat.txt b/res/cardsfolder/dementia_bat.txt deleted file mode 100644 index a42931db154..00000000000 --- a/res/cardsfolder/dementia_bat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dementia Bat -ManaCost:4 B -Types:Creature Bat -Text:no text -PT:2/2 -K:Flying -A:AB$ Discard | Cost$ Sac<1/CARDNAME> 4 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dementia_bat.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demigod_of_revenge.txt b/res/cardsfolder/demigod_of_revenge.txt deleted file mode 100644 index dbce24c5800..00000000000 --- a/res/cardsfolder/demigod_of_revenge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Demigod of Revenge -ManaCost:BR BR BR BR BR -Types:Creature Spirit Avatar -Text:When you cast Demigod of Revenge, return all cards named Demigod of Revenge from your graveyard to the battlefield. -PT:5/4 -K:Flying -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/demigod_of_revenge.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demolish.txt b/res/cardsfolder/demolish.txt deleted file mode 100644 index 77d37512d13..00000000000 --- a/res/cardsfolder/demolish.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Demolish -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SpellDescription$ Destroy target artifact or land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/demolish.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/183.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/183.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/121.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/179.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/196.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/132.jpg -End diff --git a/res/cardsfolder/demon_of_deaths_gate.txt b/res/cardsfolder/demon_of_deaths_gate.txt deleted file mode 100644 index ba1f8c23790..00000000000 --- a/res/cardsfolder/demon_of_deaths_gate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Demon of Death's Gate -ManaCost:6 B B B -Types:Creature Demon -Text:no text -PT:9/9 -K:Trample -K:Flying -SVar:AltCost:PayLife<6> Sac<3/Creature.Black>$You may pay 6 life and sacrifice three black creatures rather than pay Demon of Death's Gate's mana cost. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/demon_of_deaths_gate.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_appetite.txt b/res/cardsfolder/demonic_appetite.txt deleted file mode 100644 index 02d9023ecde..00000000000 --- a/res/cardsfolder/demonic_appetite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Demonic Appetite -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant Creature you control -K:stPumpEnchanted:Creature:3/3:No Condition:Enchanted creature gets +3/+3. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_appetite.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_consultation.txt b/res/cardsfolder/demonic_consultation.txt deleted file mode 100644 index 763d4dde88b..00000000000 --- a/res/cardsfolder/demonic_consultation.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Demonic Consultation -ManaCost:B -Types:Instant -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_consultation.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_dread.txt b/res/cardsfolder/demonic_dread.txt deleted file mode 100644 index ddbaf5d805e..00000000000 --- a/res/cardsfolder/demonic_dread.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Demonic Dread -ManaCost:1 B R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -K:Cascade -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_dread.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_hordes.txt b/res/cardsfolder/demonic_hordes.txt deleted file mode 100644 index af4740e0ebd..00000000000 --- a/res/cardsfolder/demonic_hordes.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Demonic Hordes -ManaCost:3 B B B -Types:Creature Demon -Text:At the beginning of your upkeep, unless you pay BBB, tap Demonic Hordes and sacrifice a land of an opponent's choice. -PT:5/5 -A:AB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land. | Cost$ T | SpellDescription$ Destroy target land. -SVar:PlayMain1:FALSE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_hordes.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/12.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/12.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/12.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_torment.txt b/res/cardsfolder/demonic_torment.txt deleted file mode 100644 index f898ab6039c..00000000000 --- a/res/cardsfolder/demonic_torment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Demonic Torment -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack. & HIDDEN Prevent all combat damage that would be dealt by CARDNAME.:Enchanted creature can't attack. Prevent all combat damage that would be dealt by enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_torment.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonic_tutor.txt b/res/cardsfolder/demonic_tutor.txt deleted file mode 100644 index 5536547729e..00000000000 --- a/res/cardsfolder/demonic_tutor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Demonic Tutor -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B| Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/3e/en-us/card1155.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/13.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/13.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/13.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demons_horn.txt b/res/cardsfolder/demons_horn.txt deleted file mode 100644 index 62b32d433f6..00000000000 --- a/res/cardsfolder/demons_horn.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Demon's Horn -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a black spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/demons_horn.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/204.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/209.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/116.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/294.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demons_jester.txt b/res/cardsfolder/demons_jester.txt deleted file mode 100644 index 56a860c6feb..00000000000 --- a/res/cardsfolder/demons_jester.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Demon's Jester -ManaCost:3 B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Creature:2/1:Hellbent:Hellbent - Demon's Jester gets +2/+1 as long as you have no cards in hand. -SVar:BuffedBy:Card -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/demons_jester.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/demonspine_whip.txt b/res/cardsfolder/demonspine_whip.txt deleted file mode 100644 index 4799cb6f149..00000000000 --- a/res/cardsfolder/demonspine_whip.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Demonspine Whip -ManaCost:B R -Types:Artifact Equipment -Text:no text -K:eqPump 1:+0/+0 -A:AB$ Pump | Cost$ X | Defined$ Equipped | NumAtt$ +X | SpellDescription$ Equipped creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonspine_whip.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/39.jpg -End diff --git a/res/cardsfolder/demystify.txt b/res/cardsfolder/demystify.txt deleted file mode 100644 index a4b828f6703..00000000000 --- a/res/cardsfolder/demystify.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Demystify -ManaCost:W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/demystify.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/16.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/24.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/18.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/13.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/14.jpg -End diff --git a/res/cardsfolder/denizen_of_the_deep.txt b/res/cardsfolder/denizen_of_the_deep.txt deleted file mode 100644 index e3b13d7f299..00000000000 --- a/res/cardsfolder/denizen_of_the_deep.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Denizen of the Deep -ManaCost:6 U U -Types:Creature Serpent -Text:no text -PT:11/11 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZoneAll | TriggerDescription$ When CARDNAME enters the battlefield, return each other creature you control to its owner's hand. -SVar:TrigChangeZoneAll:AB$ChangeZoneAll | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.Other+YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/denizen_of_the_deep.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/35.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/36.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dense_canopy.txt b/res/cardsfolder/dense_canopy.txt deleted file mode 100644 index 2cc4255a266..00000000000 --- a/res/cardsfolder/dense_canopy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dense Canopy -ManaCost:1 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.withFlying:0/0/HIDDEN CARDNAME can block only creatures with flying.:No Condition:Creatures with flying can block only creatures with flying. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dense_canopy.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dense_foliage.txt b/res/cardsfolder/dense_foliage.txt deleted file mode 100644 index 43c7e50acad..00000000000 --- a/res/cardsfolder/dense_foliage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dense Foliage -ManaCost:2 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/HIDDEN CARDNAME can't be the target of spells.:No Condition:Creatures can't be the target of spells. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dense_foliage.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/66.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deny_reality.txt b/res/cardsfolder/deny_reality.txt deleted file mode 100644 index 234e90ca6a3..00000000000 --- a/res/cardsfolder/deny_reality.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deny Reality -ManaCost:3 U B -Types:Instant -Text:no text -K:Cascade -A:SP$ ChangeZone | Cost$ 3 U B | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deny_reality.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/denying_wind.txt b/res/cardsfolder/denying_wind.txt deleted file mode 100644 index 26eac370abb..00000000000 --- a/res/cardsfolder/denying_wind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Denying Wind -ManaCost:7 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 7 U U | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 7 | IsCurse$ True | SpellDescription$ Search target player's library for up to seven cards and exile them. Then that player shuffles his or her library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/denying_wind.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deprive.txt b/res/cardsfolder/deprive.txt deleted file mode 100644 index 9fdb8bad478..00000000000 --- a/res/cardsfolder/deprive.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deprive -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U Return<1/Land> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/deprive.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deranged_hermit.txt b/res/cardsfolder/deranged_hermit.txt deleted file mode 100644 index 142b2ccb20b..00000000000 --- a/res/cardsfolder/deranged_hermit.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Deranged Hermit -ManaCost:3 G G -Types:Creature Elf -Text:no text -PT:1/1 -K:Echo:3 G G -K:stPumpAll:Creature.Squirrel:1/1:No Condition:Squirrel creatures get +1/+1. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put four 1/1 green Squirrel creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 4 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deranged_hermit.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/derelor.txt b/res/cardsfolder/derelor.txt deleted file mode 100644 index 7354e598d63..00000000000 --- a/res/cardsfolder/derelor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Derelor -ManaCost:3 B -Types:Creature Thrull -Text:Black spells you cast cost B more to cast. -PT:4/4 -K:CostChange:Player:More:B:Spell:black:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/derelor.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/17.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/120.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/descendant_of_soramaro.txt b/res/cardsfolder/descendant_of_soramaro.txt deleted file mode 100644 index 8e59c3b5231..00000000000 --- a/res/cardsfolder/descendant_of_soramaro.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Descendant of Soramaro -ManaCost:3 U -Types:Creature Human Wizard -Text:no text -PT:2/3 -A:AB$ RearrangeTopOfLibrary | Cost$ 1 U | Defined$ You | NumCards$ X | SpellDescription$ 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. -SVar:X:Count$InYourHand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/descendant_of_soramaro.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desecrated_earth.txt b/res/cardsfolder/desecrated_earth.txt deleted file mode 100644 index 43c30c43e64..00000000000 --- a/res/cardsfolder/desecrated_earth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Desecrated Earth -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDiscard | SpellDescription$ Destroy target land. Its controller discards a card. -SVar:DBDiscard:DB$Discard | Defined$ TargetedController | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/desecrated_earth.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/86.jpg -End diff --git a/res/cardsfolder/desert.txt b/res/cardsfolder/desert.txt deleted file mode 100644 index 5085ec9af84..00000000000 --- a/res/cardsfolder/desert.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Desert -ManaCost:no cost -Types:Land Desert -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking Creature | NumDmg$ 1 | ActivatingPhases$ EndCombat | SpellDescription$ Desert deals 1 damage to target attacking creature. Activate this ability only during the end of combat step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/desert.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/118.jpg -SetInfo:ARN|Land|http://magiccards.info/scans/en/an/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desert_drake.txt b/res/cardsfolder/desert_drake.txt deleted file mode 100644 index 81ebeed0b13..00000000000 --- a/res/cardsfolder/desert_drake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Desert Drake -ManaCost:3 R -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4333.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desert_nomads.txt b/res/cardsfolder/desert_nomads.txt deleted file mode 100644 index 63b22e44348..00000000000 --- a/res/cardsfolder/desert_nomads.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Desert Nomads -ManaCost:2 R -Types:Creature Human Nomad -Text:Prevent all damage that would be dealt to CARDNAME by Deserts. -PT:2/2 -K:Desertwalk -K:PreventAllDamageBy Desert -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/desert_nomads.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desert_sandstorm.txt b/res/cardsfolder/desert_sandstorm.txt deleted file mode 100644 index 9e954d1679c..00000000000 --- a/res/cardsfolder/desert_sandstorm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Desert Sandstorm -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 R | NumDmg$ 1 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 1 damage to each creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/desert_sandstorm.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desert_twister.txt b/res/cardsfolder/desert_twister.txt deleted file mode 100644 index 7af7e45035a..00000000000 --- a/res/cardsfolder/desert_twister.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Desert Twister -ManaCost:4 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 G G | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Destroy target permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/desert_twister.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/243.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/99.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/124.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/30.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/150.jpg -End diff --git a/res/cardsfolder/deserted_temple.txt b/res/cardsfolder/deserted_temple.txt deleted file mode 100644 index 14f193d6531..00000000000 --- a/res/cardsfolder/deserted_temple.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Deserted Temple -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Untap | Cost$ 1 T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deserted_temple.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desolation_angel.txt b/res/cardsfolder/desolation_angel.txt deleted file mode 100644 index 2207e3a1682..00000000000 --- a/res/cardsfolder/desolation_angel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Desolation Angel -ManaCost:3 B B -Types:Creature Angel -Text:no text -PT:5/4 -K:Flying -K:Kicker:W W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+notkicked | Execute$ TrigDestroyYourLand | TriggerDescription$ When CARDNAME enters the battlefield, destroy all lands you control. If it was kicked, destroy all lands instead. -SVar:TrigDestroyYourLand:AB$DestroyAll | Cost$ 0 | ValidCards$ Land.YouCtrl | SpellDescription$ CARDNAME destroys all land you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Secondary$ True | Execute$ TrigKicker | TriggerDescription$ Kicker: If you paid the kicker cost, destroy all lands instead. -SVar:TrigKicker:AB$DestroyAll | Cost$ 0 | ValidCards$ Land | SpellDescription$ CARDNAME destroys all land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/desolation_angel.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desolation_giant.txt b/res/cardsfolder/desolation_giant.txt deleted file mode 100644 index 112df606282..00000000000 --- a/res/cardsfolder/desolation_giant.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Desolation Giant -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:3/3 -K:Kicker:W W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+notkicked | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy all other creatures you control. If it was kicked, destroy all other creatures instead. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Secondary$ True | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy all other creatures. -SVar:TrigDestroy:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.Other+YouCtrl -SVar:TrigKicker:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/desolation_giant.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/59.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/desperate_charge.txt b/res/cardsfolder/desperate_charge.txt deleted file mode 100644 index 6889fc8f0f7..00000000000 --- a/res/cardsfolder/desperate_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Desperate Charge -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SpellDescription$ Creatures you control get +2/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10512.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/74.jpg -End diff --git a/res/cardsfolder/despise.txt b/res/cardsfolder/despise.txt deleted file mode 100644 index c685fad83e6..00000000000 --- a/res/cardsfolder/despise.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Despise -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Opponent | NumCards$ 1 | DiscardValid$ Creature,Planeswalker | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals his or her hand. You choose a creature or planeswalker card from it. That player discards that card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/despise.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/despoil.txt b/res/cardsfolder/despoil.txt deleted file mode 100644 index 89d04a9e942..00000000000 --- a/res/cardsfolder/despoil.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Despoil -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDrain | SpellDescription$ Destroy target land. Its controller loses 2 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/despoil.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/62.jpg -End diff --git a/res/cardsfolder/despondency.txt b/res/cardsfolder/despondency.txt deleted file mode 100644 index 866756c944d..00000000000 --- a/res/cardsfolder/despondency.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Despondency -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-2/-0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/despondency.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/despotic_scepter.txt b/res/cardsfolder/despotic_scepter.txt deleted file mode 100644 index c7aff78e27a..00000000000 --- a/res/cardsfolder/despotic_scepter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Despotic Scepter -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Destroy | Cost$ T | ValidTgts$ Permanent.YouOwn | TgtPrompt$ Select target permanent you own | NoRegen$ True | SpellDescription$ Destroy target permanent you own. It can't be regenerated. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/despotic_scepter.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/destructive_flow.txt b/res/cardsfolder/destructive_flow.txt deleted file mode 100644 index 2762f23a957..00000000000 --- a/res/cardsfolder/destructive_flow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Destructive Flow -ManaCost:B R G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices a nonbasic land. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Land.nonBasic | Defined$ TriggeredPlayer | SacMessage$ nonbasic land -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/destructive_flow.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/destructive_force.txt b/res/cardsfolder/destructive_force.txt deleted file mode 100644 index 44b90a1f5da..00000000000 --- a/res/cardsfolder/destructive_force.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Destructive Force -ManaCost:5 R R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 5 R R | Defined$ Each | SacValid$ Land | Amount$ 5 | SpellDescription$ Each player sacrifices five lands. CARDNAME deals 5 damage to each creature. | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$ DamageAll | NumDmg$ 5 | ValidCards$ Creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/destructive_force.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/destructive_urge.txt b/res/cardsfolder/destructive_urge.txt deleted file mode 100644 index efab012503c..00000000000 --- a/res/cardsfolder/destructive_urge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Destructive Urge -ManaCost:1 R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | Execute$ TrigSacrifice | CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, that player sacrifices a land. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | Defined$ TriggeredTarget | SacValid$ Land | ChangeNum$ 1 | SpellDescription$ Sacrifice a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/destructive_urge.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/detonate.txt b/res/cardsfolder/detonate.txt deleted file mode 100644 index 3ba0a285956..00000000000 --- a/res/cardsfolder/detonate.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Detonate -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ X R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | NoRegen$ True | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target artifact with converted mana cost X. It can't be regenerated. CARDNAME deals X damage to that artifact's controller. -SVar:DBDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ X -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/detonate.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/88.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/218.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/202.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/deus_of_calamity.txt b/res/cardsfolder/deus_of_calamity.txt deleted file mode 100644 index fdfe9f6ef22..00000000000 --- a/res/cardsfolder/deus_of_calamity.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Deus of Calamity -ManaCost:RG RG RG RG RG -Types:Creature Spirit Avatar -Text:no text -PT:6/6 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | DamageAmount$ GE6 | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals 6 or more damage to an opponent, destroy target land that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land.YouDontCtrl | TgtPrompt$ Select target land opponent controls. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/deus_of_calamity.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devastate.txt b/res/cardsfolder/devastate.txt deleted file mode 100644 index 94655b6f763..00000000000 --- a/res/cardsfolder/devastate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devastate -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Land | TgtPrompt$ Select target land. | SubAbility$ SVar=DBDamageAll | SpellDescription$ Destroy target land. CARDNAME deals 1 damage to each creature and each player. -SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/devastate.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devastating_summons.txt b/res/cardsfolder/devastating_summons.txt deleted file mode 100644 index 573b56a6af2..00000000000 --- a/res/cardsfolder/devastating_summons.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Devastating Summons -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ R Sac | TokenAmount$ 2 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ X | TokenToughness$ X | SpellDescription$ Put two X/X red Elemental creature tokens onto the battlefield. -SVar:X:Sacrificed$Amount -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/devastating_summons.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devastation.txt b/res/cardsfolder/devastation.txt deleted file mode 100644 index a01d5d1ca85..00000000000 --- a/res/cardsfolder/devastation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devastation -ManaCost:5 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 5 R R | ValidCards$ Creature,Land | SpellDescription$ Destroy all creatures and lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/devastation.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/94.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/128.jpg -End diff --git a/res/cardsfolder/devoted_druid.txt b/res/cardsfolder/devoted_druid.txt deleted file mode 100644 index 77c54c8ba84..00000000000 --- a/res/cardsfolder/devoted_druid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Devoted Druid -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:0/2 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Untap | Cost$ AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/devoted_druid.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devoted_hero.txt b/res/cardsfolder/devoted_hero.txt deleted file mode 100644 index ed343ff2eed..00000000000 --- a/res/cardsfolder/devoted_hero.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devoted Hero -ManaCost:W -Types:Creature Elf Soldier -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21057.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/13.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devoted_retainer.txt b/res/cardsfolder/devoted_retainer.txt deleted file mode 100644 index 0babe0ee96b..00000000000 --- a/res/cardsfolder/devoted_retainer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devoted Retainer -ManaCost:W -Types:Creature Human Samurai -Text:no text -PT:1/1 -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/devoted_retainer.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devour_in_shadow.txt b/res/cardsfolder/devour_in_shadow.txt deleted file mode 100644 index c33e2917877..00000000000 --- a/res/cardsfolder/devour_in_shadow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Devour in Shadow -ManaCost:B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SubAbility$ SVar=DBLoseLife | SpellDescription$ Destroy target creature. It can't be regenerated. You lose life equal to that creature's toughness. -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card50210.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/46.jpg -End diff --git a/res/cardsfolder/devouring_deep.txt b/res/cardsfolder/devouring_deep.txt deleted file mode 100644 index b298111a706..00000000000 --- a/res/cardsfolder/devouring_deep.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devouring Deep -ManaCost:2 U -Types:Creature Fish -Text:no text -PT:1/2 -K:Islandwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1476.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devout_harpist.txt b/res/cardsfolder/devout_harpist.txt deleted file mode 100644 index b0fafc8490e..00000000000 --- a/res/cardsfolder/devout_harpist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devout Harpist -ManaCost:W -Types:Creature Human -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Aura.enchanting | TgtPrompt$ Select target Aura attached to a creature | SpellDescription$ Destroy target Aura attached to a creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/devout_harpist.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/6.jpg -End diff --git a/res/cardsfolder/devout_lightcaster.txt b/res/cardsfolder/devout_lightcaster.txt deleted file mode 100644 index 3a2a5a79462..00000000000 --- a/res/cardsfolder/devout_lightcaster.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Devout Lightcaster -ManaCost:W W W -Types:Creature Kor Cleric -Text:no text -PT:2/2 -K:Protection from black -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile target black permanent. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Black | TgtPrompt$ Select target black permanent | Origin$ Battlefield | Destination$ Exile -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/devout_lightcaster.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devout_monk.txt b/res/cardsfolder/devout_monk.txt deleted file mode 100644 index 40db32d507f..00000000000 --- a/res/cardsfolder/devout_monk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Devout Monk -ManaCost:W -Types:Creature Human Monk Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Starter_1999/devout_monk.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/devout_witness.txt b/res/cardsfolder/devout_witness.txt deleted file mode 100644 index 7f1e4c37ee7..00000000000 --- a/res/cardsfolder/devout_witness.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Devout Witness -ManaCost:2 W -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ 1 W T Discard<1/Card> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/devout_witness.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/17.jpg -End diff --git a/res/cardsfolder/dewdrop_spy.txt b/res/cardsfolder/dewdrop_spy.txt deleted file mode 100644 index 808b8247c36..00000000000 --- a/res/cardsfolder/dewdrop_spy.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dewdrop Spy -ManaCost:1 U U -Types:Creature Faerie Rogue -Text:no text -PT:2/2 -K:Flash -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at the top card of target player's library. -SVar:TrigPeek:AB$ RearrangeTopOfLibrary | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 1 | SpellDescription$ Look at the top card of target player's library. -SVar:RemAI:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dewdrop_spy.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diabolic_edict.txt b/res/cardsfolder/diabolic_edict.txt deleted file mode 100644 index b3108d9a9ac..00000000000 --- a/res/cardsfolder/diabolic_edict.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Diabolic Edict -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target player sacrifices a creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_edict.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diabolic_intent.txt b/res/cardsfolder/diabolic_intent.txt deleted file mode 100644 index 58fa44dbc90..00000000000 --- a/res/cardsfolder/diabolic_intent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diabolic Intent -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B Sac<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_intent.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diabolic_machine.txt b/res/cardsfolder/diabolic_machine.txt deleted file mode 100644 index 56ba094c538..00000000000 --- a/res/cardsfolder/diabolic_machine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Diabolic Machine -ManaCost:7 -Types:Artifact Creature Construct -Text:no text -PT:4/4 -A:AB$ Regenerate | Cost$ 3 | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_machine.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/363.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/98.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/332.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diabolic_tutor.txt b/res/cardsfolder/diabolic_tutor.txt deleted file mode 100644 index 2945ad2430f..00000000000 --- a/res/cardsfolder/diabolic_tutor.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Diabolic Tutor -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_tutor.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/128.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/129.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/125.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/135.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/93.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diabolic_vision.txt b/res/cardsfolder/diabolic_vision.txt deleted file mode 100644 index d7d72067a71..00000000000 --- a/res/cardsfolder/diabolic_vision.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diabolic Vision -ManaCost:U B -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ U B | DigNum$ 5 | ChangeNum$ 1 | LibraryPosition2$ 0 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diabolic_vision.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/362.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diamond_faerie.txt b/res/cardsfolder/diamond_faerie.txt deleted file mode 100644 index 0ac66c52cdd..00000000000 --- a/res/cardsfolder/diamond_faerie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Diamond Faerie -ManaCost:2 G W U -Types:Snow Creature Faerie -Text:no text -PT:3/3 -K:Flying -A:AB$ PumpAll | Cost$ 1 S | ValidCards$ Creature.Snow+YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Snow creatures you control get +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/diamond_faerie.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diamond_kaleidoscope.txt b/res/cardsfolder/diamond_kaleidoscope.txt deleted file mode 100644 index 47792930bf7..00000000000 --- a/res/cardsfolder/diamond_kaleidoscope.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Diamond Kaleidoscope -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 3 T | TokenAmount$ 1 | TokenName$ Prism | TokenTypes$ Artifact,Creature,Prism | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | SpellDescription$ Put a 0/1 colorless Prism artifact creature token onto the battlefield. -A:AB$ Mana | Cost$ Sac<1/Prism.token> | CostDesc$ Sacrifice a Prism token: | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Prism.token> | CostDesc$ Sacrifice a Prism token: | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Prism.token> | CostDesc$ Sacrifice a Prism token: | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Prism.token> | CostDesc$ Sacrifice a Prism token: | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Prism.token> | CostDesc$ Sacrifice a Prism token: | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/diamond_kaleidoscope.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diamond_valley.txt b/res/cardsfolder/diamond_valley.txt deleted file mode 100644 index 62d3d3ccc89..00000000000 --- a/res/cardsfolder/diamond_valley.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diamond Valley -ManaCost:no cost -Types:Land -A:AB$ GainLife | Cost$ T Sac<1/Creature> | LifeAmount$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. -SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diamond_valley.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/didgeridoo.txt b/res/cardsfolder/didgeridoo.txt deleted file mode 100644 index 4592689879f..00000000000 --- a/res/cardsfolder/didgeridoo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Didgeridoo -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 3 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.Minotaur | ChangeNum$ 1 | SpellDescription$ You may put a Minotaur permanent card from your hand onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/didgeridoo.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diligent_farmhand.txt b/res/cardsfolder/diligent_farmhand.txt deleted file mode 100644 index 961274fa77a..00000000000 --- a/res/cardsfolder/diligent_farmhand.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diligent Farmhand -ManaCost:G -Types:Creature Druid -Text:If Diligent Farmhand is in the graveyard, Muscle Burst's effect counts it as a Muscle Burst. -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 G Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/diligent_farmhand.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diminish.txt b/res/cardsfolder/diminish.txt deleted file mode 100644 index 0300a00c7b8..00000000000 --- a/res/cardsfolder/diminish.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diminish -ManaCost:U -Types:Instant -Text:no text -A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 1 | Toughness$ 1 | SpellDescription$ Target creature becomes 1/1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/diminish.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diminishing_returns.txt b/res/cardsfolder/diminishing_returns.txt deleted file mode 100644 index 81dfcca4a05..00000000000 --- a/res/cardsfolder/diminishing_returns.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Diminishing Returns -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 U U | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBChangeHand | SpellDescription$ Each player shuffles his or her hand and graveyard into his or her library. -SVar:DBChangeHand:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBExile -SVar:DBExile:DB$Mill | Defined$ You | NumCards$ 10 | Destination$ Exile | SubAbility$ SVar=DBDraw | SpellDescription$ You exile the top ten cards of your library. -SVar:DBDraw:DB$Draw | Defined$ Each | NumCards$ 7 | SpellDescription$ Then each player draws up to seven cards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/diminishing_returns.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/65.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_aqueduct.txt b/res/cardsfolder/dimir_aqueduct.txt deleted file mode 100644 index 5601fdb603a..00000000000 --- a/res/cardsfolder/dimir_aqueduct.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dimir Aqueduct -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U B | SpellDescription$ Add U B to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_aqueduct.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_cutpurse.txt b/res/cardsfolder/dimir_cutpurse.txt deleted file mode 100644 index 00638d7217e..00000000000 --- a/res/cardsfolder/dimir_cutpurse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dimir Cutpurse -ManaCost:1 U B -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigDrawDiscard | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card and you draw a card. -SVar:TrigDrawDiscard:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_cutpurse.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_guildmage.txt b/res/cardsfolder/dimir_guildmage.txt deleted file mode 100644 index 52e24e82ddf..00000000000 --- a/res/cardsfolder/dimir_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dimir Guildmage -ManaCost:UB UB -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Draw | Cost$ 3 U | ValidTgts$ Player | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Target player draws a card. Activate this ability only any time you could cast a sorcery. -A:AB$ Discard | Cost$ 3 B | ValidTgts$ Player | Mode$ TgtChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_guildmage.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_house_guard.txt b/res/cardsfolder/dimir_house_guard.txt deleted file mode 100644 index 4af59a8b5a2..00000000000 --- a/res/cardsfolder/dimir_house_guard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dimir House Guard -ManaCost:3 B -Types:Creature Skeleton -Text:no text -PT:2/3 -K:Fear -A:AB$ Regenerate | Cost$ Sac<1/Creature> | CostDesc$ Sacrifice a creature: | SpellDescription$ Regenerate CARDNAME. -K:Transmute:1 B B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_house_guard.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_infiltrator.txt b/res/cardsfolder/dimir_infiltrator.txt deleted file mode 100644 index 2b83f803600..00000000000 --- a/res/cardsfolder/dimir_infiltrator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dimir Infiltrator -ManaCost:U B -Types:Creature Spirit -Text:no text -PT:1/3 -K:Unblockable -K:Transmute:1 U B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_infiltrator.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_machinations.txt b/res/cardsfolder/dimir_machinations.txt deleted file mode 100644 index b7a41127fbe..00000000000 --- a/res/cardsfolder/dimir_machinations.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dimir Machinations -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 2 B | DigNum$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | AnyNumber$ True | DestinationZone$ Exile | LibraryPosition2$ 0 | SpellDescription$ 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. -K:Transmute:1 B B -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_machinations.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dimir_signet.txt b/res/cardsfolder/dimir_signet.txt deleted file mode 100644 index db77c1e82f1..00000000000 --- a/res/cardsfolder/dimir_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dimir Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ U B | SpellDescription$ Add U B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dimir_signet.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/din_of_the_fireherd.txt b/res/cardsfolder/din_of_the_fireherd.txt deleted file mode 100644 index a3c3776cb1f..00000000000 --- a/res/cardsfolder/din_of_the_fireherd.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Din of the Fireherd -ManaCost:5 BR BR BR -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 5 BR BR BR | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental | TokenColors$ Black,Red | TokenTypes$ Creature,Elemental | TokenPower$ 5 | TokenToughness$ 5 | SubAbility$ SVar=DBSac1 | SpellDescription$ 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. -SVar:DBSac1:DB$Sacrifice | SacValid$ Creature | Defined$ Opponent | Amount$ X | SubAbility$ SVar=DBSac2 -SVar:DBSac2:DB$Sacrifice | SacValid$ Land | Defined$ Opponent | Amount$ Y -SVar:X:Count$Valid Creature.Black+YouCtrl -SVar:Y:Count$Valid Creature.Red+YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/din_of_the_fireherd.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dingus_egg.txt b/res/cardsfolder/dingus_egg.txt deleted file mode 100644 index 8a8ecfe8a81..00000000000 --- a/res/cardsfolder/dingus_egg.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Dingus Egg -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that land's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dingus_egg.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/297.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/241.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/243.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/292.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/364.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/333.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/280.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/244.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dingus_staff.txt b/res/cardsfolder/dingus_staff.txt deleted file mode 100644 index 7546f758d72..00000000000 --- a/res/cardsfolder/dingus_staff.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dingus Staff -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that creature's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dingus_staff.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diplomatic_escort.txt b/res/cardsfolder/diplomatic_escort.txt deleted file mode 100644 index 380a591441d..00000000000 --- a/res/cardsfolder/diplomatic_escort.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diplomatic Escort -ManaCost:1 U -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ U T Discard<1/Card> | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability | ValidTgts$ Card | TargetValidTargeting$ Creature | SpellDescription$ Counter target spell or ability that targets a creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diplomatic_escort.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diplomatic_immunity.txt b/res/cardsfolder/diplomatic_immunity.txt deleted file mode 100644 index 6ee6b106986..00000000000 --- a/res/cardsfolder/diplomatic_immunity.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Diplomatic Immunity -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Shroud -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/diplomatic_immunity.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dire_undercurrents.txt b/res/cardsfolder/dire_undercurrents.txt deleted file mode 100644 index 0e82587dc5a..00000000000 --- a/res/cardsfolder/dire_undercurrents.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dire Undercurrents -ManaCost:3 UB UB -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Blue+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever a blue creature enters the battlefield under your control, you may have target player draw a card. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Black+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ Whenever a black creature enters the battlefield under your control, you may have target player discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ select target player to draw a card | NumCards$ 1 -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | NumCards$ 1 | TgtPrompt$ select target player to discard a card | Mode$ TgtChoose -SVar:BuffedBy:Creature.Blue,Creature.Black -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dire_undercurrents.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dirge_of_dread.txt b/res/cardsfolder/dirge_of_dread.txt deleted file mode 100644 index 55cbd7e419e..00000000000 --- a/res/cardsfolder/dirge_of_dread.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dirge of Dread -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature | KW$ Fear | SpellDescription$ All creatures gain fear until end of turn. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have target creature gain fear until end of turn -K:Cycling:1 B -SVar:TrigPump:AB$ Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear -SVar:Picture:http://www.wizards.com/global/images/magic/general/dirge_of_dread.jpg -SVar:Rarity:Common -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/138.jpg -End diff --git a/res/cardsfolder/dirtcowl_wurm.txt b/res/cardsfolder/dirtcowl_wurm.txt deleted file mode 100644 index 199d7a6b766..00000000000 --- a/res/cardsfolder/dirtcowl_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dirtcowl Wurm -ManaCost:4 G -Types:Creature Wurm -Text:no text -PT:3/4 -T:Mode$ LandPlayed | ValidCard$ Land.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent plays a land, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dirtcowl_wurm.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dirtwater_wraith.txt b/res/cardsfolder/dirtwater_wraith.txt deleted file mode 100644 index b8c5b10bd36..00000000000 --- a/res/cardsfolder/dirtwater_wraith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dirtwater Wraith -ManaCost:3 B -Types:Creature Wraith -Text:no text -PT:1/3 -K:Swampwalk -A:AB$ Pump | Cost$ B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dirtwater_wraith.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/15.jpg -End diff --git a/res/cardsfolder/dirty_wererat.txt b/res/cardsfolder/dirty_wererat.txt deleted file mode 100644 index 5adf9b3421d..00000000000 --- a/res/cardsfolder/dirty_wererat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dirty Wererat -ManaCost:3 B -Types:Creature Human Rat Minion -Text:no text -PT:2/3 -A:AB$ Regenerate | Cost$ B Discard<1/Card> | SpellDescription$ Regenerate CARDNAME. -K:stPumpSelf:Creature:2/2/CARDNAME can't block.:Threshold:Threshold - As long as seven or more cards are in your graveyard, CARDNAME gets +2/+2 and can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dirty_wererat.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disappear.txt b/res/cardsfolder/disappear.txt deleted file mode 100644 index 427e8599af3..00000000000 --- a/res/cardsfolder/disappear.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Disappear -ManaCost:2 U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -A:AB$ ChangeZone | Cost$ U | Defined$ Enchanted | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBBounce | SpellDescription$ Return enchanted creature and CARDNAME to their owners' hands. -SVar:DBBounce:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/disappear.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_grace.txt b/res/cardsfolder/disciple_of_grace.txt deleted file mode 100644 index 3b5eb218eb7..00000000000 --- a/res/cardsfolder/disciple_of_grace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Disciple of Grace -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/2 -K:Protection from black -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_grace.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/10.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_kangee.txt b/res/cardsfolder/disciple_of_kangee.txt deleted file mode 100644 index 39846bcb088..00000000000 --- a/res/cardsfolder/disciple_of_kangee.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Disciple of Kangee -ManaCost:2 W -Types:Creature Human Wizard -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ps/en-us/card26285.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_law.txt b/res/cardsfolder/disciple_of_law.txt deleted file mode 100644 index 2d1eb92b6b9..00000000000 --- a/res/cardsfolder/disciple_of_law.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disciple of Law -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/2 -K:Protection from red -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_law.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_malice.txt b/res/cardsfolder/disciple_of_malice.txt deleted file mode 100644 index ade1b4f04d0..00000000000 --- a/res/cardsfolder/disciple_of_malice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disciple of Malice -ManaCost:1 B -Types:Creature Human Cleric -Text:no text -PT:1/2 -K:Protection from white -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_malice.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_tevesh_szat.txt b/res/cardsfolder/disciple_of_tevesh_szat.txt deleted file mode 100644 index bc1e55ec558..00000000000 --- a/res/cardsfolder/disciple_of_tevesh_szat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disciple of Tevesh Szat -ManaCost:2 B B -Types:Creature Human Cleric -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -A:AB$ Pump | Cost$ 4 B B T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -6 | NumDef$ -6 | IsCurse$ True | SpellDescription$ Target creature gets -6/-6 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_tevesh_szat.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disciple_of_the_vault.txt b/res/cardsfolder/disciple_of_the_vault.txt deleted file mode 100644 index 843dff663b0..00000000000 --- a/res/cardsfolder/disciple_of_the_vault.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disciple of the Vault -ManaCost:B -Types:Creature Human Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigLoseLife | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, you may have target opponent lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disciple_of_the_vault.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/discombobulate.txt b/res/cardsfolder/discombobulate.txt deleted file mode 100644 index d9e3fcab3ae..00000000000 --- a/res/cardsfolder/discombobulate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Discombobulate -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SubAbility$ SVar=DBRearrange | SpellDescription$ Counter target spell. Look at the top four cards of your library, then put them back in any order. -SVar:DBRearrange:DB$RearrangeTopOfLibrary | Defined$ You | NumCards$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/discombobulate.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/79.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/discordant_dirge.txt b/res/cardsfolder/discordant_dirge.txt deleted file mode 100644 index 8381efc0d49..00000000000 --- a/res/cardsfolder/discordant_dirge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Discordant Dirge -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ X | SpellDescription$ Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on CARDNAME. That player discards those cards. -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/discordant_dirge.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disease_carriers.txt b/res/cardsfolder/disease_carriers.txt deleted file mode 100644 index 5f1b004f79e..00000000000 --- a/res/cardsfolder/disease_carriers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disease Carriers -ManaCost:2 B B -Types:Creature Rat -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target creature gets -2/-2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disease_carriers.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disembowel.txt b/res/cardsfolder/disembowel.txt deleted file mode 100644 index 429858d7a7b..00000000000 --- a/res/cardsfolder/disembowel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disembowel -ManaCost:X B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ X B | ValidTgts$ Creature | SpellDescription$ Destroy target creature with converted mana cost X. -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disembowel.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disempower.txt b/res/cardsfolder/disempower.txt deleted file mode 100644 index bd20afe024a..00000000000 --- a/res/cardsfolder/disempower.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Disempower -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target artifact or enchantment on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disempower.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disenchant.txt b/res/cardsfolder/disenchant.txt deleted file mode 100644 index 330e2e7a760..00000000000 --- a/res/cardsfolder/disenchant.txt +++ /dev/null @@ -1,22 +0,0 @@ -Name:Disenchant -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disenchant.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/12.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/228.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/204.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/13.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/272.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/18.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/16.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/244.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/6.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/201.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/302.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/214.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/203.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disentomb.txt b/res/cardsfolder/disentomb.txt deleted file mode 100644 index 008f013ee97..00000000000 --- a/res/cardsfolder/disentomb.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Disentomb -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disentomb.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disfigure.txt b/res/cardsfolder/disfigure.txt deleted file mode 100644 index 8e695f18078..00000000000 --- a/res/cardsfolder/disfigure.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Disfigure -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disfigure.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/87.jpg -End diff --git a/res/cardsfolder/disintegrate.txt b/res/cardsfolder/disintegrate.txt deleted file mode 100644 index 002f00c02e0..00000000000 --- a/res/cardsfolder/disintegrate.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Disintegrate -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R | Tgt$ TgtCP | NumDmg$ X | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals X damage to target creature or player. That creature can't be regenerated this turn. If the creature would be put into a graveyard this turn, exile it instead. -SVar:X:Count$xPaid -SVar:DB:DB$Pump | KW$ CARDNAME can't be regenerated. & If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disintegrate.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/141.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/142.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/203.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/58.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/141.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/219.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dismal_failure.txt b/res/cardsfolder/dismal_failure.txt deleted file mode 100644 index 1161435dc12..00000000000 --- a/res/cardsfolder/dismal_failure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dismal Failure -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SubAbility$ SVar=DBDiscard | SpellDescription$ Counter target spell. Its controller discards a card. -SVar:DBDiscard:DB$Discard | Defined$ TargetedController | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dismal_failure.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dismember.txt b/res/cardsfolder/dismember.txt deleted file mode 100644 index 4fd728edbe5..00000000000 --- a/res/cardsfolder/dismember.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dismember -ManaCost:1 PB PB -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 PB PB | IsCurse$ True | Tgt$ TgtC | NumAtt$ -5 | NumDef$ -5 | SpellDescription$ Target creature gets -5/-5 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dismember.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dismiss.txt b/res/cardsfolder/dismiss.txt deleted file mode 100644 index 053549b3e37..00000000000 --- a/res/cardsfolder/dismiss.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dismiss -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dismiss.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disorient.txt b/res/cardsfolder/disorient.txt deleted file mode 100644 index ed975a945a5..00000000000 --- a/res/cardsfolder/disorient.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Disorient -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -7 | IsCurse$ True | SpellDescription$ Target creature gets -7/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disorient.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/48.jpg -End diff --git a/res/cardsfolder/dispatch.txt b/res/cardsfolder/dispatch.txt deleted file mode 100644 index 9298b805663..00000000000 --- a/res/cardsfolder/dispatch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dispatch -ManaCost:W -Types:Instant -Text:no text -A:SP$ Tap | Cost$ W | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ SVar=DBExile | SpellDescription$ Tap target creature. Metalcraft - If you control three or more artifacts, exile that creature. -SVar:DBExile:DB$ChangeZone | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ GE3 | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | ConditionDescription$ If you control three or more artifacts, -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dispatch.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dispel.txt b/res/cardsfolder/dispel.txt deleted file mode 100644 index 0be9586ae24..00000000000 --- a/res/cardsfolder/dispel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dispel -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Instant | TgtPrompt$ Select target Instant Spell | SpellDescription$ Counter target instant spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dispel.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dispellers_capsule.txt b/res/cardsfolder/dispellers_capsule.txt deleted file mode 100644 index fc7f8a1c55e..00000000000 --- a/res/cardsfolder/dispellers_capsule.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dispeller's Capsule -ManaCost:W -Types:Artifact -Text:no text -A:AB$ Destroy | Cost$ 2 W T Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dispellers_capsule.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/8.jpg -End diff --git a/res/cardsfolder/dispense_justice.txt b/res/cardsfolder/dispense_justice.txt deleted file mode 100644 index 2b2d121edf8..00000000000 --- a/res/cardsfolder/dispense_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dispense Justice -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Sacrifice | Cost$ 2 W | ValidTgts$ Player | SacValid$ Creature.attacking | SacMessage$ Attacking Creature | Amount$ X | SpellDescription$ Target player sacrifices an attacking creature. Metalcraft - That player sacrifices two attacking creatures instead if you control three or more artifacts. -SVar:X:Count$Metalcraft.2.1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dispense_justice.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disperse.txt b/res/cardsfolder/disperse.txt deleted file mode 100644 index 8f26e92890c..00000000000 --- a/res/cardsfolder/disperse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Disperse -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disperse.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/31.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dispersing_orb.txt b/res/cardsfolder/dispersing_orb.txt deleted file mode 100644 index 98ce36d71a7..00000000000 --- a/res/cardsfolder/dispersing_orb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dispersing Orb -ManaCost:3 U U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 3 U Sac<1/Permanent> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/dispersing_orb.jpg -SVar:Rarity:Uncommon -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/80.jpg -End diff --git a/res/cardsfolder/disrupt.txt b/res/cardsfolder/disrupt.txt deleted file mode 100644 index 98f75dc0f50..00000000000 --- a/res/cardsfolder/disrupt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disrupt -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target Instant or Sorcery Spell | UnlessCost$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target instant or sorcery spell unless its controller pays 1. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/disrupt.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/37.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disrupting_scepter.txt b/res/cardsfolder/disrupting_scepter.txt deleted file mode 100644 index d3e84495ad3..00000000000 --- a/res/cardsfolder/disrupting_scepter.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Disrupting Scepter -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Discard | Cost$ 3 T | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | PlayerTurn$ True | SpellDescription$ Target player discards a card. Activate this ability only during your turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/disrupting_scepter.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/298.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/242.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/244.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/293.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/365.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/334.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/295.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/281.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/245.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disruptive_pitmage.txt b/res/cardsfolder/disruptive_pitmage.txt deleted file mode 100644 index 6a23ecef6a5..00000000000 --- a/res/cardsfolder/disruptive_pitmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Disruptive Pitmage -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -K:Morph:U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disruptive_pitmage.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disruptive_student.txt b/res/cardsfolder/disruptive_student.txt deleted file mode 100644 index 07609b077c8..00000000000 --- a/res/cardsfolder/disruptive_student.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Disruptive Student -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disruptive_student.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dissipate.txt b/res/cardsfolder/dissipate.txt deleted file mode 100644 index 49133cd9bc9..00000000000 --- a/res/cardsfolder/dissipate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dissipate -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Exile | SpellDescription$ Counter target spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dissipate.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dissipation_field.txt b/res/cardsfolder/dissipation_field.txt deleted file mode 100644 index f0a4ef349be..00000000000 --- a/res/cardsfolder/dissipation_field.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dissipation Field -ManaCost:2 U U -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidSource$ Permanent | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever a permanent deals damage to you, return it to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredSource -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dissipation_field.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/distress.txt b/res/cardsfolder/distress.txt deleted file mode 100644 index 3c770cc3c75..00000000000 --- a/res/cardsfolder/distress.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Distress -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B B | ValidTgts$ Player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1 | SpellDescription$ Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card135219.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/111.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/disturbed_burial.txt b/res/cardsfolder/disturbed_burial.txt deleted file mode 100644 index a6a54388350..00000000000 --- a/res/cardsfolder/disturbed_burial.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Disturbed Burial -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/disturbed_burial.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dive_bomber.txt b/res/cardsfolder/dive_bomber.txt deleted file mode 100644 index 95b8fce8367..00000000000 --- a/res/cardsfolder/dive_bomber.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dive Bomber -ManaCost:3 W -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -A:AB$ DealDamage | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dive_bomber.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divebomber_griffin.txt b/res/cardsfolder/divebomber_griffin.txt deleted file mode 100644 index e776727746c..00000000000 --- a/res/cardsfolder/divebomber_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Divebomber Griffin -ManaCost:3 W W -Types:Creature Griffin -Text:no text -PT:3/2 -K:Flying -A:AB$ DealDamage | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/divebomber_griffin.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/diversionary_tactics.txt b/res/cardsfolder/diversionary_tactics.txt deleted file mode 100644 index cfd9e9ab877..00000000000 --- a/res/cardsfolder/diversionary_tactics.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Diversionary Tactics -ManaCost:3 W -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ tapXType<2/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/diversionary_tactics.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/7.jpg -End diff --git a/res/cardsfolder/divination.txt b/res/cardsfolder/divination.txt deleted file mode 100644 index 637c1aff304..00000000000 --- a/res/cardsfolder/divination.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Divination -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/divination.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_offering.txt b/res/cardsfolder/divine_offering.txt deleted file mode 100644 index bb67c3e9265..00000000000 --- a/res/cardsfolder/divine_offering.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Divine Offering -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target artifact. You gain life equal to its converted mana cost. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_offering.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/215.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/303.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/5.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_presence.txt b/res/cardsfolder/divine_presence.txt deleted file mode 100644 index 1f08c5e8cfb..00000000000 --- a/res/cardsfolder/divine_presence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Divine Presence -ManaCost:2 W -Types:Enchantment -Text: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. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_presence.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_retribution.txt b/res/cardsfolder/divine_retribution.txt deleted file mode 100644 index c803a3a2bf3..00000000000 --- a/res/cardsfolder/divine_retribution.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Divine Retribution -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target attacking creature equal to the number of attacking creatures. -SVar:X:Count$Valid Creature.attacking -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_retribution.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_sacrament.txt b/res/cardsfolder/divine_sacrament.txt deleted file mode 100644 index cafafbbd521..00000000000 --- a/res/cardsfolder/divine_sacrament.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Divine Sacrament -ManaCost:1 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White:1/1:No Condition:White creatures get +1/+1. -K:stPumpAll:Creature.White:1/1:Threshold:Threshold - White creatures get an additional +1/+1 as long as seven or more cards are in your graveyard. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_sacrament.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_transformation.txt b/res/cardsfolder/divine_transformation.txt deleted file mode 100644 index 1343ab24716..00000000000 --- a/res/cardsfolder/divine_transformation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Divine Transformation -ManaCost:2 W W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_transformation.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/304.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/17.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/273.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divine_verdict.txt b/res/cardsfolder/divine_verdict.txt deleted file mode 100644 index 4560c4727d6..00000000000 --- a/res/cardsfolder/divine_verdict.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Divine Verdict -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | SpellDescription$ Destroy target attacking or blocking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/divine_verdict.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/8.jpg -End diff --git a/res/cardsfolder/diving_griffin.txt b/res/cardsfolder/diving_griffin.txt deleted file mode 100644 index f8c4ea293bf..00000000000 --- a/res/cardsfolder/diving_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Diving Griffin -ManaCost:1 W W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45176.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/17.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/divinity_of_pride.txt b/res/cardsfolder/divinity_of_pride.txt deleted file mode 100644 index 5c374a1a089..00000000000 --- a/res/cardsfolder/divinity_of_pride.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Divinity of Pride -ManaCost:WB WB WB WB WB -Types:Creature Spirit Avatar -Text:no text -PT:4/4 -K:Flying -K:Lifelink -K:stPumpSelf:Creature:4/4:LifeGE/25:Divinity of Pride gets +4/+4 as long as you have 25 or more life. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/divinity_of_pride.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dizzy_spell.txt b/res/cardsfolder/dizzy_spell.txt deleted file mode 100644 index 037bc32abf3..00000000000 --- a/res/cardsfolder/dizzy_spell.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dizzy Spell -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-0 until end of turn. -K:Transmute:1 U U -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dizzy_spell.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/43.jpg -End diff --git a/res/cardsfolder/djinn_of_the_lamp.txt b/res/cardsfolder/djinn_of_the_lamp.txt deleted file mode 100644 index 7116a560d18..00000000000 --- a/res/cardsfolder/djinn_of_the_lamp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Djinn of the Lamp -ManaCost:5 U U -Types:Creature Djinn -Text:no text -PT:5/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4260.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/do_or_die.txt b/res/cardsfolder/do_or_die.txt deleted file mode 100644 index 1d9b8c1c7cf..00000000000 --- a/res/cardsfolder/do_or_die.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Do or Die -ManaCost:1 B -Types:Sorcery -Text:Randomly destroy half of the creatures target player controls. They can't be regenerated. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:None -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23059.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dodecapod.txt b/res/cardsfolder/dodecapod.txt deleted file mode 100644 index 3b6add1b409..00000000000 --- a/res/cardsfolder/dodecapod.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dodecapod -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -K: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dodecapod.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/134.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dogged_hunter.txt b/res/cardsfolder/dogged_hunter.txt deleted file mode 100644 index 39e2f551074..00000000000 --- a/res/cardsfolder/dogged_hunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dogged Hunter -ManaCost:2 W -Types:Creature Human Nomad -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.token | TgtPrompt$ Select target creature token | SpellDescription$ Destroy target creature token. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dogged_hunter.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/20.jpg -End diff --git a/res/cardsfolder/dogpile.txt b/res/cardsfolder/dogpile.txt deleted file mode 100644 index 324f327c820..00000000000 --- a/res/cardsfolder/dogpile.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dogpile -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature or player equal to the number of attacking creatures you control. -SVar:X:Count$Valid Creature.attacking+YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dogpile.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dolmen_gate.txt b/res/cardsfolder/dolmen_gate.txt deleted file mode 100644 index f169bcd7c21..00000000000 --- a/res/cardsfolder/dolmen_gate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dolmen Gate -ManaCost:2 -Types:Artifact -Text:no text -K:stPumpAll:Creature.attacking+YouCtrl:0/0/HIDDEN Prevent all combat damage that would be dealt to CARDNAME.:No Condition:Prevent all combat damage that would be dealt to attacking creatures you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dolmen_gate.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/domestication.txt b/res/cardsfolder/domestication.txt deleted file mode 100644 index adde326ac75..00000000000 --- a/res/cardsfolder/domestication.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Domestication -ManaCost:2 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.AttachedBy+powerGE4 | Execute$ TrigSac | TriggerDescription$ At the beginning of your end step, if enchanted creature's power is 4 or greater, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/domestication.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dominate.txt b/res/cardsfolder/dominate.txt deleted file mode 100644 index 7baf1b6c68d..00000000000 --- a/res/cardsfolder/dominate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dominate -ManaCost:X 1 U U -Types:Instant -Text:no text -A:SP$ GainControl | Cost$ X 1 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Gain control of target creature with converted mana cost X or less. (This effect lasts indefinitely.) -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dominate.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dominus_of_fealty.txt b/res/cardsfolder/dominus_of_fealty.txt deleted file mode 100644 index 728f3ab7aa5..00000000000 --- a/res/cardsfolder/dominus_of_fealty.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dominus of Fealty -ManaCost:UR UR UR UR UR -Types:Creature Spirit Avatar -Text:no text -PT:4/4 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigGainControl | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigGainControl:AB$GainControl | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Untap$ True | AddKWs$ Haste | LoseControl$ EOT -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dominus_of_fealty.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/donate.txt b/res/cardsfolder/donate.txt deleted file mode 100644 index 1617d238119..00000000000 --- a/res/cardsfolder/donate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Donate -ManaCost:2 U -Types:Sorcery -Text:Target player gains control of target permanent you control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/donate.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/doom_blade.txt b/res/cardsfolder/doom_blade.txt deleted file mode 100644 index 68043b08d7f..00000000000 --- a/res/cardsfolder/doom_blade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Doom Blade -ManaCost:1 B -Types:Instant -Text: -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/doom_blade.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/95.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/93.jpg -End diff --git a/res/cardsfolder/doomed_necromancer.txt b/res/cardsfolder/doomed_necromancer.txt deleted file mode 100644 index 04211bbab0e..00000000000 --- a/res/cardsfolder/doomed_necromancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Doomed Necromancer -ManaCost:2 B -Types:Creature Human Cleric Mercenary -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/doomed_necromancer.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/140.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/doomsday.txt b/res/cardsfolder/doomsday.txt deleted file mode 100644 index 07b7501c538..00000000000 --- a/res/cardsfolder/doomsday.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Doomsday -ManaCost:B B B -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ B B B | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBDig | SpellDescription$ 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. -SVar:DBDig:DB$Dig | DigNum$ X | DestinationZone$ Library | ChangeNum$ 5 | DestinationZone2$ Exile | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ Y -SVar:X:Count$InYourLibrary -SVar:Y:Count$YourLifeTotal/HalfUp -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/doomsday.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/8.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/doomsday_specter.txt b/res/cardsfolder/doomsday_specter.txt deleted file mode 100644 index f89d04c1a58..00000000000 --- a/res/cardsfolder/doomsday_specter.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Doomsday Specter -ManaCost:2 U B -Types:Creature Specter -Text:no text -PT:2/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, look at that player's hand and choose a card from it. The player discards that card. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Blue+YouCtrl -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/doomsday_specter.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/door_to_nothingness.txt b/res/cardsfolder/door_to_nothingness.txt deleted file mode 100644 index 203b818d550..00000000000 --- a/res/cardsfolder/door_to_nothingness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Door to Nothingness -ManaCost:5 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ LosesGame | Cost$ W W U U B B R R G G T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player loses the game. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/door_to_nothingness.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/doran_the_siege_tower.txt b/res/cardsfolder/doran_the_siege_tower.txt deleted file mode 100644 index f07a052bba6..00000000000 --- a/res/cardsfolder/doran_the_siege_tower.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Doran, the Siege Tower -ManaCost:B G W -Types:Legendary Creature Treefolk Shaman -Text:Each creature assigns combat damage equal to its toughness rather than its power. -PT:0/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/doran_the_siege_tower.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dormant_gomazoa.txt b/res/cardsfolder/dormant_gomazoa.txt deleted file mode 100644 index 7c26af95c17..00000000000 --- a/res/cardsfolder/dormant_gomazoa.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dormant Gomazoa -ManaCost:1 U U -Types:Creature Jellyfish -Text:no text -PT:5/5 -K:Flying -K:CARDNAME enters the battlefield tapped. -K:CARDNAME doesn't untap during your untap step. -T:Mode$ SpellCast | TargetsValid$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you become the target of a spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dormant_gomazoa.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dormant_sliver.txt b/res/cardsfolder/dormant_sliver.txt deleted file mode 100644 index 1a455dbff80..00000000000 --- a/res/cardsfolder/dormant_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dormant Sliver -ManaCost:2 G U -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Defender:No Condition:All Sliver creatures have defender. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Sliver | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ All Slivers have "When this permanent enters the battlefield, draw a card." -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dormant_sliver.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dormant_volcano.txt b/res/cardsfolder/dormant_volcano.txt deleted file mode 100644 index 41f7ee11821..00000000000 --- a/res/cardsfolder/dormant_volcano.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dormant Volcano -ManaCost:no cost -Types:Land -Text:When CARDNAME enters the battlefield, sacrifice it unless you return an untapped Mountain you control to its owner's hand. -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 R | SpellDescription$ Add 1 R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dormant_volcano.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dosans_oldest_chant.txt b/res/cardsfolder/dosans_oldest_chant.txt deleted file mode 100644 index 3e500430b77..00000000000 --- a/res/cardsfolder/dosans_oldest_chant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dosan's Oldest Chant -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 4 G | LifeAmount$ 6 | SpellDescription$ You gain 6 life. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dosans_oldest_chant.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/127.jpg -End diff --git a/res/cardsfolder/double_cleave.txt b/res/cardsfolder/double_cleave.txt deleted file mode 100644 index f7b9996db60..00000000000 --- a/res/cardsfolder/double_cleave.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Double Cleave -ManaCost:1 RW -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 RW | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Double Strike | SpellDescription$ Target creature gains double strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/double_cleave.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/135.jpg -End diff --git a/res/cardsfolder/doubling_season.txt b/res/cardsfolder/doubling_season.txt deleted file mode 100644 index 3e7365d32eb..00000000000 --- a/res/cardsfolder/doubling_season.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Doubling Season -ManaCost:4 G -Types:Enchantment -Text: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.\r\nIf 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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/doubling_season.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/doubtless_one.txt b/res/cardsfolder/doubtless_one.txt deleted file mode 100644 index 042eb6f17ad..00000000000 --- a/res/cardsfolder/doubtless_one.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Doubtless One -ManaCost:3 W -Types:Creature Cleric Avatar -Text:no text -PT:*/* -K:stSetPT:Count$Valid Cleric:Count$Valid Cleric:CARDNAME's power and toughness are each equal to the number of Clerics on the battlefield. -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:BuffedBy:Cleric -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/doubtless_one.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/douse.txt b/res/cardsfolder/douse.txt deleted file mode 100644 index 46d3f100e38..00000000000 --- a/res/cardsfolder/douse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Douse -ManaCost:2 U -Types:Enchantment -Text:no text -A:AB$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Card.Red | TgtPrompt$ Select target Red Spell | SpellDescription$ Counter target red spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/douse.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/douse_in_gloom.txt b/res/cardsfolder/douse_in_gloom.txt deleted file mode 100644 index 91665fed79b..00000000000 --- a/res/cardsfolder/douse_in_gloom.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Douse in Gloom -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Douse in Gloom deals 2 damage to target creature and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card97221.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/49.jpg -End diff --git a/res/cardsfolder/dovescape.txt b/res/cardsfolder/dovescape.txt deleted file mode 100644 index afe0782462b..00000000000 --- a/res/cardsfolder/dovescape.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dovescape -ManaCost:3 WU WU WU -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.nonCreature | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ 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. -SVar:TrigCounter:AB$Counter | Cost$ 0 | Defined$ TriggeredSpellAbility | SubAbility$ DBToken -SVar:DBToken:DB$Token | TokenAmount$ X | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ TriggeredPlayer | TokenColors$ White,Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:X:TriggeredCard$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dovescape.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/downdraft.txt b/res/cardsfolder/downdraft.txt deleted file mode 100644 index 6ea7bc9f21e..00000000000 --- a/res/cardsfolder/downdraft.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Downdraft -ManaCost:2 G -Types:Enchantment -Text:no text -A:AB$ Debuff | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -A:AB$ DamageAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.withFlying | NumDmg$ 2 | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 2 damage to each creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/downdraft.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/downhill_charge.txt b/res/cardsfolder/downhill_charge.txt deleted file mode 100755 index 4989359b6db..00000000000 --- a/res/cardsfolder/downhill_charge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Downhill Charge -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn, where X is the number of Mountains you control. -A:SP$ Pump | Cost$ Sac<1/Mountain> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ You may sacrifice a Mountain rather than pay CARDNAME's mana cost. -SVar:X:Count$TypeYouCtrl.Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/downhill_charge.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dowsing_shaman.txt b/res/cardsfolder/dowsing_shaman.txt deleted file mode 100644 index f8844a2168a..00000000000 --- a/res/cardsfolder/dowsing_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dowsing Shaman -ManaCost:4 G -Types:Creature Centaur Shaman -Text:no text -PT:3/4 -A:AB$ ChangeZone | Cost$ 2 G T | TgtPrompt$ Choose target enchantment card in your graveyard | ValidTgts$ Enchantment.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target enchantment card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dowsing_shaman.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/draconian_cylix.txt b/res/cardsfolder/draconian_cylix.txt deleted file mode 100644 index 5b83d260a95..00000000000 --- a/res/cardsfolder/draconian_cylix.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Draconian Cylix -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Regenerate | Cost$ 2 T Discard<1/Random> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/draconian_cylix.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drag_down.txt b/res/cardsfolder/drag_down.txt deleted file mode 100644 index 7eb76fe80da..00000000000 --- a/res/cardsfolder/drag_down.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drag Down -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Domain - Target creature gets -1/-1 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drag_down.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/42.jpg -End diff --git a/res/cardsfolder/dragon_appeasement.txt b/res/cardsfolder/dragon_appeasement.txt deleted file mode 100644 index 9300db8d8d9..00000000000 --- a/res/cardsfolder/dragon_appeasement.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragon Appeasement -ManaCost:3 B R G -Types:Enchantment -Text:Skip your draw step. -T:Mode$ Sacrificed | ValidCard$ Creature | Execute$ TrigDrawCard | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a creature, you may draw a card. -SVar:TrigDrawCard:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_appeasement.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_arch.txt b/res/cardsfolder/dragon_arch.txt deleted file mode 100644 index 8738249e162..00000000000 --- a/res/cardsfolder/dragon_arch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragon Arch -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.MultiColor | ChangeNum$ 1 | SpellDescription$ You may put a multicolored creature card from your hand onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_arch.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_blood.txt b/res/cardsfolder/dragon_blood.txt deleted file mode 100644 index cb89d5ac309..00000000000 --- a/res/cardsfolder/dragon_blood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragon Blood -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_blood.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/163.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_broodmother.txt b/res/cardsfolder/dragon_broodmother.txt deleted file mode 100644 index acb1861470d..00000000000 --- a/res/cardsfolder/dragon_broodmother.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragon Broodmother -ManaCost:2 R R R G -Types:Creature Dragon -Text: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.) -PT:4/4 -K:Flying -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_broodmother.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_engine.txt b/res/cardsfolder/dragon_engine.txt deleted file mode 100644 index 8bd3f1719ac..00000000000 --- a/res/cardsfolder/dragon_engine.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dragon Engine -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:1/3 -A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_engine.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/366.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/282.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/246.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/335.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/14.jpg -End diff --git a/res/cardsfolder/dragon_fodder.txt b/res/cardsfolder/dragon_fodder.txt deleted file mode 100644 index 68c7ca797e0..00000000000 --- a/res/cardsfolder/dragon_fodder.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dragon Fodder -ManaCost:1 R -Types:Sorcery -Text:Put two 1/1 red Goblin creature tokens onto the battlefield. -A:SP$ Token | Cost$ 1 R | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_fodder.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_mage.txt b/res/cardsfolder/dragon_mage.txt deleted file mode 100644 index 5e424d0cd1c..00000000000 --- a/res/cardsfolder/dragon_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dragon Mage -ManaCost:5 R R -Types:Creature Dragon Wizard -Text:no text -PT:5/5 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDiscardDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, each player discards his or her hand and draws seven cards. -SVar:TrigDiscardDraw:AB$ChangeZoneAll | Cost$ 0 | Defined$ Each | ChangeType$ Card | Origin$ Hand | Destination$ Graveyard | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Defined$ Each | NumCards$ 7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_mage.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_roost.txt b/res/cardsfolder/dragon_roost.txt deleted file mode 100644 index 16ed55e4761..00000000000 --- a/res/cardsfolder/dragon_roost.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragon Roost -ManaCost:4 R R -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 5 R R | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying | SpellDescription$ Put a 5/5 red Dragon creature token with flying onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_roost.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/198.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragon_tyrant.txt b/res/cardsfolder/dragon_tyrant.txt deleted file mode 100644 index ee036418fda..00000000000 --- a/res/cardsfolder/dragon_tyrant.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dragon Tyrant -ManaCost:8 R R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -K:Trample -K:Double Strike -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay R R R R -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_tyrant.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/88.jpg -End diff --git a/res/cardsfolder/dragon_whelp.txt b/res/cardsfolder/dragon_whelp.txt deleted file mode 100644 index e9156e82798..00000000000 --- a/res/cardsfolder/dragon_whelp.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Dragon Whelp -ManaCost:2 R R -Types:Creature Dragon -Text:no text -PT:2/3 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | ActivationNumberSacrifice$4 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragon_whelp.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/142.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/143.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/59.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/204.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/133.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/142.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonmaster_outcast.txt b/res/cardsfolder/dragonmaster_outcast.txt deleted file mode 100644 index 707da2a503a..00000000000 --- a/res/cardsfolder/dragonmaster_outcast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dragonmaster Outcast -ManaCost:R -Types:Creature Human Shaman -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Land.YouCtrl | PresentCompare$ GE6| Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ You | TokenColors$ Red | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonmaster_outcast.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragons_claw.txt b/res/cardsfolder/dragons_claw.txt deleted file mode 100644 index 3577c668a6c..00000000000 --- a/res/cardsfolder/dragons_claw.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dragon's Claw -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a red spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragons_claw.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/205.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/210.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/117.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/296.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonskull_summit.txt b/res/cardsfolder/dragonskull_summit.txt deleted file mode 100644 index 496ac1a28ec..00000000000 --- a/res/cardsfolder/dragonskull_summit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dragonskull Summit -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped unless you control a Swamp or a Mountain. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonskull_summit.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/223.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonsoul_knight.txt b/res/cardsfolder/dragonsoul_knight.txt deleted file mode 100644 index 297da412636..00000000000 --- a/res/cardsfolder/dragonsoul_knight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dragonsoul Knight -ManaCost:2 R -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -A:AB$ Animate | Cost$ W U B R G | Defined$ Self | Types$ Dragon | Keywords$ Flying & Trample | SubAbility$ SVar=DBPump | SpellDescription$ Until end of turn, CARDNAME becomes a Dragon, gets +5/+3, and gains flying and trample. -SVar:DBPump:DB$Pump | Defined$ Self | NumAtt$ +5 | NumDef$ +3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonsoul_knight.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonspeaker_shaman.txt b/res/cardsfolder/dragonspeaker_shaman.txt deleted file mode 100644 index c9084d9cc71..00000000000 --- a/res/cardsfolder/dragonspeaker_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dragonspeaker Shaman -ManaCost:1 R R -Types:Creature Human Barbarian Shaman -Text:Dragon spells you cast cost 2 less to cast. -PT:2/2 -K:CostChange:Player:Less:2:Spell:All:Dragon:NoSpecial -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonspeaker_shaman.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonstalker.txt b/res/cardsfolder/dragonstalker.txt deleted file mode 100644 index dd582cf1875..00000000000 --- a/res/cardsfolder/dragonstalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dragonstalker -ManaCost:4 W -Types:Creature Bird Soldier -Text:no text -PT:3/3 -K:Flying -K:Protection from Dragons -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonstalker.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dragonstorm.txt b/res/cardsfolder/dragonstorm.txt deleted file mode 100644 index 024bcc685f5..00000000000 --- a/res/cardsfolder/dragonstorm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dragonstorm -ManaCost:8 R -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 8 R | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Dragon | ChangeNum$ 1 | SpellDescription$ Search your library for a Dragon permanent card and put it onto the battlefield. Then shuffle your library. -K:Storm -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dragonstorm.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/90.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drain_the_well.txt b/res/cardsfolder/drain_the_well.txt deleted file mode 100644 index 0307643a26f..00000000000 --- a/res/cardsfolder/drain_the_well.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Drain the Well -ManaCost:2 BG BG -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 BG BG | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target land. You gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drain_the_well.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/121.jpg -End diff --git a/res/cardsfolder/drake_hatchling.txt b/res/cardsfolder/drake_hatchling.txt deleted file mode 100644 index f21b479c1f9..00000000000 --- a/res/cardsfolder/drake_hatchling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drake Hatchling -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:1/3 -K:Flying -A:AB$ Pump | Cost$ U | NumAtt$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drake_hatchling.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drake_skull_cameo.txt b/res/cardsfolder/drake_skull_cameo.txt deleted file mode 100644 index ea108183a0a..00000000000 --- a/res/cardsfolder/drake_skull_cameo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Drake-Skull Cameo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drake_skull_cameo.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drake_umbra.txt b/res/cardsfolder/drake_umbra.txt deleted file mode 100644 index 02fe741c231..00000000000 --- a/res/cardsfolder/drake_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drake Umbra -ManaCost:4 U -Types:Enchantment Aura -Text:Enchanted creature gets +3/+3 and has flying. -K:Enchant creature -K:Totem armor -K:enPump:+3/+3/Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drake_umbra.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dralnus_crusade.txt b/res/cardsfolder/dralnus_crusade.txt deleted file mode 100644 index ca747ea52bf..00000000000 --- a/res/cardsfolder/dralnus_crusade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dralnu's Crusade -ManaCost:1 B R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Goblin:1/1:No Condition:Goblin creatures get +1/+1. -K:stAnimateAll:Goblin:no changes:Zombie:Black,Overwrite:No Abilities:No Condition:All Goblins are black and are Zombies in addition to their other creature types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dralnus_crusade.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dramatic_entrance.txt b/res/cardsfolder/dramatic_entrance.txt deleted file mode 100644 index 16de55e0111..00000000000 --- a/res/cardsfolder/dramatic_entrance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dramatic Entrance -ManaCost:3 G G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 3 G G | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Green | ChangeNum$ 1 | SpellDescription$ You may put a green creature card from your hand onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dramatic_entrance.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drana_kalastria_bloodchief.txt b/res/cardsfolder/drana_kalastria_bloodchief.txt deleted file mode 100644 index bd9b0e24bec..00000000000 --- a/res/cardsfolder/drana_kalastria_bloodchief.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Drana, Kalastria Bloodchief -ManaCost:3 B B -Types:Legendary Creature Vampire Shaman -Text:no text -PT:4/4 -K:Flying -A:AB$ Pump | Cost$ X B B | NumDef$ -X | ValidTgts$ Creature | IsCurse$ True | TgtPrompt$ Select target creature. | SubAbility$ SVar=DBPump | SpellDescription$ Target creature gets -0/-X until end of turn and CARDNAME gets +X/+0 until end of turn. -SVar:DBPump:DB$Pump | NumAtt$ +X | Defined$ Self -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/drana_kalastria_bloodchief.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drastic_revelation.txt b/res/cardsfolder/drastic_revelation.txt deleted file mode 100644 index c7d935fb53b..00000000000 --- a/res/cardsfolder/drastic_revelation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drastic Revelation -ManaCost:2 U B R -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 U B R | Mode$ Hand | SubAbility$ SVar=DBDraw | SpellDescription$ Discard your hand. Draw seven cards, then discard three cards at random. -SVar:DBDraw:DB$Draw | NumCards$ 7 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 3 | Mode$ Random -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drastic_revelation.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread.txt b/res/cardsfolder/dread.txt deleted file mode 100644 index 203107d4a07..00000000000 --- a/res/cardsfolder/dread.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dread -ManaCost:3 B B B -Types:Creature Elemental Incarnation -Text:no text -PT:6/6 -K:Fear -T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ You | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature deals damage to you, destroy it. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigShuffle | TriggerDescription$ When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library. -SVar:TrigShuffle:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ Self -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredSource -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_drone.txt b/res/cardsfolder/dread_drone.txt deleted file mode 100644 index 652b75677e0..00000000000 --- a/res/cardsfolder/dread_drone.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dread Drone -ManaCost:4 B -Types:Creature Eldrazi Drone -Text:no text -PT:4/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME 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." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_drone.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_of_night.txt b/res/cardsfolder/dread_of_night.txt deleted file mode 100644 index 53e73a53184..00000000000 --- a/res/cardsfolder/dread_of_night.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dread of Night -ManaCost:B -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White:-1/-1:No Condition:White creatures get -1/-1. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_of_night.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/24.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_reaper.txt b/res/cardsfolder/dread_reaper.txt deleted file mode 100644 index 98154186590..00000000000 --- a/res/cardsfolder/dread_reaper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dread Reaper -ManaCost:3 B B B -Types:Creature Horror -Text:no text -PT:6/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 5 life. -SVar:TrigLoseLife:DB$LoseLife | Cost$ 0 | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_reaper.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/76.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_return.txt b/res/cardsfolder/dread_return.txt deleted file mode 100644 index 7864be6e51f..00000000000 --- a/res/cardsfolder/dread_return.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dread Return -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -A:SP$ ChangeZone | Cost$ Sac<3/Creature> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Flashback$ True | CostDesc$ Flashback - Sacrifice three creatures. | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_return.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_slag.txt b/res/cardsfolder/dread_slag.txt deleted file mode 100644 index 3d423e9012b..00000000000 --- a/res/cardsfolder/dread_slag.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dread Slag -ManaCost:3 B R -Types:Creature Horror -Text:no text -PT:9/9 -K:Trample -K:stPumpSelf:Creature:X/X:no Condition:Dread Slag gets -4/-4 for each card in your hand. -SVar:X:Count$InYourHand/Times.-4 -SVar:RemRandomDeck:True -SVar:BuffedBy:Card -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_slag.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_specter.txt b/res/cardsfolder/dread_specter.txt deleted file mode 100644 index 09beeceef27..00000000000 --- a/res/cardsfolder/dread_specter.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dread Specter -ManaCost:3 B -Types:Creature Specter -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_specter.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_statuary.txt b/res/cardsfolder/dread_statuary.txt deleted file mode 100644 index c6586aad3ef..00000000000 --- a/res/cardsfolder/dread_statuary.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dread Statuary -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 4 | Defined$ Self | Power$ 4 | Toughness$ 2 | Types$ Creature,Artifact,Golem | SpellDescription$ CARDNAME becomes a 4/2 Golem artifact creature until end of turn. It's still a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_statuary.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dread_warlock.txt b/res/cardsfolder/dread_warlock.txt deleted file mode 100644 index f4c36be8e64..00000000000 --- a/res/cardsfolder/dread_warlock.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dread Warlock -ManaCost:1 B B -Types:Creature Human Wizard -Text:CARDNAME can't be blocked except by black creatures. -PT:2/2 -K:CantBeBlockedBy Creature.nonBlack -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_warlock.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreadship_reef.txt b/res/cardsfolder/dreadship_reef.txt deleted file mode 100644 index acade3fef60..00000000000 --- a/res/cardsfolder/dreadship_reef.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dreadship Reef -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreadship_reef.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreadwing.txt b/res/cardsfolder/dreadwing.txt deleted file mode 100644 index 6c0de55d487..00000000000 --- a/res/cardsfolder/dreadwing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dreadwing -ManaCost:B -Types:Creature Zombie -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 U R | NumAtt$ +3 | KW$ Flying | SpellDescription$ CARDNAME gets +3/+0 and gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreadwing.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/43.jpg -End diff --git a/res/cardsfolder/dream_cache.txt b/res/cardsfolder/dream_cache.txt deleted file mode 100644 index 5533f70bd52..00000000000 --- a/res/cardsfolder/dream_cache.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dream Cache -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | SubAbility$ SVar=ChangeZoneDB | SpellDescription$ Draw three cards, then put two cards from your hand both on top of your library or both on the bottom of your library. -SVar:ChangeZoneDB:DB$ChangeZone | Origin$ Hand | Destination$ Library | ChangeNum$ 2 | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | AlternativeDestinationMessage$ Would you like to put the cards on the top of your library (and not on the bottom)? -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_cache.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/59.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dream_fracture.txt b/res/cardsfolder/dream_fracture.txt deleted file mode 100644 index 605b50afdf3..00000000000 --- a/res/cardsfolder/dream_fracture.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dream Fracture -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell. Its controller draws a card. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ TargetedController | NumCards$ 1 | SubAbility$ SVar=DBDrawYou -SVar:DBDrawYou:DB$Draw | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_fracture.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dream_prowler.txt b/res/cardsfolder/dream_prowler.txt deleted file mode 100644 index 19c8ad7a487..00000000000 --- a/res/cardsfolder/dream_prowler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dream Prowler -ManaCost:2 U U -Types:Creature Illusion -Text:no text -PT:1/5 -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ CARDNAME is unblockable as long as it's attacking alone. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_prowler.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/29.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dream_stalker.txt b/res/cardsfolder/dream_stalker.txt deleted file mode 100644 index b076e115d05..00000000000 --- a/res/cardsfolder/dream_stalker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dream Stalker -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:1/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a permanent you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Permanent.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_stalker.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreamborn_muse.txt b/res/cardsfolder/dreamborn_muse.txt deleted file mode 100644 index 7e128e67c54..00000000000 --- a/res/cardsfolder/dreamborn_muse.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Dreamborn Muse -ManaCost:2 U U -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMillYou | TriggerDescription$ 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. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigMillOpp | Secondary$ True | TriggerDescription$ 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. -SVar:TrigMillYou:AB$Mill | Cost$ 0 | Defined$ You | NumCards$ X -SVar:TrigMillOpp:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ Y -SVar:X:Count$InYourHand -SVar:Y:Count$InOppHand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamborn_muse.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/36.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreamcatcher.txt b/res/cardsfolder/dreamcatcher.txt deleted file mode 100644 index 085bf56c117..00000000000 --- a/res/cardsfolder/dreamcatcher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dreamcatcher -ManaCost:U -Types:Creature Spirit -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may sacrifice Dreamcatcher. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ Sac<1/CARDNAME> | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamcatcher.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreamscape_artist.txt b/res/cardsfolder/dreamscape_artist.txt deleted file mode 100644 index 50c787a7fc4..00000000000 --- a/res/cardsfolder/dreamscape_artist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dreamscape Artist -ManaCost:1 U -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 2 U T Discard<1/Card> Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards and put them onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamscape_artist.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreamspoiler_witches.txt b/res/cardsfolder/dreamspoiler_witches.txt deleted file mode 100644 index 0aac34e28bd..00000000000 --- a/res/cardsfolder/dreamspoiler_witches.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dreamspoiler Witches -ManaCost:3 B -Types:Creature Faerie Wizard -Text:no text -PT:2/2 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ Whenever you cast a spell during an opponent's turn, you may have target creature get -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamspoiler_witches.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreamstone_hedron.txt b/res/cardsfolder/dreamstone_hedron.txt deleted file mode 100644 index 3c3e6237aa2..00000000000 --- a/res/cardsfolder/dreamstone_hedron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dreamstone Hedron -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -A:AB$ Draw | Cost$ 3 T Sac<1/CARDNAME> | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamstone_hedron.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dredge.txt b/res/cardsfolder/dredge.txt deleted file mode 100644 index d410b25bb6a..00000000000 --- a/res/cardsfolder/dredge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dredge -ManaCost:B -Types:Instant -Text:no text -A:SP$ Sacrifice | Cost$ B | SacValid$ Creature,Land | SacMessage$ Creature or Land | SpellDescription$ Sacrifice a creature or land. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dredge.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dreg_reaver.txt b/res/cardsfolder/dreg_reaver.txt deleted file mode 100644 index 643de617134..00000000000 --- a/res/cardsfolder/dreg_reaver.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dreg Reaver -ManaCost:4 B -Types:Creature Zombie Beast -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreg_reaver.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dregs_of_sorrow.txt b/res/cardsfolder/dregs_of_sorrow.txt deleted file mode 100644 index d2b4b30d54e..00000000000 --- a/res/cardsfolder/dregs_of_sorrow.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dregs of Sorrow -ManaCost:X 4 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ X 4 B | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonBlack creature | SpellDescription$ Destroy X target nonblack creatures. Draw X cards. | SubAbility$ SVar=DB -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature.nonBlack -SVar:DB:DB$Draw | Defined$ You | NumCards$ X -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dregs_of_sorrow.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/25.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dregscape_zombie.txt b/res/cardsfolder/dregscape_zombie.txt deleted file mode 100644 index 5aa62eef297..00000000000 --- a/res/cardsfolder/dregscape_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dregscape Zombie -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/1 -K:Unearth:B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dregscape_zombie.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drekavac.txt b/res/cardsfolder/drekavac.txt deleted file mode 100644 index 73c57e013a4..00000000000 --- a/res/cardsfolder/drekavac.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Drekavac -ManaCost:1 B -Types:Creature Beast -Text:When CARDNAME enters the battlefield, sacrifice it unless you discard a noncreature card. -PT:3/3 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card111258.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drelnoch.txt b/res/cardsfolder/drelnoch.txt deleted file mode 100644 index 28db303abee..00000000000 --- a/res/cardsfolder/drelnoch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drelnoch -ManaCost:4 U -Types:Creature Yeti Mutant -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drelnoch.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drift_of_phantasms.txt b/res/cardsfolder/drift_of_phantasms.txt deleted file mode 100644 index 7ba8b52c624..00000000000 --- a/res/cardsfolder/drift_of_phantasms.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drift of Phantasms -ManaCost:2 U -Types:Creature Spirit -Text:no text -PT:0/5 -K:Defender -K:Flying -K:Transmute:1 U U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drift_of_phantasms.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drift_of_the_dead.txt b/res/cardsfolder/drift_of_the_dead.txt deleted file mode 100644 index 2ad4a803ccf..00000000000 --- a/res/cardsfolder/drift_of_the_dead.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drift of the Dead -ManaCost:3 B -Types:Creature Wall -Text:no text -PT:*/* -K:Defender -K:stSetPT:Count$Valid Land.Snow+YouCtrl:Count$Valid Land.Snow+YouCtrl:Drift of the Dead's power and toughness are each equal to the number of snow lands you control. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drift_of_the_dead.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drifter_il_dal.txt b/res/cardsfolder/drifter_il_dal.txt deleted file mode 100644 index 2708a0cd5ef..00000000000 --- a/res/cardsfolder/drifter_il_dal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drifter il-Dal -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:2/1 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U -K:Shadow -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drifter_il_dal.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drifting_djinn.txt b/res/cardsfolder/drifting_djinn.txt deleted file mode 100644 index 48e6d9e0f51..00000000000 --- a/res/cardsfolder/drifting_djinn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drifting Djinn -ManaCost:4 U U -Types:Creature Djinn -Text:no text -PT:5/5 -K:Flying -K:Cycling:2 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 U -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/drifting_djinn.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drifting_meadow.txt b/res/cardsfolder/drifting_meadow.txt deleted file mode 100644 index f9777212011..00000000000 --- a/res/cardsfolder/drifting_meadow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drifting Meadow -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drifting_meadow.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drill_skimmer.txt b/res/cardsfolder/drill_skimmer.txt deleted file mode 100644 index 2a8fcefcc44..00000000000 --- a/res/cardsfolder/drill_skimmer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drill-Skimmer -ManaCost:4 -Types:Artifact Creature Thopter -Text:no text -PT:2/1 -K:Flying -K:stPumpSelf:Creature:0/0/Shroud:isPresent Artifact.Creature+Other+YouCtrl:Drill-Skimmer has shroud as long as you control another artifact creature. (It can't be the target of spells or abilities.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drill_skimmer.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dripping_dead.txt b/res/cardsfolder/dripping_dead.txt deleted file mode 100644 index 169974224e4..00000000000 --- a/res/cardsfolder/dripping_dead.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dripping Dead -ManaCost:4 B B -Types:Creature Zombie -Text:no text -PT:4/1 -K:CARDNAME can't block. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget | NoRegen$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dripping_dead.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dripping_tongue_zubera.txt b/res/cardsfolder/dripping_tongue_zubera.txt deleted file mode 100644 index c375857a1c3..00000000000 --- a/res/cardsfolder/dripping_tongue_zubera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dripping-Tongue Zubera -ManaCost:1 G -Types:Creature Zubera Spirit -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield for each Zubera put into a graveyard from the battlefield this turn. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenColors$ Colorless | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenAmount$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Card.Zubera -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80511.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dromad_purebred.txt b/res/cardsfolder/dromad_purebred.txt deleted file mode 100644 index 407dd11be44..00000000000 --- a/res/cardsfolder/dromad_purebred.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dromad Purebred -ManaCost:4 W -Types:Creature Camel Beast -Text:no text -PT:1/5 -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME is dealt damage, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dromad_purebred.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dromars_attendant.txt b/res/cardsfolder/dromars_attendant.txt deleted file mode 100644 index 9c025f09a1c..00000000000 --- a/res/cardsfolder/dromars_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dromar's Attendant -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ W U B | SpellDescription$ Add W U B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dromars_attendant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/303.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dromars_cavern.txt b/res/cardsfolder/dromars_cavern.txt deleted file mode 100644 index b627d9ce704..00000000000 --- a/res/cardsfolder/dromars_cavern.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dromar's Cavern -ManaCost:no cost -Types:Land Lair -Text:When CARDNAME enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:NeedsToPlay:Land.nonLair+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dromars_cavern.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dromosaur.txt b/res/cardsfolder/dromosaur.txt deleted file mode 100644 index 9e2082be25a..00000000000 --- a/res/cardsfolder/dromosaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dromosaur -ManaCost:2 R -Types:Creature Lizard -Text:no text -PT:2/3 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +2/-2 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigBlockedPump | Secondary$ True | TriggerDescription$ CARDNAME gets +2/-2 until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | NumAtt$ +2 | NumDef$ -2 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dromosaur.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drooling_groodion.txt b/res/cardsfolder/drooling_groodion.txt deleted file mode 100644 index 9b77810fe74..00000000000 --- a/res/cardsfolder/drooling_groodion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drooling Groodion -ManaCost:3 B B G -Types:Creature Beast -Text:no text -PT:4/3 -A:AB$ Pump | Cost$ 2 B G Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature to get +2/+2: | NumAtt$ +2 | NumDef$ +2 | SubAbility$ SVar=DBPump | SpellDescription$ Target creature gets +2/+2 until end of turn. Another target creature gets -2/-2 until end of turn. -SVar:DBPump:DB$Pump | Cost$ 0 | NumAtt$ -2 | NumDef$ -2 | ValidTgts$ Creature | TgtPromp$ Select target creature to get -2/-2 | IsCurse$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/drooling_groodion.jpg -SVar:Rarity:Uncommon -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/204.jpg -End diff --git a/res/cardsfolder/drooling_ogre.txt b/res/cardsfolder/drooling_ogre.txt deleted file mode 100644 index 280bf89e756..00000000000 --- a/res/cardsfolder/drooling_ogre.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drooling Ogre -ManaCost:1 R -Types:Creature Ogre -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Artifact | Execute$ TrigControl | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts an artifact spell, that player gains control of CARDNAME. (This effect lasts indefinitely.) -SVar:TrigControl:AB$ GainControl | Cost$ 0 | Defined$ Self | NewController$ TriggeredPlayer -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drooling_ogre.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drop_of_honey.txt b/res/cardsfolder/drop_of_honey.txt deleted file mode 100644 index c052182193e..00000000000 --- a/res/cardsfolder/drop_of_honey.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Drop of Honey -ManaCost:G -Types:Enchantment -Text: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.\r\nWhen there are no creatures on the battlefield, sacrifice Drop of Honey. -K:When there are no creatures on the battlefield, sacrifice CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drop_of_honey.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_crocodile.txt b/res/cardsfolder/dross_crocodile.txt deleted file mode 100644 index a39df5713ce..00000000000 --- a/res/cardsfolder/dross_crocodile.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dross Crocodile -ManaCost:3 B -Types:Creature Zombie Crocodile -Text:no text -PT:5/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card135216.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/47.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_golem.txt b/res/cardsfolder/dross_golem.txt deleted file mode 100644 index 0dcde21587d..00000000000 --- a/res/cardsfolder/dross_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dross Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:Affinity for Swamps (This spell costs 1 less to cast for each Swamp you control.) -PT:3/2 -K:Fear -K:CostChange:Player:Less:1:Self:All:All:Affinity/Swamp -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_golem.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_harvester.txt b/res/cardsfolder/dross_harvester.txt deleted file mode 100644 index 3aa271e7c7f..00000000000 --- a/res/cardsfolder/dross_harvester.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dross Harvester -ManaCost:1 B B -Types:Creature Horror -Text:no text -PT:4/4 -K:Protection from white -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, you gain 2 life. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your end step, you lose 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_harvester.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_hopper.txt b/res/cardsfolder/dross_hopper.txt deleted file mode 100644 index e915cd046ac..00000000000 --- a/res/cardsfolder/dross_hopper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dross Hopper -ManaCost:1 B -Types:Creature Insect Horror -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ Sac<1/Creature> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_hopper.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/60.jpg -End diff --git a/res/cardsfolder/dross_prowler.txt b/res/cardsfolder/dross_prowler.txt deleted file mode 100644 index 98888da89e4..00000000000 --- a/res/cardsfolder/dross_prowler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dross Prowler -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/1 -K:Fear -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card48570.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_ripper.txt b/res/cardsfolder/dross_ripper.txt deleted file mode 100644 index f438f06982a..00000000000 --- a/res/cardsfolder/dross_ripper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dross Ripper -ManaCost:4 -Types:Artifact Creature Hound -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_ripper.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dross_scorpion.txt b/res/cardsfolder/dross_scorpion.txt deleted file mode 100644 index ac94f8cb113..00000000000 --- a/res/cardsfolder/dross_scorpion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dross Scorpion -ManaCost:4 -Types:Artifact Creature Scorpion -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Creature+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME or another artifact creature is put into a graveyard from the battlefield, -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ you may untap target artifact. -SVar:TrigUntap:AB$Untap | Cost$ 0 | ValidTgts$ Artifact | TgtPrompt$ Choose target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dross_scorpion.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drove_of_elves.txt b/res/cardsfolder/drove_of_elves.txt deleted file mode 100644 index 878be5b51ce..00000000000 --- a/res/cardsfolder/drove_of_elves.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drove of Elves -ManaCost:3 G -Types:Creature Elf -Text:no text -PT:*/* -K:CARDNAME can't be the target of spells or abilities your opponents control. -K:stSetPT:Count$Valid Permanent.Green+YouCtrl:Count$Valid Permanent.Green+YouCtrl:Drove of Elves's power and toughness are each equal to the number of green permanents you control. -SVar:BuffedBy:Permanent.Green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drove_of_elves.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drowned.txt b/res/cardsfolder/drowned.txt deleted file mode 100644 index d1dcfc1589c..00000000000 --- a/res/cardsfolder/drowned.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Drowned -ManaCost:1 U -Types:Creature Zombie -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drowned.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drowned_catacomb.txt b/res/cardsfolder/drowned_catacomb.txt deleted file mode 100644 index 454cd79a92e..00000000000 --- a/res/cardsfolder/drowned_catacomb.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drowned Catacomb -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped unless you control an Island or a Swamp. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/drowned_catacomb.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/224.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drowned_rusalka.txt b/res/cardsfolder/drowned_rusalka.txt deleted file mode 100644 index 9432d2f1f1c..00000000000 --- a/res/cardsfolder/drowned_rusalka.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drowned Rusalka -ManaCost:U -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ U Sac<1/Creature> | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ SVar=DBDraw | SpellDescription$ Discard a card, then draw a card. -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drowned_rusalka.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drowner_initiate.txt b/res/cardsfolder/drowner_initiate.txt deleted file mode 100644 index 0c5cebaa854..00000000000 --- a/res/cardsfolder/drowner_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drowner Initiate -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | Execute$ TrigMill | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigMill:AB$Mill | Cost$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drowner_initiate.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drowner_of_secrets.txt b/res/cardsfolder/drowner_of_secrets.txt deleted file mode 100644 index 48b9771d6ba..00000000000 --- a/res/cardsfolder/drowner_of_secrets.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Drowner of Secrets -ManaCost:2 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/3 -A:AB$ Mill | Cost$ tapXType<1/Merfolk> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drowner_of_secrets.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drudge_reavers.txt b/res/cardsfolder/drudge_reavers.txt deleted file mode 100644 index 11a7e3ffca0..00000000000 --- a/res/cardsfolder/drudge_reavers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Drudge Reavers -ManaCost:3 B -Types:Creature Skeleton -Text:no text -PT:2/1 -K:Flash -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/drudge_reavers.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drudge_skeletons.txt b/res/cardsfolder/drudge_skeletons.txt deleted file mode 100644 index ee123271af0..00000000000 --- a/res/cardsfolder/drudge_skeletons.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Drudge Skeletons -ManaCost:1 B -Types:Creature Skeleton -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83061.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/129.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/15.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/15.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/130.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/19.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/17.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/126.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/139.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/95.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/123.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/15.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drudge_spell.txt b/res/cardsfolder/drudge_spell.txt deleted file mode 100644 index 619e26b9ac7..00000000000 --- a/res/cardsfolder/drudge_spell.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Drudge Spell -ManaCost:B B -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ B ExileFromGrave<2/Creature> | TokenAmount$ 1 | TokenName$ Skeleton | TokenTypes$ Creature,Skeleton | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | TokenAbilities$ ABRegen | SpellDescription$ Put a 1/1 black Skeleton creature token onto the battlefield. It has "B: Regenerate this creature." -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME leaves the battlefield, destroy all Skeleton tokens. They can't be regenerated. -SVar:ABRegen:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.token+namedSkeleton | NoRegen$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drudge_spell.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/druid_lyrist.txt b/res/cardsfolder/druid_lyrist.txt deleted file mode 100644 index b80673de3e0..00000000000 --- a/res/cardsfolder/druid_lyrist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Druid Lyrist -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/druid_lyrist.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/238.jpg -End diff --git a/res/cardsfolder/druid_of_the_anima.txt b/res/cardsfolder/druid_of_the_anima.txt deleted file mode 100644 index df1c98b9ea6..00000000000 --- a/res/cardsfolder/druid_of_the_anima.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Druid of the Anima -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/druid_of_the_anima.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/druids_call.txt b/res/cardsfolder/druids_call.txt deleted file mode 100644 index 82bb22be987..00000000000 --- a/res/cardsfolder/druids_call.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Druid's Call -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant Creature -T:Mode$ DamageDone | ValidTarget$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever enchanted creature is dealt damage, its controller puts that many 1/1 green Squirrel creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ TriggeredTargetController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/druids_call.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/drumhunter.txt b/res/cardsfolder/drumhunter.txt deleted file mode 100644 index a6b1fddbc70..00000000000 --- a/res/cardsfolder/drumhunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Drumhunter -ManaCost:3 G -Types:Creature Human Druid Warrior -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | IsPresent$ Creature.powerGE5+YouCtrl | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, if you control a creature with power 5 or greater, you may draw a card. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/drumhunter.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dry_spell.txt b/res/cardsfolder/dry_spell.txt deleted file mode 100644 index cc34553c655..00000000000 --- a/res/cardsfolder/dry_spell.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dry Spell -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dry_spell.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/7.jpg|2 -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/124.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dryad_arbor.txt b/res/cardsfolder/dryad_arbor.txt deleted file mode 100644 index a548a4576c0..00000000000 --- a/res/cardsfolder/dryad_arbor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dryad Arbor -ManaCost:no cost -Types:Land Creature Forest Dryad -Text:no text -PT:1/1 -K:Dryad Arbor is green. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136196.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dryad_sophisticate.txt b/res/cardsfolder/dryad_sophisticate.txt deleted file mode 100644 index b2bab908557..00000000000 --- a/res/cardsfolder/dryad_sophisticate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dryad Sophisticate -ManaCost:1 G -Types:Creature Dryad -Text:no text -PT:2/1 -K:Nonbasic landwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dryad_sophisticate.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dryads_favor.txt b/res/cardsfolder/dryads_favor.txt deleted file mode 100644 index a1e01a8807d..00000000000 --- a/res/cardsfolder/dryads_favor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dryad's Favor -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dryads_favor.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dueling_grounds.txt b/res/cardsfolder/dueling_grounds.txt deleted file mode 100644 index 486c6eea964..00000000000 --- a/res/cardsfolder/dueling_grounds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dueling Grounds -ManaCost:1 G W -Types:Enchantment -Text:No more than one creature can attack each turn.\r\nNo more than one creature can block each turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dueling_grounds.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duergar_assailant.txt b/res/cardsfolder/duergar_assailant.txt deleted file mode 100644 index 4bab0c99bfb..00000000000 --- a/res/cardsfolder/duergar_assailant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Duergar Assailant -ManaCost:RW -Types:Creature Dwarf Soldier -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/duergar_assailant.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duergar_cave_guard.txt b/res/cardsfolder/duergar_cave_guard.txt deleted file mode 100644 index 69a116b2429..00000000000 --- a/res/cardsfolder/duergar_cave_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Duergar Cave-Guard -ManaCost:3 R -Types:Creature Dwarf Warrior -Text:no text -PT:1/3 -K:Wither -A:AB$ Pump | Cost$ RW | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/duergar_cave_guard.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/51.jpg -End diff --git a/res/cardsfolder/duergar_hedge_mage.txt b/res/cardsfolder/duergar_hedge_mage.txt deleted file mode 100644 index d8464c39100..00000000000 --- a/res/cardsfolder/duergar_hedge_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Duergar Hedge-Mage -ManaCost:2 RW -Types:Creature Dwarf Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Mountain.YouCtrl | PresentCompare$ GE2 | Execute$ TrigDestroyA | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Mountains, you may destroy target artifact. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Plains.YouCtrl | PresentCompare$ GE2 | Execute$ TrigDestroyE | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Plains, you may destroy target enchantment. -SVar:TrigDestroyA:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | ConditionPresent$ Mountain.YouCtrl | ConditionCompare$ GE2 -SVar:TrigDestroyE:AB$Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | ConditionPresent$ Plains.YouCtrl | ConditionCompare$ GE2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/duergar_hedge_mage.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duergar_mine_captain.txt b/res/cardsfolder/duergar_mine_captain.txt deleted file mode 100644 index 02ec7989bd2..00000000000 --- a/res/cardsfolder/duergar_mine_captain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Duergar Mine-Captain -ManaCost:2 RW -Types:Creature Dwarf Soldier -Text:no text -PT:2/1 -A:AB$ PumpAll | Cost$ 1 RW Q | ValidCards$ Creature.attacking | NumAtt$ +1 | SpellDescription$ Attacking creatures get +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/duergar_mine_captain.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dune_brood_nephilim.txt b/res/cardsfolder/dune_brood_nephilim.txt deleted file mode 100644 index 7edde8a144e..00000000000 --- a/res/cardsfolder/dune_brood_nephilim.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dune-Brood Nephilim -ManaCost:B R G W -Types:Creature Nephilim -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a 1/1 colorless Sand creature token onto the battlefield for each land you control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ C 1 1 Sand | TokenName$ Sand | TokenColors$ Colorless | TokenTypes$ Creature,Sand | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ X -SVar:X:Count$Valid Land.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dune_brood_nephilim.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dunerider_outlaw.txt b/res/cardsfolder/dunerider_outlaw.txt deleted file mode 100644 index 0a81f6d5779..00000000000 --- a/res/cardsfolder/dunerider_outlaw.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dunerider Outlaw -ManaCost:B B -Types:Creature Human Rebel Rogue -Text:At the beginning of the end step, if Dunerider Outlaw dealt damage to an opponent this turn, put a +1/+1 counter on it. -PT:1/1 -K:Protection from green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dunerider_outlaw.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dungeon_shade.txt b/res/cardsfolder/dungeon_shade.txt deleted file mode 100644 index 459a5b27757..00000000000 --- a/res/cardsfolder/dungeon_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dungeon Shade -ManaCost:3 B -Types:Creature Shade Spirit -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dungeon_shade.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/8.jpg -End diff --git a/res/cardsfolder/duress.txt b/res/cardsfolder/duress.txt deleted file mode 100644 index d7a8132b1ee..00000000000 --- a/res/cardsfolder/duress.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Duress -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Opponent | Mode$ RevealYouChoose | DiscardValid$ Card.nonCreature+nonLand | NumCards$ 1 | SpellDescription$ Target opponent reveals his or her hand. You choose a noncreature, nonland card from it. That player discards that card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/duress.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/96.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/96.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/132.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/durkwood_baloth.txt b/res/cardsfolder/durkwood_baloth.txt deleted file mode 100644 index 9279289ee89..00000000000 --- a/res/cardsfolder/durkwood_baloth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Durkwood Baloth -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:5/5 -K:Suspend:5:G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/durkwood_baloth.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/durkwood_boars.txt b/res/cardsfolder/durkwood_boars.txt deleted file mode 100644 index cc08e258602..00000000000 --- a/res/cardsfolder/durkwood_boars.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Durkwood Boars -ManaCost:4 G -Types:Creature Boar -Text:no text -PT:4/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3972.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/151.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/127.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/125.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dusk_imp.txt b/res/cardsfolder/dusk_imp.txt deleted file mode 100644 index 8ddc7ce99d1..00000000000 --- a/res/cardsfolder/dusk_imp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dusk Imp -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dusk_imp.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/130.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/131.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duskdale_wurm.txt b/res/cardsfolder/duskdale_wurm.txt deleted file mode 100644 index 82b5f798e29..00000000000 --- a/res/cardsfolder/duskdale_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Duskdale Wurm -ManaCost:5 G G -Types:Creature Wurm -Text:no text -PT:7/7 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/duskdale_wurm.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/170.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duskmantle_house_of_shadow.txt b/res/cardsfolder/duskmantle_house_of_shadow.txt deleted file mode 100644 index b4e4c61aa01..00000000000 --- a/res/cardsfolder/duskmantle_house_of_shadow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Duskmantle, House of Shadow -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mill | Cost$ U B T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Duskmantle_House_of_Shadow.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duskrider_falcon.txt b/res/cardsfolder/duskrider_falcon.txt deleted file mode 100644 index 8fac8b6da8f..00000000000 --- a/res/cardsfolder/duskrider_falcon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Duskrider Falcon -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/duskrider_falcon.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/duskrider_peregrine.txt b/res/cardsfolder/duskrider_peregrine.txt deleted file mode 100644 index 1430132eb26..00000000000 --- a/res/cardsfolder/duskrider_peregrine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Duskrider Peregrine -ManaCost:5 W -Types:Creature Bird -Text:no text -PT:3/3 -K:Flying -K:Protection from black -K:Suspend:3:1 W -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/duskrider_peregrine.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dust_bowl.txt b/res/cardsfolder/dust_bowl.txt deleted file mode 100644 index 4686fa7e6be..00000000000 --- a/res/cardsfolder/dust_bowl.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dust Bowl -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Destroy | Cost$ 3 T Sac<1/Land> | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dust_bowl.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dust_corona.txt b/res/cardsfolder/dust_corona.txt deleted file mode 100644 index 0b05a2537fd..00000000000 --- a/res/cardsfolder/dust_corona.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dust Corona -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+0/HIDDEN CantBeBlockedBy Creature.withFlying:Enchanted creature gets +2/+0 and can't be blocked by creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dust_corona.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dust_elemental.txt b/res/cardsfolder/dust_elemental.txt deleted file mode 100644 index 0194afa1720..00000000000 --- a/res/cardsfolder/dust_elemental.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dust Elemental -ManaCost:2 W W -Types:Creature Elemental -Text:no text -PT:6/6 -K:Flash -K:Flying -K:Fear -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return three creatures you control to their owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouCtrl | ChangeNum$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dust_elemental.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dust_to_dust.txt b/res/cardsfolder/dust_to_dust.txt deleted file mode 100644 index 2332410bf0d..00000000000 --- a/res/cardsfolder/dust_to_dust.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dust to Dust -ManaCost:1 W W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 W W | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile two target artifacts. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dust_to_dust.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/305.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_armorer.txt b/res/cardsfolder/dwarven_armorer.txt deleted file mode 100644 index ddfda045bf4..00000000000 --- a/res/cardsfolder/dwarven_armorer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dwarven Armorer -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:0/2 -A:AB$ PutCounter | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P0 | CounterNum$ 1 | SpellDescription$ Put a +1/+0 counter on target creature. -A:AB$ PutCounter | Cost$ R T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P0P1 | CounterNum$ 1 | SpellDescription$ Put a +0/+1 counter on target creature. -SVar:Rarity:Rare -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_armorer.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_armory.txt b/res/cardsfolder/dwarven_armory.txt deleted file mode 100644 index 1f161a67aa7..00000000000 --- a/res/cardsfolder/dwarven_armory.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Armory -ManaCost:2 R R -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ 2 Sac<1/Land> | CounterType$ P2P2 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Put a +2/+2 counter on target creature. Activate this ability only during any upkeep step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_armory.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_berserker.txt b/res/cardsfolder/dwarven_berserker.txt deleted file mode 100644 index 6a060018ef7..00000000000 --- a/res/cardsfolder/dwarven_berserker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dwarven Berserker -ManaCost:1 R -Types:Creature Dwarf Berserker -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +3/+0 and gains trample until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 | KW$ Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_berserker.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_blastminer.txt b/res/cardsfolder/dwarven_blastminer.txt deleted file mode 100644 index 2bda0ae7efc..00000000000 --- a/res/cardsfolder/dwarven_blastminer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dwarven Blastminer -ManaCost:1 R -Types:Creature Dwarf -Text:no text -PT:1/1 -K:Morph:R -A:AB$ Destroy | Cost$ 2 R T | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_blastminer.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_bloodboiler.txt b/res/cardsfolder/dwarven_bloodboiler.txt deleted file mode 100644 index a9bfb2e61c8..00000000000 --- a/res/cardsfolder/dwarven_bloodboiler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dwarven Bloodboiler -ManaCost:R R R -Types:Creature Dwarf -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ tapXType<2/Dwarf> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_bloodboiler.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/84.jpg -End diff --git a/res/cardsfolder/dwarven_demolition_team.txt b/res/cardsfolder/dwarven_demolition_team.txt deleted file mode 100644 index bcaf64ec9d1..00000000000 --- a/res/cardsfolder/dwarven_demolition_team.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dwarven Demolition Team -ManaCost:2 R -Types:Creature Dwarf -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Wall | TgtPrompt$ Select target Wall | SpellDescription$ Destroy target Wall. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_demolition_team.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/184.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/143.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/144.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_grunt.txt b/res/cardsfolder/dwarven_grunt.txt deleted file mode 100644 index 68243b5d6c6..00000000000 --- a/res/cardsfolder/dwarven_grunt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Grunt -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:1/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card29760.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_hold.txt b/res/cardsfolder/dwarven_hold.txt deleted file mode 100644 index d16a073796c..00000000000 --- a/res/cardsfolder/dwarven_hold.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dwarven Hold -ManaCost:no cost -Types:Land -Text:At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. -K:CARDNAME enters the battlefield tapped. -K:You may choose not to untap CARDNAME during your untap step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_hold.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/414.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_lieutenant.txt b/res/cardsfolder/dwarven_lieutenant.txt deleted file mode 100644 index 04665b40a82..00000000000 --- a/res/cardsfolder/dwarven_lieutenant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Lieutenant -ManaCost:R R -Types:Creature Dwarf Soldier -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature.Dwarf | NumAtt$ +1 | SpellDescription$ Target Dwarf creature gets +1/+0 until end of turn. | TgtPrompt$ Select target Dwarf creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_lieutenant.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_miner.txt b/res/cardsfolder/dwarven_miner.txt deleted file mode 100644 index fe14ef73a89..00000000000 --- a/res/cardsfolder/dwarven_miner.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Miner -ManaCost:1 R -Types:Creature Dwarf -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ 2 R T | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_miner.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/169.jpg -End diff --git a/res/cardsfolder/dwarven_nomad.txt b/res/cardsfolder/dwarven_nomad.txt deleted file mode 100644 index 2ea1d0eb58c..00000000000 --- a/res/cardsfolder/dwarven_nomad.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Nomad -ManaCost:2 R -Types:Creature Dwarf Nomad -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerLE2 | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. | TgtPrompt$ Select target creature with power 2 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_nomad.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_patrol.txt b/res/cardsfolder/dwarven_patrol.txt deleted file mode 100644 index c91d7af654d..00000000000 --- a/res/cardsfolder/dwarven_patrol.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dwarven Patrol -ManaCost:2 R -Types:Creature Dwarf -Text:no text -PT:4/2 -K:CARDNAME doesn't untap. -T:Mode$ SpellCast | ValidCard$ Spell.nonRed+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a nonred spell, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_patrol.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_pony.txt b/res/cardsfolder/dwarven_pony.txt deleted file mode 100644 index 5823cbbe166..00000000000 --- a/res/cardsfolder/dwarven_pony.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Pony -ManaCost:R -Types:Creature Horse -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 R T | ValidTgts$ Creature.Dwarf | TgtPrompt$ Select target Dwarf creature | KW$ Mountainwalk | SpellDescription$ Target Dwarf creature gains mountainwalk until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_pony.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_ruins.txt b/res/cardsfolder/dwarven_ruins.txt deleted file mode 100644 index 0b126a230c6..00000000000 --- a/res/cardsfolder/dwarven_ruins.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Dwarven Ruins -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_ruins.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/415.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/323.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_soldier.txt b/res/cardsfolder/dwarven_soldier.txt deleted file mode 100644 index a629e85b594..00000000000 --- a/res/cardsfolder/dwarven_soldier.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dwarven Soldier -ManaCost:1 R -Types:Creature Dwarf Soldier -Text:no text -PT:2/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Orc | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more Orcs, CARDNAME gets +0/+2 until end of turn. -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Orc | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more Orcs, CARDNAME gets +0/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_soldier.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/221.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/107.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_song.txt b/res/cardsfolder/dwarven_song.txt deleted file mode 100644 index add288a86cb..00000000000 --- a/res/cardsfolder/dwarven_song.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dwarven Song -ManaCost:R -Types:Instant -Text:no text -A:SP$ Animate | Cost$ R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Red | OverwriteColors$ True | SpellDescription$ Any number of target creatures become red until end of turn. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_song.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_strike_force.txt b/res/cardsfolder/dwarven_strike_force.txt deleted file mode 100644 index f98c0287eb5..00000000000 --- a/res/cardsfolder/dwarven_strike_force.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Dwarven Strike Force -ManaCost:4 R -Types:Creature Dwarf Berserker -Text:no text -PT:4/3 -A:AB$ Pump | Defined$ Self | Cost$ Discard<1/Random> | KW$ First Strike & Haste | SpellDescription$ CARDNAME gains first strike and haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_strike_force.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_thaumaturgist.txt b/res/cardsfolder/dwarven_thaumaturgist.txt deleted file mode 100644 index 08e0c565a2c..00000000000 --- a/res/cardsfolder/dwarven_thaumaturgist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Dwarven Thaumaturgist -ManaCost:2 R -Types:Creature Dwarf Shaman -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_thaumaturgist.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_trader.txt b/res/cardsfolder/dwarven_trader.txt deleted file mode 100644 index 8c2fcd60cde..00000000000 --- a/res/cardsfolder/dwarven_trader.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Dwarven Trader -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/hm/en-us/card3001.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/91.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_vigilantes.txt b/res/cardsfolder/dwarven_vigilantes.txt deleted file mode 100644 index 6a4c51579fe..00000000000 --- a/res/cardsfolder/dwarven_vigilantes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Dwarven Vigilantes -ManaCost:2 R -Types:Creature Dwarf -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may have it deal damage equal to its power to target creature. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBNoCombatDamage -SVar:DBNoCombatDamage:DB$Pump | Defined$ Self | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_vigilantes.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_warriors.txt b/res/cardsfolder/dwarven_warriors.txt deleted file mode 100644 index f4373b609fb..00000000000 --- a/res/cardsfolder/dwarven_warriors.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Dwarven Warriors -ManaCost:2 R -Types:Creature Dwarf Warrior -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerLE2 | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. | TgtPrompt$ Select target creature with power 2 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_warriors.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/144.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/145.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/222.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/205.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/143.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dwarven_weaponsmith.txt b/res/cardsfolder/dwarven_weaponsmith.txt deleted file mode 100644 index d8a3933e966..00000000000 --- a/res/cardsfolder/dwarven_weaponsmith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dwarven Weaponsmith -ManaCost:1 R -Types:Creature Dwarf Artificer -Text:no text -PT:1/1 -A:AB$ PutCounter | Cost$ T Sac<1/Artifact> | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Put a +1/+1 counter on target creature. Activate this ability only during your upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/dwarven_weaponsmith.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/144.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/dying_wail.txt b/res/cardsfolder/dying_wail.txt deleted file mode 100644 index 7d1cb2000e5..00000000000 --- a/res/cardsfolder/dying_wail.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Dying Wail -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigDiscard | TriggerDescription$ When enchanted creature is put into a graveyard, target player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/dying_wail.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eager_cadet.txt b/res/cardsfolder/eager_cadet.txt deleted file mode 100644 index e5204732950..00000000000 --- a/res/cardsfolder/eager_cadet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Eager Cadet -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card47784.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9eb/1.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/early_frost.txt b/res/cardsfolder/early_frost.txt deleted file mode 100644 index dd12fb6903d..00000000000 --- a/res/cardsfolder/early_frost.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Early Frost -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 1 U | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target land | ValidTgts$ Land | SpellDescription$ Tap up to three target lands. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/early_frost.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earnest_fellowship.txt b/res/cardsfolder/earnest_fellowship.txt deleted file mode 100644 index d0789457094..00000000000 --- a/res/cardsfolder/earnest_fellowship.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Earnest Fellowship -ManaCost:1 W -Types:Enchantment -Text:Each creature has protection from its colors. -K:stPumpAll:Creature.White:0/0/Protection from white:no Condition:no text -K:stPumpAll:Creature.Blue:0/0/Protection from blue:no Condition:no text -K:stPumpAll:Creature.Black:0/0/Protection from black:no Condition:no text -K:stPumpAll:Creature.Red:0/0/Protection from red:no Condition:no text -K:stPumpAll:Creature.Green:0/0/Protection from green:no Condition:no text -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/earnest_fellowship.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earsplitting_rats.txt b/res/cardsfolder/earsplitting_rats.txt deleted file mode 100644 index fd5d0a07190..00000000000 --- a/res/cardsfolder/earsplitting_rats.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Earsplitting Rats -ManaCost:3 B -Types:Creature Rat -Text:no text -PT:2/1 -A:AB$ Regenerate | Cost$ Discard<1/Card> | SpellDescription$ Regenerate CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/earsplitting_rats.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earth_elemental.txt b/res/cardsfolder/earth_elemental.txt deleted file mode 100644 index 588a7b5f5f8..00000000000 --- a/res/cardsfolder/earth_elemental.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Earth Elemental -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:4/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129554.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/145.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/146.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/206.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/199.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/145.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/95.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earth_rift.txt b/res/cardsfolder/earth_rift.txt deleted file mode 100644 index 57024320f35..00000000000 --- a/res/cardsfolder/earth_rift.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Earth Rift -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TgtPrompt$ Select target land. | SpellDescription$ Destroy target land. -A:SP$ Destroy | Cost$ 5 R R | ValidTgts$ Land | TgtPrompt$ Select target land. | Flashback$ True | CostDesc$ Flashback 5 R R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/earth_rift.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earth_servant.txt b/res/cardsfolder/earth_servant.txt deleted file mode 100644 index 2910c3ecb56..00000000000 --- a/res/cardsfolder/earth_servant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Earth Servant -ManaCost:5 R -Types:Creature Elemental -Text:no text -PT:4/4 -K:stPumpSelf:Creature:0/X:no Condition:Earth Servant gets +0/+1 for each Mountain you control. -SVar:X:Count$Valid Mountain.YouCtrl -SVar:BuffedBy:Mountain -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/earth_servant.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earth_surge.txt b/res/cardsfolder/earth_surge.txt deleted file mode 100644 index 74b7162d73a..00000000000 --- a/res/cardsfolder/earth_surge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Earth Surge -ManaCost:3 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Land:2/2:No Condition:Each land gets +2/+2 as long as it's a creature. -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/earth_surge.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthbind.txt b/res/cardsfolder/earthbind.txt deleted file mode 100644 index 596aea8df4e..00000000000 --- a/res/cardsfolder/earthbind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Earthbind -ManaCost:R -Types:Enchantment Aura -Text:When Earthbind enters the battlefield, if enchanted creature has flying, Earthbind deals 2 damage to that creature and enchanted creature loses flying. -K:Enchant creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthbind.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/146.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/147.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/146.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthblighter.txt b/res/cardsfolder/earthblighter.txt deleted file mode 100644 index b67b807c57e..00000000000 --- a/res/cardsfolder/earthblighter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Earthblighter -ManaCost:1 B -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ 2 B T Sac<1/Goblin> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthblighter.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/68.jpg -End diff --git a/res/cardsfolder/earthbrawn.txt b/res/cardsfolder/earthbrawn.txt deleted file mode 100644 index c131fe04f9b..00000000000 --- a/res/cardsfolder/earthbrawn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Earthbrawn -ManaCost:1 G -Types:Instant -Text:no text -#This may look funny, but it works correctly AFAICT from my testing. -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -A:AB$ PutCounter | Cost$ 1 G Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | ActivatingZone$ Hand | PrecostDesc$ Reinforce 1 - | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthbrawn.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthcraft.txt b/res/cardsfolder/earthcraft.txt deleted file mode 100644 index 6dc3acfbdcc..00000000000 --- a/res/cardsfolder/earthcraft.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Earthcraft -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ Untap | Cost$ tapXType<1/Creature> | ValidTgts$ Land.Basic | TgtPrompt$ Select target basic land | SpellDescription$ Untap target basic land. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthcraft.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/116.jpg -End diff --git a/res/cardsfolder/earthen_goo.txt b/res/cardsfolder/earthen_goo.txt deleted file mode 100644 index 6f2d3da2c1f..00000000000 --- a/res/cardsfolder/earthen_goo.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Earthen Goo -ManaCost:2 R -Types:Creature Ooze -Text:no text -PT:2/2 -K:Trample -K:Cumulative upkeep:RG -K:stPumpSelf:Creature:X/X:No Condition:Earthen Goo gets +1/+1 for each age counter on it. -SVar:X:Count$CardCounters.AGE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthen_goo.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthlink.txt b/res/cardsfolder/earthlink.txt deleted file mode 100644 index 1f979969f6a..00000000000 --- a/res/cardsfolder/earthlink.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Earthlink -ManaCost:3 B R G -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, that creature's controller sacrifices a land. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ TriggeredCardController -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthlink.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/363.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthquake.txt b/res/cardsfolder/earthquake.txt deleted file mode 100644 index d4d544fc41c..00000000000 --- a/res/cardsfolder/earthquake.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Earthquake -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X R | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature without flying and each player. -SVar:X:Count$xPaid -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthquake.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/147.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/148.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/180.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/207.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/129.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/94.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/134.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/173.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/147.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/223.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/earthshaker.txt b/res/cardsfolder/earthshaker.txt deleted file mode 100644 index 9b5cdb51cd5..00000000000 --- a/res/cardsfolder/earthshaker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Earthshaker -ManaCost:4 R R -Types:Creature Spirit -Text:no text -PT:4/5 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTremor | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME deals 2 damage to each creature without flying. -SVar:TrigTremor:AB$ DamageAll | Cost$ 0 | ValidCards$ Creature.withoutFlying | NumDmg$ 2 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 2 damage to each creature without flying. -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/earthshaker.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eastern_paladin.txt b/res/cardsfolder/eastern_paladin.txt deleted file mode 100644 index 494a7dc25fd..00000000000 --- a/res/cardsfolder/eastern_paladin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Eastern Paladin -ManaCost:2 B B -Types:Creature Zombie Knight -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ B B T | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | SpellDescription$ Destroy target green creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eastern_paladin.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/131.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/133.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/132.jpg -End diff --git a/res/cardsfolder/eater_of_days.txt b/res/cardsfolder/eater_of_days.txt deleted file mode 100644 index 2abcea2a189..00000000000 --- a/res/cardsfolder/eater_of_days.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Eater of Days -ManaCost:4 -Types:Artifact Creature Leviathan -Text:no text -PT:9/8 -K:Flying -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAddTurnOpponent | TriggerDescription$ When CARDNAME enters the battlefield, you skip your next two turns. -SVar:TrigAddTurnOpponent:AB$AddTurn | Cost$ 0 | Defined$ Opponent | NumTurns$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eater_of_days.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebon_dragon.txt b/res/cardsfolder/ebon_dragon.txt deleted file mode 100644 index 6a042a8ff10..00000000000 --- a/res/cardsfolder/ebon_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ebon Dragon -ManaCost:5 B B -Types:Creature Dragon -Text:no text -PT:5/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, you may have target opponent discard a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent. | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_dragon.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebon_drake.txt b/res/cardsfolder/ebon_drake.txt deleted file mode 100644 index b44768afe03..00000000000 --- a/res/cardsfolder/ebon_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ebon Drake -ManaCost:2 B -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player casts a spell, you lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:AntiBuffedBy:Spell -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_drake.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebon_praetor.txt b/res/cardsfolder/ebon_praetor.txt deleted file mode 100644 index 6901870d544..00000000000 --- a/res/cardsfolder/ebon_praetor.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Ebon Praetor -ManaCost:4 B B -Types:Creature Avatar -Text:no text -PT:5/5 -K:First Strike -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a -2/-2 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ M2M2 | CounterNum$ 1 | SpellDescription$ Put a -2/-2 counter on CARDNAME. -A:AB$ RemoveCounter | Cost$ Sac<1/Creature> | CounterType$ M2M2 | CounterNum$ 1 | ActivatingPhases$ Upkeep | PlayerTurn$ True | ActivationLimit$ 1 | SubAbility$ SVar=DBPutCounter | SpellDescription$ Remove a -2/-2 counter from CARDNAME. If the sacrificed creature was a Thrull, put a +1/+0 counter on CARDNAME. Activate this ability only during your upkeep and only once each turn. -SVar:DBPutCounter:DB$PutCounter | CounterNum$ X | CounterType$ P1P0 -SVar:X:Sacrificed$Valid Thrull -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_praetor.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebon_stronghold.txt b/res/cardsfolder/ebon_stronghold.txt deleted file mode 100644 index 557f90d3b2a..00000000000 --- a/res/cardsfolder/ebon_stronghold.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ebon Stronghold -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebon_stronghold.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/416.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/324.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebony_horse.txt b/res/cardsfolder/ebony_horse.txt deleted file mode 100644 index 5eb6756c720..00000000000 --- a/res/cardsfolder/ebony_horse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ebony Horse -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ 2 T | ValidTgts$ Creature.attacking+YouCtrl | TgtPrompt$ Select target attacking creature you control | SubAbility$ SVar=DB | SpellDescription$ Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -SVar:DB:DB$Pump | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebony_horse.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/247.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/336.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebony_owl_netsuke.txt b/res/cardsfolder/ebony_owl_netsuke.txt deleted file mode 100644 index 79a34ba5ee6..00000000000 --- a/res/cardsfolder/ebony_owl_netsuke.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ebony Owl Netsuke -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ GE7 | Execute$ TrigDamageOpp | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has seven or more cards in hand, CARDNAME deals 4 damage to him or her. -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebony_owl_netsuke.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebony_rhino.txt b/res/cardsfolder/ebony_rhino.txt deleted file mode 100644 index 399340bb62a..00000000000 --- a/res/cardsfolder/ebony_rhino.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ebony Rhino -ManaCost:7 -Types:Artifact Creature Rhino -Text:no text -PT:4/5 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/hm/en-us/card2905.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ebony_treefolk.txt b/res/cardsfolder/ebony_treefolk.txt deleted file mode 100644 index 36fd119fb00..00000000000 --- a/res/cardsfolder/ebony_treefolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ebony Treefolk -ManaCost:1 B G -Types:Creature Treefolk -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ B G | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ebony_treefolk.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/97.jpg -End diff --git a/res/cardsfolder/echo_mage.txt b/res/cardsfolder/echo_mage.txt deleted file mode 100644 index 9d5aa62705e..00000000000 --- a/res/cardsfolder/echo_mage.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Echo Mage -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:2/3 -K:Level up:1 U -K:maxLevel:4 -K:stSetPT:2:3:LevelGE2:2:4:LevelGE4:2:5:LEVEL 2-3 2/4 U U,Tap: Copy target instant or sorcery spell. You may choose new targets for the copy. LEVEL 4+ 2/5 U U,Tap:Copy target instant or sorcery spell twice. You may choose new targets for the copies. -K:stPumpSelf:Creature.countersGE2LEVEL+countersLT4LEVEL:0/0/SVar=CopyOnce:no Condition:no text -K:stPumpSelf:Creature.countersGE4LEVEL:0/0/SVar=CopyTwice:no Condition:no text -SVar:CopyOnce:AB$CopySpell | Cost$ U U T | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:CopyTwice:AB$CopySpell | Cost$ U U T | ValidTgts$ Instant,Sorcery | SubAbility$ SVar=CopyTwice2 | SpellDescription$ Copy target instant or sorcery spell twice. You may choose new targets for the copies. -SVar:CopyTwice2:DB$CopySpell | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_mage.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/echo_tracer.txt b/res/cardsfolder/echo_tracer.txt deleted file mode 100644 index e009ba6a94e..00000000000 --- a/res/cardsfolder/echo_tracer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Echo Tracer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -K:Morph:2 U -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME is turned face up, return target creature to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/echo_tracer.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/echoing_courage.txt b/res/cardsfolder/echoing_courage.txt deleted file mode 100644 index 3188d98b5d8..00000000000 --- a/res/cardsfolder/echoing_courage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Echoing Courage -ManaCost:1 G -Types:Instant -Text:Target creature and all other creatures with the same name as that creature get +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/echoing_courage.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/echoing_decay.txt b/res/cardsfolder/echoing_decay.txt deleted file mode 100644 index 4c4e1d893bc..00000000000 --- a/res/cardsfolder/echoing_decay.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Echoing Decay -ManaCost:1 B -Types:Instant -Text:Target creature and all other creatures with the same name as that creature get -2/-2 until end of turn. -SVar:Rarity:Common -SVar:RemAIDeck:True -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46176.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/echoing_truth.txt b/res/cardsfolder/echoing_truth.txt deleted file mode 100644 index 230ab666ae7..00000000000 --- a/res/cardsfolder/echoing_truth.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Echoing Truth -ManaCost:1 U -Types:Instant -Text:Return target nonland permanent and all other permanents with the same name as that permanent to their owner's hands. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46162.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/edge_of_autumn.txt b/res/cardsfolder/edge_of_autumn.txt deleted file mode 100644 index 3b96a5c2e06..00000000000 --- a/res/cardsfolder/edge_of_autumn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Edge of Autumn -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | ConditionPresent$ Land.YouCtrl | ConditionCompare$ LE4 | ConditionDescription$ If you control four or fewer lands, | SpellDescription$ 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. -K:Cycling:Sac<1/Land> -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/edge_of_autumn.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/edge_of_the_divinity.txt b/res/cardsfolder/edge_of_the_divinity.txt deleted file mode 100644 index 12496dc2681..00000000000 --- a/res/cardsfolder/edge_of_the_divinity.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Edge of the Divinity -ManaCost:WB -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.White:1/2:No Condition:As long as enchanted creature is white, it gets +1/+2. -K:stPumpEnchanted:Creature.Black:2/1:No Condition:As long as enchanted creature is black, it gets +2/+1. -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/edge_of_the_divinity.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/edgewalker.txt b/res/cardsfolder/edgewalker.txt deleted file mode 100644 index 39b98f8b535..00000000000 --- a/res/cardsfolder/edgewalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Edgewalker -ManaCost:1 W B -Types:Creature Human Cleric -Text: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.) -PT:2/2 -K:CostChange:Player:Less:W:Spell:All:Cleric:NoSpecial -K:CostChange:Player:Less:B:Spell:All:Cleric:NoSpecial -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/edgewalker.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eel_umbra.txt b/res/cardsfolder/eel_umbra.txt deleted file mode 100644 index 97e9e6f812d..00000000000 --- a/res/cardsfolder/eel_umbra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eel Umbra -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Flash -K:Totem armor -K:enPump:+1/+1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eel_umbra.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eerie_procession.txt b/res/cardsfolder/eerie_procession.txt deleted file mode 100644 index f97c05b2527..00000000000 --- a/res/cardsfolder/eerie_procession.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Eerie Procession -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Hand | ChangeType$ Arcane | ChangeNum$ 1 | SpellDescription$ Search your library for an Arcane card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/eerie_procession.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eiganjo_castle.txt b/res/cardsfolder/eiganjo_castle.txt deleted file mode 100644 index dd75e149e6c..00000000000 --- a/res/cardsfolder/eiganjo_castle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Eiganjo Castle -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ PreventDamage | Cost$ W T | ValidTgts$ Creature.Legendary | Amount$ 2 | TgtPrompt$ Select target legendary creature | SpellDescription$ Prevent the next 2 damage that would be dealt to target legendary creature this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_castle.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eiganjo_free_riders.txt b/res/cardsfolder/eiganjo_free_riders.txt deleted file mode 100644 index 541dccb7a18..00000000000 --- a/res/cardsfolder/eiganjo_free_riders.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Eiganjo Free-Riders -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:3/4 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.White | PresentZone$ Battlefield | PresentPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a white creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target white creature | Mandatory$ True | ValidTgts$ Creature.White+YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/eiganjo_free_riders.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eightfold_maze.txt b/res/cardsfolder/eightfold_maze.txt deleted file mode 100644 index 93da92e6581..00000000000 --- a/res/cardsfolder/eightfold_maze.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Eightfold Maze -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Destroy target attacking creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eightfold_maze.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ekundu_griffin.txt b/res/cardsfolder/ekundu_griffin.txt deleted file mode 100644 index 4adfd30c2cb..00000000000 --- a/res/cardsfolder/ekundu_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ekundu Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ekundu_griffin.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/18.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/el_hajjaj.txt b/res/cardsfolder/el_hajjaj.txt deleted file mode 100644 index 6f247f35c83..00000000000 --- a/res/cardsfolder/el_hajjaj.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:El-Hajjaj -ManaCost:1 B B -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/el_hajjaj.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/16.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/18.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eladamri_lord_of_leaves.txt b/res/cardsfolder/eladamri_lord_of_leaves.txt deleted file mode 100644 index d2d3a01aea8..00000000000 --- a/res/cardsfolder/eladamri_lord_of_leaves.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eladamri, Lord of Leaves -ManaCost:G G -Types:Legendary Creature Elf Warrior -Text:no text -PT:2/2 -K:stPumpAll:Creature.Elf+Other:0/0/Forestwalk:No Condition:Other Elf creatures have forestwalk. -K:stPumpAll:Permanent.Elf+Other:0/0/Shroud:No Condition:Other Elves have shroud. (They can't be the targets of spells or abilities.) -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eladamri_lord_of_leaves.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eladamris_call.txt b/res/cardsfolder/eladamris_call.txt deleted file mode 100644 index be3c127534b..00000000000 --- a/res/cardsfolder/eladamris_call.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Eladamri's Call -ManaCost:G W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ G W | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eladamris_call.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eladamris_vineyard.txt b/res/cardsfolder/eladamris_vineyard.txt deleted file mode 100644 index e707454cc4c..00000000000 --- a/res/cardsfolder/eladamris_vineyard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Eladamri's Vineyard -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ Each | TriggerZones$ Battlefield | Execute$ TrigMana | TriggerDescription$ At the beginning of each player's precombat main phase, add G G to that player's mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 2 | Defined$ TriggeredPlayer -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eladamris_vineyard.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eland_umbra.txt b/res/cardsfolder/eland_umbra.txt deleted file mode 100644 index 4f9f6ed3d37..00000000000 --- a/res/cardsfolder/eland_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eland Umbra -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+0/+4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eland_umbra.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elder_druid.txt b/res/cardsfolder/elder_druid.txt deleted file mode 100644 index 2e4fa076fcd..00000000000 --- a/res/cardsfolder/elder_druid.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Elder Druid -ManaCost:3 G -Types:Creature Elf Cleric Druid -Text:no text -PT:2/2 -A:AB$ TapOrUntap | Cost$ 3 G T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_druid.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/152.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/223.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/120.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/238.jpg -End diff --git a/res/cardsfolder/elder_mastery.txt b/res/cardsfolder/elder_mastery.txt deleted file mode 100644 index 06ad7d0cefb..00000000000 --- a/res/cardsfolder/elder_mastery.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elder Mastery -ManaCost:3 U B R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3/Flying -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage to a player, that player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_mastery.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eldrazi_conscription.txt b/res/cardsfolder/eldrazi_conscription.txt deleted file mode 100644 index 55ba9f637fa..00000000000 --- a/res/cardsfolder/eldrazi_conscription.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Eldrazi Conscription -ManaCost:8 -Types:Tribal Enchantment Eldrazi Aura -Text:no text -K:Enchant creature -K:enPump:+10/+10/Trample & Annihilator 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eldrazi_conscription.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eldrazi_monument.txt b/res/cardsfolder/eldrazi_monument.txt deleted file mode 100644 index cdbce977975..00000000000 --- a/res/cardsfolder/eldrazi_monument.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eldrazi Monument -ManaCost:5 -Types:Artifact -Text:At the beginning of your upkeep, sacrifice a creature. If you can't, sacrifice Eldrazi Monument. -K:stPumpAll:Creature.YouCtrl:1/1/Flying & HIDDEN Indestructible:No Condition:Creatures you control get +1/+1, have flying, and are indestructible. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/eldrazi_monument.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/electric_eel.txt b/res/cardsfolder/electric_eel.txt deleted file mode 100644 index 7e82ea1ca47..00000000000 --- a/res/cardsfolder/electric_eel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Electric Eel -ManaCost:U -Types:Creature Fish -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R R | NumAtt$ +2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gets +2/+0 until end of turn and deals 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/electric_eel.jpg -SVar:Rarity:Uncommon -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/electrolyze.txt b/res/cardsfolder/electrolyze.txt deleted file mode 100644 index 387cd351bc5..00000000000 --- a/res/cardsfolder/electrolyze.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Electrolyze -ManaCost:1 U R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 U R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature, player or planeswalker (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 2 damage divided as you choose among one or two target creatures and/or players. Draw a card. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature, player or planeswalker (2) | NumDmg$ 1 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/electrolyze.jpg -SVar:Rarity:Uncommon -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/111.jpg -End diff --git a/res/cardsfolder/electropotence.txt b/res/cardsfolder/electropotence.txt deleted file mode 100644 index 25f2296b568..00000000000 --- a/res/cardsfolder/electropotence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Electropotence -ManaCost:2 R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ 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. -SVar:TrigDamage:AB$DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player | DamageSource$ TriggeredCard | NumDmg$ Damage | TgtPrompt$ Select target creature or player. -SVar:Damage:TriggeredCard$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/electropotence.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elemental_augury.txt b/res/cardsfolder/elemental_augury.txt deleted file mode 100644 index 5e2d0f8802a..00000000000 --- a/res/cardsfolder/elemental_augury.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elemental Augury -ManaCost:U B R -Types:Enchantment -Text:no text -A:AB$ RearrangeTopOfLibrary | Cost$ 3 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | SpellDescription$ Look at the top three cards of target player's library, then put them back in any order. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_augury.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/364.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elemental_mastery.txt b/res/cardsfolder/elemental_mastery.txt deleted file mode 100644 index c231ee4014a..00000000000 --- a/res/cardsfolder/elemental_mastery.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elemental Mastery -ManaCost:3 R -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:stPumpEnchanted:Creature.AttachedBy:0/0/SVar=Token & SVar=TokenCount:no Condition:Enchanted creature has ": 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." -SVar:Token:AB$Token | Cost$ T | TokenAmount$ TokenCount | TokenImage$ r 1 1 elemental | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenKeywords$ Haste<>HIDDEN At the beginning of the end step, exile CARDNAME. | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ 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. -SVar:TokenCount:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elemental_mastery.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elephant_ambush.txt b/res/cardsfolder/elephant_ambush.txt deleted file mode 100644 index 7b620a73b1b..00000000000 --- a/res/cardsfolder/elephant_ambush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elephant Ambush -ManaCost:2 G G -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 G G | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Elephant creature token onto the battlefield. -A:SP$ Token | Cost$ 6 G G | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | Flashback$ True | CostDesc$ Flashback 6 G G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elephant_ambush.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elephant_graveyard.txt b/res/cardsfolder/elephant_graveyard.txt deleted file mode 100644 index 012aa3bf869..00000000000 --- a/res/cardsfolder/elephant_graveyard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elephant Graveyard -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Regenerate | ValidTgts$ Creature.Elephant | TgtPrompt$ Select target Elephant | Cost$ T | SpellDescription$ Regenerate target Elephant. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elephant_graveyard.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elephant_guide.txt b/res/cardsfolder/elephant_guide.txt deleted file mode 100644 index e68b1d97a44..00000000000 --- a/res/cardsfolder/elephant_guide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elephant Guide -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3 -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ When enchanted creature is put into a graveyard, put a 3/3 green Elephant creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elephant_guide.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elesh_norn_grand_cenobite.txt b/res/cardsfolder/elesh_norn_grand_cenobite.txt deleted file mode 100644 index 4c772f03830..00000000000 --- a/res/cardsfolder/elesh_norn_grand_cenobite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Elesh Norn, Grand Cenobite -ManaCost:5 W W -Types:Legendary Creature Praetor -Text:no text -PT:4/7 -K:Vigilance -K:stPumpAll:Creature.YouCtrl+Other:2/2:No Condition:Other creatures you control get +2/+2. -K:stPumpAll:Creature.YouDontCtrl:-2/-2:No Condition:Creatures your opponents control get -2/-2. -SVar:PlayMain1:TRUE -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/elesh_norn_grand_cenobite.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elf_replica.txt b/res/cardsfolder/elf_replica.txt deleted file mode 100644 index 7d9ae77b389..00000000000 --- a/res/cardsfolder/elf_replica.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elf Replica -ManaCost:3 -Types:Artifact Creature Elf -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ 1 G Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elf_replica.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/167.jpg -End diff --git a/res/cardsfolder/elfhame_palace.txt b/res/cardsfolder/elfhame_palace.txt deleted file mode 100644 index 21f9b22fd5e..00000000000 --- a/res/cardsfolder/elfhame_palace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elfhame Palace -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elfhame_palace.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/324.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elite_archers.txt b/res/cardsfolder/elite_archers.txt deleted file mode 100644 index 5f6b1d604e9..00000000000 --- a/res/cardsfolder/elite_archers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elite Archers -ManaCost:5 W -Types:Creature Human Soldier Archer -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elite_archers.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/18.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/13.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elite_cat_warrior.txt b/res/cardsfolder/elite_cat_warrior.txt deleted file mode 100644 index 27c42aedfb5..00000000000 --- a/res/cardsfolder/elite_cat_warrior.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elite Cat Warrior -ManaCost:2 G -Types:Creature Cat Warrior -Text:no text -PT:2/3 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4293.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/87.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/elite_javelineer.txt b/res/cardsfolder/elite_javelineer.txt deleted file mode 100644 index 7c939e555bb..00000000000 --- a/res/cardsfolder/elite_javelineer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elite Javelineer -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME blocks, it deals 1 damage to target attacking creature. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.attacking | TgtPrompt$ Choose target attacking creature. | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elite_javelineer.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/19.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elite_vanguard.txt b/res/cardsfolder/elite_vanguard.txt deleted file mode 100644 index 47f13de0380..00000000000 --- a/res/cardsfolder/elite_vanguard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elite Vanguard -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:2/1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elite_vanguard.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/13.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elixir_of_immortality.txt b/res/cardsfolder/elixir_of_immortality.txt deleted file mode 100644 index c6e832630a1..00000000000 --- a/res/cardsfolder/elixir_of_immortality.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elixir of Immortality -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 2 T | LifeAmount$ 5 | SubAbility$ SVar=DBShuffleElixir | SpellDescription$ You gain 5 life. Shuffle CARDNAME and your graveyard into their owner's library. -SVar:DBShuffleElixir:DB$ChangeZone | Origin$ Battlefield | Destination$ Library | Shuffle$ True | Defined$ Self | SubAbility$ SVar=DBShuffleGrave -SVar:DBShuffleGrave:DB$ChangeZoneAll | Origin$ Graveyard | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elixir_of_immortality.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elixir_of_vitality.txt b/res/cardsfolder/elixir_of_vitality.txt deleted file mode 100644 index 68e2b1b314e..00000000000 --- a/res/cardsfolder/elixir_of_vitality.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elixir of Vitality -ManaCost:4 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ GainLife | Cost$ T Sac<1/CARDNAME> | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -A:AB$ GainLife | Cost$ 8 T Sac<1/CARDNAME> | LifeAmount$ 8 | SpellDescription$ You gain 8 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elixir_of_vitality.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elspeth_knight_errant.txt b/res/cardsfolder/elspeth_knight_errant.txt deleted file mode 100644 index 56b6f7f6ede..00000000000 --- a/res/cardsfolder/elspeth_knight_errant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Elspeth, Knight-Errant -ManaCost:2 W W -Types:Planeswalker Elspeth -Text:no text -Loyalty:4 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/elspeth_knight_errant.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elspeth_tirel.txt b/res/cardsfolder/elspeth_tirel.txt deleted file mode 100644 index 3571180362c..00000000000 --- a/res/cardsfolder/elspeth_tirel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Elspeth Tirel -ManaCost:3 W W -Types:Planeswalker Elspeth -Text:no text -Loyalty:4 -A:AB$ GainLife | Cost$ AddCounter<2/LOYALTY> | LifeAmount$ XLife | Planeswalker$ True | SpellDescription$ You gain 1 life for each creature you control. -A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | TokenAmount$ 3 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | Planeswalker$ True | SpellDescription$ Put three 1/1 white Soldier creature tokens onto the battlefield. -A:AB$ DestroyAll | Cost$ SubCounter<5/LOYALTY> | ValidCards$ Permanent.nonLand+nonToken+Other | Planeswalker$ True | SpellDescription$ Destroy all other permanents except for lands and tokens. -SVar:XLife:Count$TypeYouCtrl.Creature -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/elspeth_tirel.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elven_cache.txt b/res/cardsfolder/elven_cache.txt deleted file mode 100644 index 21fa5c0c84e..00000000000 --- a/res/cardsfolder/elven_cache.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elven Cache -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Return target card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_cache.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/55.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elven_fortress.txt b/res/cardsfolder/elven_fortress.txt deleted file mode 100644 index c512a090ede..00000000000 --- a/res/cardsfolder/elven_fortress.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Elven Fortress -ManaCost:G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ 1 G | ValidTgts$ Creature.blocking | NumDef$ +1 | SpellDescription$ Target blocking creature gets +0/+1 until end of turn. | TgtPrompt$ Select target blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_fortress.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/67.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/elven_lyre.txt b/res/cardsfolder/elven_lyre.txt deleted file mode 100644 index 978ae662557..00000000000 --- a/res/cardsfolder/elven_lyre.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Elven Lyre -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_lyre.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elven_palisade.txt b/res/cardsfolder/elven_palisade.txt deleted file mode 100644 index b501a1c0971..00000000000 --- a/res/cardsfolder/elven_palisade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elven Palisade -ManaCost:G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ Sac<1/Forest> | NumAtt$ -3 | NumDef$ 0 | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking | SpellDescription$ Target attacking creature gets -3/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_palisade.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/109.jpg -End diff --git a/res/cardsfolder/elven_riders.txt b/res/cardsfolder/elven_riders.txt deleted file mode 100644 index ac81937758f..00000000000 --- a/res/cardsfolder/elven_riders.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Elven Riders -ManaCost:3 G G -Types:Creature Elf -Text:CARDNAME can't be blocked except by Walls and/or creatures with flying. -PT:3/3 -K:CantBeBlockedBy Creature.withoutFlying+nonWall -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_riders.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/97.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/153.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/126.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/259.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/225.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elven_rite.txt b/res/cardsfolder/elven_rite.txt deleted file mode 100644 index b4d33b0c9dc..00000000000 --- a/res/cardsfolder/elven_rite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elven Rite -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ PutCounter | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=DBPutCounter | SpellDescription$ Distribute two +1/+1 counters among one or two target creatures. -SVar:DBPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_rite.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elven_warhounds.txt b/res/cardsfolder/elven_warhounds.txt deleted file mode 100644 index e0d1c2153f7..00000000000 --- a/res/cardsfolder/elven_warhounds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Elven Warhounds -ManaCost:3 G -Types:Creature Hound -Text:Whenever Elven Warhounds becomes blocked by a creature, put that creature on top of its owner's library. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_warhounds.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elves_of_deep_shadow.txt b/res/cardsfolder/elves_of_deep_shadow.txt deleted file mode 100644 index d07898e0ea2..00000000000 --- a/res/cardsfolder/elves_of_deep_shadow.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Elves of Deep Shadow -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elves_of_deep_shadow.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/161.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_aberration.txt b/res/cardsfolder/elvish_aberration.txt deleted file mode 100644 index 20c158542eb..00000000000 --- a/res/cardsfolder/elvish_aberration.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Aberration -ManaCost:5 G -Types:Creature Elf Mutant -Text:no text -PT:4/5 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -K:TypeCycling:Forest:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_aberration.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_archdruid.txt b/res/cardsfolder/elvish_archdruid.txt deleted file mode 100644 index bbc9957232e..00000000000 --- a/res/cardsfolder/elvish_archdruid.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Elvish Archdruid -ManaCost:1 G G -Types:Creature Elf Druid -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Elf you control. -K:stPumpAll:Creature.Elf+Other+YouCtrl:1/1:No Condition:Other Elf creatures you control get +1/+1. -SVar:X:Count$Valid Elf.YouCtrl -SVar:RemAIDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_archdruid.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/171.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_archers.txt b/res/cardsfolder/elvish_archers.txt deleted file mode 100644 index 6b42c449b67..00000000000 --- a/res/cardsfolder/elvish_archers.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Elvish Archers -ManaCost:1 G -Types:Creature Elf Archer -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_archers.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/100.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/100.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/239.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/154.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/127.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/226.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/100.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_bard.txt b/res/cardsfolder/elvish_bard.txt deleted file mode 100644 index 582bf4c66a0..00000000000 --- a/res/cardsfolder/elvish_bard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Bard -ManaCost:3 G G -Types:Creature Elf Shaman -Text:no text -PT:2/4 -K:All creatures able to block CARDNAME do so. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_bard.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/66.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_berserker.txt b/res/cardsfolder/elvish_berserker.txt deleted file mode 100644 index 3cf0b5f150e..00000000000 --- a/res/cardsfolder/elvish_berserker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Elvish Berserker -ManaCost:G -Types:Creature Elf Berserker -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +X | NumDef$ +X -SVar:X:TriggerCount$NumBlockers -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_berserker.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/110.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/237.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_branchbender.txt b/res/cardsfolder/elvish_branchbender.txt deleted file mode 100644 index 1821e588b65..00000000000 --- a/res/cardsfolder/elvish_branchbender.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Branchbender -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:2/2 -A:AB$ Animate | Cost$ T | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Power$ X | Toughness$ X | Types$ Creature,Treefolk | SpellDescription$ 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. -SVar:X:Count$Valid Elf.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_branchbender.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_champion.txt b/res/cardsfolder/elvish_champion.txt deleted file mode 100644 index d402f348bb5..00000000000 --- a/res/cardsfolder/elvish_champion.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Elvish Champion -ManaCost:1 G G -Types:Creature Elf -Text:no text -PT:2/2 -K:stPumpAll:Creature.Elf+Other:1/1/Forestwalk:No Condition:Other Elf creatures get +1/+1 and have forestwalk. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_champion.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/241.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/186.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/240.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/238.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_eulogist.txt b/res/cardsfolder/elvish_eulogist.txt deleted file mode 100644 index 2356cf0620c..00000000000 --- a/res/cardsfolder/elvish_eulogist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Eulogist -ManaCost:G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ Sac<1/CARDNAME>| LifeAmount$ X | SpellDescription$ You gain 1 life for each Elf card in your graveyard. -SVar:X:Count$TypeInYourYard.Elf -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_eulogist.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_farmer.txt b/res/cardsfolder/elvish_farmer.txt deleted file mode 100644 index 9dd1425f1d8..00000000000 --- a/res/cardsfolder/elvish_farmer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Elvish Farmer -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:0/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ GainLife | Cost$ Sac<1/Saproling> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_farmer.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_fury.txt b/res/cardsfolder/elvish_fury.txt deleted file mode 100644 index 8a71025b42d..00000000000 --- a/res/cardsfolder/elvish_fury.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Fury -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Buyback:4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4760.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_guidance.txt b/res/cardsfolder/elvish_guidance.txt deleted file mode 100644 index 5dc8bd01dc9..00000000000 --- a/res/cardsfolder/elvish_guidance.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Elvish Guidance -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Land -T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ X | Defined$ TriggeredCardController -SVar:X:Count$Valid Elf -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_guidance.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_handservant.txt b/res/cardsfolder/elvish_handservant.txt deleted file mode 100644 index 954c74ba0ff..00000000000 --- a/res/cardsfolder/elvish_handservant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Handservant -ManaCost:G -Types:Creature Elf Warrior -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Giant | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a player casts a Giant spell, you may put a +1/+1 counter on Elvish Handservant. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Giant -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_handservant.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_harbinger.txt b/res/cardsfolder/elvish_harbinger.txt deleted file mode 100644 index 750d60127da..00000000000 --- a/res/cardsfolder/elvish_harbinger.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Elvish Harbinger -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Elf | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_herder.txt b/res/cardsfolder/elvish_herder.txt deleted file mode 100644 index fb29e913ee1..00000000000 --- a/res/cardsfolder/elvish_herder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Herder -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_herder.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/247.jpg -End diff --git a/res/cardsfolder/elvish_hexhunter.txt b/res/cardsfolder/elvish_hexhunter.txt deleted file mode 100644 index 67aafcc2296..00000000000 --- a/res/cardsfolder/elvish_hexhunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Hexhunter -ManaCost:GW -Types:Creature Elf Shaman -Text:no text -PT:1/1 -A:AB$Destroy | Cost$ GW T Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_hexhunter.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/226.jpg -End diff --git a/res/cardsfolder/elvish_hunter.txt b/res/cardsfolder/elvish_hunter.txt deleted file mode 100644 index edf96c1cb3f..00000000000 --- a/res/cardsfolder/elvish_hunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Hunter -ManaCost:1 G -Types:Creature Elf Archer -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_hunter.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/72.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_lookout.txt b/res/cardsfolder/elvish_lookout.txt deleted file mode 100644 index b3b49b8c0bf..00000000000 --- a/res/cardsfolder/elvish_lookout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Lookout -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_lookout.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_lyrist.txt b/res/cardsfolder/elvish_lyrist.txt deleted file mode 100644 index 3a34b65b0a0..00000000000 --- a/res/cardsfolder/elvish_lyrist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Lyrist -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_lyrist.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/242.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/248.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/241.jpg -End diff --git a/res/cardsfolder/elvish_pathcutter.txt b/res/cardsfolder/elvish_pathcutter.txt deleted file mode 100644 index 8344fb74448..00000000000 --- a/res/cardsfolder/elvish_pathcutter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Pathcutter -ManaCost:3 G -Types:Creature Elf Scout -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ 2 G | ValidTgts$ Creature.elf | TgtPrompt$ Select target Elf creature | KW$ Forestwalk | SpellDescription$ Target Elf creature gains forestwalk until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_pathcutter.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_pioneer.txt b/res/cardsfolder/elvish_pioneer.txt deleted file mode 100644 index 3accda0b63d..00000000000 --- a/res/cardsfolder/elvish_pioneer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Pioneer -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put a basic land card from your hand onto the battlefield tapped. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_pioneer.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/243.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_piper.txt b/res/cardsfolder/elvish_piper.txt deleted file mode 100644 index 3935e273816..00000000000 --- a/res/cardsfolder/elvish_piper.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Elvish Piper -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -A:AB$ ChangeZone | Cost$ G T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ You may put a creature card from your hand onto the battlefield. -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83072.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/244.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/104.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/242.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/239.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/262.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_promenade.txt b/res/cardsfolder/elvish_promenade.txt deleted file mode 100644 index f82cd1429a9..00000000000 --- a/res/cardsfolder/elvish_promenade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Promenade -ManaCost:3 G -Types:Tribal Sorcery Elf -Text:no text -A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Elf Warrior creature token onto the battlefield for each Elf you control. -SVar:X:Count$Valid Elf.YouCtrl -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_promenade.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_ranger.txt b/res/cardsfolder/elvish_ranger.txt deleted file mode 100644 index 3f51ea428f3..00000000000 --- a/res/cardsfolder/elvish_ranger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Ranger -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:4/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4296.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/67.jpg|2 -SetInfo:POR|Common|http://magiccards.info/scans/en/po/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_scout.txt b/res/cardsfolder/elvish_scout.txt deleted file mode 100644 index c2ca71d9955..00000000000 --- a/res/cardsfolder/elvish_scout.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Scout -ManaCost:G -Types:Creature Elf Scout -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ G T | ValidTgts$ Creature.attacking+YouCtrl | TgtPrompt$ Select target attacking creature you control | SubAbility$ SVar=DBPump | SpellDescription$ Untap target attacking creature you control. Prevent all combat damage that would be dealt to and dealt by it this turn. -SVar:DBPump:DB$Pump | Cost$ 0 | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_scout.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/75.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_scrapper.txt b/res/cardsfolder/elvish_scrapper.txt deleted file mode 100644 index 5eeb0d77402..00000000000 --- a/res/cardsfolder/elvish_scrapper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Scrapper -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_scrapper.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/245.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/258.jpg -End diff --git a/res/cardsfolder/elvish_skysweeper.txt b/res/cardsfolder/elvish_skysweeper.txt deleted file mode 100644 index 0e496405dc7..00000000000 --- a/res/cardsfolder/elvish_skysweeper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Elvish Skysweeper -ManaCost:G -Types:Creature Elf Warrior -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ 4 G Sac<1/Creature> | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Destroy target creature with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_skysweeper.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/162.jpg -End diff --git a/res/cardsfolder/elvish_spirit_guide.txt b/res/cardsfolder/elvish_spirit_guide.txt deleted file mode 100644 index 92f7c5447ee..00000000000 --- a/res/cardsfolder/elvish_spirit_guide.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Spirit Guide -ManaCost:2 G -Types:Creature Elf Spirit -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ ExileFromHand<1/CARDNAME> | Produced$ G | ActivatingZone$ Hand | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_spirit_guide.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_vanguard.txt b/res/cardsfolder/elvish_vanguard.txt deleted file mode 100644 index a3317f11363..00000000000 --- a/res/cardsfolder/elvish_vanguard.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Elvish Vanguard -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Elf.Other | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another Elf enters the battlefield, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Elf -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_vanguard.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_visionary.txt b/res/cardsfolder/elvish_visionary.txt deleted file mode 100644 index 18daba2a659..00000000000 --- a/res/cardsfolder/elvish_visionary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Elvish Visionary -ManaCost:1 G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_visionary.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/178.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/elvish_warrior.txt b/res/cardsfolder/elvish_warrior.txt deleted file mode 100644 index 1a29fec07e7..00000000000 --- a/res/cardsfolder/elvish_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Elvish Warrior -ManaCost:G G -Types:Creature Elf Warrior -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83451.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/120.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/240.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/embargo.txt b/res/cardsfolder/embargo.txt deleted file mode 100644 index 3fe46cb2adf..00000000000 --- a/res/cardsfolder/embargo.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Embargo -ManaCost:3 U -Types:Enchantment -Text:Nonland permanents don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Permanent.nonLand -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/embargo.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ember_fist_zubera.txt b/res/cardsfolder/ember_fist_zubera.txt deleted file mode 100644 index df31c337468..00000000000 --- a/res/cardsfolder/ember_fist_zubera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ember-Fist Zubera -ManaCost:1 R -Types:Creature Zubera Spirit -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals damage to target creature or player equal to the number of Zubera put into all graveyards from the battlefield this turn. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Card.Zubera -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80508.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ember_hauler.txt b/res/cardsfolder/ember_hauler.txt deleted file mode 100644 index 0324089da7a..00000000000 --- a/res/cardsfolder/ember_hauler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ember Hauler -ManaCost:R R -Types:Creature Goblin -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_hauler.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ember_shot.txt b/res/cardsfolder/ember_shot.txt deleted file mode 100644 index 6003216e411..00000000000 --- a/res/cardsfolder/ember_shot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ember Shot -ManaCost:6 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 6 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ Ember Shot deals 3 damage to target creature or player. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_shot.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/87.jpg -End diff --git a/res/cardsfolder/ember_weaver.txt b/res/cardsfolder/ember_weaver.txt deleted file mode 100644 index f0fbc5538be..00000000000 --- a/res/cardsfolder/ember_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ember Weaver -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:2/3 -K:Reach -K:stPumpSelf:Creature:1/0/First Strike:isPresent Permanent.Red+YouCtrl:As long as you control a red permanent, Ember Weaver gets +1/+0 and has first strike. -SVar:BuffedBy:Permanent.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_weaver.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/embermage_goblin.txt b/res/cardsfolder/embermage_goblin.txt deleted file mode 100644 index ddf0112301b..00000000000 --- a/res/cardsfolder/embermage_goblin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Embermage Goblin -ManaCost:3 R -Types:Creature Goblin Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a card named CARDNAME, reveal it, and put it into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedEmbermage Goblin | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/embermage_goblin.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/200.jpg -End diff --git a/res/cardsfolder/embersmith.txt b/res/cardsfolder/embersmith.txt deleted file mode 100644 index 73b3be913ad..00000000000 --- a/res/cardsfolder/embersmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Embersmith -ManaCost:1 R -Types:Creature Human Artificer -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigDamage | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may pay 1. If you do, CARDNAME deals 1 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 1 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/embersmith.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emberstrike_duo.txt b/res/cardsfolder/emberstrike_duo.txt deleted file mode 100644 index 923262d4fd8..00000000000 --- a/res/cardsfolder/emberstrike_duo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Emberstrike Duo -ManaCost:1 BR -Types:Creature Elemental Warrior Shaman -Textno text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Black+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump11 | TriggerDescription$ Whenever you cast a black spell, CARDNAME gets +1/+1 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Red+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpFirstStrike | TriggerDescription$ Whenever you cast a red spell, CARDNAME gains first strike until end of turn. -SVar:TrigPump11:AB$Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ +1 | Defined$ Self -SVar:TrigPumpFirstStrike:AB$Pump | Cost$ 0 | KW$ First Strike | Defined$ Self -SVar:BuffedBy:Spell.Black,Spell.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/emberstrike_duo.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emberwilde_augur.txt b/res/cardsfolder/emberwilde_augur.txt deleted file mode 100644 index 4960bb2098d..00000000000 --- a/res/cardsfolder/emberwilde_augur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Emberwilde Augur -ManaCost:1 R -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | NumDmg$ 3 | Tgt$ TgtP | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ CARDNAME deals 3 damage to target player. Activate this ability only during your upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/emberwilde_augur.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emberwilde_caliph.txt b/res/cardsfolder/emberwilde_caliph.txt deleted file mode 100644 index 790d4d86b9f..00000000000 --- a/res/cardsfolder/emberwilde_caliph.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Emberwilde Caliph -ManaCost:2 U R -Types:Creature Djinn -Text:no text -PT:4/4 -K:Flying -K:Trample -K:CARDNAME attacks each turn if able. -T:Mode$ DamageDone | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals damage, you lose that much life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emberwilde_caliph.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emerald_dragonfly.txt b/res/cardsfolder/emerald_dragonfly.txt deleted file mode 100644 index 44f8b7debc5..00000000000 --- a/res/cardsfolder/emerald_dragonfly.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Emerald Dragonfly -ManaCost:1 G -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ G G | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/emerald_dragonfly.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/98.jpg -End diff --git a/res/cardsfolder/emerald_medallion.txt b/res/cardsfolder/emerald_medallion.txt deleted file mode 100644 index fd83ae92275..00000000000 --- a/res/cardsfolder/emerald_medallion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Emerald Medallion -ManaCost:2 -Types:Artifact -Text:Green spells you cast cost 1 less to cast. -K:CostChange:Player:Less:1:Spell:green:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emerald_medallion.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emerald_oryx.txt b/res/cardsfolder/emerald_oryx.txt deleted file mode 100644 index d2161f4880d..00000000000 --- a/res/cardsfolder/emerald_oryx.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Emerald Oryx -ManaCost:3 G -Types:Creature Antelope -Text:no text -PT:2/3 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/emerald_oryx.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emeria_angel.txt b/res/cardsfolder/emeria_angel.txt deleted file mode 100644 index 5a957121520..00000000000 --- a/res/cardsfolder/emeria_angel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Emeria Angel -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emeria_angel.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emeria_the_sky_ruin.txt b/res/cardsfolder/emeria_the_sky_ruin.txt deleted file mode 100644 index 53a12ceabd8..00000000000 --- a/res/cardsfolder/emeria_the_sky_ruin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Emeria, the Sky Ruin -ManaCost:no cost -Types:Land -Text: -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | IsPresent$ Card.Plains+YouCtrl | PresentCompare$ GE7 | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emeria_the_sky_ruin.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emissary_of_despair.txt b/res/cardsfolder/emissary_of_despair.txt deleted file mode 100644 index b8742be020c..00000000000 --- a/res/cardsfolder/emissary_of_despair.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Emissary of Despair -ManaCost:1 B B -Types:Creature Spirit -Text:no text -PT:2/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player loses 1 life for each artifact he or she controls. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredTarget | LifeAmount$ X -SVar:X:Count$Valid Artifact.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_despair.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emissary_of_hope.txt b/res/cardsfolder/emissary_of_hope.txt deleted file mode 100644 index 9f7e1d9222a..00000000000 --- a/res/cardsfolder/emissary_of_hope.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Emissary of Hope -ManaCost:1 W W -Types:Creature Spirit -Text:no text -PT:2/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you gain 1 life for each artifact that player controls. -SVar:TrigLoseLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Artifact.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/emissary_of_despair.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emmessi_tome.txt b/res/cardsfolder/emmessi_tome.txt deleted file mode 100644 index 0f5276bd95f..00000000000 --- a/res/cardsfolder/emmessi_tome.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Emmessi Tome -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 5 T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emmessi_tome.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emperor_crocodile.txt b/res/cardsfolder/emperor_crocodile.txt deleted file mode 100644 index 17193268eb6..00000000000 --- a/res/cardsfolder/emperor_crocodile.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Emperor Crocodile -ManaCost:3 G -Types:Creature Crocodile -Text:no text -PT:5/5 -K:When you control no other creatures, sacrifice CARDNAME. -SVar:NeedsToPlay:Creature.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/emperor_crocodile.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/246.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/105.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empress_galina.txt b/res/cardsfolder/empress_galina.txt deleted file mode 100644 index 6aa87c62227..00000000000 --- a/res/cardsfolder/empress_galina.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Empress Galina -ManaCost:3 U U -Types:Legendary Creature Merfolk -Text:no text -PT:1/3 -A:AB$ GainControl | Cost$ U U T | ValidTgts$ Permanent.Legendary | TgtPrompt$ Select target legendary permanent | SpellDescription$ Gain control of target legendary permanent. (This effect lasts indefinitely.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/empress_galina.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empty_shrine_kannushi.txt b/res/cardsfolder/empty_shrine_kannushi.txt deleted file mode 100644 index e6fee43aacc..00000000000 --- a/res/cardsfolder/empty_shrine_kannushi.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Empty-Shrine Kannushi -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:stPumpSelf:Permanent:0/0/Protection from white:isPresent Permanent.White+YouCtrl:Empty-Shrine Kannushi has protection from the colors of permanents you control. -K:stPumpSelf:Permanent:0/0/Protection from blue:isPresent Permanent.Blue+YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Protection from black:isPresent Permanent.Black+YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Protection from red:isPresent Permanent.Red+YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Protection from green:isPresent Permanent.Green+YouCtrl:no text -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_shrine_kannushi.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/2.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empty_the_catacombs.txt b/res/cardsfolder/empty_the_catacombs.txt deleted file mode 100644 index 2d798f234f2..00000000000 --- a/res/cardsfolder/empty_the_catacombs.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Empty the Catacombs -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 B | ChangeType$ Creature | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Each player returns all creature cards from his or her graveyard to his or her hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_the_catacombs.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empty_the_warrens.txt b/res/cardsfolder/empty_the_warrens.txt deleted file mode 100644 index ff8a3afbb4a..00000000000 --- a/res/cardsfolder/empty_the_warrens.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Empty the Warrens -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 R | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 red Goblin creature tokens onto the battlefield. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/empty_the_warrens.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empyrial_armor.txt b/res/cardsfolder/empyrial_armor.txt deleted file mode 100644 index 53f147de649..00000000000 --- a/res/cardsfolder/empyrial_armor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Empyrial Armor -ManaCost:1 W W -Types:Enchantment Aura -Text:Enchanted creature gets +1/+1 for each card in your hand. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$InYourHand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/empyrial_armor.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/empyrial_plate.txt b/res/cardsfolder/empyrial_plate.txt deleted file mode 100644 index c31a775f677..00000000000 --- a/res/cardsfolder/empyrial_plate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Empyrial Plate -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1 for each card in your hand. -K:eqPump 2:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:no text -SVar:X:Count$InYourHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/empyrial_plate.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emrakul_the_aeons_torn.txt b/res/cardsfolder/emrakul_the_aeons_torn.txt deleted file mode 100644 index 7e9c938ee77..00000000000 --- a/res/cardsfolder/emrakul_the_aeons_torn.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Emrakul, the Aeons Torn -ManaCost:15 -Types:Legendary Creature Eldrazi -Text:no text -PT:15/15 -K:CARDNAME can't be countered. -K:Flying -K:Protection from colored spells -K:Annihilator 6 -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and its owner shuffles his or her graveyard into his or her library. -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigAddTurn | TriggerDescription$ When you cast CARDNAME, take an extra turn after this one. -SVar:TrigAddTurn:AB$AddTurn | Cost$ 0 | Defined$ You | NumTurns$ 1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/emrakul_the_aeons_torn.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/emrakuls_hatcher.txt b/res/cardsfolder/emrakuls_hatcher.txt deleted file mode 100644 index ea8f5f54253..00000000000 --- a/res/cardsfolder/emrakuls_hatcher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Emrakul's Hatcher -ManaCost:4 R -Types:Creature Eldrazi Drone -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME 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." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/emrakuls_hatcher.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enatu_golem.txt b/res/cardsfolder/enatu_golem.txt deleted file mode 100644 index 269d09a83a8..00000000000 --- a/res/cardsfolder/enatu_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Enatu Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:3/5 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enatu_golem.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enchanted_being.txt b/res/cardsfolder/enchanted_being.txt deleted file mode 100644 index 024d4ad6be3..00000000000 --- a/res/cardsfolder/enchanted_being.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enchanted Being -ManaCost:1 W W -Types:Creature Human -Text:Prevent all combat damage that would be dealt to Enchanted Being by enchanted creatures. -PT:2/2 -K:PreventAllDamageBy Creature.enchanted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enchanted_being.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enchanted_evening.txt b/res/cardsfolder/enchanted_evening.txt deleted file mode 100644 index 8b00938d6f0..00000000000 --- a/res/cardsfolder/enchanted_evening.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enchanted Evening -ManaCost:3 WU WU -Types:Enchantment -Text:no text -K:stPumpAll:Permanent:0/0/Types=Enchantment:No Condition:All permanents are enchantments in addition to their other types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/enchanted_evening.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enchantresss_presence.txt b/res/cardsfolder/enchantresss_presence.txt deleted file mode 100644 index a0df2547b91..00000000000 --- a/res/cardsfolder/enchantresss_presence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Enchantress's Presence -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Enchantment+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/enchantresss_presence.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enclave_cryptologist.txt b/res/cardsfolder/enclave_cryptologist.txt deleted file mode 100644 index 57e55dfe770..00000000000 --- a/res/cardsfolder/enclave_cryptologist.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Enclave Cryptologist -ManaCost:U -Types:Creature Merfolk Wizard -Text:LEVEL 1-2 0/1 tap: Draw a card, then discard a card. LEVEL 3+ 0/1 tap: Draw a card. -PT:0/1 -#No need for stSetPT here since it doesn't change through levels -PA -K:stPumpSelf:Creature.countersGE1LEVEL+countersLT3LEVEL:0/0/SVar=Loot:No Condition:no text -K:stPumpSelf:Creature.countersGE3LEVEL:0/0/SVar=Draw:No Condition:no text -K:Level up:1 U -K:maxLevel:3 -SVar:Draw:AB$Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Loot:AB$Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enclave_cryptologist.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enclave_elite.txt b/res/cardsfolder/enclave_elite.txt deleted file mode 100644 index db152f9917c..00000000000 --- a/res/cardsfolder/enclave_elite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Enclave Elite -ManaCost:2 U -Types:Creature Merfolk Soldier -Text:Enclave Elite enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:2/2 -K:Islandwalk -K:Multikicker 1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enclave_elite.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/encroach.txt b/res/cardsfolder/encroach.txt deleted file mode 100644 index 37a83d835f7..00000000000 --- a/res/cardsfolder/encroach.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Encroach -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | Mode$ RevealYouChoose | DiscardValid$ Land.nonBasic | NumCards$ 1 | SpellDescription$ Target player reveals his or her hand. You choose a nonbasic land card from it. That player discards that card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/encroach.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/endbringers_revel.txt b/res/cardsfolder/endbringers_revel.txt deleted file mode 100644 index 76505e8d7e9..00000000000 --- a/res/cardsfolder/endbringers_revel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Endbringer's Revel -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 4 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature | TgtPrompt$ Select target creature from any graveyard | AnyPlayer$ True | SorcerySpeed$ True | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/endbringers_revel.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/endless_cockroaches.txt b/res/cardsfolder/endless_cockroaches.txt deleted file mode 100644 index ce917491eaa..00000000000 --- a/res/cardsfolder/endless_cockroaches.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Endless Cockroaches -ManaCost:1 B B -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4220.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enemy_of_the_guildpact.txt b/res/cardsfolder/enemy_of_the_guildpact.txt deleted file mode 100644 index 007044eeaa8..00000000000 --- a/res/cardsfolder/enemy_of_the_guildpact.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enemy of the Guildpact -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:4/2 -K:Protection:Card.MultiColor:Protection from multicolored -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enemy_of_the_guildpact.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energizer.txt b/res/cardsfolder/energizer.txt deleted file mode 100644 index 63560ae74d4..00000000000 --- a/res/cardsfolder/energizer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Energizer -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ 2 T | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/energizer.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_arc.txt b/res/cardsfolder/energy_arc.txt deleted file mode 100644 index 1fc1378e0bc..00000000000 --- a/res/cardsfolder/energy_arc.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Energy Arc -ManaCost:W U -Types:Instant -Text:no text -A:SP$ Untap | Cost$ W U | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Choose any number of target creatures | ValidTgts$ Creature | SpellDescription$ Untap any number of target creatures. Prevent all combat damage that would be dealt to and dealt by those creatures this turn. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. & HIDDEN Prevent all combat damage that would be dealt to CARDNAME. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_arc.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_bolt.txt b/res/cardsfolder/energy_bolt.txt deleted file mode 100644 index 697464d5ded..00000000000 --- a/res/cardsfolder/energy_bolt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Energy Bolt -ManaCost:X R W -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R W | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X | SpellDescription$ Choose one — CARDNAME deals X damage to target player; -A:SP$ GainLife | Cost$ X R W | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SpellDescription$ or target player gains X life. -SVar:X:Count$xPaid -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_bolt.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_field.txt b/res/cardsfolder/energy_field.txt deleted file mode 100644 index e6b104e1cb0..00000000000 --- a/res/cardsfolder/energy_field.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Energy Field -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.YouOwn | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When a card is put into your graveyard from anywhere, sacrifice CARDNAME. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ Self -K:stPreventDamage:You:Card.YouDontCtrl:All:Prevent all damage that would be dealt to you by sources you don't control. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_field.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_flux.txt b/res/cardsfolder/energy_flux.txt deleted file mode 100644 index 5f0ee696e4d..00000000000 --- a/res/cardsfolder/energy_flux.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Energy Flux -ManaCost:2 U -Types:Enchantment -Text:no text -K:stPumpAll:Artifact:0/0/At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2:No Condition:All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay 2." -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_flux.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/78.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/83.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/57.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/68.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_storm.txt b/res/cardsfolder/energy_storm.txt deleted file mode 100644 index 8548e139c44..00000000000 --- a/res/cardsfolder/energy_storm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Energy Storm -ManaCost:1 W -Types:Enchantment -Text:no text -K:Cumulative upkeep:1 -K:Permanents don't untap during their controllers' untap steps:Creature.withFlying -K:stPreventDamage:Player:Instant,Sorcery:All:Prevent all damage that would be dealt by instant and sorcery spells. Creatures with flying don't untap during their controller's untap step. -K:stPreventDamage:Permanent:Spell:1:no text -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_storm.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/energy_tap.txt b/res/cardsfolder/energy_tap.txt deleted file mode 100644 index b0c14a39597..00000000000 --- a/res/cardsfolder/energy_tap.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Energy Tap -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Tap | Cost$ U | TgtPrompt$ Select target untapped creature you control | ValidTgts$ Creature.untapped+YouCtrl | SubAbility$ SVar=DBMana | SpellDescription$ Tap target untapped creature you control. If you do, add X to your mana pool, where X is that creature's converted mana cost. -SVar:DBMana:DB$Mana | Produced$ X -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/energy_tap.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/69.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enervate.txt b/res/cardsfolder/enervate.txt deleted file mode 100644 index ed13b4be0f5..00000000000 --- a/res/cardsfolder/enervate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Enervate -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 1 U | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enervate.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/84.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enfeeblement.txt b/res/cardsfolder/enfeeblement.txt deleted file mode 100644 index fe7cb2b6794..00000000000 --- a/res/cardsfolder/enfeeblement.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Enfeeblement -ManaCost:B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-2/-2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enfeeblement.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/27.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/125.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/19.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/engineered_plague.txt b/res/cardsfolder/engineered_plague.txt deleted file mode 100644 index 4a556502141..00000000000 --- a/res/cardsfolder/engineered_plague.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Engineered Plague -ManaCost:2 B -Types:Enchantment -Text:As CARDNAME enters the battlefield, choose a creature type. -K:stPumpAll:Creature.ChosenType:-1/-1:No Condition:All creatures of the chosen type get -1/-1. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/engineered_plague.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/51.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/engulfing_flames.txt b/res/cardsfolder/engulfing_flames.txt deleted file mode 100644 index d8d896d8e41..00000000000 --- a/res/cardsfolder/engulfing_flames.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Engulfing Flames -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 1 damage to target creature. It can't be regenerated this turn. -A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DB | Flashback$ True | CostDesc$ Flashback 3 R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:DB:DB$Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/engulfing_flames.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enigma_eidolon.txt b/res/cardsfolder/enigma_eidolon.txt deleted file mode 100644 index f542ee88aaa..00000000000 --- a/res/cardsfolder/enigma_eidolon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Enigma Eidolon -ManaCost:3 U -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Mill | Cost$ U Sac<1/CARDNAME> | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top three cards of his or her library into his or her graveyard. -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enigma_eidolon.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enigma_sphinx.txt b/res/cardsfolder/enigma_sphinx.txt deleted file mode 100644 index 1683a94ef16..00000000000 --- a/res/cardsfolder/enigma_sphinx.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Enigma Sphinx -ManaCost:4 W U B -Types:Artifact Creature Sphinx -Text:no text -PT:5/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put it into your library third from the top. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 2 -K:Cascade -SVar:Picture:http://www.wizards.com/global/images/magic/general/enigma_sphinx.jpg -SVar:Rarity:Rare -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/106.jpg -End diff --git a/res/cardsfolder/enlightened_tutor.txt b/res/cardsfolder/enlightened_tutor.txt deleted file mode 100644 index b498aec4cbd..00000000000 --- a/res/cardsfolder/enlightened_tutor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Enlightened Tutor -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Artifact,Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact or enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enlightened_tutor.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/19.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enlisted_wurm.txt b/res/cardsfolder/enlisted_wurm.txt deleted file mode 100644 index 0d492abbd40..00000000000 --- a/res/cardsfolder/enlisted_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enlisted Wurm -ManaCost:4 G W -Types:Creature Wurm -Text:no text -PT:5/5 -K:Cascade -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enlisted_wurm.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enlistment_officer.txt b/res/cardsfolder/enlistment_officer.txt deleted file mode 100644 index 3bd451210dd..00000000000 --- a/res/cardsfolder/enlistment_officer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Enlistment Officer -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/3 -K:First Strike -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Soldier -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enlistment_officer.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enormous_baloth.txt b/res/cardsfolder/enormous_baloth.txt deleted file mode 100644 index 613e7c0de1f..00000000000 --- a/res/cardsfolder/enormous_baloth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Enormous Baloth -ManaCost:6 G -Types:Creature Beast -Text:no text -PT:7/7 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card44500.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/180.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/125.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9eb/9.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enrage.txt b/res/cardsfolder/enrage.txt deleted file mode 100644 index cd9f84a721f..00000000000 --- a/res/cardsfolder/enrage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Enrage -ManaCost:X R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enrage.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/185.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/91.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/180.jpg -End diff --git a/res/cardsfolder/enshrined_memories.txt b/res/cardsfolder/enshrined_memories.txt deleted file mode 100644 index 91984dbe16b..00000000000 --- a/res/cardsfolder/enshrined_memories.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Enshrined Memories -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ X G | DigNum$ X | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | SpellDescription$ 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. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/enshrined_memories.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enslave.txt b/res/cardsfolder/enslave.txt deleted file mode 100644 index b50265a70af..00000000000 --- a/res/cardsfolder/enslave.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Enslave -ManaCost:4 B B -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, enchanted creature deals 1 damage to its owner. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedOwner | DamageSource$ Enchanted | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/enslave.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enslaved_dwarf.txt b/res/cardsfolder/enslaved_dwarf.txt deleted file mode 100644 index 24dee2cb2ab..00000000000 --- a/res/cardsfolder/enslaved_dwarf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enslaved Dwarf -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R Sac<1/CARDNAME> | NumAtt$ +1 | KW$ First Strike | TgtPrompt$ Choose target Black creature | ValidTgts$ Creature.Black | SpellDescription$ Target black creature gets +1/+0 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enslaved_dwarf.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/enslaved_scout.txt b/res/cardsfolder/enslaved_scout.txt deleted file mode 100644 index ab0cb4d0c36..00000000000 --- a/res/cardsfolder/enslaved_scout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Enslaved Scout -ManaCost:2 R -Types:Creature Goblin Scout -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 2 | KW$ Mountainwalk | SpellDescription$ Enslaved Scout gains mountainwalk until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/enslaved_scout.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/104.jpg|2 -End diff --git a/res/cardsfolder/ensnare.txt b/res/cardsfolder/ensnare.txt deleted file mode 100644 index 8f5143536a3..00000000000 --- a/res/cardsfolder/ensnare.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ensnare -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ 3 U | ValidCards$ Creature | SpellDescription$ Tap all creatures. -SVar:AltCost:Return<2/Island> -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ensnare.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ensnaring_bridge.txt b/res/cardsfolder/ensnaring_bridge.txt deleted file mode 100644 index 824a8fe705e..00000000000 --- a/res/cardsfolder/ensnaring_bridge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ensnaring Bridge -ManaCost:3 -Types:Artifact -Text:Creatures with power greater than the number of cards in your hand can't attack. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ensnaring_bridge.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/300.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/127.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/294.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/entangling_trap.txt b/res/cardsfolder/entangling_trap.txt deleted file mode 100644 index 48603cd101d..00000000000 --- a/res/cardsfolder/entangling_trap.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Entangling Trap -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | Execute$ TrigTapW | TriggerDescription$ 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.) -SVar:TrigTapW:AB$Tap | Cost$ 0 | Tgt$ TgtC | SubAbility$ SVar=TrigTapW2 -SVar:TrigTapW2:DB$Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. -T:Mode$ Clashed | ValidPlayer$ You | Won$ False | TriggerZones$ Battlefield | Execute$ TrigTapL | Secondary$ True | TriggerDescription$ 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.) -SVar:TrigTapL:AB$Tap | Cost$ 0 | Tgt$ TgtC -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/entangling_trap.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/entangling_vines.txt b/res/cardsfolder/entangling_vines.txt deleted file mode 100644 index dd9813b459e..00000000000 --- a/res/cardsfolder/entangling_vines.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Entangling Vines -ManaCost:3 G -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Enchant tapped creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/entangling_vines.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/entomb.txt b/res/cardsfolder/entomb.txt deleted file mode 100644 index e4de51470b3..00000000000 --- a/res/cardsfolder/entomb.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Entomb -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Graveyard | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your graveyard. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/entomb.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/entropic_eidolon.txt b/res/cardsfolder/entropic_eidolon.txt deleted file mode 100644 index 1f6a7fd5319..00000000000 --- a/res/cardsfolder/entropic_eidolon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Entropic Eidolon -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 1 life and you gain 1 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/entropic_eidolon.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/entropic_specter.txt b/res/cardsfolder/entropic_specter.txt deleted file mode 100644 index 4b3c5c55a57..00000000000 --- a/res/cardsfolder/entropic_specter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Entropic Specter -ManaCost:3 B B -Types:Creature Specter Spirit -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$InOppHand:Count$InOppHand:CARDNAME's power and toughness are each equal to the number of cards in the hand of the chosen opponent. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose -SVar:Picture:http://www.wizards.com/global/images/magic/general/entropic_specter.jpg -SVar:Rarity:Rare -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/61.jpg -End diff --git a/res/cardsfolder/envelop.txt b/res/cardsfolder/envelop.txt deleted file mode 100644 index 467c6fe8041..00000000000 --- a/res/cardsfolder/envelop.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Envelop -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target Sorcery spell | ValidTgts$ Sorcery | SpellDescription$ Counter target sorcery spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/envelop.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eon_hub.txt b/res/cardsfolder/eon_hub.txt deleted file mode 100644 index 4237a70f57c..00000000000 --- a/res/cardsfolder/eon_hub.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Eon Hub -ManaCost:5 -Types:Artifact -Text:Players skip their upkeep steps. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eon_hub.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ephemeron.txt b/res/cardsfolder/ephemeron.txt deleted file mode 100644 index a5e90b0c5c4..00000000000 --- a/res/cardsfolder/ephemeron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ephemeron -ManaCost:4 U U -Types:Creature Illusion -Text:no text -PT:4/4 -K:Flying -A:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ephemeron.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/epic_proportions.txt b/res/cardsfolder/epic_proportions.txt deleted file mode 100644 index 52b41405387..00000000000 --- a/res/cardsfolder/epic_proportions.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Epic Proportions -ManaCost:4 G G -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+5/+5/Trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/epic_proportions.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/epic_struggle.txt b/res/cardsfolder/epic_struggle.txt deleted file mode 100644 index 677459851d3..00000000000 --- a/res/cardsfolder/epic_struggle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Epic Struggle -ManaCost:2 G G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | PresentCompare$ GE20 | IsPresent$ Creature.YouCtrl | Execute$ TrigWinsLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you control twenty or more creatures, you win the game. -SVar:TrigWinsLife:AB$WinsGame | Cost$ 0 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/epic_struggle.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/equilibrium.txt b/res/cardsfolder/equilibrium.txt deleted file mode 100644 index a22aaf29f8b..00000000000 --- a/res/cardsfolder/equilibrium.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Equilibrium -ManaCost:1 U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | Execute$ TrigBounce | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a creature spell, you may pay 1. If you do, return target creature to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/equilibrium.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/71.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/32.jpg -End diff --git a/res/cardsfolder/erase.txt b/res/cardsfolder/erase.txt deleted file mode 100644 index 04a88fab5f0..00000000000 --- a/res/cardsfolder/erase.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Erase -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/erase.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/erg_raiders.txt b/res/cardsfolder/erg_raiders.txt deleted file mode 100644 index d00c983c683..00000000000 --- a/res/cardsfolder/erg_raiders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Erg Raiders -ManaCost:1 B -Types:Creature Human Warrior -Text:At the beginning of your end step, if CARDNAME didn't attack this turn, CARDNAME deals 2 damage to you unless it came under your control this turn. -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/erg_raiders.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/20.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/17.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/19.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/3.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/eron_the_relentless.txt b/res/cardsfolder/eron_the_relentless.txt deleted file mode 100644 index e53229de8d9..00000000000 --- a/res/cardsfolder/eron_the_relentless.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eron the Relentless -ManaCost:3 R R -Types:Legendary Creature Human Rogue -Text:no text -PT:5/2 -K:Haste -A:AB$ Regenerate | Cost$ R R R | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/eron_the_relentless.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/93.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/errant_doomsayers.txt b/res/cardsfolder/errant_doomsayers.txt deleted file mode 100644 index 2d6ca1903d1..00000000000 --- a/res/cardsfolder/errant_doomsayers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Errant Doomsayers -ManaCost:1 W -Types:Creature Human Rebel -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Creature.toughnessLE2 | TgtPrompt$ Select target creature with toughness 2 or less | SpellDescription$ Tap target creature with toughness 2 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/errant_doomsayers.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/15.jpg -End diff --git a/res/cardsfolder/errant_ephemeron.txt b/res/cardsfolder/errant_ephemeron.txt deleted file mode 100644 index 6f05c35efc3..00000000000 --- a/res/cardsfolder/errant_ephemeron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Errant Ephemeron -ManaCost:6 U -Types:Creature Illusion -Text:no text -PT:4/4 -K:Flying -K:Suspend:4:1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/errant_ephemeron.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/erratic_explosion.txt b/res/cardsfolder/erratic_explosion.txt deleted file mode 100644 index 41fdfcbc93f..00000000000 --- a/res/cardsfolder/erratic_explosion.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Erratic Explosion -ManaCost:2 R -Types:Sorcery -Text:Choose target creature or player. The computer will randomly choose a nonland card from your library. Erratic Explosion deals damage equal to that card's converted mana cost to that creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card12484.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/erratic_portal.txt b/res/cardsfolder/erratic_portal.txt deleted file mode 100644 index 38f116d3a60..00000000000 --- a/res/cardsfolder/erratic_portal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Erratic Portal -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Return target creature to its owner's hand unless its controller pays 1. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/erratic_portal.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ertai_the_corrupted.txt b/res/cardsfolder/ertai_the_corrupted.txt deleted file mode 100644 index 1e9b359f959..00000000000 --- a/res/cardsfolder/ertai_the_corrupted.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ertai, the Corrupted -ManaCost:2 W U B -Types:Legendary Creature Wizard -Text:no text -PT:3/4 -A:AB$ Counter | Cost$ U T Sac<1/Creature,Enchantment> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. | CostDesc$ U, tap, sacrifice a creature or enchantment: -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ertai_the_corrupted.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/107.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/ertai_wizard_adept.txt b/res/cardsfolder/ertai_wizard_adept.txt deleted file mode 100644 index 41a3a81378d..00000000000 --- a/res/cardsfolder/ertai_wizard_adept.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ertai, Wizard Adept -ManaCost:2 U -Types:Legendary Creature Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ 2 U U T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ertai_wizard_adept.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ertais_trickery.txt b/res/cardsfolder/ertais_trickery.txt deleted file mode 100644 index 3a9fbbc97aa..00000000000 --- a/res/cardsfolder/ertais_trickery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ertai's Trickery -ManaCost:U -Types:Instant -Text:no text -#NOTE: This is incorrect as scripted. It should be able to target any spell, but will only Counter the Spell if it is Kicked -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell if it was kicked | ValidTgts$ Card.kicked | SpellDescription$ Counter target spell if it was kicked. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ertais_trickery.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/escape_artist.txt b/res/cardsfolder/escape_artist.txt deleted file mode 100644 index e746921e938..00000000000 --- a/res/cardsfolder/escape_artist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Escape Artist -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -K:Unblockable -A:AB$ ChangeZone | Cost$ U Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/escape_artist.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/escape_routes.txt b/res/cardsfolder/escape_routes.txt deleted file mode 100644 index aa1fd91d337..00000000000 --- a/res/cardsfolder/escape_routes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Escape Routes -ManaCost:2 U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature.White+YouCtrl,Creature.Black+YouCtrl | TgtPrompt$ Select target white or black creature you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target white or black creature you control to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/escape_routes.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/escaped_null.txt b/res/cardsfolder/escaped_null.txt deleted file mode 100644 index d5eae801201..00000000000 --- a/res/cardsfolder/escaped_null.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Escaped Null -ManaCost:3 B -Types:Creature Zombie Berserker -Text:no text -PT:1/2 -K:Lifelink -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +5/+0 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +5/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/escaped_null.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_battlemage.txt b/res/cardsfolder/esper_battlemage.txt deleted file mode 100644 index 5d1cbbc7f39..00000000000 --- a/res/cardsfolder/esper_battlemage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Esper Battlemage -ManaCost:2 U -Types:Artifact Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ W T | Defined$ You | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to you this turn. -A:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_battlemage.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_charm.txt b/res/cardsfolder/esper_charm.txt deleted file mode 100644 index ad02d939de6..00000000000 --- a/res/cardsfolder/esper_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Esper Charm -ManaCost:W U B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ W U B | ValidTgts$ Enchantment | TgtPrompt$ Select target Enchantment. | SpellDescription$ Choose one - Destroy target Enchantment; -A:SP$ Draw | Cost$ W U B | NumCards$ 2 | SpellDescription$ or draw two cards; -A:SP$ Discard | Cost$ W U B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ or target player discards two cards. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_charm.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_cormorants.txt b/res/cardsfolder/esper_cormorants.txt deleted file mode 100644 index 1c980d98197..00000000000 --- a/res/cardsfolder/esper_cormorants.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Esper Cormorants -ManaCost:2 W U -Types:Artifact Creature Bird -Text:no text -PT:3/3 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_cormorants.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_panorama.txt b/res/cardsfolder/esper_panorama.txt deleted file mode 100644 index e7cff414cb5..00000000000 --- a/res/cardsfolder/esper_panorama.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Esper Panorama -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Plains+Basic,Land.Island+Basic,Land.Swamp+Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic Plains, Island, or Swamp card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_panorama.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_sojourners.txt b/res/cardsfolder/esper_sojourners.txt deleted file mode 100644 index 02a9f28f7de..00000000000 --- a/res/cardsfolder/esper_sojourners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Esper Sojourners -ManaCost:W U B -Types:Artifact Creature Vedalken Wizard -Text:no text -PT:2/3 -K:Cycling:2 U -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigTapOrUntap | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may tap or untap target permanent. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigTapOrUntap | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may tap or untap target permanent. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_sojourners.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esper_stormblade.txt b/res/cardsfolder/esper_stormblade.txt deleted file mode 100644 index c3d061b5a23..00000000000 --- a/res/cardsfolder/esper_stormblade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Esper Stormblade -ManaCost:WB U -Types:Artifact Creature Vedalken Wizard -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/Flying:isPresent Permanent.MultiColor+Other+YouCtrl:As long as you control another multicolored permanent, Esper Stormblade gets +1/+1 and has flying. -SVar:BuffedBy:Permanent.MultiColor -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/esper_stormblade.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/esperzoa.txt b/res/cardsfolder/esperzoa.txt deleted file mode 100644 index fcb20e6a486..00000000000 --- a/res/cardsfolder/esperzoa.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Esperzoa -ManaCost:2 U -Types:Artifact Creature Jellyfish -Text:no text -PT:4/3 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return an artifact you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ChangeType$ Artifact.YouCtrl | ChangeNum$ 1 | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/esperzoa.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_drain.txt b/res/cardsfolder/essence_drain.txt deleted file mode 100644 index 24b68c7739d..00000000000 --- a/res/cardsfolder/essence_drain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Essence Drain -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 B | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ Essence Drain deals 3 damage to target creature or player and you gain 3 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_drain.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/43.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/141.jpg -End diff --git a/res/cardsfolder/essence_feed.txt b/res/cardsfolder/essence_feed.txt deleted file mode 100644 index cc2a48bcde9..00000000000 --- a/res/cardsfolder/essence_feed.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Essence Feed -ManaCost:5 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 5 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ 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." -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenAmount$ 3 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_feed.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_flare.txt b/res/cardsfolder/essence_flare.txt deleted file mode 100644 index 5976c32c67b..00000000000 --- a/res/cardsfolder/essence_flare.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Essence Flare -ManaCost:U -Types:Enchantment Aura -Text:no text -K:enPump:+2/+0 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, put a -0/-1 counter on that creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ M0M1 | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_flare.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_fracture.txt b/res/cardsfolder/essence_fracture.txt deleted file mode 100644 index 206d6a3691d..00000000000 --- a/res/cardsfolder/essence_fracture.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Essence Fracture -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return two target creatures to their owners' hands. -K:Cycling:2 U -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_fracture.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_scatter.txt b/res/cardsfolder/essence_scatter.txt deleted file mode 100644 index 8b54ad77c68..00000000000 --- a/res/cardsfolder/essence_scatter.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Essence Scatter -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_scatter.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_sliver.txt b/res/cardsfolder/essence_sliver.txt deleted file mode 100644 index 34b2ef2db83..00000000000 --- a/res/cardsfolder/essence_sliver.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Essence Sliver -ManaCost:3 W -Types:Creature Sliver -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Sliver | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Sliver deals damage, its controller gains that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ TriggeredSourceController | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/essence_sliver.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/13.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/essence_warden.txt b/res/cardsfolder/essence_warden.txt deleted file mode 100644 index ad0e9cc4352..00000000000 --- a/res/cardsfolder/essence_warden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Essence Warden -ManaCost:G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122428.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etched_champion.txt b/res/cardsfolder/etched_champion.txt deleted file mode 100644 index e560dbc6247..00000000000 --- a/res/cardsfolder/etched_champion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Etched Champion -ManaCost:3 -Types:Artifact Creature Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/Protection from white & Protection from blue & Protection from black & Protection from red & Protection from green:Metalcraft:Metalcraft - Etched Champion has protection from all colors as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/etched_champion.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etched_monstrosity.txt b/res/cardsfolder/etched_monstrosity.txt deleted file mode 100644 index 2c4b07d3cdb..00000000000 --- a/res/cardsfolder/etched_monstrosity.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Etched Monstrosity -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:10/10 -K:etbCounter:M1M1:5 -A:AB$ Draw | Cost$ W U B R G SubCounter<5/M1M1> | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 3 | SpellDescription$ Target player draws three cards. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/etched_monstrosity.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etched_oracle.txt b/res/cardsfolder/etched_oracle.txt deleted file mode 100644 index 5199f554a0f..00000000000 --- a/res/cardsfolder/etched_oracle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Etched Oracle -ManaCost:4 -Types:Artifact Creature Wizard -Text:no text -PT:0/0 -K:Sunburst -A:AB$ Draw | Cost$ 1 SubCounter<4/P1P1> | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 3 | SpellDescription$ Target player draws 3 cards. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/etched_oracle.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eternal_dragon.txt b/res/cardsfolder/eternal_dragon.txt deleted file mode 100644 index 64e11c38d13..00000000000 --- a/res/cardsfolder/eternal_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eternal Dragon -ManaCost:5 W W -Types:Creature Dragon Spirit -Text:no text -PT:5/5 -K:Flying -K:TypeCycling:Plains:2 -A:AB$ ChangeZone | Cost$ 3 W W | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your upkeep. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eternal_dragon.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eternal_flame.txt b/res/cardsfolder/eternal_flame.txt deleted file mode 100644 index 24573b19c84..00000000000 --- a/res/cardsfolder/eternal_flame.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eternal Flame -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R R | ValidTgts$ Opponent| NumDmg$ X | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals X damage to target opponent where X is the number of mountains you control. It deals half X damage, rounded up, to you. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ Y | Defined$ You -SVar:X:Count$NumTypeYouCtrl.Mountain -SVar:Y:Count$NumTypeYouCtrl.Mountain/HalfUp -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eternal_flame.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/60.jpg -End diff --git a/res/cardsfolder/eternal_warrior.txt b/res/cardsfolder/eternal_warrior.txt deleted file mode 100644 index 1215f5952c3..00000000000 --- a/res/cardsfolder/eternal_warrior.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eternal Warrior -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eternal_warrior.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/225.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/208.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eternal_witness.txt b/res/cardsfolder/eternal_witness.txt deleted file mode 100644 index 4210e391ccf..00000000000 --- a/res/cardsfolder/eternal_witness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eternal Witness -ManaCost:1 G G -Types:Creature Human Shaman -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51628.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eternity_snare.txt b/res/cardsfolder/eternity_snare.txt deleted file mode 100644 index 1060f131136..00000000000 --- a/res/cardsfolder/eternity_snare.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eternity Snare -ManaCost:5 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eternity_snare.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eternity_vessel.txt b/res/cardsfolder/eternity_vessel.txt deleted file mode 100644 index 988bd2c7505..00000000000 --- a/res/cardsfolder/eternity_vessel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Eternity Vessel -ManaCost:6 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:X -SVar:X:Count$YourLifeTotal -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLife | OptionalDecider$ You | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may have your life total become the number of charge counters on CARDNAME. -SVar:TrigLife:AB$SetLife | Cost$ 0 | Defined$ You | LifeAmount$ Y -SVar:Y:Count$CardCounters.CHARGE -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/eternity_vessel.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ethercaste_knight.txt b/res/cardsfolder/ethercaste_knight.txt deleted file mode 100644 index f200d777457..00000000000 --- a/res/cardsfolder/ethercaste_knight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ethercaste Knight -ManaCost:W U -Types:Artifact Creature Human Knight -Text:no text -PT:1/3 -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ethercaste_knight.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ethereal_champion.txt b/res/cardsfolder/ethereal_champion.txt deleted file mode 100644 index 06039d88b17..00000000000 --- a/res/cardsfolder/ethereal_champion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ethereal Champion -ManaCost:2 W W W -Types:Creature Avatar -Text:no text -PT:3/4 -A:AB$ PreventDamage | Cost$ PayLife<1> | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ethereal_champion.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/20.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ethereal_usher.txt b/res/cardsfolder/ethereal_usher.txt deleted file mode 100644 index e3355e531e4..00000000000 --- a/res/cardsfolder/ethereal_usher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ethereal Usher -ManaCost:5 U -Types:Creature Spirit -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Target creature is unblockable this turn. -K:Transmute:1 U U -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ethereal_usher.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/47.jpg -End diff --git a/res/cardsfolder/ethereal_whiskergill.txt b/res/cardsfolder/ethereal_whiskergill.txt deleted file mode 100644 index da183d8cb41..00000000000 --- a/res/cardsfolder/ethereal_whiskergill.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ethereal Whiskergill -ManaCost:3 U -Types:Creature Elemental -Text:no text -PT:4/3 -K:CARDNAME can't attack unless defending player controls an Island. -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ethereal_whiskergill.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etherium_abomination.txt b/res/cardsfolder/etherium_abomination.txt deleted file mode 100644 index dd3e4f55a73..00000000000 --- a/res/cardsfolder/etherium_abomination.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Etherium Abomination -ManaCost:3 U B -Types:Artifact Creature Horror -Text:no text -PT:4/3 -K:Unearth:1 U B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/etherium_abomination.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etherium_astrolabe.txt b/res/cardsfolder/etherium_astrolabe.txt deleted file mode 100644 index a8dbe1dcf4c..00000000000 --- a/res/cardsfolder/etherium_astrolabe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Etherium Astrolabe -ManaCost:2 U -Types:Artifact -Text:no text -K:Flash -A:AB$ Draw | Cost$ B T Sac<1/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/etherium_astrolabe.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/etherium_sculptor.txt b/res/cardsfolder/etherium_sculptor.txt deleted file mode 100644 index ada7144667a..00000000000 --- a/res/cardsfolder/etherium_sculptor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Etherium Sculptor -ManaCost:1 U -Types:Artifact Creature Vedalken Artificer -Text:Artifact spells you cast cost 1 less to cast. -PT:1/2 -K:CostChange:Player:Less:1:Spell:All:Artifact:NoSpecial -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/etherium_sculptor.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ethersworn_adjudicator.txt b/res/cardsfolder/ethersworn_adjudicator.txt deleted file mode 100644 index 70f90b44a64..00000000000 --- a/res/cardsfolder/ethersworn_adjudicator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ethersworn Adjudicator -ManaCost:4 U -Types:Artifact Creature Vedalken Knight -Text:no text -PT:4/4 -K:Flying -A:AB$ Untap | Cost$ 2 U | SpellDescription$ Untap CARDNAME. -A:AB$ Destroy | Cost$ 1 W B T | ValidTgts$ Creature,Enchantment | TgtPrompt$ Select target creature or enchantment | SpellDescription$ Destroy target creature or enchantment. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/ethersworn_adjudicator.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/26.jpg -End diff --git a/res/cardsfolder/evacuation.txt b/res/cardsfolder/evacuation.txt deleted file mode 100644 index 3beceeb4c26..00000000000 --- a/res/cardsfolder/evacuation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Evacuation -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U | ChangeType$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all creatures to their owners' hands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/evacuation.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/76.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/72.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/30.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/75.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evaporate.txt b/res/cardsfolder/evaporate.txt deleted file mode 100644 index 177fd4b2ef2..00000000000 --- a/res/cardsfolder/evaporate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Evaporate -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 R | NumDmg$ 1 | ValidCards$ Creature.White,Creature.Blue | ValidDescription$ each creature that's white or blue. | SpellDescription$ CARDNAME deals 1 damage to each creature that's white or blue. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/evaporate.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evasive_action.txt b/res/cardsfolder/evasive_action.txt deleted file mode 100644 index 3e3809cea89..00000000000 --- a/res/cardsfolder/evasive_action.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Evasive Action -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Domain - Counter target spell unless its controller pays 1 for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/evasive_action.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/even_the_odds.txt b/res/cardsfolder/even_the_odds.txt deleted file mode 100644 index cb4aa44046b..00000000000 --- a/res/cardsfolder/even_the_odds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Even the Odds -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 W | IsPresent$ Creature.YouCtrl | PresentCompare$ LTX | TokenAmount$ 3 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Cast CARDNAME only if you control fewer creatures than each opponent. Put three 1/1 white Soldier creature tokens onto the battlefield. -SVar:X:Count$Valid Creature.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/even_the_odds.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/everbark_shaman.txt b/res/cardsfolder/everbark_shaman.txt deleted file mode 100644 index 2c23df0933f..00000000000 --- a/res/cardsfolder/everbark_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Everbark Shaman -ManaCost:4 G -Types:Creature Treefolk Shaman -Text:no text -PT:3/5 -A:AB$ ChangeZone | Cost$ T ExileFromGrave<1/Treefolk> | Origin$ Library | Tapped$ True | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 2 | SpellDescription$ Search your library for two Forest cards and put them onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/everbark_shaman.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/everflowing_chalice.txt b/res/cardsfolder/everflowing_chalice.txt deleted file mode 100644 index 907b0fc3bc1..00000000000 --- a/res/cardsfolder/everflowing_chalice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Everflowing Chalice -ManaCost:0 -Types:Artifact -Text:Everflowing Chalice enters the battlefield with a charge counter on it for each time it was kicked. -K:Multikicker 2 -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ X | SpellDescription$ Add 1 to your mana pool for each charge counter on CARDNAME. -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/everflowing_chalice.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/everglades.txt b/res/cardsfolder/everglades.txt deleted file mode 100644 index 5fcbf2cc030..00000000000 --- a/res/cardsfolder/everglades.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Everglades -ManaCost:no cost -Types:Land -Text:When CARDNAME enters the battlefield, sacrifice it unless you return an untapped Swamp you control to its owner's hand. -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 B | SpellDescription$ Add 1 B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/everglades.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evil_eye_of_orms_by_gore.txt b/res/cardsfolder/evil_eye_of_orms_by_gore.txt deleted file mode 100644 index 3c82848f2f6..00000000000 --- a/res/cardsfolder/evil_eye_of_orms_by_gore.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Evil Eye of Orms-by-Gore -ManaCost:4 B -Types:Creature Eye -Text:CARDNAME can't be blocked except by Walls. -PT:3/6 -K:stPumpAll:Creature.nonEye+YouCtrl:0/0/HIDDEN CARDNAME can't attack.:No condition:Non-Eye creatures you control can't attack. -K:CantBeBlockedBy Creature.nonWall -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_eye_of_orms_by_gore.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/21.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/126.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/42.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evil_eye_of_urborg.txt b/res/cardsfolder/evil_eye_of_urborg.txt deleted file mode 100644 index 17db6e592f3..00000000000 --- a/res/cardsfolder/evil_eye_of_urborg.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Evil Eye of Urborg -ManaCost:4 B -Types:Creature Eye -Text:no text -PT:6/3 -K:stPumpAll:Creature.nonEye+YouCtrl:0/0/HIDDEN CARDNAME can't attack.:No condition:Non-Eye creatures you control can't attack. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDestroyBlocker | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, destroy that creature. -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_eye_of_urborg.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evil_presence.txt b/res/cardsfolder/evil_presence.txt deleted file mode 100644 index 4eaefa3d70c..00000000000 --- a/res/cardsfolder/evil_presence.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Evil Presence -ManaCost:B -Types:Enchantment Aura -Text:Enchanted land is a Swamp. -K:Enchant land -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_presence.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/16.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/16.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/22.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/20.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/18.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evincars_justice.txt b/res/cardsfolder/evincars_justice.txt deleted file mode 100644 index ff566de4e8f..00000000000 --- a/res/cardsfolder/evincars_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Evincar's Justice -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 B B | NumDmg$ 2 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/evincars_justice.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eviscerator.txt b/res/cardsfolder/eviscerator.txt deleted file mode 100644 index 5af3b089c7d..00000000000 --- a/res/cardsfolder/eviscerator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Eviscerator -ManaCost:3 B B -Types:Creature Horror -Text:no text -PT:5/5 -K:Protection from white -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 5 life. -SVar:TrigLoseLife:DB$LoseLife | Cost$ 0 | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eviscerator.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evolution_charm.txt b/res/cardsfolder/evolution_charm.txt deleted file mode 100644 index 000d484cdbd..00000000000 --- a/res/cardsfolder/evolution_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Evolution Charm -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | PrecostDesc$ Choose one - | SpellDescription$ Search your library for a basic land card, reveal it, put it into your hand, then shuffle your library; -A:SP$ ChangeZone | Cost$ 1 G | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature | Origin$ Graveyard | Destination$ Hand | SpellDescription$ or return target creature card from your graveyard to your hand; -A:SP$Pump | Cost$ 1 G | ValidTgts$ Creature | KW$ Flying | TgtPrompt$ Select target creature | SpellDescription$ or target creature gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/evolution_charm.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/evolving_wilds.txt b/res/cardsfolder/evolving_wilds.txt deleted file mode 100644 index 5adeee7d836..00000000000 --- a/res/cardsfolder/evolving_wilds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Evolving Wilds -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/evolving_wilds.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exalted_angel.txt b/res/cardsfolder/exalted_angel.txt deleted file mode 100644 index c09a2bcae5b..00000000000 --- a/res/cardsfolder/exalted_angel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Exalted Angel -ManaCost:4 W W -Types:Creature Angel -Text:no text -PT:4/5 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -K:Morph:2 W W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/exalted_angel.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/excavation.txt b/res/cardsfolder/excavation.txt deleted file mode 100644 index 01a6174015a..00000000000 --- a/res/cardsfolder/excavation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Excavation -ManaCost:1 U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 1 Sac<1/Land> | NumCards$ 1 | AnyPlayer$ True | SpellDescription$ Draw a card. Any player may activate this ability. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/excavation.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/excise.txt b/res/cardsfolder/excise.txt deleted file mode 100644 index e8646bbcc37..00000000000 --- a/res/cardsfolder/excise.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Excise -ManaCost:X W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ X W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | UnlessCost$ X | UnlessPayer$ TargetedController | SpellDescription$ Exile target attacking creature unless its controller pays X. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/excise.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exclude.txt b/res/cardsfolder/exclude.txt deleted file mode 100644 index db3248d76ef..00000000000 --- a/res/cardsfolder/exclude.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Exclude -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target creature spell. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/exclude.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/excommunicate.txt b/res/cardsfolder/excommunicate.txt deleted file mode 100644 index 80b97085ea1..00000000000 --- a/res/cardsfolder/excommunicate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Excommunicate -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/excommunicate.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/14.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/10.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/execute.txt b/res/cardsfolder/execute.txt deleted file mode 100644 index d256dc76538..00000000000 --- a/res/cardsfolder/execute.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Execute -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | NoRegen$ True | SpellDescription$ Destroy target white creature. It can't be regenerated. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/execute.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/132.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/133.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/128.jpg -End diff --git a/res/cardsfolder/executioners_capsule.txt b/res/cardsfolder/executioners_capsule.txt deleted file mode 100644 index 5b606300ed7..00000000000 --- a/res/cardsfolder/executioners_capsule.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Executioner's Capsule -ManaCost:B -Types:Artifact -Text:no text -A:AB$ Destroy | Cost$ 1 B T Sac<1/CARDNAME> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/executioners_capsule.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/75.jpg -End diff --git a/res/cardsfolder/exhaustion.txt b/res/cardsfolder/exhaustion.txt deleted file mode 100644 index 4aa02022bb2..00000000000 --- a/res/cardsfolder/exhaustion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Exhaustion -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 U | ValidCards$ Creature.YouDontCtrl,Land.YouDontCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SpellDescription$ Creatures and lands target opponent controls don't untap during his or her next untap step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exhaustion.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/74.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/42.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/37.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/55.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/76.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exhume.txt b/res/cardsfolder/exhume.txt deleted file mode 100644 index e4937cd5479..00000000000 --- a/res/cardsfolder/exhume.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Exhume -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | ChangeNum$ 1 | Hidden$ True | SubAbility$ SVar=DBChangeZoneOpp | SpellDescription$ Each player puts a creature card from his or her graveyard onto the battlefield. -SVar:DBChangeZoneOpp:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature.YouDontCtrl | Defined$ Opponent | ChangeNum$ 1 | Hidden$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/exhume.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exile.txt b/res/cardsfolder/exile.txt deleted file mode 100644 index ff36ecd3c65..00000000000 --- a/res/cardsfolder/exile.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exile -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | ValidTgts$ Creature.attacking+nonWhite | TgtPrompt$ Select target nonwhite attacking creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ SVar=DBGainLife | SpellDescription$ Exile target nonwhite attacking creature. You gain life equal to its toughness. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/exile.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/21.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exile_into_darkness.txt b/res/cardsfolder/exile_into_darkness.txt deleted file mode 100644 index 39031302a77..00000000000 --- a/res/cardsfolder/exile_into_darkness.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exile into Darkness -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 4 B | ValidTgts$ Player | SacValid$ Creature.cmcLE3 | SacMessage$ creature with converted mana cost 3 or less | SpellDescription$ Target player sacrifices a creature with converted mana cost 3 or less. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LTX | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if you have more cards in hand than each opponent, you may return CARDNAME from your graveyard to your hand. -SVar:X:Count$InYourHand -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exile_into_darkness.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exiled_boggart.txt b/res/cardsfolder/exiled_boggart.txt deleted file mode 100644 index 40260ea710a..00000000000 --- a/res/cardsfolder/exiled_boggart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Exiled Boggart -ManaCost:1 B -Types:Creature Goblin Rogue -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, discard a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/exiled_boggart.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exorcist.txt b/res/cardsfolder/exorcist.txt deleted file mode 100644 index a5c6931e2d5..00000000000 --- a/res/cardsfolder/exorcist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Exorcist -ManaCost:W W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ 1 W T | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | SpellDescription$ Destroy target black creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/exorcist.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/79.jpg -End diff --git a/res/cardsfolder/exoskeletal_armor.txt b/res/cardsfolder/exoskeletal_armor.txt deleted file mode 100644 index 09615e0576a..00000000000 --- a/res/cardsfolder/exoskeletal_armor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Exoskeletal Armor -ManaCost:1 G -Types:Enchantment Aura -Text:Enchanted creature gets +X/+X, where X is the number of creature cards in all graveyards. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exoskeletal_armor.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exotic_curse.txt b/res/cardsfolder/exotic_curse.txt deleted file mode 100644 index eb80c8ef828..00000000000 --- a/res/cardsfolder/exotic_curse.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Exotic Curse -ManaCost:2 B -Types:Enchantment Aura -Text:Domain - Enchanted creature gets -1/-1 for each basic land type among lands you control. -K:Enchant creature -K:enPumpCurse:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$Domain/Negative -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/exotic_curse.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exotic_disease.txt b/res/cardsfolder/exotic_disease.txt deleted file mode 100644 index 1cd94bd07b8..00000000000 --- a/res/cardsfolder/exotic_disease.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exotic Disease -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 4 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ X | SubAbility$ SVar=DBGainLife | PrecostDesc$ Domain - | SpellDescription$ Target player loses X life and you gain X life, where X is the number of basic land types among lands you control. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exotic_disease.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/43.jpg -End diff --git a/res/cardsfolder/exotic_orchard.txt b/res/cardsfolder/exotic_orchard.txt deleted file mode 100644 index 530f720ae74..00000000000 --- a/res/cardsfolder/exotic_orchard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Exotic Orchard -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Land.YouDontCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color that a land an opponent controls could produce. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/exotic_orchard.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/expedition_map.txt b/res/cardsfolder/expedition_map.txt deleted file mode 100644 index c468a66f440..00000000000 --- a/res/cardsfolder/expedition_map.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Expedition Map -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/expedition_map.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/expendable_troops.txt b/res/cardsfolder/expendable_troops.txt deleted file mode 100644 index fbb8e371603..00000000000 --- a/res/cardsfolder/expendable_troops.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Expendable Troops -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/expendable_troops.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exploding_borders.txt b/res/cardsfolder/exploding_borders.txt deleted file mode 100644 index 93957ea7487..00000000000 --- a/res/cardsfolder/exploding_borders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exploding Borders -ManaCost:2 R G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 R G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ Domain - Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target player, where X is the number of basic land types among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/exploding_borders.jpg -SVar:Rarity:Common -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/106.jpg -End diff --git a/res/cardsfolder/exploration.txt b/res/cardsfolder/exploration.txt deleted file mode 100644 index 9e2b54d7cd2..00000000000 --- a/res/cardsfolder/exploration.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Exploration -ManaCost:G -Types:Enchantment -Text:You may play an additional land each of your turns. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/exploration.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/explore.txt b/res/cardsfolder/explore.txt deleted file mode 100644 index 5fc935737e8..00000000000 --- a/res/cardsfolder/explore.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Explore -ManaCost:1 G -Types:Sorcery -Text:You may play an additional land this turn. Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/explore.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/explosive_growth.txt b/res/cardsfolder/explosive_growth.txt deleted file mode 100644 index 2a2672499e1..00000000000 --- a/res/cardsfolder/explosive_growth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Explosive Growth -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. If CARDNAME was kicked, that creature gets +5/+5 until end of turn instead. -A:SP$ Pump | Cost$ G 5 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +5 | NumDef$ +5 | SpellDescription$ Kicker 5 (You may pay an additional 5 as you cast this spell.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/explosive_growth.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/explosive_revelation.txt b/res/cardsfolder/explosive_revelation.txt deleted file mode 100644 index 1a3051f8600..00000000000 --- a/res/cardsfolder/explosive_revelation.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Explosive Revelation -ManaCost:3 R R -Types:Sorcery -Text: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/explosive_revelation.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/explosive_vegetation.txt b/res/cardsfolder/explosive_vegetation.txt deleted file mode 100644 index 5e2600dd450..00000000000 --- a/res/cardsfolder/explosive_vegetation.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Explosive Vegetation -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards and put them onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/explosive_vegetation.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/expunge.txt b/res/cardsfolder/expunge.txt deleted file mode 100644 index a4f2786d8cc..00000000000 --- a/res/cardsfolder/expunge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Expunge -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonBlack+nonArtifact | TgtPrompt$ Select target nonartifact, nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonartifact, nonblack creature. It can't be regenerated. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/expunge.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/135.jpg -End diff --git a/res/cardsfolder/exsanguinate.txt b/res/cardsfolder/exsanguinate.txt deleted file mode 100644 index db2377de706..00000000000 --- a/res/cardsfolder/exsanguinate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exsanguinate -ManaCost:X B B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ X B B | Defined$ Opponent | LifeAmount$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ Each opponent loses X life. You gain life equal to the life lost this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exsanguinate.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/extinguish.txt b/res/cardsfolder/extinguish.txt deleted file mode 100644 index 893d537eb5f..00000000000 --- a/res/cardsfolder/extinguish.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Extinguish -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target sorcery spell | ValidTgts$ Sorcery | SpellDescription$ Counter target sorcery spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/extinguish.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/38.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/37.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/extortion.txt b/res/cardsfolder/extortion.txt deleted file mode 100755 index b8dea0fe898..00000000000 --- a/res/cardsfolder/extortion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Extortion -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B B | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ 2 | SpellDescription$ Look at target player's hand and choose up to two cards from it. That player discards those cards. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/extortion.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/extra_arms.txt b/res/cardsfolder/extra_arms.txt deleted file mode 100644 index 153fbb9426f..00000000000 --- a/res/cardsfolder/extra_arms.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Extra Arms -ManaCost:4 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature attacks, it deals 2 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/extra_arms.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/extract.txt b/res/cardsfolder/extract.txt deleted file mode 100644 index 39f48b41c8e..00000000000 --- a/res/cardsfolder/extract.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Extract -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ Search target player's library for a card and exile it. Then that player shuffles his or her library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/extract.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/extractor_demon.txt b/res/cardsfolder/extractor_demon.txt deleted file mode 100644 index 72a011a9048..00000000000 --- a/res/cardsfolder/extractor_demon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Extractor Demon -ManaCost:4 B B -Types:Creature Demon -Text:no text -PT:5/5 -K:Flying -K:Unearth:2 B -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMill | TriggerDescription$ 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. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player -SVar:Picture:http://www.wizards.com/global/images/magic/general/extractor_demon.jpg -SVar:Rarity:Rare -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/44.jpg -End diff --git a/res/cardsfolder/extruder.txt b/res/cardsfolder/extruder.txt deleted file mode 100644 index 804b76f7b27..00000000000 --- a/res/cardsfolder/extruder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Extruder -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:4/3 -K:Echo:4 -A:AB$ PutCounter | Cost$ Sac<1/Artifact> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/extruder.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/exuberant_firestoker.txt b/res/cardsfolder/exuberant_firestoker.txt deleted file mode 100644 index e43bc1f6dab..00000000000 --- a/res/cardsfolder/exuberant_firestoker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Exuberant Firestoker -ManaCost:2 R -Types:Creature Human Druid Shaman -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | IsPresent$ Creature.powerGE5+YouCtrl | Execute$ TrigDamage | TriggerDescription$ At the beginning of your end step, if you control a creature with power 5 or greater, you may have CARDNAME deal 2 damage to target player. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/exuberant_firestoker.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eye_of_nowhere.txt b/res/cardsfolder/eye_of_nowhere.txt deleted file mode 100644 index 3f9f149bb00..00000000000 --- a/res/cardsfolder/eye_of_nowhere.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Eye of Nowhere -ManaCost:U U -Types:Sorcery Arcane -Text:no text -A:SP$ ChangeZone | Cost$ U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_nowhere.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eye_of_ramos.txt b/res/cardsfolder/eye_of_ramos.txt deleted file mode 100644 index c2525b0f829..00000000000 --- a/res/cardsfolder/eye_of_ramos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eye of Ramos -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_ramos.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/294.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eye_of_ugin.txt b/res/cardsfolder/eye_of_ugin.txt deleted file mode 100644 index 46890be019c..00000000000 --- a/res/cardsfolder/eye_of_ugin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eye of Ugin -ManaCost:no cost -Types:Legendary Land -Text:Colorless Eldrazi spells you cast cost 2 less to cast. -K:CostChange:Player:Less:2:Spell:colorless:Eldrazi:NoSpecial -A:AB$ ChangeZone | Cost$ 7 T | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Colorless | ChangeNum$ 1 | SpellDescription$ Search your library for a colorless creature card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_ugin.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eye_spy.txt b/res/cardsfolder/eye_spy.txt deleted file mode 100644 index e278cea84d4..00000000000 --- a/res/cardsfolder/eye_spy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eye Spy -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ U | ValidTgts$ Player | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of target player's library. You may put that card into his or her graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/eye_spy.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/38.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/eyeblights_ending.txt b/res/cardsfolder/eyeblights_ending.txt deleted file mode 100644 index f537349b6b5..00000000000 --- a/res/cardsfolder/eyeblights_ending.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Eyeblight's Ending -ManaCost:2 B -Types:Tribal Instant Elf -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonElf | TgtPrompt$ Select target non-Elf creature | SpellDescription$ Destroy target non-Elf creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/eyeblights_ending.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/110.jpg -End diff --git a/res/cardsfolder/eyes_of_the_wisent.txt b/res/cardsfolder/eyes_of_the_wisent.txt deleted file mode 100644 index 97d8ef78063..00000000000 --- a/res/cardsfolder/eyes_of_the_wisent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Eyes of the Wisent -ManaCost:1 G -Types:Tribal Enchantment Elemental -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.blue | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | PlayerTurn$ True | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a blue spell during your turn, you may put a 4/4 green Elemental creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/eyes_of_the_wisent.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ezuri_renegade_leader.txt b/res/cardsfolder/ezuri_renegade_leader.txt deleted file mode 100644 index 8bca534b2a3..00000000000 --- a/res/cardsfolder/ezuri_renegade_leader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ezuri, Renegade Leader -ManaCost:1 G G -Types:Legendary Creature Elf Warrior -Text:no text -PT:2/2 -A:AB$ PumpAll | Cost$ 2 G G G | ValidCards$ Creature.Elf+YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Elf creatures you control get +3/+3 and gain trample until end of turn. -A:AB$ Regenerate | ValidTgts$ Creature.Elf+Other | TgtPrompt$ Select another target Elf | Cost$ G | SpellDescription$ Regenerate another target Elf. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ezuri_renegade_leader.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ezuris_archers.txt b/res/cardsfolder/ezuris_archers.txt deleted file mode 100644 index 3aeee4d3ac6..00000000000 --- a/res/cardsfolder/ezuris_archers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ezuri's Archers -ManaCost:G -Types:Creature Elf Archer -Text:no text -PT:1/2 -K:Reach -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.withFlying | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature with flying, CARDNAME gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ezuris_archers.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ezuris_brigade.txt b/res/cardsfolder/ezuris_brigade.txt deleted file mode 100644 index 164dc605528..00000000000 --- a/res/cardsfolder/ezuris_brigade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ezuri's Brigade -ManaCost:2 G G -Types:Creature Elf Warrior -Text:no text -PT:4/4 -K:stPumpSelf:Creature:4/4/Trample:Metalcraft:Metalcraft - As long as you control three or more artifacts, Ezuri's Brigade gets +4/+4 and has trample. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ezuris_brigade.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fable_of_wolf_and_owl.txt b/res/cardsfolder/fable_of_wolf_and_owl.txt deleted file mode 100644 index 100910d84c1..00000000000 --- a/res/cardsfolder/fable_of_wolf_and_owl.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fable of Wolf and Owl -ManaCost:3 GU GU GU -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigWolf | TriggerDescription$ Whenever you cast a green spell, you may put a 2/2 green Wolf creature token onto the battlefield. -T:Mode$ SpellCast | ValidCard$ Card.Blue+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigBird | TriggerDescription$ Whenever you cast a blue spell, you may put a 1/1 blue Bird creature token with flying onto the battlefield. -SVar:TrigWolf:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 -SVar:TrigBird:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:BuffedBy:Spell.Green,Spell.Blue -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fable_of_wolf_and_owl.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fabricate.txt b/res/cardsfolder/fabricate.txt deleted file mode 100644 index 0f545b93324..00000000000 --- a/res/cardsfolder/fabricate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fabricate -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Hand | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fabricate.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/35.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/face_of_fear.txt b/res/cardsfolder/face_of_fear.txt deleted file mode 100644 index 1c1654cafa2..00000000000 --- a/res/cardsfolder/face_of_fear.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Face of Fear -ManaCost:5 B -Types:Creature Horror -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ 2 B Discard<1/Card> | KW$ Fear | SpellDescription$ CARDNAME gains fear until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/face_of_fear.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faceless_butcher.txt b/res/cardsfolder/faceless_butcher.txt deleted file mode 100644 index 8d310fdbfd1..00000000000 --- a/res/cardsfolder/faceless_butcher.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Faceless Butcher -ManaCost:2 B B -Types:Creature Nightmare Horror -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | TargetMin$ 1 | IsCurse$ True | ValidTgts$ Creature.Other | TgtPrompt$ Choose target creature other than Faceless Butcher. | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108840.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/60.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faceless_devourer.txt b/res/cardsfolder/faceless_devourer.txt deleted file mode 100644 index 8e10ce19181..00000000000 --- a/res/cardsfolder/faceless_devourer.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Faceless Devourer -ManaCost:2 B -Types:Creature Nightmare Horror -Text:no text -PT:2/1 -K:Shadow -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another target creature with shadow. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | TargetMin$ 1 | IsCurse$ True | ValidTgts$ Creature.withShadow+Other | TgtPrompt$ Choose target creature with shadow other than Faceless Devourer. | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/faceless_devourer.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/facevaulter.txt b/res/cardsfolder/facevaulter.txt deleted file mode 100644 index 12ccc6d30f4..00000000000 --- a/res/cardsfolder/facevaulter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Facevaulter -ManaCost:B -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B Sac<1/Goblin> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/facevaulter.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fact_or_fiction.txt b/res/cardsfolder/fact_or_fiction.txt deleted file mode 100644 index 2ff2a2a2aa9..00000000000 --- a/res/cardsfolder/fact_or_fiction.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Fact or Fiction -ManaCost:3 U -Types:Instant -Text: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fact_or_fiction.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fade_from_memory.txt b/res/cardsfolder/fade_from_memory.txt deleted file mode 100644 index 01497575674..00000000000 --- a/res/cardsfolder/fade_from_memory.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fade from Memory -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -K:Cycling:B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fade_from_memory.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_conclave.txt b/res/cardsfolder/faerie_conclave.txt deleted file mode 100644 index 9be5822a19d..00000000000 --- a/res/cardsfolder/faerie_conclave.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Faerie Conclave -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Animate | Cost$ 1 U | Defined$ Self | Power$ 2 | Toughness$ 1 | Types$ Creature,Faerie | Colors$ Blue | Keywords$ Flying | SpellDescription$ CARDNAME 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_conclave.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/139.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/351.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_harbinger.txt b/res/cardsfolder/faerie_harbinger.txt deleted file mode 100644 index ff30bfca9ff..00000000000 --- a/res/cardsfolder/faerie_harbinger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Faerie Harbinger -ManaCost:3 U -Types:Creature Faerie Wizard -Text:no text -PT:2/2 -K:Flying -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Faerie | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_macabre.txt b/res/cardsfolder/faerie_macabre.txt deleted file mode 100644 index c5a3e29da92..00000000000 --- a/res/cardsfolder/faerie_macabre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Faerie Macabre -ManaCost:1 B B -Types:Creature Faerie Rogue -Text:no text -PT:2/2 -K:Flying -A:AB$ ChangeZone | Cost$ Discard<1/CARDNAME> | ActivatingZone$ Hand | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target cards in graveyards | ValidTgts$ Card | SpellDescription$ Exile up to two target cards from graveyards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_macabre.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_mechanist.txt b/res/cardsfolder/faerie_mechanist.txt deleted file mode 100644 index 28731d5fa59..00000000000 --- a/res/cardsfolder/faerie_mechanist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Faerie Mechanist -ManaCost:3 U -Types:Artifact Creature Faerie Artificer -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 3 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_mechanist.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_noble.txt b/res/cardsfolder/faerie_noble.txt deleted file mode 100644 index e8d7dc82219..00000000000 --- a/res/cardsfolder/faerie_noble.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Faerie Noble -ManaCost:2 G -Types:Creature Faerie -Text:no text -PT:1/2 -K:Flying -K:stPumpAll:Creature.Faerie+Other+YouCtrl:0/1:No Condition:Other Faerie creatures you control get +0/+1. -A:AB$ PumpAll | Cost$ T | ValidCards$ Creature.Faerie+Other+YouCtrl | NumAtt$ +1 | SpellDescription$ Other Faerie creatures you control get +1/+0 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_noble.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_swarm.txt b/res/cardsfolder/faerie_swarm.txt deleted file mode 100644 index 3711f39ec29..00000000000 --- a/res/cardsfolder/faerie_swarm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Faerie Swarm -ManaCost:3 U -Types:Creature Faerie -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$Valid Permanent.Blue+YouCtrl:Count$Valid Permanent.Blue+YouCtrl:Faerie Swarm's power and toughness are each equal to the number of blue permanents you control. -SVar:BuffedBy:Permanent.Blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_swarm.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_tauntings.txt b/res/cardsfolder/faerie_tauntings.txt deleted file mode 100644 index 43061c77cb6..00000000000 --- a/res/cardsfolder/faerie_tauntings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Faerie Tauntings -ManaCost:2 B -Types:Tribal Enchantment Faerie -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigLoseLife | OptionalDecider$ You | TriggerDescription$ Whenever you cast a spell during an opponent's turn, you may have each opponent lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_tauntings.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faerie_trickery.txt b/res/cardsfolder/faerie_trickery.txt deleted file mode 100644 index 50dabd6aa05..00000000000 --- a/res/cardsfolder/faerie_trickery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Faerie Trickery -ManaCost:1 U U -Types:Tribal Instant Faerie -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target non-Faerie spell | ValidTgts$ Card.nonFaerie | Destination$ Exile | SpellDescription$ Counter target non-Faerie spell. If that spell is countered this way, exile it instead of putting it into its owner's graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_trickery.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faith_healer.txt b/res/cardsfolder/faith_healer.txt deleted file mode 100644 index 54147ff6248..00000000000 --- a/res/cardsfolder/faith_healer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Faith Healer -ManaCost:1 W -Types:Creature Human Cleric -PT:1/1 -A:AB$ GainLife | Cost$ Sac<1/Enchantment> | LifeAmount$ X | SpellDescription$ You gain life equal to the sacrificed enchantment's converted mana cost. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/faith_healer.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallen_angel.txt b/res/cardsfolder/fallen_angel.txt deleted file mode 100644 index b4e53cf1567..00000000000 --- a/res/cardsfolder/fallen_angel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Fallen Angel -ManaCost:3 B B -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ CARDNAME gets +2/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallen_angel.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/133.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/23.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/127.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/134.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallen_askari.txt b/res/cardsfolder/fallen_askari.txt deleted file mode 100644 index db43a1e3fb6..00000000000 --- a/res/cardsfolder/fallen_askari.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fallen Askari -ManaCost:1 B -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallen_askari.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallen_cleric.txt b/res/cardsfolder/fallen_cleric.txt deleted file mode 100644 index bb7eccbf45d..00000000000 --- a/res/cardsfolder/fallen_cleric.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fallen Cleric -ManaCost:4 B -Types:Creature Zombie Cleric -Text:no text -PT:4/2 -K:Protection from Clerics -K:Morph:4 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallen_cleric.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallen_ferromancer.txt b/res/cardsfolder/fallen_ferromancer.txt deleted file mode 100644 index fca174cc696..00000000000 --- a/res/cardsfolder/fallen_ferromancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fallen Ferromancer -ManaCost:3 R -Types:Creature Human Shaman -Text:no text -PT:1/1 -K:Infect -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallen_ferromancer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallen_ideal.txt b/res/cardsfolder/fallen_ideal.txt deleted file mode 100644 index 9982e1b4bf2..00000000000 --- a/res/cardsfolder/fallen_ideal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fallen Ideal -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -A:AB$ Pump | Cost$ Sac<1/Creature> | Defined$ Enchanted | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Enchanted creature gets +2/+1 until end of turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallen_ideal.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallow_earth.txt b/res/cardsfolder/fallow_earth.txt deleted file mode 100644 index 590fc8e888c..00000000000 --- a/res/cardsfolder/fallow_earth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fallow Earth -ManaCost:2 G -Types:Sorcery -Text: -A:SP$ ChangeZone | Cost$ 2 G | ValidTgts$ Land | TgtPrompt$ Select target land | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target land on top of its owner's library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallow_earth.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/227.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fallowsage.txt b/res/cardsfolder/fallowsage.txt deleted file mode 100644 index 775135a99bf..00000000000 --- a/res/cardsfolder/fallowsage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fallowsage -ManaCost:3 U -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes tapped, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fallowsage.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_cure.txt b/res/cardsfolder/false_cure.txt deleted file mode 100644 index f1b36753334..00000000000 --- a/res/cardsfolder/false_cure.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:False Cure -ManaCost:B B -Types:Instant -Text:no text -A:SP$ Effect | Cost$ B B | Name$ False Cure Effect | Triggers$ GainLife | SVars$ TrigLoseLife,X | SpellDescription$ Until end of turn, whenever a player gains life, that player loses 2 life for each 1 life he or she gained. -SVar:GainLife:Mode$ LifeGained | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player gains life, that player loses 2 life for each 1 life he or she gained. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredPlayer | LifeAmount$ X -SVar:X:TriggerCount$LifeAmount/Times.2 -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/false_cure.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_defeat.txt b/res/cardsfolder/false_defeat.txt deleted file mode 100644 index 3158eca8fca..00000000000 --- a/res/cardsfolder/false_defeat.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:False Defeat -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 W | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/false_defeat.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_demise.txt b/res/cardsfolder/false_demise.txt deleted file mode 100644 index f387d2ac6e0..00000000000 --- a/res/cardsfolder/false_demise.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:False Demise -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature is put into a graveyard, return that card to the battlefield under your control. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/false_demise.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/40.jpg|2 -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_mourning.txt b/res/cardsfolder/false_mourning.txt deleted file mode 100644 index 0785e0e0db9..00000000000 --- a/res/cardsfolder/false_mourning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:False Mourning -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Put target card from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/false_mourning.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_prophet.txt b/res/cardsfolder/false_prophet.txt deleted file mode 100644 index 041e7646a10..00000000000 --- a/res/cardsfolder/false_prophet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:False Prophet -ManaCost:2 W W -Types:Creature Human Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile all creatures. -SVar:TrigSac:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Creature | Origin$ Battlefield | Destination$ Exile -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/false_prophet.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/false_summoning.txt b/res/cardsfolder/false_summoning.txt deleted file mode 100644 index 84f87995961..00000000000 --- a/res/cardsfolder/false_summoning.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:False Summoning -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/false_summoning.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/falter.txt b/res/cardsfolder/falter.txt deleted file mode 100644 index 598af2f8acf..00000000000 --- a/res/cardsfolder/falter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Falter -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Effect | Cost$ 1 R | Name$ Falter Effect | Keywords$ KWPump | SpellDescription$ Creatures without flying can't block this turn. -SVar:KWPump:stPumpAll:Creature.withoutFlying:0/0/HIDDEN CARDNAME can't block.:no Condition:Creatures without flying can't block this turn. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/falter.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/familiar_ground.txt b/res/cardsfolder/familiar_ground.txt deleted file mode 100644 index 7110830afde..00000000000 --- a/res/cardsfolder/familiar_ground.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Familiar Ground -ManaCost:2 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN CARDNAME can't be blocked by more than one creature.:No Condition:Each creature you control can't be blocked by more than one creature. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/familiar_ground.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/69.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/familiars_ruse.txt b/res/cardsfolder/familiars_ruse.txt deleted file mode 100644 index d41966263d9..00000000000 --- a/res/cardsfolder/familiars_ruse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Familiar's Ruse -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U Return<1/Creature> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/familiars_ruse.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/famine.txt b/res/cardsfolder/famine.txt deleted file mode 100644 index 5ff983666ab..00000000000 --- a/res/cardsfolder/famine.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Famine -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 B B | NumDmg$ 3 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 3 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/famine.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fanatical_devotion.txt b/res/cardsfolder/fanatical_devotion.txt deleted file mode 100644 index cec1e6df6c2..00000000000 --- a/res/cardsfolder/fanatical_devotion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fanatical Devotion -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ Sac<1/Creature> | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fanatical_devotion.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fanatical_fever.txt b/res/cardsfolder/fanatical_fever.txt deleted file mode 100644 index 3b78453eaa1..00000000000 --- a/res/cardsfolder/fanatical_fever.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fanatical Fever -ManaCost:2 G G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | KW$ Trample | SpellDescription$ Target creature gets +3/+0 and gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fanatical_fever.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/122.jpg -End diff --git a/res/cardsfolder/fang_skulkin.txt b/res/cardsfolder/fang_skulkin.txt deleted file mode 100644 index ac93b3dfbfa..00000000000 --- a/res/cardsfolder/fang_skulkin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fang Skulkin -ManaCost:2 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | KW$ Wither | SpellDescription$ Target black creature gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fang_skulkin.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fangren_firstborn.txt b/res/cardsfolder/fangren_firstborn.txt deleted file mode 100644 index d40d796a7d1..00000000000 --- a/res/cardsfolder/fangren_firstborn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fangren Firstborn -ManaCost:1 G G G -Types:Creature Beast -Text:no text -PT:4/2 -T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigCounters | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on each attacking creature. -SVar:TrigCounters:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.attacking | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fangren_firstborn.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fangren_hunter.txt b/res/cardsfolder/fangren_hunter.txt deleted file mode 100644 index a28b494f3a7..00000000000 --- a/res/cardsfolder/fangren_hunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fangren Hunter -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:4/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card46115.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fangren_marauder.txt b/res/cardsfolder/fangren_marauder.txt deleted file mode 100644 index 51e506406a0..00000000000 --- a/res/cardsfolder/fangren_marauder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fangren Marauder -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, you may gain 5 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fangren_marauder.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fangren_pathcutter.txt b/res/cardsfolder/fangren_pathcutter.txt deleted file mode 100644 index 6814b3037e8..00000000000 --- a/res/cardsfolder/fangren_pathcutter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fangren Pathcutter -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:4/6 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, attacking creatures gain trample until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking | KW$ Trample -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fangren_pathcutter.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fanning_the_flames.txt b/res/cardsfolder/fanning_the_flames.txt deleted file mode 100644 index af21292c0c3..00000000000 --- a/res/cardsfolder/fanning_the_flames.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fanning the Flames -ManaCost:X R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:Buyback:3 -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fanning_the_flames.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/far_wanderings.txt b/res/cardsfolder/far_wanderings.txt deleted file mode 100644 index e95aed43260..00000000000 --- a/res/cardsfolder/far_wanderings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Far Wanderings -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ X | SpellDescription$ Search your library for a basic land card and put that card into play tapped. Then shuffle your library. Threshold - Instead search your library for three basic land cards and put them into play tapped. Then shuffle your library. -SVar:X:Count$Threshold.3.1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/far_wanderings.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/farhaven_elf.txt b/res/cardsfolder/farhaven_elf.txt deleted file mode 100644 index d101fe7c399..00000000000 --- a/res/cardsfolder/farhaven_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Farhaven Elf -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/farhaven_elf.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/farmstead.txt b/res/cardsfolder/farmstead.txt deleted file mode 100644 index 72d5aac248f..00000000000 --- a/res/cardsfolder/farmstead.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Farmstead -ManaCost:W W W -Types:Enchantment Aura -Text:Enchanted land has "At the beginning of your upkeep, you may pay W W. If you do, you gain 1 life." -K:Enchant Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/farmstead.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/203.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/205.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/203.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/farrelite_priest.txt b/res/cardsfolder/farrelite_priest.txt deleted file mode 100644 index 427684d5ed9..00000000000 --- a/res/cardsfolder/farrelite_priest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Farrelite Priest -ManaCost:1 W W -Types:Creature Human Cleric -Text:no text -PT:1/3 -A:AB$ Mana | Cost$ 1 | Produced$ W | ActivationNumberSacrifice$ 4 | SpellDescription$ Add W to your mana pool. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/farrelite_priest.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/farseek.txt b/res/cardsfolder/farseek.txt deleted file mode 100644 index 2e00912b586..00000000000 --- a/res/cardsfolder/farseek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Farseek -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Island,Swamp,Mountain | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains, Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/farseek.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/farsight_mask.txt b/res/cardsfolder/farsight_mask.txt deleted file mode 100644 index c410c800972..00000000000 --- a/res/cardsfolder/farsight_mask.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Farsight Mask -ManaCost:5 -Types:Artifact -Text:Whenever a source an opponent controls deals damage to you, if Farsight Mask is untapped, you may draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/farsight_mask.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fastbond.txt b/res/cardsfolder/fastbond.txt deleted file mode 100644 index cc79cb65a4e..00000000000 --- a/res/cardsfolder/fastbond.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fastbond -ManaCost:G -Types:Enchantment -Text:You may play as many lands as you choose on your turn. Whenever you play a land other than the first land of the turn, Fastbond deals 1 damage to you. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fastbond.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/101.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/101.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/101.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fatal_attraction.txt b/res/cardsfolder/fatal_attraction.txt deleted file mode 100644 index ae14b3f8b61..00000000000 --- a/res/cardsfolder/fatal_attraction.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Fatal Attraction -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDamage2 | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to enchanted creature. -SVar:TrigDamage2:AB$DealDamage | Cost$ 0 | Defined$ Enchanted | NumDmg$ 2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage4 | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 4 damage to enchanted creature. -SVar:TrigDamage4:AB$DealDamage | Cost$ 0 | Defined$ Enchanted | NumDmg$ 4 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_attraction.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fatal_blow.txt b/res/cardsfolder/fatal_blow.txt deleted file mode 100644 index 152d69b63b3..00000000000 --- a/res/cardsfolder/fatal_blow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fatal Blow -ManaCost:B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.wasDealtDamageThisTurn | NoRegen$ True | TgtPrompt$ Select target creature that was dealt damage this turn | SpellDescription$ Destroy target creature that was dealt damage this turn. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_blow.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/9.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fatal_frenzy.txt b/res/cardsfolder/fatal_frenzy.txt deleted file mode 100644 index 3afc9de8fce..00000000000 --- a/res/cardsfolder/fatal_frenzy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fatal Frenzy -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ X | KW$ Trample & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ 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. -SVar:X:Targeted$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_frenzy.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fatal_mutation.txt b/res/cardsfolder/fatal_mutation.txt deleted file mode 100644 index b0abefa588a..00000000000 --- a/res/cardsfolder/fatal_mutation.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Fatal Mutation -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -T:Mode$ TurnFaceUp | ValidCard$ Card.AttachedBy | Execute$ TrigDestroy | TriggerDescription$ When enchanted creature is turned face up, destroy it. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredCard | NoRegen$ True -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatal_mutation.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fatestitcher.txt b/res/cardsfolder/fatestitcher.txt deleted file mode 100644 index 3962b06133d..00000000000 --- a/res/cardsfolder/fatestitcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fatestitcher -ManaCost:3 U -Types:Creature Zombie Wizard -Text:no text -PT:1/2 -K:Unearth:U -A:AB$ TapOrUntap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent | SpellDescription$ You may tap or untap another target permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fatestitcher.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fathom_seer.txt b/res/cardsfolder/fathom_seer.txt deleted file mode 100644 index 4a005aefd53..00000000000 --- a/res/cardsfolder/fathom_seer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fathom Seer -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:1/3 -K:Morph:Return<2/Island> -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is turned face up, draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fathom_seer.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fault_line.txt b/res/cardsfolder/fault_line.txt deleted file mode 100644 index 57e2b06460e..00000000000 --- a/res/cardsfolder/fault_line.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fault Line -ManaCost:X R R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ X R R | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | NumDmg$ X | ValidDescription$ each creature without flying and each player. | SpellDescription$ CARDNAME deals X damage to each creature without flying and each player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fault_line.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fault_riders.txt b/res/cardsfolder/fault_riders.txt deleted file mode 100644 index a724840a4f4..00000000000 --- a/res/cardsfolder/fault_riders.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fault Riders -ManaCost:2 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +2 | KW$ First Strike | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+0 and gains first strike until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fault_riders.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/faultgrinder.txt b/res/cardsfolder/faultgrinder.txt deleted file mode 100644 index 5309aadc5be..00000000000 --- a/res/cardsfolder/faultgrinder.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Faultgrinder -ManaCost:6 R -Types:Creature Elemental -Text:no text -PT:4/4 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target land. -K:Evoke:4 R -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select a land. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/faultgrinder.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fauna_shaman.txt b/res/cardsfolder/fauna_shaman.txt deleted file mode 100644 index 61255330875..00000000000 --- a/res/cardsfolder/fauna_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fauna Shaman -ManaCost:1 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ G T Discard<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a Creature card and put it into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fauna_shaman.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/favor_of_the_mighty.txt b/res/cardsfolder/favor_of_the_mighty.txt deleted file mode 100644 index df47a5cde92..00000000000 --- a/res/cardsfolder/favor_of_the_mighty.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Favor of the Mighty -ManaCost:1 W -Types:Tribal Enchantment Giant -Text:Each creature with the highest converted mana cost has protection from all colors. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/favor_of_the_mighty.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/favor_of_the_overbeing.txt b/res/cardsfolder/favor_of_the_overbeing.txt deleted file mode 100644 index 69a088913b2..00000000000 --- a/res/cardsfolder/favor_of_the_overbeing.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Favor of the Overbeing -ManaCost:1 GU -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Green:1/1/Vigilance:No Condition:As long as enchanted creature is green, it gets +1/+1 and has vigilance. -K:stPumpEnchanted:Creature.Blue:1/1/Flying:No Condition:As long as enchanted creature is blue, it gets +1/+1 and has flying. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/favor_of_the_overbeing.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/favorable_destiny.txt b/res/cardsfolder/favorable_destiny.txt deleted file mode 100644 index 4c9b4840b84..00000000000 --- a/res/cardsfolder/favorable_destiny.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Favorable Destiny -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.White:1/2:No Condition:Enchanted creature gets +1/+2 as long as it's white. -K:stPumpEnchanted:Creature:0/0/Shroud:EnchantedControllerCreaturesGE/2:Enchanted creature has shroud as long as its controller controls another creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/favorable_destiny.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fear.txt b/res/cardsfolder/fear.txt deleted file mode 100644 index e56ec87dd6c..00000000000 --- a/res/cardsfolder/fear.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Fear -ManaCost:B B -Types:Enchantment Aura -Text:Enchanted creature has fear. -K:Enchant creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fear.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/134.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/17.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/17.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/135.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/24.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/21.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/129.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/12.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/142.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/129.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/19.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feast_of_blood.txt b/res/cardsfolder/feast_of_blood.txt deleted file mode 100644 index 534399efeea..00000000000 --- a/res/cardsfolder/feast_of_blood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feast of Blood -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBGainLife | IsPresent$ Vampire.YouCtrl | PresentCompare$ GE2 | SpellDescription$ Cast CARDNAME only if you control two or more Vampires. Destroy target creature. You gain 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_blood.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feast_of_flesh.txt b/res/cardsfolder/feast_of_flesh.txt deleted file mode 100644 index 0f9b0a73c0a..00000000000 --- a/res/cardsfolder/feast_of_flesh.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feast of Flesh -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals X damage to target creature and you gain X life, where X is 1 plus the number of cards named CARDNAME in all graveyards. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$NamedInAllYards.Feast of Flesh/Plus.1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_flesh.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/56.jpg -End diff --git a/res/cardsfolder/feast_of_the_unicorn.txt b/res/cardsfolder/feast_of_the_unicorn.txt deleted file mode 100644 index 03e9627735a..00000000000 --- a/res/cardsfolder/feast_of_the_unicorn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feast of the Unicorn -ManaCost:3 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+4/+0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_the_unicorn.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/9.jpg|2 -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feast_of_worms.txt b/res/cardsfolder/feast_of_worms.txt deleted file mode 100644 index b93e74eed63..00000000000 --- a/res/cardsfolder/feast_of_worms.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feast of Worms -ManaCost:3 G G -Types:Sorcery Arcane -Text:no text -A:SP$ Destroy | Cost$ 3 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBSacrifice | SpellDescription$ Destroy target land. If that land was legendary, its controller sacrifices another land. -SVar:DBSacrifice:DB$ Sacrifice | Defined$ TargetedController | SacValid$ Land | ConditionDefined$ Targeted | ConditionPresent$ Land.Legendary | ConditionCompare$ EQ1 | ConditionDescription$ If that land was legendary, -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_of_worms.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feast_or_famine.txt b/res/cardsfolder/feast_or_famine.txt deleted file mode 100644 index 1dd1592c47a..00000000000 --- a/res/cardsfolder/feast_or_famine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feast or Famine -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Token | Cost$ 3 B | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | PrecostDesc$ Choose one - | SpellDescription$ Put a 2/2 black Zombie creature token onto the battlefield; -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature.nonBlack+nonArtifact | TgtPrompt$ Select target nonblack, nonartifact creature | NoRegen$ True | SpellDescription$ or destroy target nonartifact, nonblack creature and it can't be regenerated. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/feast_or_famine.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/8.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/fecundity.txt b/res/cardsfolder/fecundity.txt deleted file mode 100644 index 4034fab9be0..00000000000 --- a/res/cardsfolder/fecundity.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fecundity -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, that creature's controller may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fecundity.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/247.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feebleness.txt b/res/cardsfolder/feebleness.txt deleted file mode 100644 index d5597ede970..00000000000 --- a/res/cardsfolder/feebleness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feebleness -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:-2/-1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/feebleness.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feedback.txt b/res/cardsfolder/feedback.txt deleted file mode 100644 index 14de4fe1138..00000000000 --- a/res/cardsfolder/feedback.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Feedback -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant Enchantment Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted enchantment's controller, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feedback.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/58.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/58.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/85.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/71.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/58.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feedback_bolt.txt b/res/cardsfolder/feedback_bolt.txt deleted file mode 100644 index e4b8a3fa6d6..00000000000 --- a/res/cardsfolder/feedback_bolt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feedback Bolt -ManaCost:4 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 4 R | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target player equal to the number of artifacts you control. -SVar:X:Count$TypeYouCtrl.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feedback_bolt.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/64.jpg -End diff --git a/res/cardsfolder/feeding_frenzy.txt b/res/cardsfolder/feeding_frenzy.txt deleted file mode 100644 index 76c55a5b14c..00000000000 --- a/res/cardsfolder/feeding_frenzy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feeding Frenzy -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of Zombies on the battlefield. -SVar:X:Count$Valid Zombie -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feeding_frenzy.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/147.jpg -End diff --git a/res/cardsfolder/feldons_cane.txt b/res/cardsfolder/feldons_cane.txt deleted file mode 100644 index e99ac25ad97..00000000000 --- a/res/cardsfolder/feldons_cane.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Feldon's Cane -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZoneAll | Cost$ T Exile<1/CARDNAME> | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle your graveyard into your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feldons_cane.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/368.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/109.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/felidar_sovereign.txt b/res/cardsfolder/felidar_sovereign.txt deleted file mode 100644 index 1142a6a10ed..00000000000 --- a/res/cardsfolder/felidar_sovereign.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Felidar Sovereign -ManaCost:4 W W -Types:Creature Cat Beast -Text:At the beginning of your upkeep, if you have 40 or more life, you win the game. -PT:4/6 -K:Vigilance -K:Lifelink -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/felidar_sovereign.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fellwar_stone.txt b/res/cardsfolder/fellwar_stone.txt deleted file mode 100644 index f38314389c7..00000000000 --- a/res/cardsfolder/fellwar_stone.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fellwar Stone -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Land.YouDontCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color that a land an opponent controls could produce. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fellwar_stone.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/369.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/99.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/337.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/297.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/femeref_archers.txt b/res/cardsfolder/femeref_archers.txt deleted file mode 100644 index 85ae6294850..00000000000 --- a/res/cardsfolder/femeref_archers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Femeref Archers -ManaCost:2 G -Types:Creature Human Archer -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking+withFlying | TgtPrompt$ Select target attacking creature with flying | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target attacking creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/femeref_archers.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/229.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/113.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/244.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/femeref_enchantress.txt b/res/cardsfolder/femeref_enchantress.txt deleted file mode 100644 index 539018f36ca..00000000000 --- a/res/cardsfolder/femeref_enchantress.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Femeref Enchantress -ManaCost:G W -Types:Creature Human Druid -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Enchantment | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an enchantment is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/femeref_enchantress.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/femeref_healer.txt b/res/cardsfolder/femeref_healer.txt deleted file mode 100644 index ceb6a9f2890..00000000000 --- a/res/cardsfolder/femeref_healer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Femeref Healer -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/femeref_healer.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/femeref_knight.txt b/res/cardsfolder/femeref_knight.txt deleted file mode 100644 index ba19c15ed13..00000000000 --- a/res/cardsfolder/femeref_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Femeref Knight -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ Pump | Cost$ W | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/femeref_knight.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/222.jpg -End diff --git a/res/cardsfolder/femeref_scouts.txt b/res/cardsfolder/femeref_scouts.txt deleted file mode 100644 index 8f132a2222e..00000000000 --- a/res/cardsfolder/femeref_scouts.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Femeref Scouts -ManaCost:2 W -Types:Creature Human Scout -Text:no text -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3494.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fen_stalker.txt b/res/cardsfolder/fen_stalker.txt deleted file mode 100644 index 66c936edbe5..00000000000 --- a/res/cardsfolder/fen_stalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fen Stalker -ManaCost:3 B -Types:Creature Nightstalker -Text:no text -PT:3/2 -K:stPumpSelf:Creature:0/0/Fear:isNotPresent Land.untapped+YouCtrl: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.) -SVar:BuffedBy:Spell -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fen_stalker.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fencer_clique.txt b/res/cardsfolder/fencer_clique.txt deleted file mode 100644 index 517abb6b299..00000000000 --- a/res/cardsfolder/fencer_clique.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fencer Clique -ManaCost:2 U U -Types:Creature Faerie Soldier -Text:no text -PT:3/2 -K:Flying -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put CARDNAME on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fencer_clique.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fencers_magemark.txt b/res/cardsfolder/fencers_magemark.txt deleted file mode 100644 index 7a43361ca29..00000000000 --- a/res/cardsfolder/fencers_magemark.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fencer's Magemark -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpAll:Creature.enchanted+YouCtrl:1/1/First Strike:no Condition:Creatures you control that are enchanted get +1/+1 and have first strike. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fencers_magemark.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fend_off.txt b/res/cardsfolder/fend_off.txt deleted file mode 100644 index 2d86ab701e9..00000000000 --- a/res/cardsfolder/fend_off.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fend Off -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fend_off.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/7.jpg -End diff --git a/res/cardsfolder/fendeep_summoner.txt b/res/cardsfolder/fendeep_summoner.txt deleted file mode 100644 index a833d359856..00000000000 --- a/res/cardsfolder/fendeep_summoner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fendeep Summoner -ManaCost:4 B -Types:Creature Treefolk Shaman -Text:no text -PT:3/5 -A:AB$ Animate | Cost$ T | ValidTgts$ Swamp | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target Swamp | Power$ 3 | Toughness$ 5 | Types$ Creature,Warrior,Treefolk | SpellDescription$ Up to two target Swamps each become 3/5 Treefolk Warrior creatures in addition to their other types until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fendeep_summoner.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feral_animist.txt b/res/cardsfolder/feral_animist.txt deleted file mode 100644 index d39b8f9e84f..00000000000 --- a/res/cardsfolder/feral_animist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Feral Animist -ManaCost:1 R G -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 3 | NumAtt$ +X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is its power. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_animist.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/112.jpg -End diff --git a/res/cardsfolder/feral_hydra.txt b/res/cardsfolder/feral_hydra.txt deleted file mode 100644 index 49ba8a20f2d..00000000000 --- a/res/cardsfolder/feral_hydra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Feral Hydra -ManaCost:X G -Types:Creature Hydra -Text:no text -PT:0/0 -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -A:AB$ PutCounter | Cost$ 3 | CounterType$ P1P1 | CounterNum$ 1 | AnyPlayer$ True | SpellDescription$ Put a +1/+1 counter on Feral Hydra. Any player may activate this ability. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_hydra.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feral_instinct.txt b/res/cardsfolder/feral_instinct.txt deleted file mode 100644 index 0f182cc9229..00000000000 --- a/res/cardsfolder/feral_instinct.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Feral Instinct -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_instinct.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feral_lightning.txt b/res/cardsfolder/feral_lightning.txt deleted file mode 100644 index 04111b7f61a..00000000000 --- a/res/cardsfolder/feral_lightning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Feral Lightning -ManaCost:3 R R R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 R R R | TokenAmount$ 3 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste<>At the beginning of the end step, exile CARDNAME. | SpellDescription$ Put three 3/1 red Elemental creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card84373.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feral_shadow.txt b/res/cardsfolder/feral_shadow.txt deleted file mode 100644 index 65aca9cd6a4..00000000000 --- a/res/cardsfolder/feral_shadow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Feral Shadow -ManaCost:2 B -Types:Creature Nightstalker -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20373.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/77.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/20.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/feral_thallid.txt b/res/cardsfolder/feral_thallid.txt deleted file mode 100644 index 0e7e862927c..00000000000 --- a/res/cardsfolder/feral_thallid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Feral Thallid -ManaCost:3 G G G -Types:Creature Fungus -Text:no text -PT:6/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Regenerate | Cost$ SubCounter<3/SPORE> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/feral_thallid.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ferocious_charge.txt b/res/cardsfolder/ferocious_charge.txt deleted file mode 100644 index 211f7deaa9f..00000000000 --- a/res/cardsfolder/ferocious_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ferocious Charge -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 4 | NumDef$ 4 | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ferocious_charge.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ferocity.txt b/res/cardsfolder/ferocity.txt deleted file mode 100755 index 0f87e065f82..00000000000 --- a/res/cardsfolder/ferocity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ferocity -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ AttackerBlocked | ValidCard$ Card.AttachedBy | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked, you may put a +1/+1 counter on it. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | Execute$ TrigPutCounter | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked, you may put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ferocity.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ferozs_ban.txt b/res/cardsfolder/ferozs_ban.txt deleted file mode 100644 index 41e3e7ec695..00000000000 --- a/res/cardsfolder/ferozs_ban.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Feroz's Ban -ManaCost:6 -Types:Artifact -Text:Creature spells cost 2 more to cast. -K:CostChange:All:More:2:Spell:All:Creature:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ferozs_ban.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/132.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/370.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ferrovore.txt b/res/cardsfolder/ferrovore.txt deleted file mode 100644 index dd8140c660f..00000000000 --- a/res/cardsfolder/ferrovore.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ferrovore -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R Sac<1/Artifact> | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ferrovore.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/88.jpg -End diff --git a/res/cardsfolder/fertilid.txt b/res/cardsfolder/fertilid.txt deleted file mode 100644 index 0e0238571ed..00000000000 --- a/res/cardsfolder/fertilid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fertilid -ManaCost:2 G -Types:Creature Elemental -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -A:AB$ ChangeZone | Cost$ 1 G SubCounter<1/P1P1> | ValidTgts$ Player | Defined$ Targeted | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fertilid.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fervent_charge.txt b/res/cardsfolder/fervent_charge.txt deleted file mode 100644 index 26f1243883a..00000000000 --- a/res/cardsfolder/fervent_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fervent Charge -ManaCost:1 W B R -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ +2 | NumDef$ +2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fervent_charge.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fervent_denial.txt b/res/cardsfolder/fervent_denial.txt deleted file mode 100644 index 1fc1bf26b4f..00000000000 --- a/res/cardsfolder/fervent_denial.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fervent Denial -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 3 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -A:SP$ Counter | Cost$ 5 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Flashback$ True | CostDesc$ Flashback 5 U U | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fervent_denial.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fervor.txt b/res/cardsfolder/fervor.txt deleted file mode 100644 index dfdbba8e34f..00000000000 --- a/res/cardsfolder/fervor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fervor -ManaCost:2 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Haste:No Condition:Creatures you control have haste. -SVar:BuffedBy:Creature -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fervor.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/99.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/174.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festercreep.txt b/res/cardsfolder/festercreep.txt deleted file mode 100644 index 69824ed517e..00000000000 --- a/res/cardsfolder/festercreep.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Festercreep -ManaCost:1 B -Types:Creature Elemental -Text:no text -PT:0/0 -K:etbCounter:P1P1:1 -A:AB$ PumpAll | Cost$ 1 B SubCounter<1/P1P1> | ValidCards$ Creature.Other | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All other creatures get -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/festercreep.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festering_evil.txt b/res/cardsfolder/festering_evil.txt deleted file mode 100644 index d753f1b5999..00000000000 --- a/res/cardsfolder/festering_evil.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Festering Evil -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each creature and each player. -A:AB$ DamageAll | Cost$ B B Sac<1/CARDNAME> | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 3 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 3 damage to each creature and each player. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 0 | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 | ValidDescription$ each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/festering_evil.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festering_goblin.txt b/res/cardsfolder/festering_goblin.txt deleted file mode 100644 index 126245472af..00000000000 --- a/res/cardsfolder/festering_goblin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Festering Goblin -ManaCost:B -Types:Creature Zombie Goblin -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target creature gets -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/festering_goblin.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/148.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/130.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festering_march.txt b/res/cardsfolder/festering_march.txt deleted file mode 100644 index 002250f8386..00000000000 --- a/res/cardsfolder/festering_march.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Festering March -ManaCost:3 B B -Types:Sorcery -Text:no text -K:Suspend:3:2 B -A:SP$ PumpAll | Cost$ 3 B B | ValidCards$ Creature.YouDontCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ SVar=DBChange | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn. Exile CARDNAME with three time counters on it. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | CounterType$ TIME | CounterNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/festering_march.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festering_wound.txt b/res/cardsfolder/festering_wound.txt deleted file mode 100644 index 40ab97e6dfa..00000000000 --- a/res/cardsfolder/festering_wound.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Festering Wound -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put an infection counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals X damage to that player, where X is the number of infection counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ INFECTION | CounterNum$ 1 -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ X -SVar:X:Count$CardCounters.INFECTION -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/festering_wound.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festival.txt b/res/cardsfolder/festival.txt deleted file mode 100644 index ffb106cb903..00000000000 --- a/res/cardsfolder/festival.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Festival -ManaCost:W -Types:Instant -Text:Cast Festival only during an opponent's upkeep. -A:SP$ Effect | Cost$ W | Name$ Festival Effect | Keywords$ KWPump | OpponentTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Creatures can't attack this turn. -SVar:KWPump:stPumpAll:Creature:0/0/HIDDEN CARDNAME can't attack.:no Condition:Creatures can't attack this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/festival.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/festival_of_trokin.txt b/res/cardsfolder/festival_of_trokin.txt deleted file mode 100644 index 741c8602aff..00000000000 --- a/res/cardsfolder/festival_of_trokin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Festival of Trokin -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ W | LifeAmount$ X | SpellDescription$ You gain 2 life for each creature you control. -SVar:X:Count$TypeYouCtrl.Creature/Times.2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6504.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fetid_heath.txt b/res/cardsfolder/fetid_heath.txt deleted file mode 100644 index 3590573ad23..00000000000 --- a/res/cardsfolder/fetid_heath.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fetid Heath -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ WB T | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ WB T | Produced$ W B | SpellDescription$ Add W B to your mana pool. -A:AB$ Mana | Cost$ WB T | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fetid_heath.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fetid_horror.txt b/res/cardsfolder/fetid_horror.txt deleted file mode 100644 index f961c61439b..00000000000 --- a/res/cardsfolder/fetid_horror.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fetid Horror -ManaCost:3 B -Types:Creature Shade Horror -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fetid_horror.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/21.jpg -End diff --git a/res/cardsfolder/feudkillers_verdict.txt b/res/cardsfolder/feudkillers_verdict.txt deleted file mode 100644 index 3338e1f2479..00000000000 --- a/res/cardsfolder/feudkillers_verdict.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Feudkiller's Verdict -ManaCost:4 W W -Types:Tribal Sorcery Giant -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/feudkillers_verdict.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fever_charm.txt b/res/cardsfolder/fever_charm.txt deleted file mode 100644 index d8cf7780892..00000000000 --- a/res/cardsfolder/fever_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fever Charm -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Choose one - Target creature gains haste until end of turn -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ or target creature gets +2/+0 until end of turn -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature.wizard | NumDmg$ 3 | SpellDescription$ or CARDNAME deals 3 damage to target Wizard creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fever_charm.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fevered_convulsions.txt b/res/cardsfolder/fevered_convulsions.txt deleted file mode 100644 index 276027de170..00000000000 --- a/res/cardsfolder/fevered_convulsions.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fevered Convulsions -ManaCost:B B -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ 2 B B | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fevered_convulsions.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fevered_strength.txt b/res/cardsfolder/fevered_strength.txt deleted file mode 100644 index a0590ba5d2e..00000000000 --- a/res/cardsfolder/fevered_strength.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fevered Strength -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fevered_strength.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/10.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/fiddlehead_kami.txt b/res/cardsfolder/fiddlehead_kami.txt deleted file mode 100644 index a7949dcb267..00000000000 --- a/res/cardsfolder/fiddlehead_kami.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fiddlehead Kami -ManaCost:4 G -Types:Creature Spirit -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRegen | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, regenerate CARDNAME. -SVar:TrigRegen:AB$Regenerate | Cost$ 0 | Defined$ Self -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiddlehead_kami.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/field_marshal.txt b/res/cardsfolder/field_marshal.txt deleted file mode 100644 index 7b5fd69d2de..00000000000 --- a/res/cardsfolder/field_marshal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Field Marshal -ManaCost:1 W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:stPumpAll:Creature.Soldier+Other:1/1/First Strike:No Condition:Other Soldier creatures get +1/+1 and have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/field_marshal.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/5.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/field_of_souls.txt b/res/cardsfolder/field_of_souls.txt deleted file mode 100644 index f9141c20592..00000000000 --- a/res/cardsfolder/field_of_souls.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Field of Souls -ManaCost:2 W W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/field_of_souls.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fieldmist_borderpost.txt b/res/cardsfolder/fieldmist_borderpost.txt deleted file mode 100644 index 42eae2ad001..00000000000 --- a/res/cardsfolder/fieldmist_borderpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fieldmist Borderpost -ManaCost:1 W U -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:AltCost:1 Return<1/Land.Basic>$You may pay 1 and return a basic land you control to its owner's hand rather than pay Fieldmist Borderpost's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fieldmist_borderpost.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fierce_empath.txt b/res/cardsfolder/fierce_empath.txt deleted file mode 100644 index 12b7b89b424..00000000000 --- a/res/cardsfolder/fierce_empath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fierce Empath -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Creature.cmcGE6 | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fierce_empath.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fiery_conclusion.txt b/res/cardsfolder/fiery_conclusion.txt deleted file mode 100644 index 8e9eb490211..00000000000 --- a/res/cardsfolder/fiery_conclusion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fiery Conclusion -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_conclusion.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fiery_fall.txt b/res/cardsfolder/fiery_fall.txt deleted file mode 100644 index 2a05555b3bf..00000000000 --- a/res/cardsfolder/fiery_fall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fiery Fall -ManaCost:5 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 5 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature. -K:TypeCycling:Basic:1 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_fall.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/63.jpg -End diff --git a/res/cardsfolder/fiery_hellhound.txt b/res/cardsfolder/fiery_hellhound.txt deleted file mode 100644 index 2834ab19885..00000000000 --- a/res/cardsfolder/fiery_hellhound.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fiery Hellhound -ManaCost:1 R R -Types:Creature Elemental Hound -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_hellhound.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/136.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/135.jpg -End diff --git a/res/cardsfolder/fiery_mantle.txt b/res/cardsfolder/fiery_mantle.txt deleted file mode 100644 index d90dbe3d0a4..00000000000 --- a/res/cardsfolder/fiery_mantle.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fiery Mantle -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_mantle.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fiery_temper.txt b/res/cardsfolder/fiery_temper.txt deleted file mode 100644 index 868332e7ea3..00000000000 --- a/res/cardsfolder/fiery_temper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fiery Temper -ManaCost:1 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -K:Madness:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fiery_temper.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/97.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/62.jpg -End diff --git a/res/cardsfolder/fight_to_the_death.txt b/res/cardsfolder/fight_to_the_death.txt deleted file mode 100644 index 8e9db49f9f0..00000000000 --- a/res/cardsfolder/fight_to_the_death.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fight to the Death -ManaCost:R W -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ R W | ValidCards$ Creature.blocked,Creature.blocking | SpellDescription$ Destroy all blocking creatures and all blocked creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fight_to_the_death.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/97.jpg -End diff --git a/res/cardsfolder/fighting_drake.txt b/res/cardsfolder/fighting_drake.txt deleted file mode 100644 index c2bb01e7d45..00000000000 --- a/res/cardsfolder/fighting_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fighting Drake -ManaCost:2 U U -Types:Creature Drake -Text:no text -PT:2/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4700.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/77.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/63.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/figure_of_destiny.txt b/res/cardsfolder/figure_of_destiny.txt deleted file mode 100644 index 6d1a31834c1..00000000000 --- a/res/cardsfolder/figure_of_destiny.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Figure of Destiny -ManaCost:RW -Types:Creature Kithkin -Text:no text -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/figure_of_destiny.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/filigree_angel.txt b/res/cardsfolder/filigree_angel.txt deleted file mode 100644 index b9201a467ec..00000000000 --- a/res/cardsfolder/filigree_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Filigree Angel -ManaCost:5 W W U -Types:Artifact Creature Angel -Text:no text -PT:4/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life for each artifact you control. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ X -SVar:X:Count$Valid Artifact.YouCtrl/Times.3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/filigree_angel.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/filigree_fracture.txt b/res/cardsfolder/filigree_fracture.txt deleted file mode 100644 index ad7e2ad56d1..00000000000 --- a/res/cardsfolder/filigree_fracture.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Filigree Fracture -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ SVar=DBDraw | SpellDescription$ Destroy target artifact or enchantment. If that permanent was blue or black, draw a card. -SVar:DBDraw:DB$ Draw | NumCards$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Permanent.Blue,Permanent.Black | ConditionCompare$ EQ1 | ConditionDescription$ If that permanent was blue or black, -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/filigree_fracture.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/filigree_sages.txt b/res/cardsfolder/filigree_sages.txt deleted file mode 100644 index 646158da42a..00000000000 --- a/res/cardsfolder/filigree_sages.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Filigree Sages -ManaCost:3 U -Types:Artifact Creature Vedalken Wizard -Text:no text -PT:2/3 -A:AB$ Untap | Cost$ 2 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/filigree_sages.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/44.jpg -End diff --git a/res/cardsfolder/fill_with_fright.txt b/res/cardsfolder/fill_with_fright.txt deleted file mode 100644 index 8630d882dc1..00000000000 --- a/res/cardsfolder/fill_with_fright.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fill with Fright -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | TgtPrompt$ Select a player | Mode$ TgtChoose | NumCards$ 2 | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fill_with_fright.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/filth.txt b/res/cardsfolder/filth.txt deleted file mode 100644 index 4d3702fdc9d..00000000000 --- a/res/cardsfolder/filth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Filth -ManaCost:3 B -Types:Creature Incarnation -Text:As long as Filth is in your graveyard and you control a Swamp, creatures you control have swampwalk. -PT:2/2 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/filth.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/filthy_cur.txt b/res/cardsfolder/filthy_cur.txt deleted file mode 100644 index 14662a93573..00000000000 --- a/res/cardsfolder/filthy_cur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Filthy Cur -ManaCost:1 B -Types:Creature Hound -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME is dealt damage, you lose that much life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/filthy_cur.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/final_judgment.txt b/res/cardsfolder/final_judgment.txt deleted file mode 100644 index e5c33b0dfdd..00000000000 --- a/res/cardsfolder/final_judgment.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Final Judgment -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 4 W W | ChangeType$ Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile all creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/final_judgment.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/4.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/final_revels.txt b/res/cardsfolder/final_revels.txt deleted file mode 100644 index a894ad3b283..00000000000 --- a/res/cardsfolder/final_revels.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Final Revels -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 4 B | ValidCards$ Creature | NumAtt$ +2 | PrecostDesc$ Choose one - | SpellDescription$ All creatures get +2/+0 until end of turn; -A:SP$ PumpAll | Cost$ 4 B | ValidCards$ Creature | NumDef$ -2 | PrecostDesc$ or | SpellDescription$ all creatures get -0/-2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/final_revels.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/final_sting_faerie.txt b/res/cardsfolder/final_sting_faerie.txt deleted file mode 100644 index 101c6b00e5f..00000000000 --- a/res/cardsfolder/final_sting_faerie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Final-Sting Faerie -ManaCost:3 B -Types:Creature Faerie Assassin -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target creature that was dealt damage this turn. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.wasDealtDamageThisTurn | TgtPrompt$ Select target creature that was dealt damage this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/final_sting_faerie.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/final_strike.txt b/res/cardsfolder/final_strike.txt deleted file mode 100644 index 51c132b4def..00000000000 --- a/res/cardsfolder/final_strike.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Final Strike -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Opponent | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target opponent equal to the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/final_strike.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/finest_hour.txt b/res/cardsfolder/finest_hour.txt deleted file mode 100644 index 3d4b69bfe28..00000000000 --- a/res/cardsfolder/finest_hour.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Finest Hour -ManaCost:2 G W U -Types:Enchantment -Text: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. -K:Exalted -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/finest_hour.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_ambush.txt b/res/cardsfolder/fire_ambush.txt deleted file mode 100644 index cb979693589..00000000000 --- a/res/cardsfolder/fire_ambush.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fire Ambush -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Three_Kingdoms/fire_ambush.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_ants.txt b/res/cardsfolder/fire_ants.txt deleted file mode 100644 index 7a47441ec1a..00000000000 --- a/res/cardsfolder/fire_ants.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fire Ants -ManaCost:2 R -Types:Creature Insect -Text:no text -PT:2/1 -A:AB$ DamageAll | Cost$ T | ValidCards$ Creature.withoutFlying+Other | NumDmg$ 1 | ValidDescription$ each other creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each other creature without flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_ants.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_at_will.txt b/res/cardsfolder/fire_at_will.txt deleted file mode 100644 index 8e8b6f21ac4..00000000000 --- a/res/cardsfolder/fire_at_will.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fire at Will -ManaCost:RW RW RW -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ RW RW RW | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 3 damage divided as you choose among one, two, or three target attacking or blocking creatures. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ target attacking or blocking creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ target attacking or blocking creature (3) | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_at_will.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_belly_changeling.txt b/res/cardsfolder/fire_belly_changeling.txt deleted file mode 100644 index c0365ed13ba..00000000000 --- a/res/cardsfolder/fire_belly_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fire-Belly Changeling -ManaCost:1 R -Types:Creature Shapeshifter -Text:Play this ability no more than twice each turn. -PT:1/1 -K:Changeling -A:AB$ Pump | Cost$ R | NumAtt$ +1 | ActivationLimit$ 2 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_belly_changeling.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_bowman.txt b/res/cardsfolder/fire_bowman.txt deleted file mode 100644 index 731882c4242..00000000000 --- a/res/cardsfolder/fire_bowman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fire Bowman -ManaCost:R -Types:Creature Human Soldier Archer -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_bowman.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_diamond.txt b/res/cardsfolder/fire_diamond.txt deleted file mode 100644 index f6b4354830f..00000000000 --- a/res/cardsfolder/fire_diamond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fire Diamond -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_diamond.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/284.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/267.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_dragon.txt b/res/cardsfolder/fire_dragon.txt deleted file mode 100644 index 31cadb0d474..00000000000 --- a/res/cardsfolder/fire_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Fire Dragon -ManaCost:6 R R R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to the number of Mountains you control to target creature. -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X -SVar:X:Count$TypeYouCtrl.Mountain -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_dragon.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_drake.txt b/res/cardsfolder/fire_drake.txt deleted file mode 100644 index b54dd4202af..00000000000 --- a/res/cardsfolder/fire_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fire Drake -ManaCost:1 R R -Types:Creature Drake -Text:no text -PT:1/2 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_drake.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/226.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_elemental.txt b/res/cardsfolder/fire_elemental.txt deleted file mode 100644 index 8e56c1a5fe1..00000000000 --- a/res/cardsfolder/fire_elemental.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Fire Elemental -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:5/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card15813.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/149.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/150.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/183.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/209.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/176.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/148.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/96.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_field_ogre.txt b/res/cardsfolder/fire_field_ogre.txt deleted file mode 100644 index a360952ec42..00000000000 --- a/res/cardsfolder/fire_field_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fire-Field Ogre -ManaCost:1 U B R -Types:Creature Ogre Mutant -Text:no text -PT:4/2 -K:First Strike -K:Unearth:U B R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_field_ogre.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_imp.txt b/res/cardsfolder/fire_imp.txt deleted file mode 100644 index 06ff215695b..00000000000 --- a/res/cardsfolder/fire_imp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fire Imp -ManaCost:2 R -Types:Creature Imp -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target creature. -SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4337.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_lit_thicket.txt b/res/cardsfolder/fire_lit_thicket.txt deleted file mode 100644 index 781916fe9ba..00000000000 --- a/res/cardsfolder/fire_lit_thicket.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fire-Lit Thicket -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ RG T | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -A:AB$ Mana | Cost$ RG T | Produced$ R G | SpellDescription$ Add R G to your mana pool. -A:AB$ Mana | Cost$ RG T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_lit_thicket.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_servant.txt b/res/cardsfolder/fire_servant.txt deleted file mode 100644 index 6a07f79a48e..00000000000 --- a/res/cardsfolder/fire_servant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fire Servant -ManaCost:3 R R -Types:Creature Elemental -Text:If a red instant or sorcery spell you control would deal damage, it deals double that damage instead. -PT:4/3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_servant.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_snake.txt b/res/cardsfolder/fire_snake.txt deleted file mode 100644 index 1ab9ca3d972..00000000000 --- a/res/cardsfolder/fire_snake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fire Snake -ManaCost:4 R -Types:Creature Snake -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy target land. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Common -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/fire_snake.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_sprites.txt b/res/cardsfolder/fire_sprites.txt deleted file mode 100644 index c0dd522a9ae..00000000000 --- a/res/cardsfolder/fire_sprites.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fire Sprites -ManaCost:1 G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -A:AB$ Mana | Cost$ G T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fire_sprites.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fire_tempest.txt b/res/cardsfolder/fire_tempest.txt deleted file mode 100644 index 4dd355324b5..00000000000 --- a/res/cardsfolder/fire_tempest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fire Tempest -ManaCost:5 R R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 5 R R | NumDmg$ 6 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 6 damage to each creature and each player. -SVar:Rarity:Rare -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/fire_tempest.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/97.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fireball.txt b/res/cardsfolder/fireball.txt deleted file mode 100644 index 3491cc8c86d..00000000000 --- a/res/cardsfolder/fireball.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Fireball -ManaCost:X R -Types:Sorcery -Text:Fireball deals X damage divided evenly, rounded down, among any number of target creatures and/or players.\r\nFireball costs 1 more to cast for each target beyond the first. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fireball.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/150.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/151.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/227.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/60.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/210.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/138.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/136.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/149.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fireblast.txt b/res/cardsfolder/fireblast.txt deleted file mode 100644 index ad80352b636..00000000000 --- a/res/cardsfolder/fireblast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fireblast -ManaCost:4 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 4 R R | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:AltCost:Sac<2/Mountain> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fireblast.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firebolt.txt b/res/cardsfolder/firebolt.txt deleted file mode 100644 index 0189968b8c5..00000000000 --- a/res/cardsfolder/firebolt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Firebolt -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -A:SP$ DealDamage | Cost$ 4 R | Tgt$ TgtCP | NumDmg$ 2 | Flashback$ True | CostDesc$ Flashback 4 R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card30570.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firebreathing.txt b/res/cardsfolder/firebreathing.txt deleted file mode 100644 index d9d49496472..00000000000 --- a/res/cardsfolder/firebreathing.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Firebreathing -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/firebreathing.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/151.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/152.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/228.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/211.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/181.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/200.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/137.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/177.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/150.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/174.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firecat_blitz.txt b/res/cardsfolder/firecat_blitz.txt deleted file mode 100644 index cd4a029dadf..00000000000 --- a/res/cardsfolder/firecat_blitz.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Firecat Blitz -ManaCost:X R R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ X R R | TokenAmount$ X | TokenName$ Elemental Cat | TokenTypes$ Creature,Elemental,Cat | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste<>At the beginning of the end step, exile CARDNAME. | SpellDescription$ Put X 1/1 red Elemental Cat creature tokens with haste onto the battlefield. Exile them at the beginning of the next end step. -A:SP$ Token | Cost$ R R Sac | TokenAmount$ Y | TokenName$ Elemental Cat | TokenTypes$ Creature,Elemental,Cat | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste<>At the beginning of the end step, exile CARDNAME. | Flashback$ True | CostDesc$ Flashback - R R, Sacrifice X Mountains. | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:X:Count$xPaid -SVar:Y:Sacrificed$Amount -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/firecat_blitz.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firefly.txt b/res/cardsfolder/firefly.txt deleted file mode 100644 index fcdb15a4271..00000000000 --- a/res/cardsfolder/firefly.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Firefly -ManaCost:3 R -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/firefly.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/172.jpg -End diff --git a/res/cardsfolder/firemane_angel.txt b/res/cardsfolder/firemane_angel.txt deleted file mode 100644 index bdd24187164..00000000000 --- a/res/cardsfolder/firemane_angel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Firemane Angel -ManaCost:3 W W R -Types:Creature Angel -Text:no text -PT:4/3 -K:Flying -K:First Strike -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield,Graveyard | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard or on the battlefield, you may gain 1 life. -A:AB$ ChangeZone | Cost$ 6 R R W W | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. Activate this ability only during your upkeep. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/firemane_angel.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firemaw_kavu.txt b/res/cardsfolder/firemaw_kavu.txt deleted file mode 100644 index 9c1c88465d7..00000000000 --- a/res/cardsfolder/firemaw_kavu.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Firemaw Kavu -ManaCost:5 R -Types:Creature Kavu -Text:no text -PT:4/2 -K:Echo:5 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage2pts | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDealDamage4pts | TriggerDescription$ When CARDNAME leaves the battlefield, it deals 4 damage to target creature. -SVar:TrigDealDamage2pts:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:TrigDealDamage4pts:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/firemaw_kavu.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fires_of_yavimaya.txt b/res/cardsfolder/fires_of_yavimaya.txt deleted file mode 100644 index 455ead9f231..00000000000 --- a/res/cardsfolder/fires_of_yavimaya.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fires of Yavimaya -ManaCost:1 R G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Haste:No Condition:Creatures you control have haste. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fires_of_yavimaya.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/246.jpg -End diff --git a/res/cardsfolder/firescreamer.txt b/res/cardsfolder/firescreamer.txt deleted file mode 100644 index d404f4a1cbd..00000000000 --- a/res/cardsfolder/firescreamer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Firescreamer -ManaCost:3 B -Types:Creature Kavu -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/firescreamer.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/106.jpg -End diff --git a/res/cardsfolder/fireshrieker.txt b/res/cardsfolder/fireshrieker.txt deleted file mode 100644 index 385bfecbc29..00000000000 --- a/res/cardsfolder/fireshrieker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fireshrieker -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature has double strike. -K:eqPump 2:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fireshrieker.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fireslinger.txt b/res/cardsfolder/fireslinger.txt deleted file mode 100644 index ea86cf3a6bc..00000000000 --- a/res/cardsfolder/fireslinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fireslinger -ManaCost:1 R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ Fireslinger deals 1 damage to target creature or player and 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fireslinger.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/173.jpg -End diff --git a/res/cardsfolder/firestorm.txt b/res/cardsfolder/firestorm.txt deleted file mode 100644 index eaa5da51dc4..00000000000 --- a/res/cardsfolder/firestorm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Firestorm -ManaCost:R -Types:Instant -Text:As an additional cost to cast CARDNAME, discard X cards.\r\n\r\nCARDNAME deals X damage to each of X target creatures and/or players. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/firestorm.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firestorm_hellkite.txt b/res/cardsfolder/firestorm_hellkite.txt deleted file mode 100644 index e08371941f5..00000000000 --- a/res/cardsfolder/firestorm_hellkite.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Firestorm Hellkite -ManaCost:4 U R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -K:Trample -K:Cumulative upkeep:U R -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/firestorm_hellkite.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firewake_sliver.txt b/res/cardsfolder/firewake_sliver.txt deleted file mode 100644 index 42517da699f..00000000000 --- a/res/cardsfolder/firewake_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Firewake Sliver -ManaCost:1 R G -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/Haste:no Condition:All Slivers have haste. -K:stPumpAll:Sliver:0/0/SVar=Pump:no Condition:All Slivers have "1, Sacrifice this permanent: Target Sliver creature gets +2/+2 until end of turn." -SVar:Pump:AB$Pump | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Sliver | TgtPrompt$ Choose target Sliver. | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ Target Sliver creature gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/firewake_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/firewild_borderpost.txt b/res/cardsfolder/firewild_borderpost.txt deleted file mode 100644 index b9e811c48d2..00000000000 --- a/res/cardsfolder/firewild_borderpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Firewild Borderpost -ManaCost:1 R G -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:AltCost:1 Return<1/Land.Basic>$You may pay 1 and return a basic land you control to its owner's hand rather than pay Firewild Borderpost's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/firewild_borderpost.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/first_volley.txt b/res/cardsfolder/first_volley.txt deleted file mode 100644 index 379a14f606c..00000000000 --- a/res/cardsfolder/first_volley.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:First Volley -ManaCost:1 R -Types:Instant Arcane -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature and 1 damage to that creature's controller. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ 1 | Defined$ TargetedController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/first_volley.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/100.jpg -End diff --git a/res/cardsfolder/fishliver_oil.txt b/res/cardsfolder/fishliver_oil.txt deleted file mode 100644 index 537d3e46d83..00000000000 --- a/res/cardsfolder/fishliver_oil.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fishliver Oil -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Islandwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fishliver_oil.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/77.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/17.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/fissure.txt b/res/cardsfolder/fissure.txt deleted file mode 100644 index b503b61efe0..00000000000 --- a/res/cardsfolder/fissure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fissure -ManaCost:3 R R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Creature,Land | TgtPrompt$ Select target creature or land | NoRegen$ True | SpellDescription$ Destroy target creature or land. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fissure.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/62.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/212.jpg -End diff --git a/res/cardsfolder/fissure_vent.txt b/res/cardsfolder/fissure_vent.txt deleted file mode 100644 index 43e0ed9cbf2..00000000000 --- a/res/cardsfolder/fissure_vent.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fissure Vent -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Choose one - destroy target artifact; -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ or destroy target nonbasic land; -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBDestroy | SpellDescription$ or destroy target artifact and destroy target land. -SVar:DBDestroy:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fissure_vent.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fistful_of_force.txt b/res/cardsfolder/fistful_of_force.txt deleted file mode 100644 index 5aca16ab262..00000000000 --- a/res/cardsfolder/fistful_of_force.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fistful of Force -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | Tgt$ TgtC | NumAtt$ 2 | NumDef$ 2 | SubAbility$ SVar=DBClash | SpellDescription$ 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. -SVar:DBClash:DB$Clash | WinSubAbility$ AdditionalPump -SVar:AdditionalPump:DB$Pump | Defined$ Targeted | NumAtt$ 2 | NumDef$ 2 | KW$ Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fistful_of_force.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fists_of_ironwood.txt b/res/cardsfolder/fists_of_ironwood.txt deleted file mode 100644 index a174d963061..00000000000 --- a/res/cardsfolder/fists_of_ironwood.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fists of Ironwood -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 1/1 green Saproling creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fists_of_ironwood.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fists_of_the_anvil.txt b/res/cardsfolder/fists_of_the_anvil.txt deleted file mode 100644 index d9e19e9d65f..00000000000 --- a/res/cardsfolder/fists_of_the_anvil.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fists of the Anvil -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | SpellDescription$ Target creature gets +4/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fists_of_the_anvil.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/91.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/201.jpg -End diff --git a/res/cardsfolder/fists_of_the_demigod.txt b/res/cardsfolder/fists_of_the_demigod.txt deleted file mode 100644 index d795619e174..00000000000 --- a/res/cardsfolder/fists_of_the_demigod.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fists of the Demigod -ManaCost:1 BR -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Black:1/1/Wither:No Condition: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.) -K:stPumpEnchanted:Creature.Red:1/1/First Strike:No Condition:As long as enchanted creature is red, it gets +1/+1 and has first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fists_of_the_demigod.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fit_of_rage.txt b/res/cardsfolder/fit_of_rage.txt deleted file mode 100644 index 23b8b26a037..00000000000 --- a/res/cardsfolder/fit_of_rage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fit of Rage -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ First Strike | SpellDescription$ Target creature gets +3/+3 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fit_of_rage.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/102.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/178.jpg -End diff --git a/res/cardsfolder/flagstones_of_trokair.txt b/res/cardsfolder/flagstones_of_trokair.txt deleted file mode 100644 index 80cb39ebc66..00000000000 --- a/res/cardsfolder/flagstones_of_trokair.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flagstones of Trokair -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Card.Plains | ChangeNum$ 1 -SVar:SacMe:3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flagstones_of_trokair.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flailing_manticore.txt b/res/cardsfolder/flailing_manticore.txt deleted file mode 100644 index 802b4c1a8cc..00000000000 --- a/res/cardsfolder/flailing_manticore.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Flailing Manticore -ManaCost:3 R -Types:Creature Manticore -Text:no text -PT:3/3 -K:Flying -K:First Strike -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. -A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_manticore.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/187.jpg -End diff --git a/res/cardsfolder/flailing_ogre.txt b/res/cardsfolder/flailing_ogre.txt deleted file mode 100644 index d5ce13da9a5..00000000000 --- a/res/cardsfolder/flailing_ogre.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flailing Ogre -ManaCost:2 R -Types:Creature Ogre -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. -A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_ogre.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flailing_soldier.txt b/res/cardsfolder/flailing_soldier.txt deleted file mode 100644 index 0028706a6a4..00000000000 --- a/res/cardsfolder/flailing_soldier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flailing Soldier -ManaCost:R -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ +1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Any player may activate this ability. -A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ -1 | AnyPlayer$ True | SpellDescription$ CARDNAME gets -1/-1 until end of turn. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flailing_soldier.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flame_burst.txt b/res/cardsfolder/flame_burst.txt deleted file mode 100644 index 834c9eb8e8f..00000000000 --- a/res/cardsfolder/flame_burst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flame Burst -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player, where X is 2 plus the number of cards named CARDNAME in all graveyards. -SVar:X:Count$NamedInAllYards.Flame Burst/Plus.Y -SVar:Y:Count$NamedInAllYards.Pardic Firecat/Plus.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_burst.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/194.jpg -End diff --git a/res/cardsfolder/flame_elemental.txt b/res/cardsfolder/flame_elemental.txt deleted file mode 100644 index a215edc86c7..00000000000 --- a/res/cardsfolder/flame_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flame Elemental -ManaCost:2 R R -Types:Creature Elemental -Text:no text -PT:3/2 -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_elemental.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flame_jab.txt b/res/cardsfolder/flame_jab.txt deleted file mode 100644 index 003bc700af1..00000000000 --- a/res/cardsfolder/flame_jab.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flame Jab -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -A:SP$ DealDamage | Cost$ R Discard<1/Land> | ActivatingZone$ Graveyard | CostDesc$ Retrace | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_jab.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flame_javelin.txt b/res/cardsfolder/flame_javelin.txt deleted file mode 100644 index eeea3a7b882..00000000000 --- a/res/cardsfolder/flame_javelin.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flame Javelin -ManaCost:2/R 2/R 2/R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2/R 2/R 2/R | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_javelin.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/92.jpg -End diff --git a/res/cardsfolder/flame_jet.txt b/res/cardsfolder/flame_jet.txt deleted file mode 100644 index b9a91c5fd36..00000000000 --- a/res/cardsfolder/flame_jet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flame Jet -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target player. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_jet.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/81.jpg -End diff --git a/res/cardsfolder/flame_kin_zealot.txt b/res/cardsfolder/flame_kin_zealot.txt deleted file mode 100644 index 13f7dd9e242..00000000000 --- a/res/cardsfolder/flame_kin_zealot.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flame-Kin Zealot -ManaCost:1 R R W -Types:Creature Elemental Berserker -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control get +1/+1 and haste until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Haste -SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_kin_zealot.jpg -SVar:Rarity:Uncommon -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/206.jpg -End diff --git a/res/cardsfolder/flame_rift.txt b/res/cardsfolder/flame_rift.txt deleted file mode 100644 index ebcd4bec878..00000000000 --- a/res/cardsfolder/flame_rift.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flame Rift -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 4 | ValidPlayers$ Each | ValidDescription$ each player. | SpellDescription$ CARDNAME deals 4 damage to each player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_rift.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flame_slash.txt b/res/cardsfolder/flame_slash.txt deleted file mode 100644 index 2846c830948..00000000000 --- a/res/cardsfolder/flame_slash.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flame Slash -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ Flame Slash deals 4 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_slash.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/145.jpg -End diff --git a/res/cardsfolder/flame_spirit.txt b/res/cardsfolder/flame_spirit.txt deleted file mode 100644 index 14e7dc9114f..00000000000 --- a/res/cardsfolder/flame_spirit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flame Spirit -ManaCost:4 R -Types:Creature Elemental Spirit -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flame_spirit.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/229.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/179.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/184.jpg -End diff --git a/res/cardsfolder/flameblast_dragon.txt b/res/cardsfolder/flameblast_dragon.txt deleted file mode 100644 index 757abb44137..00000000000 --- a/res/cardsfolder/flameblast_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Flameblast Dragon -ManaCost:4 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, you may pay X R. If you do, Flameblast Dragon deals X damage to target creature or player. -SVar:TrigDamage:AB$ DealDamage | Cost$ X R | Tgt$ TgtCP | NumDmg$ X -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flameblast_dragon.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flameborn_hellion.txt b/res/cardsfolder/flameborn_hellion.txt deleted file mode 100644 index 914e58a6e33..00000000000 --- a/res/cardsfolder/flameborn_hellion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flameborn Hellion -ManaCost:5 R -Types:Creature Hellion -Text:no text -PT:5/4 -K:Haste -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flameborn_hellion.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flameborn_viron.txt b/res/cardsfolder/flameborn_viron.txt deleted file mode 100644 index 6726ea7a16d..00000000000 --- a/res/cardsfolder/flameborn_viron.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flameborn Viron -ManaCost:4 R R -Types:Creature Insect -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flameborn_viron.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flamebreak.txt b/res/cardsfolder/flamebreak.txt deleted file mode 100644 index e1d86bf7d73..00000000000 --- a/res/cardsfolder/flamebreak.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flamebreak -ManaCost:R R R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ R R R | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | NumDmg$ 3 | NoRegen$ True | SpellDescription$ CARDNAME deals 3 damage to each creature without flying and each player. Creatures dealt damage this way can't be regenerated this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamebreak.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flamecore_elemental.txt b/res/cardsfolder/flamecore_elemental.txt deleted file mode 100644 index ccd5c610ef5..00000000000 --- a/res/cardsfolder/flamecore_elemental.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flamecore Elemental -ManaCost:2 R R -Types:Creature Elemental -Text:no text -PT:5/4 -K:Echo:2 R R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamecore_elemental.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flamekin_brawler.txt b/res/cardsfolder/flamekin_brawler.txt deleted file mode 100644 index 085e14ad11a..00000000000 --- a/res/cardsfolder/flamekin_brawler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flamekin Brawler -ManaCost:R -Types:Creature Elemental Warrior -Text:no text -PT:0/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamekin_brawler.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/166.jpg -End diff --git a/res/cardsfolder/flamekin_harbinger.txt b/res/cardsfolder/flamekin_harbinger.txt deleted file mode 100644 index 47c1edec69b..00000000000 --- a/res/cardsfolder/flamekin_harbinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flamekin Harbinger -ManaCost:R -Types:Creature Elemental Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a Elemental card, reveal it, then shuffle your library and put that card on top of it. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Elemental | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamekin_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flamekin_spitfire.txt b/res/cardsfolder/flamekin_spitfire.txt deleted file mode 100644 index a063e8c5b93..00000000000 --- a/res/cardsfolder/flamekin_spitfire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flamekin Spitfire -ManaCost:1 R -Types:Creature Elemental Shaman -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamekin_spitfire.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flameshot.txt b/res/cardsfolder/flameshot.txt deleted file mode 100644 index c81ca39503c..00000000000 --- a/res/cardsfolder/flameshot.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Flameshot -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 4 damage divided as you choose among any number of target creatures and/or players. -A:SP$ DealDamage | Cost$ Discard<1/Mountain> | ValidTgts$ Creature | TgtPrompt$ Select target creature(1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | CostDesc$ You may discard a Mountain card rather than pay CARDNAME's mana cost | SpellDescription$   -SVar:DBDamage2:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature (3) | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flameshot.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/90.jpg -End diff --git a/res/cardsfolder/flametongue_kavu.txt b/res/cardsfolder/flametongue_kavu.txt deleted file mode 100644 index fcdb7963afe..00000000000 --- a/res/cardsfolder/flametongue_kavu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flametongue Kavu -ManaCost:3 R -Types:Creature Kavu -Text:no text -PT:4/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 4 damage to target creature. -SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ps/en-us/card26262.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flamewave_invoker.txt b/res/cardsfolder/flamewave_invoker.txt deleted file mode 100644 index 1503afedfa6..00000000000 --- a/res/cardsfolder/flamewave_invoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flamewave Invoker -ManaCost:2 R -Types:Creature Goblin Mutant -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 7 R | Tgt$ TgtP | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flamewave_invoker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/92.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flaming_sword.txt b/res/cardsfolder/flaming_sword.txt deleted file mode 100644 index 3892890ebfa..00000000000 --- a/res/cardsfolder/flaming_sword.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flaming Sword -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+0/First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flaming_sword.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flanking_troops.txt b/res/cardsfolder/flanking_troops.txt deleted file mode 100644 index 4f83fa5df3a..00000000000 --- a/res/cardsfolder/flanking_troops.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flanking Troops -ManaCost:2 W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME attacks, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flanking_troops.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flare.txt b/res/cardsfolder/flare.txt deleted file mode 100644 index 32c88c7ec66..00000000000 --- a/res/cardsfolder/flare.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flare -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Flare deals 1 damage to target creature or player. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flare.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/230.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/176.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flaring_flame_kin.txt b/res/cardsfolder/flaring_flame_kin.txt deleted file mode 100644 index e25b0be6f7a..00000000000 --- a/res/cardsfolder/flaring_flame_kin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flaring Flame-Kin -ManaCost:2 R -Types:Creature Elemental Warrior -Text:no text -PT:2/2 -K:stPumpSelf:Creature:+2/+2/Trample & SVar=ABPump:isPresent Card.enchanted+Self:As long as CARDNAME is enchanted, it gets +2/+2, has trample, and has "R: CARDNAME gets +1/+0 until end of turn." -SVar:ABPump:AB$Pump | Cost$ R | Defined$ Self | NumAtt$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:EnchantMe:Once -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flaring_flame_kin.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flash_counter.txt b/res/cardsfolder/flash_counter.txt deleted file mode 100644 index adeffe06111..00000000000 --- a/res/cardsfolder/flash_counter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flash Counter -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Instant spell | ValidTgts$ Instant | SpellDescription$ Counter target instant spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_counter.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/78.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flash_flood.txt b/res/cardsfolder/flash_flood.txt deleted file mode 100644 index 36c817cb60e..00000000000 --- a/res/cardsfolder/flash_flood.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flash Flood -ManaCost:U -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ U | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent | PrecostDesc$ Choose one - | SpellDescription$ Destroy target red permanent; -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Mountain | TgtPrompt$ Select target Mountain | Origin$ Battlefield | Destination$ Hand | SpellDescription$ or return target Mountain to its owner's hand. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_flood.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flash_of_defiance.txt b/res/cardsfolder/flash_of_defiance.txt deleted file mode 100644 index 9fb7ab58b94..00000000000 --- a/res/cardsfolder/flash_of_defiance.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flash of Defiance -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 R | ValidCards$ Creature.Green,Creature.White | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Green creatures and white creatures can't block this turn. -A:SP$ PumpAll | Cost$ 1 R PayLife<3> | ValidCards$ Creature.Green,Creature.White | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | Flashback$ True | CostDesc$ Flashback 1 R, Pay 3 life | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flash_of_defiance.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flashfires.txt b/res/cardsfolder/flashfires.txt deleted file mode 100644 index 3c55c2f0c4b..00000000000 --- a/res/cardsfolder/flashfires.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Flashfires -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Plains | SpellDescription$ Destroy all Plains. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flashfires.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/186.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/152.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/153.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/213.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/134.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/183.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/180.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/151.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/231.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flashfreeze.txt b/res/cardsfolder/flashfreeze.txt deleted file mode 100644 index 2dea037e36f..00000000000 --- a/res/cardsfolder/flashfreeze.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flashfreeze -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Red or Green spell | ValidTgts$ Card.Red,Card.Green | SpellDescription$ Counter target red or green spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flashfreeze.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/53.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/53.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/33.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flayed_nim.txt b/res/cardsfolder/flayed_nim.txt deleted file mode 100644 index d0fa2e4d157..00000000000 --- a/res/cardsfolder/flayed_nim.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Flayed Nim -ManaCost:3 B -Types:Creature Skeleton -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ 2 B | SpellDescription$ Regenerate CARDNAME. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, that creature's controller loses that much life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredTargetController | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flayed_nim.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flayer_husk.txt b/res/cardsfolder/flayer_husk.txt deleted file mode 100644 index 08c4bd31124..00000000000 --- a/res/cardsfolder/flayer_husk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flayer Husk -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1. -K:eqPump 2:+1/+1 -K:Living Weapon -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flayer_husk.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_djinn.txt b/res/cardsfolder/fledgling_djinn.txt deleted file mode 100644 index 7290ff0daf3..00000000000 --- a/res/cardsfolder/fledgling_djinn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fledgling Djinn -ManaCost:1 B -Types:Creature Djinn -Text:no text -PT:2/2 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/wl/en-us/card4457.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_dragon.txt b/res/cardsfolder/fledgling_dragon.txt deleted file mode 100644 index f8fa22dd1b8..00000000000 --- a/res/cardsfolder/fledgling_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fledgling Dragon -ManaCost:2 R R -Types:Creature Dragon -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Creature:3/3/SVar=Pump:Threshold: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." -SVar:Pump:AB$Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fledgling_dragon.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_griffin.txt b/res/cardsfolder/fledgling_griffin.txt deleted file mode 100644 index 5715b8230f5..00000000000 --- a/res/cardsfolder/fledgling_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fledgling Griffin -ManaCost:1 W -Types:Creature Griffin -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Flying -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fledgling_griffin.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_imp.txt b/res/cardsfolder/fledgling_imp.txt deleted file mode 100644 index 28bf0a30077..00000000000 --- a/res/cardsfolder/fledgling_imp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fledgling Imp -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ B Discard<1/Card> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fledgling_imp.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_mawcor.txt b/res/cardsfolder/fledgling_mawcor.txt deleted file mode 100644 index c07f814af03..00000000000 --- a/res/cardsfolder/fledgling_mawcor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fledgling Mawcor -ManaCost:3 U -Types:Creature Beast -Text:no text -PT:2/2 -K:Flying -K:Morph:U U -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fledgling_mawcor.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fledgling_osprey.txt b/res/cardsfolder/fledgling_osprey.txt deleted file mode 100644 index 3975a8b80d9..00000000000 --- a/res/cardsfolder/fledgling_osprey.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fledgling Osprey -ManaCost:U -Types:Creature Bird -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/0/Flying:isEnchanted:Fledgling Osprey has flying as long as it's enchanted. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fledgling_osprey.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleet_footed_monk.txt b/res/cardsfolder/fleet_footed_monk.txt deleted file mode 100644 index 58bd70f560e..00000000000 --- a/res/cardsfolder/fleet_footed_monk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fleet-Footed Monk -ManaCost:1 W -Types:Creature Human Monk -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by creatures with power 2 or greater. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/fleet_footed_monk.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleetfoot_panther.txt b/res/cardsfolder/fleetfoot_panther.txt deleted file mode 100644 index 084bb31e391..00000000000 --- a/res/cardsfolder/fleetfoot_panther.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fleetfoot Panther -ManaCost:1 G W -Types:Creature Cat -Text:no text -PT:3/4 -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a green or white creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.White+YouCtrl,Creature.Green+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleetfoot_panther.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleeting_aven.txt b/res/cardsfolder/fleeting_aven.txt deleted file mode 100644 index 00a2dad6c39..00000000000 --- a/res/cardsfolder/fleeting_aven.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fleeting Aven -ManaCost:1 U U -Types:Creature Bird Wizard -Text:no text -PT:2/2 -K:Flying -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, return CARDNAME to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleeting_aven.jpg -SVar:Rarity:Uncommon -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/83.jpg -End diff --git a/res/cardsfolder/fleeting_distraction.txt b/res/cardsfolder/fleeting_distraction.txt deleted file mode 100644 index 65ff1cdec47..00000000000 --- a/res/cardsfolder/fleeting_distraction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fleeting Distraction -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-0 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleeting_distraction.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/67.jpg -End diff --git a/res/cardsfolder/fleeting_image.txt b/res/cardsfolder/fleeting_image.txt deleted file mode 100644 index 60aca115bec..00000000000 --- a/res/cardsfolder/fleeting_image.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Fleeting Image -ManaCost:2 U -Types:Creature Illusion -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ 1 U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleeting_image.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/79.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/74.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/31.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flensermite.txt b/res/cardsfolder/flensermite.txt deleted file mode 100644 index 315d180166b..00000000000 --- a/res/cardsfolder/flensermite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flensermite -ManaCost:1 B -Types:Creature Gremlin -Text:no text -PT:1/1 -K:Infect -K:Lifelink -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flensermite.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flesh_allergy.txt b/res/cardsfolder/flesh_allergy.txt deleted file mode 100644 index 686e3505611..00000000000 --- a/res/cardsfolder/flesh_allergy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flesh Allergy -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Creature | SubAbility$ SVar=DBLoseLife | SpellDescription$ Destroy target creature. Its controller loses life equal to the number of creatures put into all graveyards from the battlefield this turn. -SVar:DBLoseLife:DB$LoseLife | Defined$ TargetedController | LifeAmount$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flesh_allergy.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flesh_eater_imp.txt b/res/cardsfolder/flesh_eater_imp.txt deleted file mode 100644 index ac19173c3c5..00000000000 --- a/res/cardsfolder/flesh_eater_imp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flesh-Eater Imp -ManaCost:3 B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -K:Infect -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flesh_eater_imp.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleshbag_marauder.txt b/res/cardsfolder/fleshbag_marauder.txt deleted file mode 100644 index 6f554a5298e..00000000000 --- a/res/cardsfolder/fleshbag_marauder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fleshbag Marauder -ManaCost:2 B -Types:Creature Zombie Warrior -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each player sacrifices a creature. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ Each | SacValid$ Creature -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshbag_marauder.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleshformer.txt b/res/cardsfolder/fleshformer.txt deleted file mode 100644 index 887bd5b48c4..00000000000 --- a/res/cardsfolder/fleshformer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fleshformer -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ W U B R G | NumAtt$ +2 | NumDef$ +2 | KW$ Fear | ActivationLimit$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ CARDNAME gets +2/+2 and gains fear until end of turn. -SVar:DBPump:DB$Pump | Cost$ 0 | NumAtt$ -2 | NumDef$ -2 | Tgt$ TgtC | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. Activate this ability only once each turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshformer.jpg -SVar:Rarity:Uncommon -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/45.jpg -End diff --git a/res/cardsfolder/fleshgrafter.txt b/res/cardsfolder/fleshgrafter.txt deleted file mode 100644 index d1600234cc3..00000000000 --- a/res/cardsfolder/fleshgrafter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fleshgrafter -ManaCost:2 B -Types:Creature Human Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Discard<1/Artifact> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshgrafter.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fleshwrither.txt b/res/cardsfolder/fleshwrither.txt deleted file mode 100644 index 33bfbe22f99..00000000000 --- a/res/cardsfolder/fleshwrither.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fleshwrither -ManaCost:2 B B -Types:Creature Horror -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ 1 B B Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQ4 | ChangeNum$ 1 | SorcerySpeed$ True | SpellDescription$ 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fleshwrither.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flicker.txt b/res/cardsfolder/flicker.txt deleted file mode 100644 index c77ed99bc7c..00000000000 --- a/res/cardsfolder/flicker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flicker -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Permanent.nonToken | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target nontoken permanent | SubAbility$ SVar=DBReturn | RememberTargets$ True | SpellDescription$ Exile target nontoken permanent, then return it to the battlefield under its owner's control. -SVar:DBReturn:DB$ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flicker.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flickerwisp.txt b/res/cardsfolder/flickerwisp.txt deleted file mode 100644 index 86fa9387635..00000000000 --- a/res/cardsfolder/flickerwisp.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Flickerwisp -ManaCost:1 W W -Types:Creature Elemental -Text:no text -PT:3/1 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Creature.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME 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. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Other | Mandatory$ True | TgtPrompt$ Select another target permanent | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ SVar=DelTrig -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return exiled permanent to the battlefield. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flickerwisp.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flight.txt b/res/cardsfolder/flight.txt deleted file mode 100644 index 8a420a1d044..00000000000 --- a/res/cardsfolder/flight.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Flight -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flight.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/80.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/59.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/59.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/75.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/86.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/72.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/79.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/68.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/59.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flight_of_fancy.txt b/res/cardsfolder/flight_of_fancy.txt deleted file mode 100644 index 01a87b21778..00000000000 --- a/res/cardsfolder/flight_of_fancy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flight of Fancy -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flight_of_fancy.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flight_spellbomb.txt b/res/cardsfolder/flight_spellbomb.txt deleted file mode 100644 index b67521b80fc..00000000000 --- a/res/cardsfolder/flight_spellbomb.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flight Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay U. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ U | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flight_spellbomb.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fling.txt b/res/cardsfolder/fling.txt deleted file mode 100644 index e28e92c0655..00000000000 --- a/res/cardsfolder/fling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fling -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the sacrificed creature's power to target creature or player. -SVar:X:Sacrificed$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fling.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/139.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flint_golem.txt b/res/cardsfolder/flint_golem.txt deleted file mode 100644 index fd949b82951..00000000000 --- a/res/cardsfolder/flint_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flint Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:2/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player puts the top three cards of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flint_golem.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/floating_dream_zubera.txt b/res/cardsfolder/floating_dream_zubera.txt deleted file mode 100644 index 1c34cb1bb44..00000000000 --- a/res/cardsfolder/floating_dream_zubera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Floating-Dream Zubera -ManaCost:1 U -Types:Creature Zubera Spirit -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card for each Zubera put into a graveyard from the battlefield this turn. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Card.Zubera -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80507.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flood.txt b/res/cardsfolder/flood.txt deleted file mode 100644 index adbb35aa53c..00000000000 --- a/res/cardsfolder/flood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flood -ManaCost:U -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ U U | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying | SpellDescription$ Tap target creature without flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flood.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/87.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/26.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/73.jpg -End diff --git a/res/cardsfolder/flood_plain.txt b/res/cardsfolder/flood_plain.txt deleted file mode 100644 index 25570163747..00000000000 --- a/res/cardsfolder/flood_plain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flood Plain -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Island | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains or Island card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flood_plain.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/floodbringer.txt b/res/cardsfolder/floodbringer.txt deleted file mode 100644 index 7cab6a67a9b..00000000000 --- a/res/cardsfolder/floodbringer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Floodbringer -ManaCost:1 U -Types:Creature Moonfolk Wizard -Text:no text -PT:1/2 -K:Flying -A:AB$ Tap | Cost$ 2 Return<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Tap target land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/floodbringer.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/34.jpg -End diff --git a/res/cardsfolder/flooded_grove.txt b/res/cardsfolder/flooded_grove.txt deleted file mode 100644 index 0e1688c9df5..00000000000 --- a/res/cardsfolder/flooded_grove.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Flooded Grove -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ GU T | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -A:AB$ Mana | Cost$ GU T | Produced$ U G | SpellDescription$ Add U G to your mana pool. -A:AB$ Mana | Cost$ GU T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_grove.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flooded_shoreline.txt b/res/cardsfolder/flooded_shoreline.txt deleted file mode 100644 index 60687dd936f..00000000000 --- a/res/cardsfolder/flooded_shoreline.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flooded Shoreline -ManaCost:U U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ U U Return<2/Island> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_shoreline.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flooded_strand.txt b/res/cardsfolder/flooded_strand.txt deleted file mode 100644 index c4b5ca7146d..00000000000 --- a/res/cardsfolder/flooded_strand.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flooded Strand -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Island | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains or Island card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flooded_strand.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/floodwater_dam.txt b/res/cardsfolder/floodwater_dam.txt deleted file mode 100644 index 0cf15553292..00000000000 --- a/res/cardsfolder/floodwater_dam.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Floodwater Dam -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ X X 1 T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target Land | SpellDescription$ Tap X target lands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/floodwater_dam.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flourishing_defenses.txt b/res/cardsfolder/flourishing_defenses.txt deleted file mode 100644 index abb564caa43..00000000000 --- a/res/cardsfolder/flourishing_defenses.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flourishing Defenses -ManaCost:4 G -Types:Enchantment -Text:no text -T:Mode$ CounterAdded | ValidCard$ Creature | TriggerZones$ Battlefield | CounterType$ M1M1 | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever a -1/-1 counter is placed on a creature, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flourishing_defenses.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flow_of_ideas.txt b/res/cardsfolder/flow_of_ideas.txt deleted file mode 100644 index 3170efe4cfb..00000000000 --- a/res/cardsfolder/flow_of_ideas.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Flow of Ideas -ManaCost:5 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 5 U | NumCards$ X | SpellDescription$ Draw a card for each Island you control. -SVar:X:Count$TypeYouCtrl.Island -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flow_of_ideas.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/50.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/38.jpg -End diff --git a/res/cardsfolder/flow_of_maggots.txt b/res/cardsfolder/flow_of_maggots.txt deleted file mode 100644 index 4dd11d776b4..00000000000 --- a/res/cardsfolder/flow_of_maggots.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flow of Maggots -ManaCost:2 B -Types:Creature Insect -Text:CARDNAME can't be blocked by non-Wall creatures. -PT:2/2 -K:Cumulative upkeep:1 -K:CantBeBlockedBy Creature.nonWall -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flow_of_maggots.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_blade.txt b/res/cardsfolder/flowstone_blade.txt deleted file mode 100644 index a3f65355740..00000000000 --- a/res/cardsfolder/flowstone_blade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Blade -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ Enchanted creature gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_blade.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_charger.txt b/res/cardsfolder/flowstone_charger.txt deleted file mode 100644 index 29dd38ab1f1..00000000000 --- a/res/cardsfolder/flowstone_charger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Charger -ManaCost:2 R W -Types:Creature Beast -Text:no text -PT:2/5 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +3/-3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +3 | NumDef$ -3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_charger.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_crusher.txt b/res/cardsfolder/flowstone_crusher.txt deleted file mode 100644 index a833c52f8ea..00000000000 --- a/res/cardsfolder/flowstone_crusher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Crusher -ManaCost:3 R R -Types:Creature Beast -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_crusher.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/81.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/184.jpg -End diff --git a/res/cardsfolder/flowstone_embrace.txt b/res/cardsfolder/flowstone_embrace.txt deleted file mode 100644 index 2f9feb63c17..00000000000 --- a/res/cardsfolder/flowstone_embrace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Embrace -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ T | Defined$ Enchanted | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ Enchanted creature gets +2/-2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_embrace.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_flood.txt b/res/cardsfolder/flowstone_flood.txt deleted file mode 100644 index 9eeaca15c46..00000000000 --- a/res/cardsfolder/flowstone_flood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Flood -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -A:SP$ Destroy | Cost$ 3 R PayLife<3> Discard<1/Random> | ValidTgts$ Land | TgtPrompt$ Select target land | CostDesc$ Buyback-Pay 3 life, Discard a card at random. | SubAbility$ SVar=DBBuyback | SpellDescription$ (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.) -SVar:DBBuyback:DB$ ChangeZone | Cost$ 0 | Origin$ Stack | Destination$ Hand | ValidCard$ Card.Self -SVar:Rarity:Uncommon -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/83.jpg -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_flood.jpg -End diff --git a/res/cardsfolder/flowstone_giant.txt b/res/cardsfolder/flowstone_giant.txt deleted file mode 100644 index a701784b43e..00000000000 --- a/res/cardsfolder/flowstone_giant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flowstone Giant -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ R | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_giant.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/174.jpg -End diff --git a/res/cardsfolder/flowstone_hellion.txt b/res/cardsfolder/flowstone_hellion.txt deleted file mode 100644 index a1055c9b144..00000000000 --- a/res/cardsfolder/flowstone_hellion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Hellion -ManaCost:4 R -Types:Creature Hellion Beast -Text:no text -PT:3/3 -K:Haste -A:AB$ Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_hellion.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/84.jpg -End diff --git a/res/cardsfolder/flowstone_mauler.txt b/res/cardsfolder/flowstone_mauler.txt deleted file mode 100644 index f096e7ad22d..00000000000 --- a/res/cardsfolder/flowstone_mauler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Mauler -ManaCost:4 R R -Types:Creature Beast -Text:no text -PT:4/5 -K:Trample -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_mauler.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/85.jpg -End diff --git a/res/cardsfolder/flowstone_overseer.txt b/res/cardsfolder/flowstone_overseer.txt deleted file mode 100644 index fe5fe92e400..00000000000 --- a/res/cardsfolder/flowstone_overseer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flowstone Overseer -ManaCost:2 R R R -Types:Creature Beast -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ Target creature gets +1/-1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_overseer.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/82.jpg -End diff --git a/res/cardsfolder/flowstone_salamander.txt b/res/cardsfolder/flowstone_salamander.txt deleted file mode 100644 index 3ef3d28ed45..00000000000 --- a/res/cardsfolder/flowstone_salamander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flowstone Salamander -ManaCost:3 R R -Types:Creature Salamander -Text:no text -PT:3/4 -A:AB$ DealDamage | Cost$ R | ValidTgts$ Creature.blockingSource | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature blocking it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_salamander.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_sculpture.txt b/res/cardsfolder/flowstone_sculpture.txt deleted file mode 100644 index c78eec8ec1b..00000000000 --- a/res/cardsfolder/flowstone_sculpture.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Flowstone Sculpture -ManaCost:6 -Types:Artifact Creature Shapeshifter -Text:no text -PT:4/4 -A:AB$ PutCounter | Cost$ 2 Discard<1/Card> | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME -A:AB$ Pump | Cost$ 2 Discard<1/Card> | Defined$ Self | KW$ Flying | Permanent$ True | SpellDescription$ or CARDNAME gains flying -A:AB$ Pump | Cost$ 2 Discard<1/Card> | Defined$ Self | KW$ First Strike | Permanent$ True | SpellDescription$ or CARDNAME gains first strike -A:AB$ Pump | Cost$ 2 Discard<1/Card> | Defined$ Self | KW$ Trample | Permanent$ True | SpellDescription$ or CARDNAME gains trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_sculpture.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_shambler.txt b/res/cardsfolder/flowstone_shambler.txt deleted file mode 100644 index 0397511bd45..00000000000 --- a/res/cardsfolder/flowstone_shambler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Shambler -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_shambler.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/86.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/185.jpg -End diff --git a/res/cardsfolder/flowstone_slide.txt b/res/cardsfolder/flowstone_slide.txt deleted file mode 100644 index e289e6b0194..00000000000 --- a/res/cardsfolder/flowstone_slide.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Flowstone Slide -ManaCost:X 2 R R -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ X 2 R R | ValidCards$ Creature | IsCurse$ True | NumAtt$ +X | NumDef$ -X | SpellDescription$ All Creatures get +X/-X until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_slide.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/83.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/186.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_strike.txt b/res/cardsfolder/flowstone_strike.txt deleted file mode 100644 index 22bdcb45cf5..00000000000 --- a/res/cardsfolder/flowstone_strike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Flowstone Strike -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ -1 | KW$ Haste | SpellDescription$ Target creature gets +1/-1 and gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_strike.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/84.jpg -End diff --git a/res/cardsfolder/flowstone_surge.txt b/res/cardsfolder/flowstone_surge.txt deleted file mode 100644 index 3d1543398bd..00000000000 --- a/res/cardsfolder/flowstone_surge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Surge -ManaCost:1 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:1/-1:No Condition:Creatures you control get +1/-1. -SVar:RemAIDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_surge.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flowstone_thopter.txt b/res/cardsfolder/flowstone_thopter.txt deleted file mode 100644 index 2dcfe76c566..00000000000 --- a/res/cardsfolder/flowstone_thopter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Flowstone Thopter -ManaCost:7 -Types:Artifact Creature Thopter -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ -1 | KW$ Flying | SpellDescription$ CARDNAME gets +1/-1 and gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_thopter.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/132.jpg -End diff --git a/res/cardsfolder/flowstone_wall.txt b/res/cardsfolder/flowstone_wall.txt deleted file mode 100644 index 8ebeb704613..00000000000 --- a/res/cardsfolder/flowstone_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Wall -ManaCost:2 R -Types:Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_wall.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/86.jpg -End diff --git a/res/cardsfolder/flowstone_wyvern.txt b/res/cardsfolder/flowstone_wyvern.txt deleted file mode 100644 index 61b3d0b6d8b..00000000000 --- a/res/cardsfolder/flowstone_wyvern.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flowstone Wyvern -ManaCost:3 R R -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_wyvern.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/176.jpg -End diff --git a/res/cardsfolder/fluctuator.txt b/res/cardsfolder/fluctuator.txt deleted file mode 100644 index 7e8d005a3f5..00000000000 --- a/res/cardsfolder/fluctuator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fluctuator -ManaCost:2 -Types:Artifact -Text:Cycling abilities you activate cost you up to 2 less to activate. -K:CostChange:Player:Less:2:Ability_Cycling:All:All:TargetInHand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fluctuator.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flurry_of_wings.txt b/res/cardsfolder/flurry_of_wings.txt deleted file mode 100644 index 5e0d9d7a6fe..00000000000 --- a/res/cardsfolder/flurry_of_wings.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flurry of Wings -ManaCost:G W U -Types:Instant -Text:no text -A:SP$ Token | Cost$ G W U | TokenAmount$ X | TokenName$ Bird Soldier | TokenTypes$ Creature,Bird,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put X 1/1 white Bird Soldier creature tokens with flying onto the battlefield, where X is the number of attacking creatures. -SVar:X:Count$Valid Creature.attacking -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flurry_of_wings.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/flying_carpet.txt b/res/cardsfolder/flying_carpet.txt deleted file mode 100644 index d954ebb8d4a..00000000000 --- a/res/cardsfolder/flying_carpet.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Flying Carpet -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/flying_carpet.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/301.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/297.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/371.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/338.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/285.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/248.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/77.jpg -End diff --git a/res/cardsfolder/flying_men.txt b/res/cardsfolder/flying_men.txt deleted file mode 100644 index f9649316478..00000000000 --- a/res/cardsfolder/flying_men.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Flying Men -ManaCost:U -Types:Creature Human -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/flying_men.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/20.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fodder_cannon.txt b/res/cardsfolder/fodder_cannon.txt deleted file mode 100644 index e5687dc5c73..00000000000 --- a/res/cardsfolder/fodder_cannon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fodder Cannon -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 4 T Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fodder_cannon.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/302.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fodder_launch.txt b/res/cardsfolder/fodder_launch.txt deleted file mode 100644 index f5da681a601..00000000000 --- a/res/cardsfolder/fodder_launch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fodder Launch -ManaCost:3 B -Types:Tribal Sorcery Goblin -Text:no text -A:SP$ Pump | Cost$ 3 B Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -5 | NumDef$ -5 | IsCurse$ True | SubAbility$ SVar=DBDealDamage | SpellDescription$ Target creature gets -5/-5 until end of turn. Fodder Launch deals 5 damage to that creature's controller. -SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 5 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fodder_launch.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fog.txt b/res/cardsfolder/fog.txt deleted file mode 100644 index b908213e67c..00000000000 --- a/res/cardsfolder/fog.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Fog -ManaCost:G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ G | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fog.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/102.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/102.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/245.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/155.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/128.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/173.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/182.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/230.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/102.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/114.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fog_bank.txt b/res/cardsfolder/fog_bank.txt deleted file mode 100644 index 2b56b5cb730..00000000000 --- a/res/cardsfolder/fog_bank.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fog Bank -ManaCost:1 U -Types:Creature Wall -Text:no text -PT:0/2 -K:Defender -K:Flying -K:Prevent all combat damage that would be dealt to and dealt by CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fog_bank.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fog_elemental.txt b/res/cardsfolder/fog_elemental.txt deleted file mode 100644 index 95388739706..00000000000 --- a/res/cardsfolder/fog_elemental.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Fog Elemental -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:4/4 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fog_elemental.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/40.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/69.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fog_of_gnats.txt b/res/cardsfolder/fog_of_gnats.txt deleted file mode 100644 index 450770c95a3..00000000000 --- a/res/cardsfolder/fog_of_gnats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fog of Gnats -ManaCost:B B -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fog_of_gnats.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/folk_medicine.txt b/res/cardsfolder/folk_medicine.txt deleted file mode 100644 index adf379e9964..00000000000 --- a/res/cardsfolder/folk_medicine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Folk Medicine -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 2 G | LifeAmount$ X | SpellDescription$ You gain 1 life for each creature you control. -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ X | Flashback$ True | CostDesc$ Flashback 1 W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:X:Count$TypeYouCtrl.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/folk_medicine.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/115.jpg -End diff --git a/res/cardsfolder/folk_of_an_havva.txt b/res/cardsfolder/folk_of_an_havva.txt deleted file mode 100644 index 4572eed66b1..00000000000 --- a/res/cardsfolder/folk_of_an_havva.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Folk of An-Havva -ManaCost:G -Types:Creature Human -Text:no text -PT:1/1 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/folk_of_an_havva.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/58.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/folk_of_the_pines.txt b/res/cardsfolder/folk_of_the_pines.txt deleted file mode 100644 index 72e0d61a07f..00000000000 --- a/res/cardsfolder/folk_of_the_pines.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Folk of the Pines -ManaCost:4 G -Types:Creature Dryad -Text:no text -PT:2/5 -A:AB$ Pump | Cost$ 1 G | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/folk_of_the_pines.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/123.jpg -End diff --git a/res/cardsfolder/followed_footsteps.txt b/res/cardsfolder/followed_footsteps.txt deleted file mode 100644 index 5ed37876494..00000000000 --- a/res/cardsfolder/followed_footsteps.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Followed Footsteps -ManaCost:3 U U -Types:Enchantment Aura -Text:no text -K:Enchant creature Curse -K:enPump:0/0 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, put a token that's a copy of enchanted creature onto the battlefield. -SVar:TrigCopy:AB$CopyPermanent | Cost$ 0 | Defined$ Enchanted | SpellDescription$ At the beginning of your upkeep, put a token that's a copy of enchanted creature onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/followed_footsteps.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fomori_nomad.txt b/res/cardsfolder/fomori_nomad.txt deleted file mode 100644 index 03aea77d163..00000000000 --- a/res/cardsfolder/fomori_nomad.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fomori Nomad -ManaCost:4 R -Types:Creature Nomad Giant -Text:no text -PT:4/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card126149.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/font_of_mythos.txt b/res/cardsfolder/font_of_mythos.txt deleted file mode 100644 index 52137662413..00000000000 --- a/res/cardsfolder/font_of_mythos.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Font of Mythos -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws two additional cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 2 | Defined$ TriggeredPlayer -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/font_of_mythos.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fools_demise.txt b/res/cardsfolder/fools_demise.txt deleted file mode 100644 index db4b12484ff..00000000000 --- a/res/cardsfolder/fools_demise.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Fool's Demise -ManaCost:4 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature is put into a graveyard, return that card to the battlefield under your control. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fools_demise.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fools_tome.txt b/res/cardsfolder/fools_tome.txt deleted file mode 100644 index 9939ee0f20e..00000000000 --- a/res/cardsfolder/fools_tome.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fool's Tome -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T | NumCards$ 1 | ActivatingCardsInHand$ 0 | SpellDescription$ Draw a card. Activate this ability only if you have no cards in hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fools_tome.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foot_soldiers.txt b/res/cardsfolder/foot_soldiers.txt deleted file mode 100644 index b5ea447ebf3..00000000000 --- a/res/cardsfolder/foot_soldiers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Foot Soldiers -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84608.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/17.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/178.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/footbottom_feast.txt b/res/cardsfolder/footbottom_feast.txt deleted file mode 100644 index d02e6e2590d..00000000000 --- a/res/cardsfolder/footbottom_feast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Footbottom Feast -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Put any number of target creature cards from your graveyard on top of your library. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/footbottom_feast.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foothill_guide.txt b/res/cardsfolder/foothill_guide.txt deleted file mode 100644 index 9ced8f9ad73..00000000000 --- a/res/cardsfolder/foothill_guide.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Foothill Guide -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Morph:W -K:Protection from Goblins -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foothill_guide.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/footsteps_of_the_goryo.txt b/res/cardsfolder/footsteps_of_the_goryo.txt deleted file mode 100644 index 59b5eda56f1..00000000000 --- a/res/cardsfolder/footsteps_of_the_goryo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Footsteps of the Goryo -ManaCost:2 B -Types:Sorcery Arcane -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature in your graveyard | GainControl$ True | SubAbility$ SVar=DBPump | SpellDescription$ Return target creature card from your graveyard to the battlefield. Sacrifice that creature at the beginning of the next end step. -SVar:DBPump:DB$Pump | KW$ HIDDEN At the beginning of the end step, sacrifice CARDNAME. | Defined$ Targeted -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/footsteps_of_the_goryo.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foratog.txt b/res/cardsfolder/foratog.txt deleted file mode 100644 index 2eed9e19803..00000000000 --- a/res/cardsfolder/foratog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Foratog -ManaCost:2 G -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ G Sac<1/Forest> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/foratog.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/249.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/115.jpg -End diff --git a/res/cardsfolder/forbid.txt b/res/cardsfolder/forbid.txt deleted file mode 100644 index 4d05b876e47..00000000000 --- a/res/cardsfolder/forbid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Forbid -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -A:SP$ Counter | Cost$ 1 U U Discard<2/Any> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | CostDesc$ Buyback | SpellDescription$ - 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.) | SubAbility$ SVar=DBChange -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://magiccards.info/scans/en/fnmp/27.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forbidden_lore.txt b/res/cardsfolder/forbidden_lore.txt deleted file mode 100644 index e57cec9c06c..00000000000 --- a/res/cardsfolder/forbidden_lore.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forbidden Lore -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=Damage:No Condition:Enchanted land has "Tap: Target creature gets +2/+1 until end of turn." -SVar:Damage:AB$Pump | Cost$ T | Tgt$ TgtC | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Target creature gets +2/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidden_lore.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forbidden_orchard.txt b/res/cardsfolder/forbidden_orchard.txt deleted file mode 100644 index fea5083f1bc..00000000000 --- a/res/cardsfolder/forbidden_orchard.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Forbidden Orchard -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ TapsForMana | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever you tap CARDNAME for mana, put a 1/1 colorless Spirit creature token onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ Opponent -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidden_orchard.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forbidding_watchtower.txt b/res/cardsfolder/forbidding_watchtower.txt deleted file mode 100644 index a1023ad07ca..00000000000 --- a/res/cardsfolder/forbidding_watchtower.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Forbidding Watchtower -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Animate | Cost$ 1 W | Defined$ Self | Power$ 1 | Toughness$ 5 | Types$ Creature,Soldier | Colors$ White | SpellDescription$ CARDNAME becomes a 1/5 white Soldier creature until end of turn. It's still a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/forbidding_watchtower.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/140.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/352.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/force_of_nature.txt b/res/cardsfolder/force_of_nature.txt deleted file mode 100644 index 7ff2c562df3..00000000000 --- a/res/cardsfolder/force_of_nature.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Force of Nature -ManaCost:2 G G G G -Types:Creature Elemental -Text:no text -PT:8/8 -K:Trample -K:At the beginning of your upkeep, CARDNAME deals 8 damage to you unless you pay G G G G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/force_of_nature.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/103.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/103.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/156.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/129.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/242.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/103.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/force_of_savagery.txt b/res/cardsfolder/force_of_savagery.txt deleted file mode 100644 index 3d59dbe4cce..00000000000 --- a/res/cardsfolder/force_of_savagery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Force of Savagery -ManaCost:2 G -Types:Creature Elemental -Text:no text -PT:8/0 -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130713.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/force_of_will.txt b/res/cardsfolder/force_of_will.txt deleted file mode 100644 index ea73cb55e0f..00000000000 --- a/res/cardsfolder/force_of_will.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Force of Will -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 3 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Graveyard | SpellDescription$ Counter target spell. -SVar:AltCost:PayLife<1> ExileFromHand<1/Card.Blue>$You may pay 1 life and exile a blue card from your hand rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/force_of_will.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/force_spike.txt b/res/cardsfolder/force_spike.txt deleted file mode 100644 index 29dccd462dd..00000000000 --- a/res/cardsfolder/force_spike.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Force Spike -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/force_spike.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/88.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/58.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/force_void.txt b/res/cardsfolder/force_void.txt deleted file mode 100644 index d394fe2d562..00000000000 --- a/res/cardsfolder/force_void.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Force Void -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/force_void.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forced_fruition.txt b/res/cardsfolder/forced_fruition.txt deleted file mode 100644 index 6af74aa1ad8..00000000000 --- a/res/cardsfolder/forced_fruition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forced Fruition -ManaCost:4 U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a spell, that player draws seven cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ 7 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/Forced_Fruition.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forced_march.txt b/res/cardsfolder/forced_march.txt deleted file mode 100755 index 672c0847669..00000000000 --- a/res/cardsfolder/forced_march.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forced March -ManaCost:X B B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ X B B B | ValidCards$ Creature.cmcLEX | SpellDescription$ Destroy all creatures with converted mana cost X or less. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forced_march.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forced_retreat.txt b/res/cardsfolder/forced_retreat.txt deleted file mode 100644 index 53f9de7eb3f..00000000000 --- a/res/cardsfolder/forced_retreat.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Forced Retreat -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/forced_retreat.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forced_worship.txt b/res/cardsfolder/forced_worship.txt deleted file mode 100644 index e54ae85f12d..00000000000 --- a/res/cardsfolder/forced_worship.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forced Worship -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack.:Enchanted creature can't attack. -A:AB$ ChangeZone | Cost$ 2 W | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/forced_worship.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forcemage_advocate.txt b/res/cardsfolder/forcemage_advocate.txt deleted file mode 100644 index 7d739dd8f20..00000000000 --- a/res/cardsfolder/forcemage_advocate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forcemage Advocate -ManaCost:1 G -Types:Creature Centaur Shaman -Text:no text -PT:2/1 -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.YouDontCtrl | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBPutCounter | SpellDescription$ Return target card from an opponent's graveyard to his or her hand. Put a +1/+1 counter on target creature. -SVar:DBPutCounter:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/forcemage_advocate.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foresee.txt b/res/cardsfolder/foresee.txt deleted file mode 100644 index 75387f0703c..00000000000 --- a/res/cardsfolder/foresee.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Foresee -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Scry | Cost$ 3 U | ScryNum$ 4 | SpellDescription$ 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.) | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foresee.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/54.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foresight.txt b/res/cardsfolder/foresight.txt deleted file mode 100644 index 42315c7bba9..00000000000 --- a/res/cardsfolder/foresight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Foresight -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | Mandatory$ True | SpellDescription$ Search your library for three cards, exile them, then shuffle your library. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foresight.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/43.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/forest.txt b/res/cardsfolder/forest.txt deleted file mode 100644 index c091ad52c46..00000000000 --- a/res/cardsfolder/forest.txt +++ /dev/null @@ -1,44 +0,0 @@ -Name:Forest -ManaCost:no cost -Types:Basic Land Forest -Text:no text -SVar:PicCount:4 -SVar:Rarity:Land -SVar:Picture:http://resources.wizards.com/magic/cards/unh/en-us/card73946.jpg\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=2748\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=587\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=586 -SetInfo:USG|Land|http://magiccards.info/scans/en/us/347.jpg|4 -SetInfo:TMP|Land|http://magiccards.info/scans/en/tp/308.jpg|4 -SetInfo:ZEN|Land|http://magiccards.info/scans/en/zen/246.jpg|4 -SetInfo:4ED|Land|http://magiccards.info/scans/en/4e/175.jpg|3 -SetInfo:3ED|Land|http://magiccards.info/scans/en/rv/284.jpg|3 -SetInfo:SOM|Land|http://magiccards.info/scans/en/som/246.jpg|4 -SetInfo:TSP|Land|http://magiccards.info/scans/en/ts/298.jpg|4 -SetInfo:ODY|Land|http://magiccards.info/scans/en/od/347.jpg|4 -SetInfo:MIR|Land|http://magiccards.info/scans/en/mr/292.jpg|4 -SetInfo:PTK|Land|http://magiccards.info/scans/en/p3k/178.jpg|3 -SetInfo:7ED|Land|http://magiccards.info/scans/en/7e/328.jpg|4 -SetInfo:POR|Land|http://magiccards.info/scans/en/po/203.jpg|4 -SetInfo:ROE|Land|http://magiccards.info/scans/en/roe/245.jpg|4 -SetInfo:10E|Land|http://magiccards.info/scans/en/10e/380.jpg|4 -SetInfo:RAV|Land|http://magiccards.info/scans/en/rav/303.jpg|4 -SetInfo:6ED|Land|http://magiccards.info/scans/en/6e/347.jpg|4 -SetInfo:5ED|Land|http://magiccards.info/scans/en/5e/417.jpg|4 -SetInfo:ONS|Land|http://magiccards.info/scans/en/on/347.jpg|4 -SetInfo:S99|Land|http://magiccards.info/scans/en/st/170.jpg|4 -SetInfo:MBS|Land|http://magiccards.info/scans/en/mbs/154.jpg|2 -SetInfo:8ED|Land|http://magiccards.info/scans/en/8e/347.jpg|4 -SetInfo:CHK|Land|http://magiccards.info/scans/en/chk/303.jpg|4 -SetInfo:PO2|Land|http://magiccards.info/scans/en/po2/151.jpg|3 -SetInfo:9ED|Land|http://magiccards.info/scans/en/9e/347.jpg|4 -SetInfo:ICE|Land|http://magiccards.info/scans/en/ia/328.jpg|3 -SetInfo:MRD|Land|http://magiccards.info/scans/en/mi/303.jpg|4 -SetInfo:SHM|Land|http://magiccards.info/scans/en/shm/298.jpg|4 -SetInfo:LEA|Land|http://magiccards.info/scans/en/al/279.jpg|2 -SetInfo:LEB|Land|http://magiccards.info/scans/en/be/280.jpg|3 -SetInfo:INV|Land|http://magiccards.info/scans/en/in/347.jpg|4 -SetInfo:MMQ|Land|http://magiccards.info/scans/en/mm/347.jpg|4 -SetInfo:ALA|Land|http://magiccards.info/scans/en/ala/246.jpg|4 -SetInfo:M11|Land|http://magiccards.info/scans/en/m11/246.jpg|4 -SetInfo:M10|Land|http://magiccards.info/scans/en/m10/246.jpg|4 -SetInfo:LRW|Land|http://magiccards.info/scans/en/lw/298.jpg|4 -SetInfo:2ED|Land|http://magiccards.info/scans/en/un/280.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/forest_bear.txt b/res/cardsfolder/forest_bear.txt deleted file mode 100644 index 394e89bae32..00000000000 --- a/res/cardsfolder/forest_bear.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Forest Bear -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10505.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forethought_amulet.txt b/res/cardsfolder/forethought_amulet.txt deleted file mode 100644 index 79a324b23d2..00000000000 --- a/res/cardsfolder/forethought_amulet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Forethought Amulet -ManaCost:5 -Types:Artifact -Text:If an instant or sorcery source would deal 3 or more damage to you, it deals 2 damage to you instead. -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 3 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forethought_amulet.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forfend.txt b/res/cardsfolder/forfend.txt deleted file mode 100644 index ecf5c7bb82f..00000000000 --- a/res/cardsfolder/forfend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forfend -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Effect | Cost$ 1 W | Name$ Forfend Effect | Keywords$ KWPump | SpellDescription$ Prevent all damage that would be dealt to creatures this turn. -SVar:KWPump:stPumpAll:Creature:0/0/HIDDEN Prevent all damage that would be dealt to CARDNAME.:no Condition:Prevent all damage that would be dealt to creatures this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/forfend.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forge_armor.txt b/res/cardsfolder/forge_armor.txt deleted file mode 100644 index 3cb6cedbde8..00000000000 --- a/res/cardsfolder/forge_armor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Forge Armor -ManaCost:4 R -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ 4 R Sac<1/Artifact> | CounterType$ P1P1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterNum$ X | SpellDescription$ Put X +1/+1 counters on target creature, where X is the sacrificed artifact's converted mana cost. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/forge_armor.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forgotten_ancient.txt b/res/cardsfolder/forgotten_ancient.txt deleted file mode 100644 index 670490ac0ac..00000000000 --- a/res/cardsfolder/forgotten_ancient.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Forgotten Ancient -ManaCost:3 G -Types:Creature Elemental -Text:no text -PT:0/3 -T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a player casts a spell, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -A:AB$ PutCounter | Cost$ SubCounter<1/P1P1> | ValidTgts$ Creature.Other | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ At the beginning of your upkeep, you may move any number of +1/+1 counters from CARDNAME onto other creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_ancient.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forgotten_cave.txt b/res/cardsfolder/forgotten_cave.txt deleted file mode 100644 index 75dc25c5fd4..00000000000 --- a/res/cardsfolder/forgotten_cave.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forgotten Cave -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -K:Cycling:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_cave.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forgotten_harvest.txt b/res/cardsfolder/forgotten_harvest.txt deleted file mode 100644 index cd43ccceb65..00000000000 --- a/res/cardsfolder/forgotten_harvest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Forgotten Harvest -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ 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. -SVar:TrigPutCounter:AB$PutCounter | Cost$ ExileFromGrave<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forgotten_harvest.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/114.jpg -End diff --git a/res/cardsfolder/fork.txt b/res/cardsfolder/fork.txt deleted file mode 100644 index c299ade1054..00000000000 --- a/res/cardsfolder/fork.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fork -ManaCost:R R -Types:Instant -Text:no text -A:SP$ CopySpell | Cost$ R R | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fork.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/153.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/154.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/152.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forked_bolt.txt b/res/cardsfolder/forked_bolt.txt deleted file mode 100644 index 031144051cc..00000000000 --- a/res/cardsfolder/forked_bolt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Forked Bolt -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 2 damage divided as you choose among one or two target creatures and/or players. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/forked_bolt.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forked_branch_garami.txt b/res/cardsfolder/forked_branch_garami.txt deleted file mode 100644 index e40e3b68415..00000000000 --- a/res/cardsfolder/forked_branch_garami.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Forked-Branch Garami -ManaCost:3 G G -Types:Creature Spirit -Text:no text -PT:4/4 -K:Soulshift:4 -K:Soulshift:4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/forked_branch_garami.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/form_of_the_dragon.txt b/res/cardsfolder/form_of_the_dragon.txt deleted file mode 100644 index ef36f4a97f5..00000000000 --- a/res/cardsfolder/form_of_the_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Form of the Dragon -ManaCost:4 R R R -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 5 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 5 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Each | TriggerZones$ Battlefield | Execute$ TrigLife | TriggerDescription$ At the beginning of each end step, your life total becomes 5. -SVar:TrigLife:AB$SetLife | Cost$ 0 | Defined$ You | LifeAmount$ 5 -K:stPumpAll:Creature.withoutFlying+YouDontCtrl:0/0/HIDDEN CARDNAME can't attack.:No Condition:Creatures without flying can't attack you. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/form_of_the_dragon.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/93.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forsaken_city.txt b/res/cardsfolder/forsaken_city.txt deleted file mode 100644 index 5d96aa4b538..00000000000 --- a/res/cardsfolder/forsaken_city.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Forsaken City -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME doesn't untap during your untap step. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may exile a card from your hand. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ ExileFromHand<1/Card> | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forsaken_city.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/forsaken_wastes.txt b/res/cardsfolder/forsaken_wastes.txt deleted file mode 100644 index fe33dde0494..00000000000 --- a/res/cardsfolder/forsaken_wastes.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Forsaken Wastes -ManaCost:2 B -Types:World Enchantment -Text:Players cannot gain life. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Each | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player loses 1 life. -T:Mode$ SpellCast | TargetsValid$ Card.Self | Execute$ TrigLoseLife5 | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes the target of a spell, that spell's controller loses 5 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredPlayer | LifeAmount$ 1 -SVar:TrigLoseLife5:AB$LoseLife | Cost$ 0 | Defined$ TriggeredPlayer | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/forsaken_wastes.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fortify.txt b/res/cardsfolder/fortify.txt deleted file mode 100644 index 63d7bc8c3d8..00000000000 --- a/res/cardsfolder/fortify.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fortify -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | PrecostDesc$ Choose one - | SpellDescription$ Creatures you control get +2/+0 until end of turn; -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumDef$ +2 | SpellDescription$ or creatures you control get +0/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fortify.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fortitude.txt b/res/cardsfolder/fortitude.txt deleted file mode 100644 index d4f0a0e6092..00000000000 --- a/res/cardsfolder/fortitude.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fortitude -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Regenerate | Cost$ Sac<1/Forest> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigBounce | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fortitude.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fortune_thief.txt b/res/cardsfolder/fortune_thief.txt deleted file mode 100644 index f097c50343f..00000000000 --- a/res/cardsfolder/fortune_thief.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fortune Thief -ManaCost:4 R -Types:Creature Human Rogue -Text:no text -PT:0/1 -K:Morph:R R -K:Damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fortune_thief.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foul_familiar.txt b/res/cardsfolder/foul_familiar.txt deleted file mode 100644 index 28dcb194a78..00000000000 --- a/res/cardsfolder/foul_familiar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Foul Familiar -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:3/1 -K:CARDNAME can't block. -A:AB$ ChangeZone | Cost$ B PayLife<1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foul_familiar.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foul_imp.txt b/res/cardsfolder/foul_imp.txt deleted file mode 100644 index 3304e8b03b5..00000000000 --- a/res/cardsfolder/foul_imp.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Foul Imp -ManaCost:B B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -# Note: The Executing Ability needs to be a Drawback for the AI to properly test it's conditions -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 2 life. -SVar:TrigLoseLife:DB$LoseLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5158.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/9.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/132.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foul_presence.txt b/res/cardsfolder/foul_presence.txt deleted file mode 100644 index 8fe965086f1..00000000000 --- a/res/cardsfolder/foul_presence.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Foul Presence -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:-1/-1 -K:stPumpEnchanted:Creature:0/0/SVar=Pump:No Condition:Enchanted creature gets -1/-1 and has "Tap: Target creature gets -1/-1 until end of turn." -SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Target creature gets -1/-1 until end of turn." -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/foul_presence.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foul_spirit.txt b/res/cardsfolder/foul_spirit.txt deleted file mode 100644 index dc558e3a0ef..00000000000 --- a/res/cardsfolder/foul_spirit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Foul Spirit -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:3/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a land. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/foul_spirit.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fountain_of_youth.txt b/res/cardsfolder/fountain_of_youth.txt deleted file mode 100644 index c129d86c2b8..00000000000 --- a/res/cardsfolder/fountain_of_youth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fountain of Youth -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 2 T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fountain_of_youth.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/372.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/100.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/286.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/323.jpg -End diff --git a/res/cardsfolder/fountain_watch.txt b/res/cardsfolder/fountain_watch.txt deleted file mode 100644 index 697a5355be6..00000000000 --- a/res/cardsfolder/fountain_watch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fountain Watch -ManaCost:3 W W -Types:Creature Human Cleric -Text:no text -PT:2/4 -K:stPumpAll:Artifact.YouCtrl,Enchantment.YouCtrl:0/0/Shroud:No Condition:Artifacts and enchantments you control have shroud. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fountain_watch.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foxfire.txt b/res/cardsfolder/foxfire.txt deleted file mode 100644 index 2f925cf6b0a..00000000000 --- a/res/cardsfolder/foxfire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Foxfire -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Untap | Cost$ 2 G | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SubAbility$ SVar=DBPump | SpellDescription$ 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. -SVar:DBPump:DB$Pump | Cost$ 0 | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foxfire.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/157.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/foxfire_oak.txt b/res/cardsfolder/foxfire_oak.txt deleted file mode 100644 index 9c3815b6c67..00000000000 --- a/res/cardsfolder/foxfire_oak.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Foxfire Oak -ManaCost:5 G -Types:Creature Treefolk Shaman -Text:no text -PT:3/6 -A:AB$ Pump | Cost$ RG RG RG | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/foxfire_oak.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/115.jpg -End diff --git a/res/cardsfolder/fracturing_gust.txt b/res/cardsfolder/fracturing_gust.txt deleted file mode 100644 index d904d369a41..00000000000 --- a/res/cardsfolder/fracturing_gust.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fracturing Gust -ManaCost:2 GW GW GW -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 2 GW GW GW | ValidCards$ Artifact,Enchantment | RememberDestroyed$ True | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy all artifacts and enchantments. You gain 2 life for each permanent destroyed this way. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Remembered$Amount.Twice -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fracturing_gust.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frantic_purification.txt b/res/cardsfolder/frantic_purification.txt deleted file mode 100644 index 06f88eca3f9..00000000000 --- a/res/cardsfolder/frantic_purification.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frantic Purification -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -K:Madness:W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frantic_purification.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/6.jpg -End diff --git a/res/cardsfolder/frantic_salvage.txt b/res/cardsfolder/frantic_salvage.txt deleted file mode 100644 index 22fe8d17224..00000000000 --- a/res/cardsfolder/frantic_salvage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Frantic Salvage -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 3 W | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SubAbility$ SVar=DBDraw | SpellDescription$ Put any number of target artifact cards from your graveyard on top of your library. -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:X:Count$TypeInYourYard.Artifact -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frantic_salvage.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frantic_search.txt b/res/cardsfolder/frantic_search.txt deleted file mode 100644 index bfb27136337..00000000000 --- a/res/cardsfolder/frantic_search.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Frantic Search -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | SpellDescription$ Draw two cards, then discard two cards. Untap up to three lands. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ SVar=DBUntap -SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frantic_search.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frazzle.txt b/res/cardsfolder/frazzle.txt deleted file mode 100644 index bd484bbfe00..00000000000 --- a/res/cardsfolder/frazzle.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Frazzle -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 3 U | TargetType$ Spell | TgtPrompt$ Select target nonblue spell | ValidTgts$ Card.nonBlue | SpellDescription$ Counter target nonblue spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frazzle.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freed_from_the_real.txt b/res/cardsfolder/freed_from_the_real.txt deleted file mode 100644 index 686012ecd63..00000000000 --- a/res/cardsfolder/freed_from_the_real.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Freed from the Real -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Tap | Cost$ U | Defined$ Enchanted | SpellDescription$ Tap enchanted creature. -A:AB$ Untap | Cost$ U | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/freed_from_the_real.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freewind_equenaut.txt b/res/cardsfolder/freewind_equenaut.txt deleted file mode 100644 index 9b49c0d7270..00000000000 --- a/res/cardsfolder/freewind_equenaut.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Freewind Equenaut -ManaCost:2 W -Types:Creature Human Archer -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Creature:0/0/SVar=DealDamage:isEnchanted:As long as Freewind Equenaut is enchanted, it has "T: Freewind Equenaut deals 2 damage to target attacking or blocking creature." -SVar:DealDamage:AB$DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | Secondary$ True | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature." -SVar:EnchantMe:Once -SVar:Picture:http://www.wizards.com/global/images/magic/general/freewind_equenaut.jpg -SVar:Rarity:Common -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/9.jpg -End diff --git a/res/cardsfolder/freewind_falcon.txt b/res/cardsfolder/freewind_falcon.txt deleted file mode 100644 index 8ac88203c36..00000000000 --- a/res/cardsfolder/freewind_falcon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Freewind Falcon -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/freewind_falcon.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frenetic_ogre.txt b/res/cardsfolder/frenetic_ogre.txt deleted file mode 100644 index 16b9d494341..00000000000 --- a/res/cardsfolder/frenetic_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frenetic Ogre -ManaCost:4 R -Types:Creature Ogre -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ R Discard<1/Random> | NumAtt$ +3 | SpellDescription$ CARDNAME gets +3/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frenetic_ogre.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frenetic_raptor.txt b/res/cardsfolder/frenetic_raptor.txt deleted file mode 100644 index 2d92395155f..00000000000 --- a/res/cardsfolder/frenetic_raptor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frenetic Raptor -ManaCost:5 R -Types:Creature Lizard Beast -Text:no text -PT:6/6 -K:stPumpAll:Beast:0/0/HIDDEN CARDNAME can't block.:No Condition:Beasts can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frenetic_raptor.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frenzied_tilling.txt b/res/cardsfolder/frenzied_tilling.txt deleted file mode 100644 index b2f467ccb1d..00000000000 --- a/res/cardsfolder/frenzied_tilling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frenzied Tilling -ManaCost:3 R G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBSearch | SpellDescription$ Destroy target land. Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:DBSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frenzied_tilling.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fresh_meat.txt b/res/cardsfolder/fresh_meat.txt deleted file mode 100644 index 50891a77fd6..00000000000 --- a/res/cardsfolder/fresh_meat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fresh Meat -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenOwner$ You | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Beast creature token onto the battlefield for each creature put into your graveyard from the battlefield this turn. -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fresh_meat.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fresh_volunteers.txt b/res/cardsfolder/fresh_volunteers.txt deleted file mode 100644 index d169ad4ad6b..00000000000 --- a/res/cardsfolder/fresh_volunteers.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fresh Volunteers -ManaCost:1 W -Types:Creature Human Rebel -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19542.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freyalise_supplicant.txt b/res/cardsfolder/freyalise_supplicant.txt deleted file mode 100644 index 820d315a0a3..00000000000 --- a/res/cardsfolder/freyalise_supplicant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Freyalise Supplicant -ManaCost:1 G -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T Sac<1/Creature.Red;Creature.White> | Tgt$ TgtCP | NumDmg$ X | CostDesc$ Tap, Sacrifice a red or white creature: | SpellDescription$ CARDNAME deals damage to target creature or player equal to half the sacrificed creature's power, rounded down. -SVar:X:Sacrificed$CardPower/HalfDown -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalise_supplicant.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freyalises_charm.txt b/res/cardsfolder/freyalises_charm.txt deleted file mode 100644 index 06f1217092a..00000000000 --- a/res/cardsfolder/freyalises_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Freyalise's Charm -ManaCost:G G -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ G G | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -T:Mode$ SpellCast | ValidCard$ Card.Black+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a black spell, you may pay G G. If you do, you draw a card. -SVar:TrigDraw:AB$Draw | Cost$ G G | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_charm.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freyalises_radiance.txt b/res/cardsfolder/freyalises_radiance.txt deleted file mode 100644 index c2ce53f2fef..00000000000 --- a/res/cardsfolder/freyalises_radiance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Freyalise's Radiance -ManaCost:1 G -Types:Enchantment -Text:Snow permanents don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Snow -K:Cumulative upkeep:2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_radiance.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/freyalises_winds.txt b/res/cardsfolder/freyalises_winds.txt deleted file mode 100644 index 67b9cc723ff..00000000000 --- a/res/cardsfolder/freyalises_winds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Freyalise's Winds -ManaCost:2 G G -Types:Enchantment -Text:If a permanent with a wind counter on it would untap during its controller's untap step, remove all wind counters from it instead. -T:Mode$ Taps | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a permanent becomes tapped, put a wind counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredCard | CounterType$ WIND | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/freyalises_winds.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frightcrawler.txt b/res/cardsfolder/frightcrawler.txt deleted file mode 100644 index db83e5a7014..00000000000 --- a/res/cardsfolder/frightcrawler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frightcrawler -ManaCost:1 B -Types:Creature Horror -Text:no text -PT:1/1 -K:Fear -K:stPumpSelf:Creature:2/2/CARDNAME can't block.:Threshold:Threshold - As long as seven or more cards are in your graveyard, Frightcrawler gets +2/+2 and can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frightcrawler.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frog_tongue.txt b/res/cardsfolder/frog_tongue.txt deleted file mode 100644 index 0a7630d870a..00000000000 --- a/res/cardsfolder/frog_tongue.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Frog Tongue -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Reach -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frog_tongue.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frogmite.txt b/res/cardsfolder/frogmite.txt deleted file mode 100644 index 4b172b5d080..00000000000 --- a/res/cardsfolder/frogmite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frogmite -ManaCost:4 -Types:Artifact Creature Frog -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:2/2 -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frogmite.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frogtosser_banneret.txt b/res/cardsfolder/frogtosser_banneret.txt deleted file mode 100644 index 1ecf5b9d5e8..00000000000 --- a/res/cardsfolder/frogtosser_banneret.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frogtosser Banneret -ManaCost:1 B -Types:Creature Goblin Rogue -Text:Goblin spells and Rogue spells you cast cost 1 less to cast. -PT:1/1 -K:Haste -K:CostChange:Player:Less:1:Spell:All:Goblin/Rogue:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frogtosser_banneret.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frontier_guide.txt b/res/cardsfolder/frontier_guide.txt deleted file mode 100644 index 6227a646aa8..00000000000 --- a/res/cardsfolder/frontier_guide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frontier Guide -ManaCost:1 G -Types:Creature Elf Scout -PT:1/1 -Text:no text -A:AB$ ChangeZone | Cost$ 3 G T | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Frontier_guide.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frontline_sage.txt b/res/cardsfolder/frontline_sage.txt deleted file mode 100644 index 07d8ec0a787..00000000000 --- a/res/cardsfolder/frontline_sage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Frontline Sage -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:0/1 -K:Exalted -A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frontline_sage.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frontline_strategist.txt b/res/cardsfolder/frontline_strategist.txt deleted file mode 100644 index 4d2b80f391b..00000000000 --- a/res/cardsfolder/frontline_strategist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Frontline Strategist -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:Morph:W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is turned face up, prevent all combat damage non-Soldier creatures would deal this turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.nonSoldier | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frontline_strategist.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frost_giant.txt b/res/cardsfolder/frost_giant.txt deleted file mode 100644 index c50762c8d10..00000000000 --- a/res/cardsfolder/frost_giant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frost Giant -ManaCost:3 R R R -Types:Creature Giant -Text:no text -PT:4/4 -K:Rampage 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_giant.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frost_marsh.txt b/res/cardsfolder/frost_marsh.txt deleted file mode 100644 index 6e5c240e6fd..00000000000 --- a/res/cardsfolder/frost_marsh.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frost Marsh -ManaCost:no cost -Types:Snow Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_marsh.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frost_ogre.txt b/res/cardsfolder/frost_ogre.txt deleted file mode 100644 index e5ac36d8853..00000000000 --- a/res/cardsfolder/frost_ogre.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Frost Ogre -ManaCost:3 R R -Types:Creature Ogre Warrior -Text:no text -PT:5/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/bok/en-us/card74589.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frost_raptor.txt b/res/cardsfolder/frost_raptor.txt deleted file mode 100644 index d72c7c36e2b..00000000000 --- a/res/cardsfolder/frost_raptor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Frost Raptor -ManaCost:2 U -Types:Snow Creature Bird -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ S S | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_raptor.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/34.jpg -End diff --git a/res/cardsfolder/frost_titan.txt b/res/cardsfolder/frost_titan.txt deleted file mode 100644 index cf2433edaf9..00000000000 --- a/res/cardsfolder/frost_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Frost Titan -ManaCost:4 U U -Types:Creature Giant -Text:no text -PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_titan.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frostling.txt b/res/cardsfolder/frostling.txt deleted file mode 100644 index 78bf1461841..00000000000 --- a/res/cardsfolder/frostling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Frostling -ManaCost:R -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | TgtPrompt$ Select target creature | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/bok/en-us/card74621.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frostweb_spider.txt b/res/cardsfolder/frostweb_spider.txt deleted file mode 100644 index e4ca017c1f9..00000000000 --- a/res/cardsfolder/frostweb_spider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Frostweb Spider -ManaCost:2 G -Types:Snow Creature Spider -Text:no text -PT:1/3 -K:Reach -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.withFlying | DelayedTrigger$ DelayedTrig | TriggerDescription$ Whenever CARDNAME blocks a creature with flying, put a +1/+1 counter on CARDNAME at end of combat. -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigPutCounter | TriggerDescription$ Put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121197.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frostwind_invoker.txt b/res/cardsfolder/frostwind_invoker.txt deleted file mode 100644 index 885a2f84135..00000000000 --- a/res/cardsfolder/frostwind_invoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frostwind Invoker -ManaCost:4 U -Types:Creature Merfolk Wizard -Text:no text -PT:3/3 -K:Flying -A:AB$ PumpAll | Cost$ 8 | ValidCards$ Creature.YouCtrl | KW$ Flying | SpellDescription$ Creatures you control gain flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frostwind_invoker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frozen_aether.txt b/res/cardsfolder/frozen_aether.txt deleted file mode 100644 index b323192743f..00000000000 --- a/res/cardsfolder/frozen_aether.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Frozen AEther -ManaCost:3 U -Types:Enchantment -Text:Artifacts, creatures, and lands your opponents control enter the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/frozen_aether.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frozen_shade.txt b/res/cardsfolder/frozen_shade.txt deleted file mode 100644 index 75756c11e70..00000000000 --- a/res/cardsfolder/frozen_shade.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Frozen Shade -ManaCost:2 B -Types:Creature Shade -Text:no text -PT:0/1 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frozen_shade.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/18.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/18.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/25.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/22.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/20.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/frozen_solid.txt b/res/cardsfolder/frozen_solid.txt deleted file mode 100644 index c7d1b6a6b0a..00000000000 --- a/res/cardsfolder/frozen_solid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Frozen Solid -ManaCost:1 U U -Types:Enchantment Aura -Text:When enchanted creature is dealt damage, destroy it. -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step. & HIDDEN When CARDNAME is dealt damage, destroy it.:Enchanted creature doesn't untap during its controller's untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/frozen_solid.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/36.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fruition.txt b/res/cardsfolder/fruition.txt deleted file mode 100644 index 1d2632c7d4a..00000000000 --- a/res/cardsfolder/fruition.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fruition -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ G | LifeAmount$ X | SpellDescription$ You gain 1 life for each Forest on the battlefield. -SVar:X:Count$TypeOnBattlefield.Forest -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/fruition.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/91.jpg -End diff --git a/res/cardsfolder/fuel_for_the_cause.txt b/res/cardsfolder/fuel_for_the_cause.txt deleted file mode 100644 index f92d2df89ec..00000000000 --- a/res/cardsfolder/fuel_for_the_cause.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fuel for the Cause -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBProliferate | SpellDescription$ Counter target spell, then proliferate. -SVar:DBProliferate:DB$Proliferate -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fuel_for_the_cause.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fugitive_wizard.txt b/res/cardsfolder/fugitive_wizard.txt deleted file mode 100644 index 7b5e5679b66..00000000000 --- a/res/cardsfolder/fugitive_wizard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fugitive Wizard -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card134762.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/81.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/38.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/80.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fugue.txt b/res/cardsfolder/fugue.txt deleted file mode 100644 index a9d7a4e6dff..00000000000 --- a/res/cardsfolder/fugue.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fugue -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B B | ValidTgts$ Player | NumCards$ 3 | Mode$ TgtChoose | SpellDescription$ Target player discards three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fugue.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/62.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fulminator_mage.txt b/res/cardsfolder/fulminator_mage.txt deleted file mode 100644 index bcd4b64c67d..00000000000 --- a/res/cardsfolder/fulminator_mage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fulminator Mage -ManaCost:1 BR BR -Types:Creature Elemental Shaman -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fulminator_mage.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/188.jpg -End diff --git a/res/cardsfolder/fume_spitter.txt b/res/cardsfolder/fume_spitter.txt deleted file mode 100644 index f15b15efe6a..00000000000 --- a/res/cardsfolder/fume_spitter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fume Spitter -ManaCost:B -Types:Creature Horror -PT:1/1 -Text:no text -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Common -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/fume_spitter.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fumiko_the_lowblood.txt b/res/cardsfolder/fumiko_the_lowblood.txt deleted file mode 100644 index 22e76318076..00000000000 --- a/res/cardsfolder/fumiko_the_lowblood.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Fumiko the Lowblood -ManaCost:2 R R -Types:Legendary Creature Human Samurai -Text:no text -PT:3/2 -K:stPumpAll:Creature.YouDontCtrl:0/0/HIDDEN CARDNAME attacks each turn if able.:no Condition:Creatures your opponents control attack each turn if able. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ CARDNAME 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.) -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ CARDNAME 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.) -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Creature.attacking -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fumiko_the_lowblood.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/funeral_charm.txt b/res/cardsfolder/funeral_charm.txt deleted file mode 100644 index 8d62f035fb5..00000000000 --- a/res/cardsfolder/funeral_charm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Funeral Charm -ManaCost:B -Types:Instant -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ 1 | Mode$ TgtChoose | PrecostDesc$ Choose one - | SpellDescription$ Target player discards a card; -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ -1 | SpellDescription$ or target creature gets +2/-1 until end of turn; -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ or target creature gains swampwalk until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108895.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/11.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/44.jpg -End diff --git a/res/cardsfolder/funeral_march.txt b/res/cardsfolder/funeral_march.txt deleted file mode 100644 index 76f7de7a215..00000000000 --- a/res/cardsfolder/funeral_march.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Funeral March -ManaCost:1 B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.AttachedBy | Execute$ TrigSac | TriggerDescription$ When enchanted creature leaves the battlefield, its controller sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Creature | Defined$ TriggeredCardController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/funeral_march.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/11.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/funeral_pyre.txt b/res/cardsfolder/funeral_pyre.txt deleted file mode 100644 index eed01fd0d5b..00000000000 --- a/res/cardsfolder/funeral_pyre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Funeral Pyre -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ SVar=DBToken | SpellDescription$ Exile target card from a graveyard. Its owner puts a 1/1 white Spirit creature token with flying onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ TargetedController | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/funeral_pyre.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungal_bloom.txt b/res/cardsfolder/fungal_bloom.txt deleted file mode 100644 index a8e2bcdeb53..00000000000 --- a/res/cardsfolder/fungal_bloom.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fungal Bloom -ManaCost:G G -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ G G | ValidTgts$ Fungus | TgtPrompt$ Select target Fungus | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on target Fungus. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungal_bloom.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungal_reaches.txt b/res/cardsfolder/fungal_reaches.txt deleted file mode 100644 index 93c20d4f011..00000000000 --- a/res/cardsfolder/fungal_reaches.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fungal Reaches -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungal_reaches.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungal_shambler.txt b/res/cardsfolder/fungal_shambler.txt deleted file mode 100644 index 1d5a1870ec6..00000000000 --- a/res/cardsfolder/fungal_shambler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fungal Shambler -ManaCost:4 U B G -Types:Creature Fungus Beast -Text:no text -PT:6/4 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDrawDiscard | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you draw a card and that opponent discards a card. -SVar:TrigDrawDiscard:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungal_shambler.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungus_elemental.txt b/res/cardsfolder/fungus_elemental.txt deleted file mode 100644 index 5af061f7b7f..00000000000 --- a/res/cardsfolder/fungus_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fungus Elemental -ManaCost:3 G -Types:Creature Fungus Elemental -Text:no text -PT:3/3 -A:AB$ PutCounter | Cost$ Sac<1/Forest> | Defined$ Self | CounterType$ P2P2 | CounterNum$ 1 | IsPresent$ Card.Self+enteredBattlefieldThisTurn | SpellDescription$ Put a +2/+2 counter on CARDNAME. Activate this ability only if CARDNAME entered the battlefield this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungus_elemental.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungus_sliver.txt b/res/cardsfolder/fungus_sliver.txt deleted file mode 100644 index 485042b631e..00000000000 --- a/res/cardsfolder/fungus_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fungus Sliver -ManaCost:3 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Whenever CARDNAME is dealt damage, put a +1/+1 counter on it.:no Condition: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.) -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungus_sliver.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fungusaur.txt b/res/cardsfolder/fungusaur.txt deleted file mode 100644 index a6c7e84b340..00000000000 --- a/res/cardsfolder/fungusaur.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Fungusaur -ManaCost:3 G -Types:Creature Fungus Lizard -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME is dealt damage, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fungusaur.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/250.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/104.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/104.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/158.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/130.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/104.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furious_assault.txt b/res/cardsfolder/furious_assault.txt deleted file mode 100644 index faa75d54b4c..00000000000 --- a/res/cardsfolder/furious_assault.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Furious Assault -ManaCost:2 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a creature spell, CARDNAME deals 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:BuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/furious_assault.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furnace_brood.txt b/res/cardsfolder/furnace_brood.txt deleted file mode 100644 index 7c941a36ca2..00000000000 --- a/res/cardsfolder/furnace_brood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Furnace Brood -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_brood.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furnace_celebration.txt b/res/cardsfolder/furnace_celebration.txt deleted file mode 100644 index 62fd95c7fa1..00000000000 --- a/res/cardsfolder/furnace_celebration.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Furnace Celebration -ManaCost:1 R R -Types:Enchantment -Text:no text -T:Mode$ Sacrificed | ValidCard$ Permanent.Other | Execute$ TrigDealDamage | OptionalDecider$ You | TriggerZones$ Battlefield | ValidPlayer$ You | TriggerDescription$ Whenever you sacrifice another permanent, you may pay 2. If you do, CARDNAME deals 2 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 2 | Tgt$ TgtCP | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_celebration.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furnace_of_rath.txt b/res/cardsfolder/furnace_of_rath.txt deleted file mode 100644 index c425c50e845..00000000000 --- a/res/cardsfolder/furnace_of_rath.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Furnace of Rath -ManaCost:1 R R R -Types:Enchantment -Text:If a source would deal damage to a creature or player, it deals double that damage to that creature or player instead. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_of_rath.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/187.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/177.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/188.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furnace_scamp.txt b/res/cardsfolder/furnace_scamp.txt deleted file mode 100644 index 936b27b2bd2..00000000000 --- a/res/cardsfolder/furnace_scamp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Furnace Scamp -ManaCost:R -Types:Creature Beast -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, CARDNAME deals 3 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ Sac<1/CARDNAME> | Defined$ TriggeredTarget | NumDmg$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/furnace_scamp.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/furnace_spirit.txt b/res/cardsfolder/furnace_spirit.txt deleted file mode 100644 index 98d2d293fc2..00000000000 --- a/res/cardsfolder/furnace_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Furnace Spirit -ManaCost:2 R -Types:Creature Spirit -Text:no text -PT:1/1 -K:Haste -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5160.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/87.jpg -End diff --git a/res/cardsfolder/furnace_whelp.txt b/res/cardsfolder/furnace_whelp.txt deleted file mode 100644 index bb65c07a91f..00000000000 --- a/res/cardsfolder/furnace_whelp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Furnace Whelp -ManaCost:2 R R -Types:Creature Dragon -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card73578.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/65.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/205.jpg -End diff --git a/res/cardsfolder/fury_sliver.txt b/res/cardsfolder/fury_sliver.txt deleted file mode 100644 index d67bb82d201..00000000000 --- a/res/cardsfolder/fury_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fury Sliver -ManaCost:5 R -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Creature.Sliver:0/0/Double Strike:No Condition:All Sliver creatures have double strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fury_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fusion_elemental.txt b/res/cardsfolder/fusion_elemental.txt deleted file mode 100644 index b702eaf078b..00000000000 --- a/res/cardsfolder/fusion_elemental.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fusion Elemental -ManaCost:W U B R G -Types:Creature Elemental -Text:no text -PT:8/8 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fusion_elemental.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fylamarid.txt b/res/cardsfolder/fylamarid.txt deleted file mode 100644 index 79ca06801ab..00000000000 --- a/res/cardsfolder/fylamarid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Fylamarid -ManaCost:1 U U -Types:Creature Squid Beast -Text:no text -PT:1/3 -K:Flying -K:CARDNAME can't be blocked by blue creatures. -A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fylamarid.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fyndhorn_bow.txt b/res/cardsfolder/fyndhorn_bow.txt deleted file mode 100644 index 0aec1f52a5b..00000000000 --- a/res/cardsfolder/fyndhorn_bow.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Fyndhorn Bow -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fyndhorn_bow.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/293.jpg -End diff --git a/res/cardsfolder/fyndhorn_brownie.txt b/res/cardsfolder/fyndhorn_brownie.txt deleted file mode 100644 index b1398f26713..00000000000 --- a/res/cardsfolder/fyndhorn_brownie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Fyndhorn Brownie -ManaCost:2 G -Types:Creature Ouphe -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ 2 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/fyndhorn_brownie.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/231.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/130.jpg -End diff --git a/res/cardsfolder/fyndhorn_elder.txt b/res/cardsfolder/fyndhorn_elder.txt deleted file mode 100644 index 0b5ba3f502b..00000000000 --- a/res/cardsfolder/fyndhorn_elder.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Fyndhorn Elder -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/fyndhorn_elder.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/251.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/159.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/232.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/131.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fyndhorn_elves.txt b/res/cardsfolder/fyndhorn_elves.txt deleted file mode 100644 index c1c69836ea9..00000000000 --- a/res/cardsfolder/fyndhorn_elves.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Fyndhorn Elves -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2568.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/fyndhorn_pollen.txt b/res/cardsfolder/fyndhorn_pollen.txt deleted file mode 100644 index ae1176e8f07..00000000000 --- a/res/cardsfolder/fyndhorn_pollen.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Fyndhorn Pollen -ManaCost:2 G -Types:Enchantment -Text:no text -K:Cumulative upkeep:1 -K:stPumpAll:Creature:-1/0:No Condition:All creatures get -1/-0. -A:AB$ PumpAll | Cost$ 1 G | ValidCards$ Creature | NumAtt$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-0 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/fyndhorn_pollen.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaddock_teeg.txt b/res/cardsfolder/gaddock_teeg.txt deleted file mode 100644 index b186c1189a6..00000000000 --- a/res/cardsfolder/gaddock_teeg.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gaddock Teeg -ManaCost:G W -Types:Legendary Creature Kithkin Advisor -Text:Noncreature spells with converted mana cost 4 or greater can't be cast.\r\nNoncreature spells with X in their mana costs can't be cast. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaddock_teeg.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_anthem.txt b/res/cardsfolder/gaeas_anthem.txt deleted file mode 100644 index 97cba55f9c1..00000000000 --- a/res/cardsfolder/gaeas_anthem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gaea's Anthem -ManaCost:1 G G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:1/1:No Condition:Creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122367.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_avenger.txt b/res/cardsfolder/gaeas_avenger.txt deleted file mode 100644 index c51c18e10a9..00000000000 --- a/res/cardsfolder/gaeas_avenger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gaea's Avenger -ManaCost:1 G G -Types:Creature Treefolk -Text:no text -PT:1+*/1+* -K:stSetPT:Count$NumTypeOppCtrl.Artifact/Plus.1:Count$NumTypeOppCtrl.Artifact/Plus.1:CARDNAME's power and toughness are each equal to 1 plus the number of artifacts your opponents control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_avenger.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_bounty.txt b/res/cardsfolder/gaeas_bounty.txt deleted file mode 100644 index 8dfdaf68070..00000000000 --- a/res/cardsfolder/gaeas_bounty.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gaea's Bounty -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 2 | SpellDescription$ Search your library for up to two Forest cards, reveal those cards, and put them into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_bounty.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_cradle.txt b/res/cardsfolder/gaeas_cradle.txt deleted file mode 100644 index 7bb141d9f93..00000000000 --- a/res/cardsfolder/gaeas_cradle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gaea's Cradle -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Creature you control. -SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_cradle.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_embrace.txt b/res/cardsfolder/gaeas_embrace.txt deleted file mode 100644 index bc14872a1da..00000000000 --- a/res/cardsfolder/gaeas_embrace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gaea's Embrace -ManaCost:2 G G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3/Trample -A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_embrace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_herald.txt b/res/cardsfolder/gaeas_herald.txt deleted file mode 100644 index 03f06aee455..00000000000 --- a/res/cardsfolder/gaeas_herald.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gaea's Herald -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/1 -K:stPumpAll:Creature:0/0/HIDDEN CARDNAME can't be countered.:No Condition:Creature spells can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_herald.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/252.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/80.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_might.txt b/res/cardsfolder/gaeas_might.txt deleted file mode 100644 index 9e9b154af64..00000000000 --- a/res/cardsfolder/gaeas_might.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gaea's Might -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Domain - Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_might.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/81.jpg -End diff --git a/res/cardsfolder/gaeas_revenge.txt b/res/cardsfolder/gaeas_revenge.txt deleted file mode 100644 index 2856f2e2272..00000000000 --- a/res/cardsfolder/gaeas_revenge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gaea's Revenge -ManaCost:5 G G -Types:Creature Elemental -Text:Gaea's Revenge can't be the target of nongreen spells or abilities from nongreen sources. -PT:8/5 -K:CARDNAME can't be countered. -K:Haste -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_revenge.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaeas_skyfolk.txt b/res/cardsfolder/gaeas_skyfolk.txt deleted file mode 100644 index 76262167d82..00000000000 --- a/res/cardsfolder/gaeas_skyfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gaea's Skyfolk -ManaCost:U G -Types:Creature Elf Merfolk -Text:no text -PT:2/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card26757.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gainsay.txt b/res/cardsfolder/gainsay.txt deleted file mode 100644 index 7a2fd5dc5f6..00000000000 --- a/res/cardsfolder/gainsay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gainsay -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Blue spell | ValidTgts$ Card.Blue | SpellDescription$ Counter target blue spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gainsay.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gale_force.txt b/res/cardsfolder/gale_force.txt deleted file mode 100644 index 3abc2813265..00000000000 --- a/res/cardsfolder/gale_force.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gale Force -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 4 G | NumDmg$ 5 | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 5 damage to each creature with flying. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gale_force.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/galepowder_mage.txt b/res/cardsfolder/galepowder_mage.txt deleted file mode 100644 index 4916843461a..00000000000 --- a/res/cardsfolder/galepowder_mage.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Galepowder Mage -ManaCost:3 W -Types:Creature Kithkin Wizard -Text:no text -PT:3/3 -K:Flying -T:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.Other | Mandatory$ True | TgtPrompt$ Select another target creature | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ SVar=DelTrig -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return exiled creature to the battlefield. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/galepowder_mage.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/galinas_knight.txt b/res/cardsfolder/galinas_knight.txt deleted file mode 100644 index 132754ab1fc..00000000000 --- a/res/cardsfolder/galinas_knight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Galina's Knight -ManaCost:W U -Types:Creature Merfolk Knight -Text:no text -PT:2/2 -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/galinas_knight.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gallantry.txt b/res/cardsfolder/gallantry.txt deleted file mode 100644 index e3b8a78e3ea..00000000000 --- a/res/cardsfolder/gallantry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gallantry -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature.blocking | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target blocking creature gets +4/+4 until end of turn. | TgtPrompt$Select target blocking creature. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gallantry.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/232.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/galvanic_arc.txt b/res/cardsfolder/galvanic_arc.txt deleted file mode 100644 index 43b32d52e77..00000000000 --- a/res/cardsfolder/galvanic_arc.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Galvanic Arc -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 3 -SVar:Picture:http://www.wizards.com/global/images/magic/general/galvanic_arc.jpg -SVar:Rarity:Common -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/126.jpg -End diff --git a/res/cardsfolder/galvanic_blast.txt b/res/cardsfolder/galvanic_blast.txt deleted file mode 100644 index bb754179204..00000000000 --- a/res/cardsfolder/galvanic_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Galvanic Blast -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals 2 damage to target creature or player. Metalcraft - CARDNAME deals 4 damage to that creature or player instead if you control 3 or more artifacts. -SVar:X:Count$Metalcraft.4.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/galvanic_blast.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/91.jpg -End diff --git a/res/cardsfolder/galvanic_key.txt b/res/cardsfolder/galvanic_key.txt deleted file mode 100644 index 83a43e8d9ca..00000000000 --- a/res/cardsfolder/galvanic_key.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Galvanic Key -ManaCost:2 -Types:Artifact -Text:no text -K:Flash -A:AB$ Untap | Cost$ 3 T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/galvanic_key.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/173.jpg -End diff --git a/res/cardsfolder/gamble.txt b/res/cardsfolder/gamble.txt deleted file mode 100644 index 60aabd16d07..00000000000 --- a/res/cardsfolder/gamble.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gamble -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ R | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SubAbility$ SVar=DBDiscard | Mandatory$ True | SpellDescription$ Search your library for a card, put that card into your hand, discard a card at random, then shuffle your library. -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ Random -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gamble.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/game_trail_changeling.txt b/res/cardsfolder/game_trail_changeling.txt deleted file mode 100644 index 9336188c6b1..00000000000 --- a/res/cardsfolder/game_trail_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Game-Trail Changeling -ManaCost:3 G G -Types:Creature Shapeshifter -Text:no text -PT:4/4 -K:Changeling -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/game_trail_changeling.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gang_of_elk.txt b/res/cardsfolder/gang_of_elk.txt deleted file mode 100644 index aed3c887ac7..00000000000 --- a/res/cardsfolder/gang_of_elk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gang of Elk -ManaCost:5 G -Types:Creature Elk Beast -Text:no text -PT:5/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +X | NumDef$ +X -SVar:X:Count$NumBlockingMe/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gang_of_elk.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/102.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gangrenous_goliath.txt b/res/cardsfolder/gangrenous_goliath.txt deleted file mode 100644 index 5cbf48f53df..00000000000 --- a/res/cardsfolder/gangrenous_goliath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gangrenous Goliath -ManaCost:3 B B -Types:Creature Zombie Giant -Text:no text -PT:4/4 -A:AB$ ChangeZone | Cost$tapXType<3/Cleric> | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. -Var:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gangrenous_goliath.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gangrenous_zombies.txt b/res/cardsfolder/gangrenous_zombies.txt deleted file mode 100644 index a49d1ea14d7..00000000000 --- a/res/cardsfolder/gangrenous_zombies.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gangrenous Zombies -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/2 -A:AB$ DamageAll | Cost$ T Sac<1/CARDNAME> | IsPresent$ Swamp.Snow+YouCtrl | PresentCompare$ EQ0 | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. If you control a snow Swamp, CARDNAME deals 2 damage to each creature and each player instead. -A:AB$ DamageAll | Cost$ T Sac<1/CARDNAME> | IsPresent$ Swamp.Snow+YouCtrl | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 2 | ValidDescription$ each creature and each player. -SVar:Picture:http://www.wizards.com/global/images/magic/general/gangrenous_zombies.jpg -SVar:Rarity:Common -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gargoyle_castle.txt b/res/cardsfolder/gargoyle_castle.txt deleted file mode 100644 index f15fab6d487..00000000000 --- a/res/cardsfolder/gargoyle_castle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gargoyle Castle -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Token | Cost$ 5 T Sac<1/CARDNAME> | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Gargoyle | TokenTypes$ Artifact,Creature,Gargoyle | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 4 | TokenKeywords$ Flying | SpellDescription$ Put a 3/4 colorless Gargoyle artifact creature token with flying onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gargoyle_castle.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/garruk_wildspeaker.txt b/res/cardsfolder/garruk_wildspeaker.txt deleted file mode 100644 index 7130ab01b80..00000000000 --- a/res/cardsfolder/garruk_wildspeaker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Garruk Wildspeaker -ManaCost:2 G G -Types:Planeswalker Garruk -Text:no text -Loyalty:3 -A:AB$ Untap | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Land | TgtPrompt$ Select target land | TargetMin$ 2 | TargetMax$ 2 | SpellDescription$ Untap two target lands. -A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Beast creature token onto the battlefield. -A:AB$ PumpAll | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Creatures you control get +3/+3 and gain trample until end of turn. -SVar:Rarity:Mythic -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card140205.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/175.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/183.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/garruks_companion.txt b/res/cardsfolder/garruks_companion.txt deleted file mode 100644 index 091cf79965a..00000000000 --- a/res/cardsfolder/garruks_companion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Garruk's Companion -ManaCost:G G -Types:Creature Beast -Text:no text -PT:3/2 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/garruks_companion.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/garruks_packleader.txt b/res/cardsfolder/garruks_packleader.txt deleted file mode 100644 index 18f7eb05e48..00000000000 --- a/res/cardsfolder/garruks_packleader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Garruk's Packleader -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE3+Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever another creature with power 3 or greater enters the battlefield under your control, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/garruks_packleader.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/garza_zol_plague_queen.txt b/res/cardsfolder/garza_zol_plague_queen.txt deleted file mode 100644 index 6de8f4f32f7..00000000000 --- a/res/cardsfolder/garza_zol_plague_queen.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Garza Zol, Plague Queen -ManaCost:4 U B R -Types:Legendary Creature Vampire -Text:no text -PT:5/5 -K:Flying -K:Haste -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/garza_zol_plague_queen.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaseous_form.txt b/res/cardsfolder/gaseous_form.txt deleted file mode 100644 index e2b1018ff8d..00000000000 --- a/res/cardsfolder/gaseous_form.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gaseous Form -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME.:Prevent all combat damage that would be dealt to and dealt by enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaseous_form.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/65.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/90.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/71.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/74.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gate_hound.txt b/res/cardsfolder/gate_hound.txt deleted file mode 100644 index 16dfd15464d..00000000000 --- a/res/cardsfolder/gate_hound.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gate Hound -ManaCost:2 W -Types:Creature Hound -Text:no text -PT:1/1 -K:stPumpAll:Creature.YouCtrl:0/0/Vigilance:isEnchanted:Creatures you control have vigilance as long as Gate Hound is enchanted. -SVar:EnchantMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_hound.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gate_to_phyrexia.txt b/res/cardsfolder/gate_to_phyrexia.txt deleted file mode 100644 index 85131b4267d..00000000000 --- a/res/cardsfolder/gate_to_phyrexia.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gate to Phyrexia -ManaCost:B B -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ Sac<1/Creature> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | ActivatingPhases$ Upkeep | ActivationLimit$ 1 | PlayerTurn$ True | SpellDescription$ Destroy target artifact. Activate this ability only during your upkeep and only once each turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gate_to_phyrexia.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gatekeeper_of_malakir.txt b/res/cardsfolder/gatekeeper_of_malakir.txt deleted file mode 100644 index e0f3fb32723..00000000000 --- a/res/cardsfolder/gatekeeper_of_malakir.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gatekeeper of Malakir -ManaCost:B B -Types:Creature Vampire Warrior -Text:no text -PT:2/2 -K:Kicker:B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target player sacrifices a creature. -SVar:TrigKicker:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature -SVar:NeedsToPlay:Creature.YouDontCtrl -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gatekeeper_of_malakir.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gathan_raiders.txt b/res/cardsfolder/gathan_raiders.txt deleted file mode 100644 index 9e9bb9153e4..00000000000 --- a/res/cardsfolder/gathan_raiders.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gathan Raiders -ManaCost:3 R R -Types:Creature Human Warrior -Text:no text -PT:3/3 -K:stPumpSelf:Creature:2/2:Hellbent:Hellbent - CARDNAME gets +2/+2 as long as you have no cards in hand. -K:Morph:Discard<1/Card> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gathan_raiders.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gatherer_of_graces.txt b/res/cardsfolder/gatherer_of_graces.txt deleted file mode 100644 index 42efd886fa6..00000000000 --- a/res/cardsfolder/gatherer_of_graces.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gatherer of Graces -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:1/2 -K:stPumpSelf:Creature:X/X:no Condition:Gatherer of Graces gets +1/+1 for each Aura attached to it. -A:AB$ Regenerate | Cost$ Sac<1/Aura> | SpellDescription$ Regenerate Gatherer of Graces. -SVar:X:Count$Valid Aura.Attached -SVar:EnchantMe:Multiple -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gatherer_of_graces.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gauntlet_of_might.txt b/res/cardsfolder/gauntlet_of_might.txt deleted file mode 100644 index e635dd4561a..00000000000 --- a/res/cardsfolder/gauntlet_of_might.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Gauntlet of Might -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature.Red:1/1:No Condition:Red creatures get +1/+1. -T:Mode$ TapsForMana | ValidCard$ Mountain | Execute$ TrigMana |TriggerZones$ Battlefield | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ R | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gauntlet_of_might.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/244.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/246.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaze_of_adamaro.txt b/res/cardsfolder/gaze_of_adamaro.txt deleted file mode 100644 index a06ae45254d..00000000000 --- a/res/cardsfolder/gaze_of_adamaro.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gaze of Adamaro -ManaCost:2 R R -Types:Instant Arcane -Text:no text -A:SP$ DealDamage | Cost$ 2 R R | ValidTgts$ Player | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of cards in target player's hand to that player. -SVar:X:TargetedPlayer$CardsInHand -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaze_of_adamaro.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gaze_of_justice.txt b/res/cardsfolder/gaze_of_justice.txt deleted file mode 100644 index 1ee0b8e1897..00000000000 --- a/res/cardsfolder/gaze_of_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gaze of Justice -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ W tapXType<3/Creature.White> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | CostDesc$ As an additional cost to cast CARDNAME, tap three untapped white creatures you control. | SpellDescription$ Exile target creature. -A:SP$ ChangeZone | Cost$ 5 W tapXType<3/Creature.White> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | Flashback$ True | CostDesc$ Flashback 5 W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gaze_of_justice.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gelatinous_genesis.txt b/res/cardsfolder/gelatinous_genesis.txt deleted file mode 100644 index 7172a2521db..00000000000 --- a/res/cardsfolder/gelatinous_genesis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gelatinous Genesis -ManaCost:X X G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ X X G | TokenImage$ G X X Ooze | TokenAmount$ X | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenOwner$ You | TokenColors$ Green | TokenPower$ X | TokenToughness$ X | SpellDescription$ Put X X/X green Ooze creature tokens onto the battlefield. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gelatinous_genesis.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gelectrode.txt b/res/cardsfolder/gelectrode.txt deleted file mode 100644 index 928ec6ab157..00000000000 --- a/res/cardsfolder/gelectrode.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gelectrode -ManaCost:1 U R -Types:Creature Weird -Text:no text -PT:0/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -T:Mode$ SpellCast | ValidCard$ Card.Instant+YouCtrl,Card.Sorcery+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigUntap | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gelectrode.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gelid_shackles.txt b/res/cardsfolder/gelid_shackles.txt deleted file mode 100644 index 153d17af806..00000000000 --- a/res/cardsfolder/gelid_shackles.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gelid Shackles -ManaCost:W -Types:Snow Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't block. & HIDDEN CARDNAME's activated abilities can't be activated.:Enchanted creature can't block and its activated abilities can't be activated. -A:AB$ Pump | Cost$ S | Defined$ Enchanted | KW$ Defender | SpellDescription$ Enchanted creature gains defender until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gelid_shackles.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gemhide_sliver.txt b/res/cardsfolder/gemhide_sliver.txt deleted file mode 100644 index 025218201f8..00000000000 --- a/res/cardsfolder/gemhide_sliver.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Gemhide Sliver -ManaCost:1 G -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=WMana & SVar=UMana & SVar=BMana & SVar=RMana & SVar=GMana & :no Condition:All Slivers have "Tap: Add one mana of any color to your mana pool." -SVar:WMana:AB$Mana | Cost$ T | Produced$ W | Amount$ 1 | SpellDescription$ Add W to your mana pool. -SVar:UMana:AB$Mana | Cost$ T | Produced$ U | Amount$ 1 | SpellDescription$ Add U to your mana pool. -SVar:BMana:AB$Mana | Cost$ T | Produced$ B | Amount$ 1 | SpellDescription$ Add B to your mana pool. -SVar:RMana:AB$Mana | Cost$ T | Produced$ R | Amount$ 1 | SpellDescription$ Add R to your mana pool. -SVar:GMana:AB$Mana | Cost$ T | Produced$ G | Amount$ 1 | SpellDescription$ Add G to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gemhide_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gemini_engine.txt b/res/cardsfolder/gemini_engine.txt deleted file mode 100644 index e8609553cbc..00000000000 --- a/res/cardsfolder/gemini_engine.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Gemini Engine -ManaCost:6 -Types:Artifact Creature Construct -Text:no text -PT:3/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, put a colorless Construct artifact creature token named Twin onto the battlefield attacking. Its power is equal to CARDNAME's power and its toughness is equal to CARDNAME's toughness. Sacrifice the token at end of combat. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Twin | TokenTypes$ Artifact,Creature,Construct | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ X | TokenToughness$ Y | TokenAttacking$ True | TokenTriggers$ TrigSac | TokenSVars$ TrigSacrifice -SVar:TrigSac:Mode$ Phase | Phase$ EndCombat | Execute$ TrigSacrifice | TriggerDescription$ At end of combat, Sacrifice the Twin token. -SVar:TrigSacrifice:AB$ Sacrifice | Cost$ 0 | SacValid$ Self | Mandatory$ True -SVar:X:Count$CardPower -SVar:Y:Count$CardToughness -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gemini_engine.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gempalm_avenger.txt b/res/cardsfolder/gempalm_avenger.txt deleted file mode 100644 index fe7a9a297d5..00000000000 --- a/res/cardsfolder/gempalm_avenger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gempalm Avenger -ManaCost:5 W -Types:Creature Human Soldier -Text:no text -PT:3/5 -K:Cycling:2 W -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When you cycle CARDNAME, Soldier creatures get +1/+1 and gain first strike until end of turn. -SVar:TrigPumpAll:AB$ PumpAll | Cost$ 0 | ValidCards$ Creature.Soldier | NumAtt$ +1 | NumDef$ +1 | KW$ First Strike -SVar:Picture:http://www.wizards.com/global/images/magic/general/gempalm_avenger.jpg -SVar:Rarity:Common -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/14.jpg -End diff --git a/res/cardsfolder/gempalm_incinerator.txt b/res/cardsfolder/gempalm_incinerator.txt deleted file mode 100644 index e2c06094231..00000000000 --- a/res/cardsfolder/gempalm_incinerator.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gempalm Incinerator -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:2/1 -K:Cycling:1 R -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have it deal X damage to target creature, where X is the number of Goblins on the battlefield. -SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | Tgt$ TgtC | NumDmg$ X -SVar:X:Count$Valid Goblin -SVar:Picture:http://www.wizards.com/global/images/magic/general/gempalm_incinerator.jpg -SVar:Rarity:Uncommon -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/94.jpg -End diff --git a/res/cardsfolder/gempalm_polluter.txt b/res/cardsfolder/gempalm_polluter.txt deleted file mode 100644 index 0088b21e936..00000000000 --- a/res/cardsfolder/gempalm_polluter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gempalm Polluter -ManaCost:5 B -Types:Creature Zombie -Text:no text -PT:4/3 -K:Cycling:B B -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigLoseLife | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have target player lose life equal to the number of Zombies on the battlefield. -SVar:TrigLoseLife:AB$ LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X -SVar:X:Count$Valid Zombie -SVar:Picture:http://www.wizards.com/global/images/magic/general/gempalm_polluter.jpg -SVar:Rarity:Common -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gempalm_sorcerer.txt b/res/cardsfolder/gempalm_sorcerer.txt deleted file mode 100644 index ead3ea55b7e..00000000000 --- a/res/cardsfolder/gempalm_sorcerer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gempalm Sorcerer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -K:Cycling:2 U -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When you cycle CARDNAME, all Wizards gain flying until end of turn. -SVar:TrigPumpAll:AB$ PumpAll | Cost$ 0 | ValidCards$ Wizard | KW$ Flying -SVar:Picture:http://www.wizards.com/global/images/magic/general/gempalm_sorcerer.jpg -SVar:Rarity:Uncommon -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/39.jpg -End diff --git a/res/cardsfolder/gempalm_strider.txt b/res/cardsfolder/gempalm_strider.txt deleted file mode 100644 index dc2b362c435..00000000000 --- a/res/cardsfolder/gempalm_strider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gempalm Strider -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:2/2 -K:Cycling:2 G G -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When you cycle CARDNAME, Elf creatures get +2/+2 until end of turn. -SVar:TrigPumpAll:AB$ PumpAll | Cost$ 0 | ValidCards$ Creature.Elf | NumAtt$ +2 | NumDef$ +2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/gempalm_strider.jpg -SVar:Rarity:Uncommon -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/127.jpg -End diff --git a/res/cardsfolder/gemstone_array.txt b/res/cardsfolder/gemstone_array.txt deleted file mode 100644 index 57d9dc0b4b6..00000000000 --- a/res/cardsfolder/gemstone_array.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Gemstone Array -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gemstone_array.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gemstone_mine.txt b/res/cardsfolder/gemstone_mine.txt deleted file mode 100644 index dcc3e81e60c..00000000000 --- a/res/cardsfolder/gemstone_mine.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Gemstone Mine -ManaCost:no cost -Types:Land -Text: -K:etbCounter:MINING:3 -A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ B | Deplete$ MINING | SpellDescription$ Add B to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ R | Deplete$ MINING | SpellDescription$ Add R to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ G | Deplete$ MINING | SpellDescription$ Add G to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ W | Deplete$ MINING | SpellDescription$ Add W to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -A:AB$ Mana | Cost$ T SubCounter<1/MINING> | Produced$ U | Deplete$ MINING | SpellDescription$ Add U to your mana pool. If there are no mining counters on Gemstone Mine, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gemstone_mine.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/164.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/generals_kabuto.txt b/res/cardsfolder/generals_kabuto.txt deleted file mode 100644 index a6f888ab6e7..00000000000 --- a/res/cardsfolder/generals_kabuto.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:General's Kabuto -ManaCost:4 -Types:Artifact Equipment -Text:Equipped creature has shroud. (It can't be the target of spells or abilities.)\r\nPrevent all combat damage that would be dealt to equipped creature. -K:eqPump 2:Shroud & HIDDEN Prevent all combat damage that would be dealt to CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/generals_kabuto.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/genesis.txt b/res/cardsfolder/genesis.txt deleted file mode 100644 index 69d8bfbf7c2..00000000000 --- a/res/cardsfolder/genesis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Genesis -ManaCost:4 G -Types:Creature Incarnation -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay 2 G. If you do, return target creature card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/genesis.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/genesis_chamber.txt b/res/cardsfolder/genesis_chamber.txt deleted file mode 100644 index fb4de517e1b..00000000000 --- a/res/cardsfolder/genesis_chamber.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Genesis Chamber -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | ValidPlayer$ Player | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | IsPresent$ Card.Self+untapped | TriggerDescription$ Whenever a nontoken creature enters the battlefield, if CARDNAME is untapped, that creature's controller puts a 1/1 Myr artifact creature token onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenOwner$ TriggeredCardController | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | ConditionPresent$ Card.Self+untapped | ConditionCompare$ EQ1 | SpellDescription$ Put a 1/1 Myr artifact creature token onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/genesis_chamber.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/genesis_wave.txt b/res/cardsfolder/genesis_wave.txt deleted file mode 100644 index 97a3285ccf7..00000000000 --- a/res/cardsfolder/genesis_wave.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Genesis Wave -ManaCost:X G G G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ X G G G | DigNum$ X | Reveal$ True | AnyNumber$ True | ChangeValid$ Permanent.cmcLEX | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | SpellDescription$ 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. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/genesis_wave.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/genju_of_the_realm.txt b/res/cardsfolder/genju_of_the_realm.txt deleted file mode 100644 index 69a31cf92f5..00000000000 --- a/res/cardsfolder/genju_of_the_realm.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Genju of the Realm -ManaCost:W U B R G -Types:Legendary Enchantment Aura -Text:no text -K:Enchant Land -#This doesn't work because I think abilities are added before CardFactory is processed, which clears this ability. Same problem as Caribou Range. -#Interestingly enough, the trigger works -A:AB$ Animate | Cost$ 2 | Defined$ Enchanted | Power$ 8 | Toughness$ 12 | Types$ Creature,Legendary,Spirit | Keywords$ Trample | SpellDescription$ Enchanted land becomes a legendary 8/12 Spirit creature with trample until end of turn. It's still a land. -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigReturnOwner | OptionalDecider$ You | TriggerDescription$ When enchanted land is put into a graveyard, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturnOwner:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/genju_of_the_realm.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/geothermal_crevice.txt b/res/cardsfolder/geothermal_crevice.txt deleted file mode 100644 index 13e73adc6fe..00000000000 --- a/res/cardsfolder/geothermal_crevice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Geothermal Crevice -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B G | SpellDescription$ Add B G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/geothermal_crevice.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gerrards_battle_cry.txt b/res/cardsfolder/gerrards_battle_cry.txt deleted file mode 100644 index b4116de4c6e..00000000000 --- a/res/cardsfolder/gerrards_battle_cry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gerrard's Battle Cry -ManaCost:W -Types:Enchantment -Text:no text -A:AB$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gerrards_battle_cry.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gerrards_command.txt b/res/cardsfolder/gerrards_command.txt deleted file mode 100644 index 619091882f1..00000000000 --- a/res/cardsfolder/gerrards_command.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gerrard's Command -ManaCost:W G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SubAbility$ SVar=DBUntap | SpellDescription$ Untap target creature. It gets +3/+3 until end of turn. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gerrards_command.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/109.jpg -End diff --git a/res/cardsfolder/gerrards_irregulars.txt b/res/cardsfolder/gerrards_irregulars.txt deleted file mode 100644 index 8b20f2b50a6..00000000000 --- a/res/cardsfolder/gerrards_irregulars.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gerrard's Irregulars -ManaCost:4 R -Types:Creature Human Soldier -Text:no text -PT:4/2 -K:Haste -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19842.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gerrards_verdict.txt b/res/cardsfolder/gerrards_verdict.txt deleted file mode 100644 index 1ccd40f10e8..00000000000 --- a/res/cardsfolder/gerrards_verdict.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Gerrard's Verdict -ManaCost:W B -Types:Sorcery -Text:Target player discards two cards. You gain 3 life for each land card discarded this way. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gerrards_verdict.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gerrards_wisdom.txt b/res/cardsfolder/gerrards_wisdom.txt deleted file mode 100644 index 766c55af603..00000000000 --- a/res/cardsfolder/gerrards_wisdom.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gerrard's Wisdom -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 W W | LifeAmount$ X | SpellDescription$ You gain 2 life for each card in your hand. -SVar:X:Count$CardsInYourHand/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gerrards_wisdom.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/131.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/18.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/16.jpg -End diff --git a/res/cardsfolder/geth_lord_of_the_vault.txt b/res/cardsfolder/geth_lord_of_the_vault.txt deleted file mode 100644 index 5ec3e58ec85..00000000000 --- a/res/cardsfolder/geth_lord_of_the_vault.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Geth, Lord of the Vault -ManaCost:4 B B -Types:Legendary Creature Zombie -Text:no text -PT:5/5 -K:Intimidate -A:AB$ ChangeZone | Cost$ X B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in an opponent's graveyard | ValidTgts$ Creature.YouDontCtrl,Artifact.YouDontCtrl | Tapped$ True | SubAbility$ SVar=DBMill | SpellDescription$ 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. -SVar:DBMill:DB$Mill | NumCards$ X | Defined$ Opponent -SVar:X:Targeted$CardManaCost -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/geth_lord_of_the_vault.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/geths_grimoire.txt b/res/cardsfolder/geths_grimoire.txt deleted file mode 100644 index 51b8fec3c15..00000000000 --- a/res/cardsfolder/geths_grimoire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Geth's Grimoire -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent discards a card, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/geths_grimoire.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/geths_verdict.txt b/res/cardsfolder/geths_verdict.txt deleted file mode 100644 index 796df6d87fe..00000000000 --- a/res/cardsfolder/geths_verdict.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Geth's Verdict -ManaCost:B B -Types:Instant -Text:no text -A:SP$ Sacrifice | Cost$ B B | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | SubAbility$ SVar=DBDrain | SpellDescription$ Target player sacrifices a creature and loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ Targeted | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/geths_verdict.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/geyser_glider.txt b/res/cardsfolder/geyser_glider.txt deleted file mode 100644 index 8a94ecf62bf..00000000000 --- a/res/cardsfolder/geyser_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Geyser Glider -ManaCost:3 R R -Types:Creature Elemental Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigFlying | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gains flying until end of turn. -SVar:TrigFlying:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Geyser_glider.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghalmas_warden.txt b/res/cardsfolder/ghalmas_warden.txt deleted file mode 100644 index 16db38d2c00..00000000000 --- a/res/cardsfolder/ghalmas_warden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghalma's Warden -ManaCost:3 W -Types:Creature Elephant Soldier -Text:no text -PT:2/4 -K:stPumpSelf:Creature:2/2:Metalcraft:Metalcraft - Ghalma's Warden gets +2/+2 as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghalmas_warden.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghastlord_of_fugue.txt b/res/cardsfolder/ghastlord_of_fugue.txt deleted file mode 100644 index be2030afbcd..00000000000 --- a/res/cardsfolder/ghastlord_of_fugue.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghastlord of Fugue -ManaCost:UB UB UB UB UB -Types:Creature Spirit Avatar -Text:no text -PT:4/4 -K:Unblockable -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigChangeZone | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player reveals his or her hand. You choose a card from it. That player exiles that card. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Exile | Defined$ TriggeredTarget | Chooser$ You | ChangeType$ Card | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghastlord_of_fugue.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghastly_demise.txt b/res/cardsfolder/ghastly_demise.txt deleted file mode 100644 index 69d71c095dd..00000000000 --- a/res/cardsfolder/ghastly_demise.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ghastly Demise -ManaCost:B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.nonBlack+toughnessLEX | TgtPrompt$ Select target nonblack creature with toughness less than or equal to the number of cards in your graveyard. | SpellDescription$ Destroy target nonblack creature if its toughness is less than or equal to the number of cards in your graveyard. -SVar:X:Count$InYourYard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghastly_demise.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghitu_encampment.txt b/res/cardsfolder/ghitu_encampment.txt deleted file mode 100644 index 09c125dfa3d..00000000000 --- a/res/cardsfolder/ghitu_encampment.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghitu Encampment -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Animate | Cost$ 1 R | Defined$ Self | Power$ 2 | Toughness$ 1 | Types$ Creature,Warrior | Colors$ Red | Keywords$ First Strike | SpellDescription$ CARDNAME 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghitu_encampment.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/141.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/353.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghitu_fire_eater.txt b/res/cardsfolder/ghitu_fire_eater.txt deleted file mode 100644 index e15e699ef08..00000000000 --- a/res/cardsfolder/ghitu_fire_eater.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghitu Fire-Eater -ManaCost:2 R -Types:Creature Human Nomad -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature or player. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghitu_fire_eater.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/76.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghitu_slinger.txt b/res/cardsfolder/ghitu_slinger.txt deleted file mode 100644 index a9f556166cc..00000000000 --- a/res/cardsfolder/ghitu_slinger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ghitu Slinger -ManaCost:2 R -Types:Creature Human Nomad -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target creature or player. -K:Echo:2 R -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 2 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghitu_slinger.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghitu_war_cry.txt b/res/cardsfolder/ghitu_war_cry.txt deleted file mode 100644 index 8d085247dcf..00000000000 --- a/res/cardsfolder/ghitu_war_cry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ghitu War Cry -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghitu_war_cry.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/78.jpg -End diff --git a/res/cardsfolder/ghor_clan_bloodscale.txt b/res/cardsfolder/ghor_clan_bloodscale.txt deleted file mode 100644 index c11b7d5b3ae..00000000000 --- a/res/cardsfolder/ghor_clan_bloodscale.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghor-Clan Bloodscale -ManaCost:3 R -Types:Creature Viashino Warrior -Text:no text -PT:2/1 -K:First Strike -A:AB$ Pump | Cost$ 3 G | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghor_clan_bloodscale.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghor_clan_savage.txt b/res/cardsfolder/ghor_clan_savage.txt deleted file mode 100644 index bf562492382..00000000000 --- a/res/cardsfolder/ghor_clan_savage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ghor-Clan Savage -ManaCost:3 G G -Types:Creature Centaur Berserker -Text:no text -PT:2/3 -K:Bloodthirst 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghor_clan_savage.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_hounds.txt b/res/cardsfolder/ghost_hounds.txt deleted file mode 100644 index 175c26eb7da..00000000000 --- a/res/cardsfolder/ghost_hounds.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ghost Hounds -ManaCost:1 B -Types:Creature Hound Spirit -Text:no text -PT:1/1 -K:Vigilance -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.White | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a white creature, CARDNAME gains first strike until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.White | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a white creature, CARDNAME gains first strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_hounds.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/12.jpg -End diff --git a/res/cardsfolder/ghost_lit_nourisher.txt b/res/cardsfolder/ghost_lit_nourisher.txt deleted file mode 100644 index 0742aee08ea..00000000000 --- a/res/cardsfolder/ghost_lit_nourisher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost-Lit Nourisher -ManaCost:2 G -Types:Creature Spirit -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -A:AB$ Pump | Cost$ 3 G Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | PrecostDesc$ Channel - | SpellDescription$ Target creature gets +4/+4 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_lit_nourisher.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_lit_raider.txt b/res/cardsfolder/ghost_lit_raider.txt deleted file mode 100644 index bb5fc50119b..00000000000 --- a/res/cardsfolder/ghost_lit_raider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost-Lit Raider -ManaCost:2 R -Types:Creature Spirit -Text:no text -A:AB$ DealDamage | Cost$ 2 R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -A:AB$ DealDamage | Cost$ 3 R Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | ActivatingZone$ Hand | PrecostDesc$ Channel - | SpellDescription$ CARDNAME deals 4 damage to target creature. -PT:2/1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_lit_raider.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_lit_redeemer.txt b/res/cardsfolder/ghost_lit_redeemer.txt deleted file mode 100644 index cdd2be14226..00000000000 --- a/res/cardsfolder/ghost_lit_redeemer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost-Lit Redeemer -ManaCost:W -Types:Creature Spirit -Text:no text -A:AB$ GainLife | Cost$ W T | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -A:AB$ GainLife | Cost$ 1 W Discard<1/CARDNAME> | LifeAmount$ 4 | ActivatingZone$ Hand | PrecostDesc$ Channel - | SpellDescription$ You gain 4 life. -PT:1/1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card74082.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_lit_stalker.txt b/res/cardsfolder/ghost_lit_stalker.txt deleted file mode 100644 index b29c33cddc4..00000000000 --- a/res/cardsfolder/ghost_lit_stalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost-Lit Stalker -ManaCost:B -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ 4 B T | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards two cards. Activate this ability only any time you could cast a sorcery. -A:AB$ Discard | Cost$ 5 B B Discard<1/CARDNAME> | ValidTgts$ Player | NumCards$ 4 | Mode$ TgtChoose | SorcerySpeed$ True | ActivatingZone$ Hand | PrecostDesc$ Channel - | SpellDescription$ Target player discards four cards. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_lit_stalker.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_lit_warder.txt b/res/cardsfolder/ghost_lit_warder.txt deleted file mode 100644 index b018e00a2c3..00000000000 --- a/res/cardsfolder/ghost_lit_warder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghost-Lit Warder -ManaCost:1 U -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ 3 U T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays 2. -A:AB$ Counter | Cost$ 3 U Discard<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 4 | ActivatingZone$ Hand | PrecostDesc$ Channel - | SpellDescription$ Counter target spell unless its controller pays 4. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_lit_warder.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_quarter.txt b/res/cardsfolder/ghost_quarter.txt deleted file mode 100644 index bfdab3e0f73..00000000000 --- a/res/cardsfolder/ghost_quarter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghost Quarter -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land. | SubAbility$ SVar=DBChange | SpellDescription$ 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. -SVar:DBChange:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | OptionalDecider$ You | ChangeType$ Land.Basic | ChangeNum$ 1 | Defined$ TargetedController -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_quarter.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_ship.txt b/res/cardsfolder/ghost_ship.txt deleted file mode 100644 index ebd7a05064b..00000000000 --- a/res/cardsfolder/ghost_ship.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ghost Ship -ManaCost:2 U U -Types:Creature Spirit -Text:no text -PT:2/4 -K:Flying -A:AB$ Regenerate | Cost$ U U U | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card107294.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/21.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/27.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_tactician.txt b/res/cardsfolder/ghost_tactician.txt deleted file mode 100644 index 283b15eedd1..00000000000 --- a/res/cardsfolder/ghost_tactician.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost Tactician -ManaCost:4 W -Types:Creature Spirit Spellshaper -Text:no text -PT:2/5 -A:AB$ PumpAll | Cost$ W T Discard<1/Card> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_tactician.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_town.txt b/res/cardsfolder/ghost_town.txt deleted file mode 100644 index b2c46f56a1e..00000000000 --- a/res/cardsfolder/ghost_town.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost Town -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | OpponentTurn$ True | SpellDescription$ Return CARDNAME to its owner's hand. Activate this ability only if it's not your turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghost_town.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghost_warden.txt b/res/cardsfolder/ghost_warden.txt deleted file mode 100644 index 9202c3dfd3d..00000000000 --- a/res/cardsfolder/ghost_warden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghost Warden -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96901.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/5.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/16.jpg -End diff --git a/res/cardsfolder/ghostfire.txt b/res/cardsfolder/ghostfire.txt deleted file mode 100644 index 75c5ef808f8..00000000000 --- a/res/cardsfolder/ghostfire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ghostfire -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -K:CARDNAME is colorless. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostfire.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/115.jpg -End diff --git a/res/cardsfolder/ghostflame_sliver.txt b/res/cardsfolder/ghostflame_sliver.txt deleted file mode 100644 index db231648fef..00000000000 --- a/res/cardsfolder/ghostflame_sliver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ghostflame Sliver -ManaCost:B R -Types:Creature Sliver -Text:no text -PT:2/2 -K:stAnimateAll:Sliver:no changes:no types:Overwrite:No Abilities:No Condition:All Slivers are colorless. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostflame_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghostly_changeling.txt b/res/cardsfolder/ghostly_changeling.txt deleted file mode 100644 index e9fb857da50..00000000000 --- a/res/cardsfolder/ghostly_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghostly Changeling -ManaCost:2 B -Types:Creature Shapeshifter -Text:no text -PT:2/2 -K:Changeling -A:AB$ Pump | Cost$ 1 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_changeling.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/116.jpg -End diff --git a/res/cardsfolder/ghostly_prison.txt b/res/cardsfolder/ghostly_prison.txt deleted file mode 100644 index 4a5e93e4f3a..00000000000 --- a/res/cardsfolder/ghostly_prison.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Ghostly Prison -ManaCost:2 W -Types:Enchantment -Text:Creatures can't attack you unless their controller pays 2 for each creature he or she controls that's attacking you. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_prison.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghostly_visit.txt b/res/cardsfolder/ghostly_visit.txt deleted file mode 100644 index 513b3f7a295..00000000000 --- a/res/cardsfolder/ghostly_visit.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ghostly Visit -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:Rarity:Common -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Three_Kingdoms/ghostly_visit.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghostly_wings.txt b/res/cardsfolder/ghostly_wings.txt deleted file mode 100644 index 39e2523f4e7..00000000000 --- a/res/cardsfolder/ghostly_wings.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghostly Wings -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:1/1/Flying:Enchanted creature gets +1/+1 and has flying. -A:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | Defined$ Enchanted | SpellDescription$ Return enchanted creature to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostly_wings.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghosts_of_the_damned.txt b/res/cardsfolder/ghosts_of_the_damned.txt deleted file mode 100644 index 55fa5f50f97..00000000000 --- a/res/cardsfolder/ghosts_of_the_damned.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ghosts of the Damned -ManaCost:1 B B -Types:Creature Spirit -Text:no text -PT:0/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | NumAtt$ -1 | IsCurse$ True | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -1/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghosts_of_the_damned.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghostway.txt b/res/cardsfolder/ghostway.txt deleted file mode 100644 index 1d0439a8aa1..00000000000 --- a/res/cardsfolder/ghostway.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ghostway -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ChangeZoneAll | Cost$ 2 W | ChangeType$ Creature.YouCtrl | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ SVar=DelTrig | SpellDescription$ Exile each creature you control. Return those cards to the battlefield under their owners' control at the beginning of the next end step. -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return exiled creatures to the battlefield. -SVar:TrigReturn:AB$ChangeZoneAll | Cost$ 0 | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghostway.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ghouls_feast.txt b/res/cardsfolder/ghouls_feast.txt deleted file mode 100644 index 9672459a15c..00000000000 --- a/res/cardsfolder/ghouls_feast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ghoul's Feast -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn, where X is the number of creature cards in your graveyard. -SVar:X:Count$TypeInYourYard.Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ghouls_feast.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/137.jpg -End diff --git a/res/cardsfolder/giant_badger.txt b/res/cardsfolder/giant_badger.txt deleted file mode 100644 index e3df57f3486..00000000000 --- a/res/cardsfolder/giant_badger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Giant Badger -ManaCost:1 G G -Types:Creature Badger -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_badger.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_cockroach.txt b/res/cardsfolder/giant_cockroach.txt deleted file mode 100644 index ea0aa39201e..00000000000 --- a/res/cardsfolder/giant_cockroach.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Giant Cockroach -ManaCost:3 B -Types:Creature Insect -Text:no text -PT:4/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83102.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/135.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/54.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/133.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_crab.txt b/res/cardsfolder/giant_crab.txt deleted file mode 100644 index 2c1a0fea95a..00000000000 --- a/res/cardsfolder/giant_crab.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Giant Crab -ManaCost:4 U -Types:Creature Crab -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_crab.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/66.jpg -End diff --git a/res/cardsfolder/giant_dustwasp.txt b/res/cardsfolder/giant_dustwasp.txt deleted file mode 100644 index f3e44ac3300..00000000000 --- a/res/cardsfolder/giant_dustwasp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Giant Dustwasp -ManaCost:3 G G -Types:Creature Insect -Text:no text -PT:3/3 -K:Flying -K:Suspend:4:1 G -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122313.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_growth.txt b/res/cardsfolder/giant_growth.txt deleted file mode 100644 index f34d157a3a9..00000000000 --- a/res/cardsfolder/giant_growth.txt +++ /dev/null @@ -1,22 +0,0 @@ -Name:Giant Growth -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_growth.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/254.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/106.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/106.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/248.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/161.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/132.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/243.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/134.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/266.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/178.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/184.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/233.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/106.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_harbinger.txt b/res/cardsfolder/giant_harbinger.txt deleted file mode 100644 index d1f600e28a3..00000000000 --- a/res/cardsfolder/giant_harbinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Giant Harbinger -ManaCost:4 R -Types:Creature Giant -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Giant | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_mantis.txt b/res/cardsfolder/giant_mantis.txt deleted file mode 100644 index ffdb27343b3..00000000000 --- a/res/cardsfolder/giant_mantis.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Giant Mantis -ManaCost:3 G -Types:Creature Insect -Text:no text -PT:2/4 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3387.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_octopus.txt b/res/cardsfolder/giant_octopus.txt deleted file mode 100644 index 7d145cf5ac0..00000000000 --- a/res/cardsfolder/giant_octopus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Giant Octopus -ManaCost:3 U -Types:Creature Octopus -Text:no text -PT:3/3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83104.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/39.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/57.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9eb/4.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_scorpion.txt b/res/cardsfolder/giant_scorpion.txt deleted file mode 100644 index 885a07007a0..00000000000 --- a/res/cardsfolder/giant_scorpion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Giant Scorpion -ManaCost:2 B -Types:Creature Scorpion -Text:no text -PT:1/3 -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_scorpion.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_shark.txt b/res/cardsfolder/giant_shark.txt deleted file mode 100644 index 3e8109f4883..00000000000 --- a/res/cardsfolder/giant_shark.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Giant Shark -ManaCost:5 U -Types:Creature Fish -Text:no text -PT:4/4 -T:Mode$ Blocks | ValidCard$ Creature.wasDealtDamageThisTurn | ValidAttacker$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature that has been dealt damage this turn, CARDNAME gets +2/+0 and gains trample until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 0 | KW$ Trample -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.wasDealtDamageThisTurn | TriggerZones$ Battlefield | Execute$ TrigBlockingPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature that has been dealt damage this turn, CARDNAME gets +2/+0 and gains trample until end of turn. -SVar:TrigBlockingPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 0 | KW$ Trample -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_shark.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_solifuge.txt b/res/cardsfolder/giant_solifuge.txt deleted file mode 100644 index 2a4412f3979..00000000000 --- a/res/cardsfolder/giant_solifuge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Giant Solifuge -ManaCost:2 RG RG -Types:Creature Insect -Text:no text -PT:4/1 -K:Trample -K:Haste -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_solifuge.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_spider.txt b/res/cardsfolder/giant_spider.txt deleted file mode 100644 index 715f52b2c95..00000000000 --- a/res/cardsfolder/giant_spider.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Giant Spider -ManaCost:3 G -Types:Creature Spider -Text:no text -PT:2/4 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129570.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/255.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/107.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/107.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/249.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/92.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/133.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/244.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/267.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/179.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/185.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/234.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/107.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/162.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_strength.txt b/res/cardsfolder/giant_strength.txt deleted file mode 100644 index 1aa14cccf02..00000000000 --- a/res/cardsfolder/giant_strength.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Giant Strength -ManaCost:R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_strength.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/178.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/233.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/181.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/214.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_tortoise.txt b/res/cardsfolder/giant_tortoise.txt deleted file mode 100644 index 8afe3bac708..00000000000 --- a/res/cardsfolder/giant_tortoise.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Giant Tortoise -ManaCost:1 U -Types:Creature Turtle -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/3:isUntapped:As long as CARDNAME is untapped, it gets +0/+3. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_tortoise.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/76.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/20.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/giant_trap_door_spider.txt b/res/cardsfolder/giant_trap_door_spider.txt deleted file mode 100644 index 40ad0481950..00000000000 --- a/res/cardsfolder/giant_trap_door_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Giant Trap Door Spider -ManaCost:1 R G -Types:Creature Spider -Text:no text -PT:2/3 -A:AB$ ChangeZone | Cost$ 1 R G T | ValidTgts$ Creature.attacking+YouDontCtrl+withoutFlying | TgtPrompt$ Select target creature without flying that's attacking you | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile CARDNAME and target creature without flying that's attacking you. | SubAbility$ SVar=ExileME -SVar:ExileME:DB$ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/giant_trap_door_spider.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/371.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giant_warthog.txt b/res/cardsfolder/giant_warthog.txt deleted file mode 100644 index 27a27d5ec82..00000000000 --- a/res/cardsfolder/giant_warthog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Giant Warthog -ManaCost:5 G -Types:Creature Boar Beast -Text:no text -PT:5/5 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/jud/en-us/card36112.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giants_ire.txt b/res/cardsfolder/giants_ire.txt deleted file mode 100644 index 6345d9a6cc4..00000000000 --- a/res/cardsfolder/giants_ire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Giant's Ire -ManaCost:3 R -Types:Tribal Sorcery Giant -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtP | NumDmg$ 4 | SubAbility$ SVar=DBDraw | SpellDescription$ CARDNAME deals 4 damage to target player. If you control a Giant, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Giant.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Giant, -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/giants_ire.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gibbering_hyenas.txt b/res/cardsfolder/gibbering_hyenas.txt deleted file mode 100644 index 49bbeca36f3..00000000000 --- a/res/cardsfolder/gibbering_hyenas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gibbering Hyenas -ManaCost:2 G -Types:Creature Hyena -Text:no text -PT:3/2 -K:CARDNAME can't block black creatures. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gibbering_hyenas.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gibbering_kami.txt b/res/cardsfolder/gibbering_kami.txt deleted file mode 100644 index b2476faead4..00000000000 --- a/res/cardsfolder/gibbering_kami.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gibbering Kami -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:2/2 -K:Flying -K:Soulshift:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gibbering_kami.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gift_of_estates.txt b/res/cardsfolder/gift_of_estates.txt deleted file mode 100644 index 12034de2b51..00000000000 --- a/res/cardsfolder/gift_of_estates.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gift of Estates -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ConditionPresent$ Land.YouCtrl | ConditionCompare$ LTX | Origin$ Library | Destination$ Hand | ChangeType$ Plains | ChangeNum$ 3 | SpellDescription$ If an opponent controls more lands than you, search your library for up to three Plains cards and put them into your hand. -SVar:X:Count$Valid Land.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84504.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/179.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gift_of_granite.txt b/res/cardsfolder/gift_of_granite.txt deleted file mode 100644 index fa701ac492c..00000000000 --- a/res/cardsfolder/gift_of_granite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gift of Granite -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+0/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gift_of_granite.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gift_of_the_deity.txt b/res/cardsfolder/gift_of_the_deity.txt deleted file mode 100644 index 1eaac59391b..00000000000 --- a/res/cardsfolder/gift_of_the_deity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gift of the Deity -ManaCost:4 BG -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Black:1/1/Deathtouch:No Condition: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.) -K:stPumpEnchanted:Creature.Green:1/1/HIDDEN All creatures able to block CARDNAME do so.:No Condition:As long as enchanted creature is green, it gets +1/+1 and all creatures able to block it do so. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gift_of_the_deity.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gift_of_the_woods.txt b/res/cardsfolder/gift_of_the_woods.txt deleted file mode 100644 index 4046e4ab438..00000000000 --- a/res/cardsfolder/gift_of_the_woods.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gift of the Woods -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked, it gets +0/+3 until end of turn and you gain 1 life. -T:Mode$ AttackerBlocked | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever enchanted creature blocks or becomes blocked, it gets +0/+3 until end of turn and you gain 1 life. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Enchanted | NumDef$ +3 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gift_of_the_woods.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/73.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/gigadrowse.txt b/res/cardsfolder/gigadrowse.txt deleted file mode 100644 index f00baf7aead..00000000000 --- a/res/cardsfolder/gigadrowse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gigadrowse -ManaCost:U -Types:Instant -Text:no text -A:SP$Tap | Cost$ U | ValidTgts$ Permanent | TgtPromp$ Select target permanent | SpellDescription$ Tap target permanent. -K:Replicate U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gigadrowse.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gigantomancer.txt b/res/cardsfolder/gigantomancer.txt deleted file mode 100644 index 80d48bdda6c..00000000000 --- a/res/cardsfolder/gigantomancer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gigantomancer -ManaCost:7 G -Types:Creature Human Shaman -Text:no text -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gigantomancer.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gigapede.txt b/res/cardsfolder/gigapede.txt deleted file mode 100644 index b8a46b639da..00000000000 --- a/res/cardsfolder/gigapede.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gigapede -ManaCost:3 G G -Types:Creature Insect -Text:no text -PT:6/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may discard a card. If you do, return CARDNAME to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ Discard<1/Card> | Origin$ Graveyard | Destination$ Hand | Defined$ Self -K:Shroud -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gigapede.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gilded_lotus.txt b/res/cardsfolder/gilded_lotus.txt deleted file mode 100644 index 8ccdf351218..00000000000 --- a/res/cardsfolder/gilded_lotus.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gilded Lotus -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 3 | SpellDescription$ Add W W W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ 3 | SpellDescription$ Add U U U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gilded_lotus.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gilder_bairn.txt b/res/cardsfolder/gilder_bairn.txt deleted file mode 100644 index 8006d10c991..00000000000 --- a/res/cardsfolder/gilder_bairn.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gilder Bairn -ManaCost:1 GU GU -Types:Creature Ouphe -Text:no text -PT:1/3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gilder_bairn.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gilt_leaf_archdruid.txt b/res/cardsfolder/gilt_leaf_archdruid.txt deleted file mode 100644 index e2235c3cc81..00000000000 --- a/res/cardsfolder/gilt_leaf_archdruid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gilt-Leaf Archdruid -ManaCost:3 G G -Types:Creature Elf Druid -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Card.Druid+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a Druid spell, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gilt_leaf_archdruid.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gilt_leaf_palace.txt b/res/cardsfolder/gilt_leaf_palace.txt deleted file mode 100644 index 3f743359704..00000000000 --- a/res/cardsfolder/gilt_leaf_palace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gilt-Leaf Palace -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal an Elf card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gilt_leaf_palace.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gilt_leaf_seer.txt b/res/cardsfolder/gilt_leaf_seer.txt deleted file mode 100644 index 63502277a29..00000000000 --- a/res/cardsfolder/gilt_leaf_seer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gilt-Leaf Seer -ManaCost:2 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -A:AB$ RearrangeTopOfLibrary | Cost$ G T | Defined$ You | NumCards$ 2 | SpellDescription$ Look at the top two cards of your library, then put them back in any order. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gilt_leaf_seer.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/giltspire_avenger.txt b/res/cardsfolder/giltspire_avenger.txt deleted file mode 100644 index a5a0e2327c8..00000000000 --- a/res/cardsfolder/giltspire_avenger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Giltspire Avenger -ManaCost:G W U -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Exalted -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.dealtDamageToYouThisTurn | TgtPrompt$ Select target creature that dealt damage to you this turn | SpellDescription$ Destroy target creature that dealt damage to you this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/giltspire_avenger.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gitaxian_probe.txt b/res/cardsfolder/gitaxian_probe.txt deleted file mode 100644 index 7ecd05707e4..00000000000 --- a/res/cardsfolder/gitaxian_probe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gitaxian Probe -ManaCost:PU -Types:Sorcery -Text:no text -A:SP$ RevealHand | Cost$ PU | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ SVar=DBDraw | SpellDescription$ Look at target player's hand. -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gitaxian_probe.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glacial_crevasses.txt b/res/cardsfolder/glacial_crevasses.txt deleted file mode 100644 index 04dddc410a7..00000000000 --- a/res/cardsfolder/glacial_crevasses.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glacial Crevasses -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ Fog | Cost$ Sac<1/Mountain.Snow> | CostDesc$ Sacrifice a snow Mountain: | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_crevasses.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glacial_fortress.txt b/res/cardsfolder/glacial_fortress.txt deleted file mode 100644 index 044321ca18f..00000000000 --- a/res/cardsfolder/glacial_fortress.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glacial Fortress -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped unless you control a Plains or an Island. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glacial_fortress.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/225.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glacial_wall.txt b/res/cardsfolder/glacial_wall.txt deleted file mode 100644 index 273d3e2fd74..00000000000 --- a/res/cardsfolder/glacial_wall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glacial Wall -ManaCost:2 U -Types:Creature Wall -Text:no text -PT:0/7 -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3912.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/91.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/72.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/71.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glaciers.txt b/res/cardsfolder/glaciers.txt deleted file mode 100644 index a98fb3e389d..00000000000 --- a/res/cardsfolder/glaciers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glaciers -ManaCost:2 W U -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay W U -K:stAnimateAll:Mountain:no change/no change/Overwrite:Land,Plains,RemoveSubTypes:no colors:Overwrite:No Condition:All Mountains are Plains. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glaciers.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/372.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glade_gnarr.txt b/res/cardsfolder/glade_gnarr.txt deleted file mode 100644 index 0a5ecdce4b4..00000000000 --- a/res/cardsfolder/glade_gnarr.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glade Gnarr -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a player casts a blue spell, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ You | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Spell.Blue -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glade_gnarr.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glare_of_subdual.txt b/res/cardsfolder/glare_of_subdual.txt deleted file mode 100644 index 845f4049431..00000000000 --- a/res/cardsfolder/glare_of_subdual.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Glare of Subdual -ManaCost:2 G W -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ tapXType<1/Creature> | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | SpellDescription$ Tap target artifact or creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glare_of_subdual.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/207.jpg -End diff --git a/res/cardsfolder/glarewielder.txt b/res/cardsfolder/glarewielder.txt deleted file mode 100644 index 3e76c574259..00000000000 --- a/res/cardsfolder/glarewielder.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Glarewielder -ManaCost:4 R -Types:Creature Elemental Shaman -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, up to two target creatures can't block this turn. -K:Evoke:1 R -SVar:TrigPump:AB$Pump | Cost$ 0 | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:PlayMain1:TRUE -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/glarewielder.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glass_golem.txt b/res/cardsfolder/glass_golem.txt deleted file mode 100644 index dca9b46789c..00000000000 --- a/res/cardsfolder/glass_golem.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Glass Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:6/2 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83719.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glassdust_hulk.txt b/res/cardsfolder/glassdust_hulk.txt deleted file mode 100644 index c50c8173b3a..00000000000 --- a/res/cardsfolder/glassdust_hulk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glassdust Hulk -ManaCost:3 W U -Types:Artifact Creature Golem -Text:no text -PT:3/4 -K:Cycling:WU -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another artifact enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn and is unblockable this turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ Unblockable -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glassdust_hulk.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glasses_of_urza.txt b/res/cardsfolder/glasses_of_urza.txt deleted file mode 100644 index 56687f27e0c..00000000000 --- a/res/cardsfolder/glasses_of_urza.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Glasses of Urza -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ RevealHand | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Look at target player's hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/glasses_of_urza.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/245.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/247.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/374.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/339.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/287.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/249.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glaze_fiend.txt b/res/cardsfolder/glaze_fiend.txt deleted file mode 100644 index 62488c9f9fb..00000000000 --- a/res/cardsfolder/glaze_fiend.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glaze Fiend -ManaCost:1 B -Types:Artifact Creature Illusion -Text:no text -PT:0/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another artifact enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glaze_fiend.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gleam_of_resistance.txt b/res/cardsfolder/gleam_of_resistance.txt deleted file mode 100644 index 56c00fc7fe0..00000000000 --- a/res/cardsfolder/gleam_of_resistance.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gleam of Resistance -ManaCost:4 W -Types:Instant -Text:no text -A:SP$ UntapAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control get +1/+2 until end of turn. Untap those creatures. | SubAbility$ SVar=DBPumpYourCreatures -SVar:DBPumpYourCreatures:DB$ PumpAll | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +2 -K:TypeCycling:Basic:1 W -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gleam_of_resistance.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glen_elendra_archmage.txt b/res/cardsfolder/glen_elendra_archmage.txt deleted file mode 100644 index db2bcbe452a..00000000000 --- a/res/cardsfolder/glen_elendra_archmage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glen Elendra Archmage -ManaCost:3 U -Types:Creature Faerie Wizard -Text:no text -PT:2/2 -K:Flying -A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature | SpellDescription$ Counter target noncreature spell. -K:Persist -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glen_elendra_archmage.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glen_elendra_liege.txt b/res/cardsfolder/glen_elendra_liege.txt deleted file mode 100644 index 4602e2b2af0..00000000000 --- a/res/cardsfolder/glen_elendra_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glen Elendra Liege -ManaCost:1 UB UB UB -Types:Creature Faerie Knight -Text:no text -PT:2/3 -K:Flying -K:stPumpAll:Creature.Blue+Other+YouCtrl:1/1:No Condition:Other blue creatures you control get +1/+1. -K:stPumpAll:Creature.Black+Other+YouCtrl:1/1:No Condition:Other black creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glen_elendra_liege.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glen_elendra_pranksters.txt b/res/cardsfolder/glen_elendra_pranksters.txt deleted file mode 100644 index 933a9ab1c20..00000000000 --- a/res/cardsfolder/glen_elendra_pranksters.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glen Elendra Pranksters -ManaCost:3 U -Types:Creature Faerie Wizard -Text:no text -PT:1/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OpponentTurn$ True | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ Whenever you cast a spell during an opponent's turn, you may return target creature you control to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/glen_elendra_pranksters.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimmerdust_nap.txt b/res/cardsfolder/glimmerdust_nap.txt deleted file mode 100644 index 423958ce648..00000000000 --- a/res/cardsfolder/glimmerdust_nap.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Glimmerdust Nap -ManaCost:2 U -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Enchant tapped creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmerdust_nap.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimmering_angel.txt b/res/cardsfolder/glimmering_angel.txt deleted file mode 100644 index 98bef88cf12..00000000000 --- a/res/cardsfolder/glimmering_angel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glimmering Angel -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmering_angel.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/17.jpg -End diff --git a/res/cardsfolder/glimmerpoint_stag.txt b/res/cardsfolder/glimmerpoint_stag.txt deleted file mode 100644 index 5ee72313769..00000000000 --- a/res/cardsfolder/glimmerpoint_stag.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Glimmerpoint Stag -ManaCost:2 W W -Types:Creature Elk -Text:no text -PT:3/3 -K:Vigilance -T:Mode$ ChangesZone | ValidCard$ Creature.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME 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. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Other | Mandatory$ True | TgtPrompt$ Select another target permanent | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ SVar=DelTrig -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | TriggerDescription$ Return exiled permanent to the battlefield. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmerpoint_stag.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimmerpost.txt b/res/cardsfolder/glimmerpost.txt deleted file mode 100644 index 75a81b54103..00000000000 --- a/res/cardsfolder/glimmerpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glimmerpost -ManaCost:no cost -Types:Land Locus -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life for each Locus on the battlefield. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ X -SVar:X:Count$TypeOnBattlefield.Locus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmerpost.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimmervoid.txt b/res/cardsfolder/glimmervoid.txt deleted file mode 100644 index 4858a1838b7..00000000000 --- a/res/cardsfolder/glimmervoid.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Glimmervoid -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Artifact.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no artifacts, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | ConditionPresent$ Artifact.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:NeedsToPlay:Artifact.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimmervoid.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimpse_of_nature.txt b/res/cardsfolder/glimpse_of_nature.txt deleted file mode 100644 index 9dc4b71a4ef..00000000000 --- a/res/cardsfolder/glimpse_of_nature.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glimpse of Nature -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ Effect | Cost$ G | Name$ Glimpse of Nature Effect | Triggers$ CreatureSpell | SVars$ TrigDraw | SpellDescription$ Whenever you cast a creature spell this turn, draw a card. -SVar:CreatureSpell:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell this turn, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimpse_of_nature.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glimpse_the_unthinkable.txt b/res/cardsfolder/glimpse_the_unthinkable.txt deleted file mode 100644 index 44c68b831c8..00000000000 --- a/res/cardsfolder/glimpse_the_unthinkable.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Glimpse the Unthinkable -ManaCost:U B -Types:Sorcery -Text:no text -A:SP$ Mill | Cost$ U B | NumCards$ 10 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top ten cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glimpse_the_unthinkable.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glint_eye_nephilim.txt b/res/cardsfolder/glint_eye_nephilim.txt deleted file mode 100644 index a7beb84f5b9..00000000000 --- a/res/cardsfolder/glint_eye_nephilim.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glint-Eye Nephilim -ManaCost:U B R G -Types:Creature Nephilim -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw that many cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:TriggerCount$DamageAmount -A:AB$ Pump | Cost$ 1 Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glint_eye_nephilim.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glint_hawk_idol.txt b/res/cardsfolder/glint_hawk_idol.txt deleted file mode 100644 index a8ed4af19bf..00000000000 --- a/res/cardsfolder/glint_hawk_idol.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glint Hawk Idol -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever another artifact enters the battlefield under your control, you may have CARDNAME become a 2/2 Bird artifact creature with flying until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Bird | Keywords$ Flying -A:AB$ Animate | Cost$ W | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Bird | Keywords$ Flying | SpellDescription$ CARDNAME becomes a 2/2 Bird artifact creature with flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glint_hawk_idol.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glintwing_invoker.txt b/res/cardsfolder/glintwing_invoker.txt deleted file mode 100644 index ef53dba68b9..00000000000 --- a/res/cardsfolder/glintwing_invoker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glintwing Invoker -ManaCost:4 U -Types:Creature Human Wizard Mutant -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 7 U | NumAtt$ +3 | NumDef$ +3 | KW$ Flying | SpellDescription$ CARDNAME gets +3/+3 and gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glintwing_invoker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/40.jpg -End diff --git a/res/cardsfolder/glissa_the_traitor.txt b/res/cardsfolder/glissa_the_traitor.txt deleted file mode 100644 index 89ff44cd681..00000000000 --- a/res/cardsfolder/glissa_the_traitor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Glissa, the Traitor -ManaCost:B G G -Types:Legendary Creature Zombie Elf -Text:no text -PT:3/3 -K:First Strike -K:Deathtouch -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may return target artifact card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target artifact card in your graveyard -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/glissa_the_traitor.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glissas_courier.txt b/res/cardsfolder/glissas_courier.txt deleted file mode 100644 index 36fba8ef3df..00000000000 --- a/res/cardsfolder/glissas_courier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glissa's Courier -ManaCost:1 G G -Types:Creature Horror -Text:no text -PT:2/3 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glissas_courier.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glissas_scorn.txt b/res/cardsfolder/glissas_scorn.txt deleted file mode 100644 index 7c80800e654..00000000000 --- a/res/cardsfolder/glissas_scorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glissa's Scorn -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBDrain | SpellDescription$ Destroy target artifact. Its controller loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glissas_scorn.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glistener_elf.txt b/res/cardsfolder/glistener_elf.txt deleted file mode 100644 index 53e9b036c3c..00000000000 --- a/res/cardsfolder/glistener_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glistener Elf -ManaCost:G -Types:Creature Elf Warrior -Text:no text -PT:1/1 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glistener_elf.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glistening_oil.txt b/res/cardsfolder/glistening_oil.txt deleted file mode 100644 index 42848ca4857..00000000000 --- a/res/cardsfolder/glistening_oil.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Glistening Oil -ManaCost:B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Infect -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on enchanted creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ M1M1 | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glistening_oil.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glitterfang.txt b/res/cardsfolder/glitterfang.txt deleted file mode 100644 index 72ce03a2f6f..00000000000 --- a/res/cardsfolder/glitterfang.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glitterfang -ManaCost:R -Types:Creature Spirit -Text:no text -PT:1/1 -K:Haste -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of the end step, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glitterfang.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/global_ruin.txt b/res/cardsfolder/global_ruin.txt deleted file mode 100644 index 994ed1732ce..00000000000 --- a/res/cardsfolder/global_ruin.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Global Ruin -ManaCost:4 W -Types:Sorcery -Text:Each player chooses from the lands he or she controls a land of each basic land type and sacrifices the rest. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/global_ruin.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloom.txt b/res/cardsfolder/gloom.txt deleted file mode 100644 index 1ac36af4a28..00000000000 --- a/res/cardsfolder/gloom.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Gloom -ManaCost:2 B -Types:Enchantment -Text:White spells cost 3 more to cast. Activated abilities of white enchantments cost 3 more to activate. -K:CostChange:All:More:3:Spell:white:All:NoSpecial -K:CostChange:All:More:3:Ability:white:Enchantment:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloom.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/19.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/19.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/27.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/23.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/21.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloomdrifter.txt b/res/cardsfolder/gloomdrifter.txt deleted file mode 100644 index 150e8d12166..00000000000 --- a/res/cardsfolder/gloomdrifter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gloomdrifter -ManaCost:3 B -Types:Creature Zombie Minion -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "When CARDNAME enters the battlefield, nonblack creatures get -2/-2 until end of turn." -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.nonBlack | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomdrifter.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloomhunter.txt b/res/cardsfolder/gloomhunter.txt deleted file mode 100644 index cd0faabdd8b..00000000000 --- a/res/cardsfolder/gloomhunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gloomhunter -ManaCost:2 B -Types:Creature Bat -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomhunter.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloomlance.txt b/res/cardsfolder/gloomlance.txt deleted file mode 100644 index ba0a78ffed1..00000000000 --- a/res/cardsfolder/gloomlance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gloomlance -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBDiscard | SpellDescription$ Destroy target creature. If that creature was green or white, its controller discards a card. -SVar:DBDiscard:DB$ Discard | Defined$ TargetedController | NumCards$ 1 | Mode$ TgtChoose | ConditionDefined$ Targeted | ConditionPresent$ Card.Green,Card.White | ConditionCompare$ EQ1 | ConditionDescription$ If that creature was green or white, -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomlance.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloomwidow.txt b/res/cardsfolder/gloomwidow.txt deleted file mode 100644 index 3ad8a0b93a7..00000000000 --- a/res/cardsfolder/gloomwidow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gloomwidow -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:3/3 -K:Reach -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomwidow.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloomwidows_feast.txt b/res/cardsfolder/gloomwidows_feast.txt deleted file mode 100644 index b51e5c33de4..00000000000 --- a/res/cardsfolder/gloomwidows_feast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gloomwidow's Feast -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SubAbility$ SVar=DBToken | SpellDescription$ 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. -SVar:DBToken:DB$Token | ConditionDefined$ Targeted | ConditionPresent$ Card.Blue,Card.Black | ConditionCompare$ EQ1 | TokenAmount$ 1 | TokenName$ Spider | TokenTypes$ Creature,Spider | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 2 | TokenKeywords$ Reach | ConditionDescription$ If that creature was blue or black, put a 1/2 green Spider creature token with reach onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomwidows_feast.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glorious_anthem.txt b/res/cardsfolder/glorious_anthem.txt deleted file mode 100644 index 58ff0290872..00000000000 --- a/res/cardsfolder/glorious_anthem.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Glorious Anthem -ManaCost:1 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:1/1:No Condition:Creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83106.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/20.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/15.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/17.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/16.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glorious_charge.txt b/res/cardsfolder/glorious_charge.txt deleted file mode 100644 index ec6ba905755..00000000000 --- a/res/cardsfolder/glorious_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Glorious Charge -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glorious_charge.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glory.txt b/res/cardsfolder/glory.txt deleted file mode 100644 index 97548103df2..00000000000 --- a/res/cardsfolder/glory.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glory -ManaCost:3 W W -Types:Creature Incarnation -Text:no text -PT:3/3 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glory.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glory_of_warfare.txt b/res/cardsfolder/glory_of_warfare.txt deleted file mode 100755 index d5cce20287f..00000000000 --- a/res/cardsfolder/glory_of_warfare.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glory of Warfare -ManaCost:2 R W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:+2/+0:isYourTurn:As long as it's your turn, creatures you control get +2/+0. -K:stPumpAll:Creature.YouCtrl:+0/+2:notYourTurn:As long as it's not your turn, creatures you control get +0/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glory_of_warfare.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/98.jpg -End diff --git a/res/cardsfolder/glory_seeker.txt b/res/cardsfolder/glory_seeker.txt deleted file mode 100644 index 5899c4394c9..00000000000 --- a/res/cardsfolder/glory_seeker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glory Seeker -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83107.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/21.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/31.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/17.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gloryscale_viashino.txt b/res/cardsfolder/gloryscale_viashino.txt deleted file mode 100644 index 842278f808d..00000000000 --- a/res/cardsfolder/gloryscale_viashino.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gloryscale Viashino -ManaCost:1 R G W -Types:Creature Viashino Soldier -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a multicolored spell, CARDNAME gets +3/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ +3 | NumDef$ +3 | Defined$ Self -SVar:BuffedBy:Card.MultiColor -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloryscale_viashino.jpg -SVar:Rarity:Uncommon -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/120.jpg -End diff --git a/res/cardsfolder/glowing_anemone.txt b/res/cardsfolder/glowing_anemone.txt deleted file mode 100644 index ad7cf18839f..00000000000 --- a/res/cardsfolder/glowing_anemone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Glowing Anemone -ManaCost:3 U -Types:Creature Jellyfish Beast -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target land to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Land | TgtPrompt$ Select target land | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/glowing_anemone.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glowrider.txt b/res/cardsfolder/glowrider.txt deleted file mode 100644 index 6fc85fd1c2d..00000000000 --- a/res/cardsfolder/glowrider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Glowrider -ManaCost:2 W -Types:Creature Human Cleric -Text:Noncreature spells cost 1 more to cast. -PT:2/1 -K:CostChange:All:More:1:Spell:All:Creature:NonType -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/glowrider.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gluttonous_slime.txt b/res/cardsfolder/gluttonous_slime.txt deleted file mode 100644 index ab2a2019d4a..00000000000 --- a/res/cardsfolder/gluttonous_slime.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gluttonous Slime -ManaCost:2 G -Types:Creature Ooze -Text:no text -PT:2/2 -K:Flash -K:Devour:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gluttonous_slime.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gluttonous_zombie.txt b/res/cardsfolder/gluttonous_zombie.txt deleted file mode 100644 index 008524b12f4..00000000000 --- a/res/cardsfolder/gluttonous_zombie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gluttonous Zombie -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:3/3 -K:Fear -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84064.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/136.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/151.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/glyph_of_destruction.txt b/res/cardsfolder/glyph_of_destruction.txt deleted file mode 100644 index 734b04df556..00000000000 --- a/res/cardsfolder/glyph_of_destruction.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Glyph of Destruction -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature.Wall+blocking | TgtPrompt$ Select target blocking Wall you control | SubAbility$ SVar=DBPump | KW$ HIDDEN Prevent all combat damage that would be dealt to CARDNAME. & HIDDEN At the beginning of the end step, destroy CARDNAME. | SpellDescription$ 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. -SVar:DBPump:DB$Pump | NumAtt$ +10 | Defined$ Targeted | UntilEndOfCombat$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/glyph_of_destruction.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnarled_effigy.txt b/res/cardsfolder/gnarled_effigy.txt deleted file mode 100644 index c1d2dd3c8d7..00000000000 --- a/res/cardsfolder/gnarled_effigy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gnarled Effigy -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 4 T | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnarled_effigy.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnarled_mass.txt b/res/cardsfolder/gnarled_mass.txt deleted file mode 100644 index df61b5c4049..00000000000 --- a/res/cardsfolder/gnarled_mass.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gnarled Mass -ManaCost:1 G G -Types:Creature Spirit -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/bok/en-us/card74435.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnarlid_pack.txt b/res/cardsfolder/gnarlid_pack.txt deleted file mode 100644 index 0cf0608cbf2..00000000000 --- a/res/cardsfolder/gnarlid_pack.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gnarlid Pack -ManaCost:1 G -Types:Creature Beast -Text:Gnarlid Pack enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:2/2 -K:Multikicker 1 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnarlid_pack.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnat_alley_creeper.txt b/res/cardsfolder/gnat_alley_creeper.txt deleted file mode 100644 index 0c670624abb..00000000000 --- a/res/cardsfolder/gnat_alley_creeper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gnat Alley Creeper -ManaCost:2 R -Types:Creature Human Rogue -Text:CARDNAME can't be blocked by creatures with flying. -PT:3/1 -K:CantBeBlockedBy Creature.withFlying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnat_alley_creeper.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnat_miser.txt b/res/cardsfolder/gnat_miser.txt deleted file mode 100644 index ccd4167a878..00000000000 --- a/res/cardsfolder/gnat_miser.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gnat Miser -ManaCost:B -Types:Creature Rat Shaman -Text:Each opponent's hand size is reduced by one. -PT:1/1 -K:HandSize - 1 Opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnat_miser.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gnathosaur.txt b/res/cardsfolder/gnathosaur.txt deleted file mode 100644 index 5dfd351f54d..00000000000 --- a/res/cardsfolder/gnathosaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gnathosaur -ManaCost:4 R R -Types:Creature Beast -Text:no text -PT:5/4 -A:AB$ Pump | Cost$ Sac<1/Artifact> | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnathosaur.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/go_for_the_throat.txt b/res/cardsfolder/go_for_the_throat.txt deleted file mode 100644 index f706694c806..00000000000 --- a/res/cardsfolder/go_for_the_throat.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Go for the Throat -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonArtifact | TgtPrompt$ Select target nonartifact creature | SpellDescription$ Destroy target nonartifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/go_for_the_throat.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/43.jpg -End diff --git a/res/cardsfolder/goatnapper.txt b/res/cardsfolder/goatnapper.txt deleted file mode 100644 index c89b5a3b6b7..00000000000 --- a/res/cardsfolder/goatnapper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goatnapper -ManaCost:2 R -Types:Creature Gobin Rogue -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGoatGrab | TriggerDescription$ When CARDNAME enters the battlefield, untap target Goat and gain control of it until end of turn. It gains haste until end of turn. -SVar:TrigGoatGrab:AB$GainControl | Cost$ 0 | ValidTgts$ Permanent.Goat | TgtPrompt$ Select target Goat | LoseControl$ EOT | Untap$ True | AddKWs$ Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goatnapper.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gobhobbler_rats.txt b/res/cardsfolder/gobhobbler_rats.txt deleted file mode 100644 index 100da906be5..00000000000 --- a/res/cardsfolder/gobhobbler_rats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gobhobbler Rats -ManaCost:B R -Types:Creature Rat -Text:no text -PT:2/2 -K:stPumpSelf:Permanent:1/0/SVar=Pump:Hellbent:Hellbent - As long as you have no cards in hand, CARDNAME gets +1/+0 and has "B: Regenerate CARDNAME." -SVar:Pump:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gobhobbler_rats.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_arsonist.txt b/res/cardsfolder/goblin_arsonist.txt deleted file mode 100644 index d4628b97fa2..00000000000 --- a/res/cardsfolder/goblin_arsonist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Arsonist -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may have it deal 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_arsonist.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_artillery.txt b/res/cardsfolder/goblin_artillery.txt deleted file mode 100644 index d6e8ba78cc5..00000000000 --- a/res/cardsfolder/goblin_artillery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Artillery -ManaCost:1 R R -Types:Creature Goblin Warrior -Text:no text -PT:1/3 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 3 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_artillery.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/138.jpg -End diff --git a/res/cardsfolder/goblin_assault.txt b/res/cardsfolder/goblin_assault.txt deleted file mode 100644 index 031961f15ea..00000000000 --- a/res/cardsfolder/goblin_assault.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Assault -ManaCost:2 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Goblin:0/0/HIDDEN CARDNAME attacks each turn if able.:No Condition:Goblin creatures attack each turn if able. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, put a 1/1 red Goblin creature token with haste onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_assault.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_balloon_brigade.txt b/res/cardsfolder/goblin_balloon_brigade.txt deleted file mode 100644 index e5001ec9a4c..00000000000 --- a/res/cardsfolder/goblin_balloon_brigade.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Goblin Balloon Brigade -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84540.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/154.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/155.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/215.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/189.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/140.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/153.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_berserker.txt b/res/cardsfolder/goblin_berserker.txt deleted file mode 100644 index dd9065da0e3..00000000000 --- a/res/cardsfolder/goblin_berserker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Berserker -ManaCost:3 R -Types:Creature Goblin Berserker -Text:no text -PT:2/2 -K:First Strike -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_berserker.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_bombardment.txt b/res/cardsfolder/goblin_bombardment.txt deleted file mode 100644 index f96c713725d..00000000000 --- a/res/cardsfolder/goblin_bombardment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Bombardment -ManaCost:1 R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_bombardment.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_brigand.txt b/res/cardsfolder/goblin_brigand.txt deleted file mode 100644 index 22094ffe171..00000000000 --- a/res/cardsfolder/goblin_brigand.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Brigand -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_brigand.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/94.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_bully.txt b/res/cardsfolder/goblin_bully.txt deleted file mode 100644 index 52864c31f51..00000000000 --- a/res/cardsfolder/goblin_bully.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goblin Bully -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4342.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_burrows.txt b/res/cardsfolder/goblin_burrows.txt deleted file mode 100644 index 202bbb3fa56..00000000000 --- a/res/cardsfolder/goblin_burrows.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Burrows -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ 1 R T | ValidTgts$ Creature.Goblin | TgtPrompt$ Select target Goblin creature | NumAtt$ +2 | SpellDescription$ Target Goblin creature gets +2/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_burrows.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_bushwhacker.txt b/res/cardsfolder/goblin_bushwhacker.txt deleted file mode 100644 index 73ca2a5c66d..00000000000 --- a/res/cardsfolder/goblin_bushwhacker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Bushwhacker -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Kicker:R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, creatures you control get +1/+0 and gain haste until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ 1 | KW$ Haste -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_bushwhacker.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_cavaliers.txt b/res/cardsfolder/goblin_cavaliers.txt deleted file mode 100644 index d6cfa5ffa9b..00000000000 --- a/res/cardsfolder/goblin_cavaliers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Cavaliers -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20214.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/95.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_caves.txt b/res/cardsfolder/goblin_caves.txt deleted file mode 100644 index 24ff2efe1e3..00000000000 --- a/res/cardsfolder/goblin_caves.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Caves -ManaCost:1 R R -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpAll:Creature.Goblin:0/2:isPresent Land.AttachedBy+Basic+Mountain:If enchanted land is a basic Mountain, Goblin creatures get +0/+2. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_caves.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_charbelcher.txt b/res/cardsfolder/goblin_charbelcher.txt deleted file mode 100644 index 1b3b2a8be44..00000000000 --- a/res/cardsfolder/goblin_charbelcher.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Goblin Charbelcher -ManaCost:4 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_charbelcher.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_chariot.txt b/res/cardsfolder/goblin_chariot.txt deleted file mode 100644 index 7500766f482..00000000000 --- a/res/cardsfolder/goblin_chariot.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Chariot -ManaCost:2 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83109.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/188.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/99.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/191.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_chieftain.txt b/res/cardsfolder/goblin_chieftain.txt deleted file mode 100644 index b9da869261e..00000000000 --- a/res/cardsfolder/goblin_chieftain.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Goblin Chieftain -ManaCost:1 R R -Types:Creature Goblin -Text:no text -PT:2/2 -K:Haste -K:stPumpAll:Creature.Goblin+Other+YouCtrl:1/1/Haste:No Condition:Other goblin creatures you control get +1/+1 and have haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Goblin -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_chieftain.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/141.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_chirurgeon.txt b/res/cardsfolder/goblin_chirurgeon.txt deleted file mode 100644 index d7654cd3192..00000000000 --- a/res/cardsfolder/goblin_chirurgeon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Chirurgeon -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:0/2 -A:AB$ Regenerate | Cost$ Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_chirurgeon.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/110.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_clearcutter.txt b/res/cardsfolder/goblin_clearcutter.txt deleted file mode 100644 index 6bc5c53c950..00000000000 --- a/res/cardsfolder/goblin_clearcutter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Goblin Clearcutter -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R R R | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R R G | SpellDescription$ Add R R G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R G G | SpellDescription$ Add R G G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ G G G | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_clearcutter.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_commando.txt b/res/cardsfolder/goblin_commando.txt deleted file mode 100644 index add9c00f099..00000000000 --- a/res/cardsfolder/goblin_commando.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Commando -ManaCost:4 R -Types:Creature Goblin -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to target creature. -SVar:TrigDealDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_commando.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_deathraiders.txt b/res/cardsfolder/goblin_deathraiders.txt deleted file mode 100644 index f637d5e60f2..00000000000 --- a/res/cardsfolder/goblin_deathraiders.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Deathraiders -ManaCost:B R -Types:Creature Goblin Warrior -Text:no text -PT:3/1 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_deathraiders.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_digging_team.txt b/res/cardsfolder/goblin_digging_team.txt deleted file mode 100644 index 2d3fdfd5785..00000000000 --- a/res/cardsfolder/goblin_digging_team.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Digging Team -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Wall | TgtPrompt$ Select target Wall | SpellDescription$ Destroy target Wall. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_digging_team.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/234.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/64.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/182.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/186.jpg -End diff --git a/res/cardsfolder/goblin_dirigible.txt b/res/cardsfolder/goblin_dirigible.txt deleted file mode 100644 index fb4b0817030..00000000000 --- a/res/cardsfolder/goblin_dirigible.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Dirigible -ManaCost:6 -Types:Artifact Creature Construct -Text:no text -PT:4/4 -K:Flying -K:CARDNAME doesn't untap during your untap step. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may pay 4. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 4 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_dirigible.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_dynamo.txt b/res/cardsfolder/goblin_dynamo.txt deleted file mode 100644 index 6f681f41ecf..00000000000 --- a/res/cardsfolder/goblin_dynamo.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Dynamo -ManaCost:5 R R -Types:Creature Goblin Mutant -Text:no text -PT:4/4 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -A:AB$ DealDamage | Cost$ X R T Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_dynamo.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_elite_infantry.txt b/res/cardsfolder/goblin_elite_infantry.txt deleted file mode 100644 index 5ae74f90fee..00000000000 --- a/res/cardsfolder/goblin_elite_infantry.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Goblin Elite Infantry -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -1/-1 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -1 | NumDef$ -1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_elite_infantry.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/177.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/183.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/187.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_firebug.txt b/res/cardsfolder/goblin_firebug.txt deleted file mode 100644 index 30405dc371c..00000000000 --- a/res/cardsfolder/goblin_firebug.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Firebug -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME leaves the battlefield, sacrifice a land. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | SacValid$ Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_firebug.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_firestarter.txt b/res/cardsfolder/goblin_firestarter.txt deleted file mode 100644 index 4a371d5f2f7..00000000000 --- a/res/cardsfolder/goblin_firestarter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Firestarter -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_firestarter.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_gardener.txt b/res/cardsfolder/goblin_gardener.txt deleted file mode 100644 index 8444408043c..00000000000 --- a/res/cardsfolder/goblin_gardener.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Gardener -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy target land. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_gardener.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/84.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_gaveleer.txt b/res/cardsfolder/goblin_gaveleer.txt deleted file mode 100644 index 7b8d03df823..00000000000 --- a/res/cardsfolder/goblin_gaveleer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Gaveleer -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Trample -K:stPumpSelf:Creature:X/0:no Condition:CARDNAME gets +2/+0 for each Equipment attached to it. -SVar:X:Count$Valid Equipment.Attached/Times.2 -SVar:EquipMe:Multiple -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_gaveleer.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_general.txt b/res/cardsfolder/goblin_general.txt deleted file mode 100644 index 6641f03c796..00000000000 --- a/res/cardsfolder/goblin_general.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin General -ManaCost:1 R R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, Goblin creatures you control get +1/+1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Goblin+YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Uncommon -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Second_Age/goblin_general.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/97.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_glider.txt b/res/cardsfolder/goblin_glider.txt deleted file mode 100644 index 0ba3eb7e83f..00000000000 --- a/res/cardsfolder/goblin_glider.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Goblin Glider -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Flying -K:CARDNAME can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6584.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/189.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/98.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/102.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_goon.txt b/res/cardsfolder/goblin_goon.txt deleted file mode 100644 index afc6712c928..00000000000 --- a/res/cardsfolder/goblin_goon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Goon -ManaCost:3 R -Types:Creature Goblin Mutant -Text:no text -PT:6/6 -K:stPumpSelf:Creature:0/0/CARDNAME can't attack. & CARDNAME can't block.:OppCtrlMoreCreatures:CARDNAME can't attack unless you control more creatures than defending player. CARDNAME can't block unless you control more creatures than attacking player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_goon.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_grenade.txt b/res/cardsfolder/goblin_grenade.txt deleted file mode 100644 index 6c90118d72a..00000000000 --- a/res/cardsfolder/goblin_grenade.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goblin Grenade -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R Sac<1/Goblin> | Tgt$ TgtCP | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_grenade.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/114.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_grenadiers.txt b/res/cardsfolder/goblin_grenadiers.txt deleted file mode 100644 index 4193cbe4e63..00000000000 --- a/res/cardsfolder/goblin_grenadiers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Grenadiers -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroyCreature | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature and target land. -SVar:TrigDestroyCreature:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Mandatory$ True | SubAbility$ SVar=DBDestroyLand -SVar:DBDestroyLand:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select target land | Mandatory$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_grenadiers.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_guide.txt b/res/cardsfolder/goblin_guide.txt deleted file mode 100644 index e8394945d3a..00000000000 --- a/res/cardsfolder/goblin_guide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Guide -ManaCost:R -Types:Creature Goblin Scout -Text:no text -PT:2/2 -K:Haste -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | Defined$ DefendingPlayer | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | LibraryPosition2$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_guide.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_hero.txt b/res/cardsfolder/goblin_hero.txt deleted file mode 100644 index b2d17439500..00000000000 --- a/res/cardsfolder/goblin_hero.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Hero -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p4/en-us/card25486.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/235.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/65.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_king.txt b/res/cardsfolder/goblin_king.txt deleted file mode 100644 index 0ba88adc6bb..00000000000 --- a/res/cardsfolder/goblin_king.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Goblin King -ManaCost:1 R R -Types:Creature Goblin -Text:no text -PT:2/2 -K:stPumpAll:Creature.Goblin+Other:1/1/Mountainwalk:No Condition:Other Goblin creatures get +1/+1 and have mountainwalk. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_king.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/190.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/155.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/156.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/190.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/236.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/216.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/192.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/207.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/185.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/154.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_lackey.txt b/res/cardsfolder/goblin_lackey.txt deleted file mode 100644 index 4205cf53546..00000000000 --- a/res/cardsfolder/goblin_lackey.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Lackey -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigChange | TriggerDescription$ Whenever CARDNAME deals damage to a player, you may put a Goblin permanent card from your hand onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.Goblin | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_lackey.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_legionnaire.txt b/res/cardsfolder/goblin_legionnaire.txt deleted file mode 100644 index 0059138b246..00000000000 --- a/res/cardsfolder/goblin_legionnaire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Legionnaire -ManaCost:R W -Types:Creature Goblin Soldier -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | Tgt$TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | Tgt$ TgtCP | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature or player this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_legionnaire.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_lookout.txt b/res/cardsfolder/goblin_lookout.txt deleted file mode 100644 index c50ce51d4f5..00000000000 --- a/res/cardsfolder/goblin_lookout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Lookout -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/2 -A:AB$ PumpAll | Cost$ T Sac<1/Goblin> | ValidCards$ Creature.Goblin | NumAtt$ +2 | SpellDescription$ Goblin creatures get +2/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_lookout.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_lore.txt b/res/cardsfolder/goblin_lore.txt deleted file mode 100644 index 88ccb284dc4..00000000000 --- a/res/cardsfolder/goblin_lore.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Lore -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 R | NumCards$ 4 | SpellDescription$ Draw four cards, then discard three cards at random. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ Random -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_lore.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/99.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_marshal.txt b/res/cardsfolder/goblin_marshal.txt deleted file mode 100644 index c213a9414e2..00000000000 --- a/res/cardsfolder/goblin_marshal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Marshal -ManaCost:4 R R -Types:Creature Goblin Warrior -Text:no text -PT:3/3 -K:Echo:4 R R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_marshal.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_masons.txt b/res/cardsfolder/goblin_masons.txt deleted file mode 100644 index b8753b6e86f..00000000000 --- a/res/cardsfolder/goblin_masons.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Masons -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy target Wall. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Wall | TgtPrompt$ Select target wall -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_masons.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_matron.txt b/res/cardsfolder/goblin_matron.txt deleted file mode 100644 index 3af9ec4bfb1..00000000000 --- a/res/cardsfolder/goblin_matron.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Matron -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Goblin | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_matron.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/191.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/100.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_medics.txt b/res/cardsfolder/goblin_medics.txt deleted file mode 100644 index 53bfc6d219d..00000000000 --- a/res/cardsfolder/goblin_medics.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Medics -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ Taps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes tapped, it deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_medics.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_mountaineer.txt b/res/cardsfolder/goblin_mountaineer.txt deleted file mode 100644 index f9daff1edf4..00000000000 --- a/res/cardsfolder/goblin_mountaineer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Mountaineer -ManaCost:R -Types:Creature Goblin Scout -Text:no text -PT:1/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83018.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/101.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/105.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/193.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_mutant.txt b/res/cardsfolder/goblin_mutant.txt deleted file mode 100644 index 6bdc8bc6ced..00000000000 --- a/res/cardsfolder/goblin_mutant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Mutant -ManaCost:2 R R -Types:Creature Goblin Mutant -Text:no text -PT:5/3 -K:Trample -K:CARDNAME can't attack if defending player controls an untapped creature with power 3 or greater. -K:CARDNAME can't block creatures with power 3 or greater. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_mutant.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_offensive.txt b/res/cardsfolder/goblin_offensive.txt deleted file mode 100644 index a5327d38aee..00000000000 --- a/res/cardsfolder/goblin_offensive.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Offensive -ManaCost:X 1 R R -Types:Sorcery -Text:Put X 1/1 red Goblin creature tokens onto the battlefield. -A:SP$ Token | Cost$ X 1 R R | TokenAmount$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_offensive.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_outlander.txt b/res/cardsfolder/goblin_outlander.txt deleted file mode 100644 index 2745f6372ca..00000000000 --- a/res/cardsfolder/goblin_outlander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Outlander -ManaCost:B R -Types:Creature Goblin Scout -Text:no text -PT:2/2 -K:Protection from white -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_outlander.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_patrol.txt b/res/cardsfolder/goblin_patrol.txt deleted file mode 100644 index c337513a391..00000000000 --- a/res/cardsfolder/goblin_patrol.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Patrol -ManaCost:R -Types:Creature Goblin -Text:no text -PT:2/1 -K:Echo:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_patrol.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_piker.txt b/res/cardsfolder/goblin_piker.txt deleted file mode 100644 index 412228c3e5b..00000000000 --- a/res/cardsfolder/goblin_piker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Piker -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82957.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/142.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/140.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/194.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/102.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_piledriver.txt b/res/cardsfolder/goblin_piledriver.txt deleted file mode 100644 index e49375c1f58..00000000000 --- a/res/cardsfolder/goblin_piledriver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Piledriver -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/2 -K:Protection from blue -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn for each other attacking Goblin. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Goblin.attacking+Other/Times.2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_piledriver.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_pyromancer.txt b/res/cardsfolder/goblin_pyromancer.txt deleted file mode 100644 index eee24b2fd5c..00000000000 --- a/res/cardsfolder/goblin_pyromancer.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Goblin Pyromancer -ManaCost:3 R -Types:Creature Goblin Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, Goblin creatures get +3/+0 until end of turn. -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of the end step, destroy all Goblins. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Goblin | NumAtt$ 3 -SVar:TrigDestroy:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.Goblin -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_pyromancer.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_raider.txt b/res/cardsfolder/goblin_raider.txt deleted file mode 100644 index 62010d0d4df..00000000000 --- a/res/cardsfolder/goblin_raider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Raider -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6583.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/191.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/103.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/194.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_razerunners.txt b/res/cardsfolder/goblin_razerunners.txt deleted file mode 100644 index fdddc918e0e..00000000000 --- a/res/cardsfolder/goblin_razerunners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Razerunners -ManaCost:2 R R -Types:Creature Goblin Warrior -Text:no text -PT:3/4 -A:AB$ PutCounter | Cost$ 1 R Sac<1/Land> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | OptionalDecider$ You | TriggerDescription$ At the beginning of your end step, you may have CARDNAME deal damage equal to the number of +1/+1 counters on it to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ X -SVar:X:Count$CardCounters.P1P1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_razerunners.jpg -SVar:Rarity:Rare -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/64.jpg -End diff --git a/res/cardsfolder/goblin_replica.txt b/res/cardsfolder/goblin_replica.txt deleted file mode 100644 index 8469d7b2a1d..00000000000 --- a/res/cardsfolder/goblin_replica.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Replica -ManaCost:3 -Types:Artifact Creature Goblin -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ 3 R Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destory target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_replica.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/178.jpg -End diff --git a/res/cardsfolder/goblin_rimerunner.txt b/res/cardsfolder/goblin_rimerunner.txt deleted file mode 100644 index ae98d257a97..00000000000 --- a/res/cardsfolder/goblin_rimerunner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Rimerunner -ManaCost:2 R -Types:Snow Creature Goblin Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -A:AB$ Pump | Cost$ S | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_rimerunner.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_ringleader.txt b/res/cardsfolder/goblin_ringleader.txt deleted file mode 100644 index ff518448117..00000000000 --- a/res/cardsfolder/goblin_ringleader.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Ringleader -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:Haste -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Goblin -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card27664.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_roughrider.txt b/res/cardsfolder/goblin_roughrider.txt deleted file mode 100644 index d3557aeaa4e..00000000000 --- a/res/cardsfolder/goblin_roughrider.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goblin Roughrider -ManaCost:2 R -Types:Creature Goblin Knight -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_roughrider.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_ruinblaster.txt b/res/cardsfolder/goblin_ruinblaster.txt deleted file mode 100644 index cce1ed52eb3..00000000000 --- a/res/cardsfolder/goblin_ruinblaster.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Goblin Ruinblaster -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -K:Haste -K:Kicker:R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonbasic land. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. -SVar:PlayMain1:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ruinblaster.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_scouts.txt b/res/cardsfolder/goblin_scouts.txt deleted file mode 100644 index 0511fe85b7a..00000000000 --- a/res/cardsfolder/goblin_scouts.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goblin Scouts -ManaCost:3 R R -Types:Sorcery -Text:Put three 1/1 red Goblin Scout creature tokens with mountainwalk onto the battlefield. -A:SP$ Token | Cost$ 3 R R | TokenAmount$ 3 | TokenName$ Goblin Scout | TokenTypes$ Creature,Goblin,Scout | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Mountainwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_scouts.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_settler.txt b/res/cardsfolder/goblin_settler.txt deleted file mode 100644 index f714bf864a0..00000000000 --- a/res/cardsfolder/goblin_settler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Settler -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select a land. -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Starter_1999/goblin_settler.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_sharpshooter.txt b/res/cardsfolder/goblin_sharpshooter.txt deleted file mode 100644 index e065aba0335..00000000000 --- a/res/cardsfolder/goblin_sharpshooter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Sharpshooter -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -K:CARDNAME doesn't untap during your untap step. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_sharpshooter.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_shortcutter.txt b/res/cardsfolder/goblin_shortcutter.txt deleted file mode 100644 index ccfc8403900..00000000000 --- a/res/cardsfolder/goblin_shortcutter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Shortcutter -ManaCost:1 R -Types:Creature Goblin Scout -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCanNotBlock | TriggerDescription$ When CARDNAME enters the battlefield, target creature can't block this turn. -SVar:TrigCanNotBlock:AB$Pump | Cost$ 0 | ValidTgts$ Creature | KW$ HIDDEN CARDNAME can't block. | TgtPrompt$ Select target creature. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_shortcutter.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_shrine.txt b/res/cardsfolder/goblin_shrine.txt deleted file mode 100644 index 88aab7a5998..00000000000 --- a/res/cardsfolder/goblin_shrine.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Goblin Shrine -ManaCost:1 R R -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpAll:Creature.Goblin:1/0:isPresent Land.AttachedBy+Basic+Mountain:If enchanted land is a basic Mountain, Goblin creatures get +1/+0. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME leaves the battlefield, it deals 1 damage to each Goblin creature. -SVar:TrigDealDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.Goblin | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_shrine.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_ski_patrol.txt b/res/cardsfolder/goblin_ski_patrol.txt deleted file mode 100644 index a643805c01b..00000000000 --- a/res/cardsfolder/goblin_ski_patrol.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Ski Patrol -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | KW$ Flying & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | ActivationLimit$ 1 | IsPresent$ Mountain.Snow+YouCtrl | SpellDescription$ CARDNAME 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_ski_patrol.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_sky_raider.txt b/res/cardsfolder/goblin_sky_raider.txt deleted file mode 100644 index b4ef70300ec..00000000000 --- a/res/cardsfolder/goblin_sky_raider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Sky Raider -ManaCost:2 R -Types:Creature Goblin Warrior -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83305.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/208.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/195.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_skycutter.txt b/res/cardsfolder/goblin_skycutter.txt deleted file mode 100644 index 4d6402db836..00000000000 --- a/res/cardsfolder/goblin_skycutter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Skycutter -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 2 | SubAbility$ DBDebuff | SpellDescription$ CARDNAME deals 2 damage to target creature with flying. That creature loses flying until end of turn. -SVar:DBDebuff:DB$ Debuff | Defined$ Targeted | Keywords$ Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_skycutter.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_sledder.txt b/res/cardsfolder/goblin_sledder.txt deleted file mode 100644 index 1bffeadc822..00000000000 --- a/res/cardsfolder/goblin_sledder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Sledder -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_sledder.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/209.jpg -End diff --git a/res/cardsfolder/goblin_soothsayer.txt b/res/cardsfolder/goblin_soothsayer.txt deleted file mode 100644 index f21dcbd62c9..00000000000 --- a/res/cardsfolder/goblin_soothsayer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Soothsayer -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -A:AB$ PumpAll | Cost$ R T Sac<1/Goblin> | ValidCards$ Creature.Red | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Red creatures get +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_soothsayer.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_spelunkers.txt b/res/cardsfolder/goblin_spelunkers.txt deleted file mode 100644 index d1e57972d42..00000000000 --- a/res/cardsfolder/goblin_spelunkers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Spelunkers -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83803.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/128.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/195.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_spy.txt b/res/cardsfolder/goblin_spy.txt deleted file mode 100644 index 5fa0e77d079..00000000000 --- a/res/cardsfolder/goblin_spy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Spy -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Play with the top card of your library revealed. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_spy.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_striker.txt b/res/cardsfolder/goblin_striker.txt deleted file mode 100644 index c31f2fdc85e..00000000000 --- a/res/cardsfolder/goblin_striker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Striker -ManaCost:1 R -Types:Creature Goblin Berserker -Text:no text -PT:1/1 -K:First Strike -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_striker.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_swine_rider.txt b/res/cardsfolder/goblin_swine_rider.txt deleted file mode 100644 index 21bb7480994..00000000000 --- a/res/cardsfolder/goblin_swine_rider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Swine-Rider -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes blocked, it deals 2 damage to each attacking creature and each blocking creature. -SVar:TrigDealDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.attacking,Creature.blocking | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_swine_rider.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_taskmaster.txt b/res/cardsfolder/goblin_taskmaster.txt deleted file mode 100644 index 2e03cc126f4..00000000000 --- a/res/cardsfolder/goblin_taskmaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Taskmaster -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature.goblin | TgtPrompt$ Select target Goblin creature | NumAtt$ +1 | SpellDescription$ Target Goblin creature gets +1/+0 until end of turn. -K:Morph:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_taskmaster.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_tinkerer.txt b/res/cardsfolder/goblin_tinkerer.txt deleted file mode 100644 index f57c39d2a69..00000000000 --- a/res/cardsfolder/goblin_tinkerer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin Tinkerer -ManaCost:1 R -Types:Creature Goblin Artificer -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ R T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target artifact. That artifact deals damage equal to its converted mana cost to CARDNAME. -SVar:DBDamage:DB$DealDamage | Defined$ Self | NumDmg$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_tinkerer.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_trenches.txt b/res/cardsfolder/goblin_trenches.txt deleted file mode 100644 index c809b8821ae..00000000000 --- a/res/cardsfolder/goblin_trenches.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goblin Trenches -ManaCost:1 R W -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 2 Sac<1/Land> | TokenAmount$ 2 | TokenName$ Goblin Soldier | TokenTypes$ Creature,Goblin,Soldier | TokenOwner$ You | TokenColors$ White,Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 red and white Goblin Soldier creature tokens onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_trenches.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_tunneler.txt b/res/cardsfolder/goblin_tunneler.txt deleted file mode 100644 index 41dbec01c5e..00000000000 --- a/res/cardsfolder/goblin_tunneler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Tunneler -ManaCost:1 R -Types:Creature Goblin Rogue -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less. | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_tunneler.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/143.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_turncoat.txt b/res/cardsfolder/goblin_turncoat.txt deleted file mode 100644 index f7f7e755bc9..00000000000 --- a/res/cardsfolder/goblin_turncoat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin Turncoat -ManaCost:1 B -Types:Creature Goblin Mercenary -Text:no text -PT:2/1 -A:AB$ Regenerate | Cost$ Sac<1/Goblin> | Defined$ Self | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_turncoat.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_vandal.txt b/res/cardsfolder/goblin_vandal.txt deleted file mode 100644 index 5c6624de7c5..00000000000 --- a/res/cardsfolder/goblin_vandal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Vandal -ManaCost:R -Types:Creature Goblin Rogue -Text:no text -PT:1/1 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, destroy target artifact defending player controls and Goblin Vandal assigns no combat damage this turn. -SVar:TrigDestroy:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact defending player controls | SubAbility$ SVar=DBPump | Mandatory$ True -SVar:DBPump:DB$Pump | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_vandal.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_war_buggy.txt b/res/cardsfolder/goblin_war_buggy.txt deleted file mode 100644 index d0ea675a08d..00000000000 --- a/res/cardsfolder/goblin_war_buggy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin War Buggy -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:Haste -K:Echo:1 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_buggy.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_war_paint.txt b/res/cardsfolder/goblin_war_paint.txt deleted file mode 100644 index 0622ba5bd17..00000000000 --- a/res/cardsfolder/goblin_war_paint.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goblin War Paint -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_paint.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_war_strike.txt b/res/cardsfolder/goblin_war_strike.txt deleted file mode 100644 index 5dda163568f..00000000000 --- a/res/cardsfolder/goblin_war_strike.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin War Strike -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of Goblins you control to target player. -SVar:X:Count$TypeYouCtrl.Goblin -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_strike.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/105.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_war_wagon.txt b/res/cardsfolder/goblin_war_wagon.txt deleted file mode 100644 index aaa709dfce9..00000000000 --- a/res/cardsfolder/goblin_war_wagon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Goblin War Wagon -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:3/3 -K:CARDNAME doesn't untap during your untap step. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may pay 2. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 2 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_wagon.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_warchief.txt b/res/cardsfolder/goblin_warchief.txt deleted file mode 100644 index 26d8170c9ce..00000000000 --- a/res/cardsfolder/goblin_warchief.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Warchief -ManaCost:1 R R -Types:Creature Goblin -Text:Goblin spells you cast cost 1 less to cast. -PT:2/2 -K:CostChange:Player:Less:1:Spell:All:Goblin:NoSpecial -K:stPumpAll:Creature.Goblin+YouCtrl:0/0/Haste:No Condition:Goblin creatures you control have haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Goblin -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_warchief.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_wardriver.txt b/res/cardsfolder/goblin_wardriver.txt deleted file mode 100644 index f445bdcca18..00000000000 --- a/res/cardsfolder/goblin_wardriver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Wardriver -ManaCost:R R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_wardriver.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_warrens.txt b/res/cardsfolder/goblin_warrens.txt deleted file mode 100644 index de6d536fbbc..00000000000 --- a/res/cardsfolder/goblin_warrens.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goblin Warrens -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 2 R Sac<2/Goblin> | TokenAmount$ 3 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put three 1/1 red Goblin Soldier creature tokens onto the battlefield. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_warrens.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/238.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/187.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goblin_wizard.txt b/res/cardsfolder/goblin_wizard.txt deleted file mode 100644 index d8c212eab39..00000000000 --- a/res/cardsfolder/goblin_wizard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goblin Wizard -ManaCost:2 R R -Types:Creature Goblin Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.Goblin | ChangeNum$ 1 | SpellDescription$ You may put a Goblin permanent card from your hand onto the battlefield. -A:AB$ Pump | Cost$ R | ValidTgts$ Permanent.Goblin | TgtPrompt$ Select target Goblin | KW$ Protection from white | SpellDescription$ Target Goblin gains protection from white until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_wizard.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godhead_of_awe.txt b/res/cardsfolder/godhead_of_awe.txt deleted file mode 100644 index 6ce7b5b6c04..00000000000 --- a/res/cardsfolder/godhead_of_awe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Godhead of Awe -ManaCost:WU WU WU WU WU -Types:Creature Spirit Avatar -Text:no text -PT:4/4 -K:Flying -K:stAnimateAll:Creature.Other:1/1:no types:no colors:No Abilities:No condition:Other creatures are 1/1. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/godhead_of_awe.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godless_shrine.txt b/res/cardsfolder/godless_shrine.txt deleted file mode 100644 index 870487c73db..00000000000 --- a/res/cardsfolder/godless_shrine.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Godless Shrine -ManaCost:no cost -Types:Land Plains Swamp -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96935.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godos_irregulars.txt b/res/cardsfolder/godos_irregulars.txt deleted file mode 100644 index be9a8a16795..00000000000 --- a/res/cardsfolder/godos_irregulars.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Godo's Irregulars -ManaCost:R -Types:Creature Human Warrior -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ R | ValidTgts$ Creature.blockingSource | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature blocking it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/godos_irregulars.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gods_eye_gate_to_the_reikai.txt b/res/cardsfolder/gods_eye_gate_to_the_reikai.txt deleted file mode 100644 index 15b4c8c77da..00000000000 --- a/res/cardsfolder/gods_eye_gate_to_the_reikai.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gods' Eye, Gate to the Reikai -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ TriggeredCardController -SVar:SacMe:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gods_eye_gate_to_the_reikai.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godsire.txt b/res/cardsfolder/godsire.txt deleted file mode 100644 index 610be76ff87..00000000000 --- a/res/cardsfolder/godsire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Godsire -ManaCost:4 R G G W -Types:Creature Beast -Text:no text -PT:8/8 -K:Vigilance -A:AB$ Token | Cost$ T | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ White,Red,Green | TokenPower$ 8 | TokenToughness$ 8 | SpellDescription$ Put an 8/8 Beast creature token that's red, green, and white onto the battlefield. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/godsire.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godtoucher.txt b/res/cardsfolder/godtoucher.txt deleted file mode 100644 index 5e7503c5760..00000000000 --- a/res/cardsfolder/godtoucher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Godtoucher -ManaCost:3 G -Types:Creature Elf Cleric -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 W T | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | SpellDescription$ Prevent all damage that would be dealt to target creature with power 5 or greater this turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/godtoucher.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/godtracker_of_jund.txt b/res/cardsfolder/godtracker_of_jund.txt deleted file mode 100644 index eb684c96313..00000000000 --- a/res/cardsfolder/godtracker_of_jund.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Godtracker of Jund -ManaCost:1 R G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ Whenever a creature with power 5 or greater enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/godtracker_of_jund.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gold_myr.txt b/res/cardsfolder/gold_myr.txt deleted file mode 100644 index c5e4050cc09..00000000000 --- a/res/cardsfolder/gold_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gold Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gold_myr.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/180.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golden_bear.txt b/res/cardsfolder/golden_bear.txt deleted file mode 100644 index a5323f7ea7c..00000000000 --- a/res/cardsfolder/golden_bear.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Golden Bear -ManaCost:3 G -Types:Creature Bear -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6616.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golden_urn.txt b/res/cardsfolder/golden_urn.txt deleted file mode 100644 index 12bcc3c7927..00000000000 --- a/res/cardsfolder/golden_urn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Golden Urn -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on CARDNAME. -A:AB$ GainLife | Cost$ T Sac<1/CARDNAME> | LifeAmount$ X | SpellDescription$ You gain life equal to the number of charge counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golden_urn.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goldenglow_moth.txt b/res/cardsfolder/goldenglow_moth.txt deleted file mode 100644 index ca024c41ff7..00000000000 --- a/res/cardsfolder/goldenglow_moth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Goldenglow Moth -ManaCost:W -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -T:Mode$ Blocks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME blocks, you may gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goldenglow_moth.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/15.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goldmeadow_dodger.txt b/res/cardsfolder/goldmeadow_dodger.txt deleted file mode 100644 index 79bd3aa7805..00000000000 --- a/res/cardsfolder/goldmeadow_dodger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goldmeadow Dodger -ManaCost:W -Types:Creature Kithkin Rogue -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by creatures with power 4 or greater. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goldmeadow_dodger.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goldmeadow_harrier.txt b/res/cardsfolder/goldmeadow_harrier.txt deleted file mode 100644 index 0da92a4ba22..00000000000 --- a/res/cardsfolder/goldmeadow_harrier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goldmeadow Harrier -ManaCost:W -Types:Creature Kithkin Soldier -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/goldmeadow_harrier.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/17.jpg -End diff --git a/res/cardsfolder/goldmeadow_lookout.txt b/res/cardsfolder/goldmeadow_lookout.txt deleted file mode 100644 index bcef8a5ae25..00000000000 --- a/res/cardsfolder/goldmeadow_lookout.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Goldmeadow Lookout -ManaCost:3 W -Types:Creature Kithkin Spellshaper -Text:no text -PT:2/2 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130311.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golem_artisan.txt b/res/cardsfolder/golem_artisan.txt deleted file mode 100644 index d8fc5c52af1..00000000000 --- a/res/cardsfolder/golem_artisan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Golem Artisan -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Artifact | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target artifact creature gets +1/+1 until end of turn. | TgtPrompt$ Select target artifact creature. -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Artifact | KW$ Flying | SpellDescription$ Target artifact creature gains flying until end of turn. | TgtPrompt$ Select target artifact creature. -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Artifact | KW$ Trample | SpellDescription$ Target artifact creature gains trample until end of turn. | TgtPrompt$ Select target artifact creature. -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Artifact | KW$ Haste | SpellDescription$ Target artifact creature gains haste until end of turn. | TgtPrompt$ Select target artifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/golem_artisan.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golem_foundry.txt b/res/cardsfolder/golem_foundry.txt deleted file mode 100644 index 7832b68a079..00000000000 --- a/res/cardsfolder/golem_foundry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Golem Foundry -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an artifact spell, you may put a charge counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/CHARGE> | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterNum$ 1 | CounterType$ CHARGE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golem_foundry.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golems_heart.txt b/res/cardsfolder/golems_heart.txt deleted file mode 100644 index 230a3abf28f..00000000000 --- a/res/cardsfolder/golems_heart.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Golem's Heart -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Artifact | Execute$ TrigGainLife | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player casts an artifact spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/golems_heart.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_brownscale.txt b/res/cardsfolder/golgari_brownscale.txt deleted file mode 100644 index 6263d5fb2af..00000000000 --- a/res/cardsfolder/golgari_brownscale.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Golgari Brownscale -ManaCost:1 G G -Types:Creature Lizard -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Graveyard | Destination$ Hand | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is put into your hand from your graveyard, you gain 2 life. -K:Dredge 2 -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_brownscale.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_germination.txt b/res/cardsfolder/golgari_germination.txt deleted file mode 100644 index 9dd0b61f587..00000000000 --- a/res/cardsfolder/golgari_germination.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Golgari Germination -ManaCost:1 B G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a nontoken creature you control is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_germination.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_grave_troll.txt b/res/cardsfolder/golgari_grave_troll.txt deleted file mode 100644 index 3439cbde2c0..00000000000 --- a/res/cardsfolder/golgari_grave_troll.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Golgari Grave-Troll -ManaCost:4 G -Types:Creature Skeleton Troll -Text:no text -PT:0/0 -K:etbCounter:P1P1:X -A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate CARDNAME. -K:Dredge 6 -SVar:X:Count$TypeInYourYard.Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_grave_troll.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_guildmage.txt b/res/cardsfolder/golgari_guildmage.txt deleted file mode 100644 index 09fe8f16e89..00000000000 --- a/res/cardsfolder/golgari_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Golgari Guildmage -ManaCost:BG BG -Types:Creature Elf Shaman -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 4 B Sac<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -A:AB$ PutCounter | Cost$ 4 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_guildmage.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_rot_farm.txt b/res/cardsfolder/golgari_rot_farm.txt deleted file mode 100644 index 8dbe3b83272..00000000000 --- a/res/cardsfolder/golgari_rot_farm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Golgari Rot Farm -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B G | SpellDescription$ Add B G to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_rot_farm.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_rotwurm.txt b/res/cardsfolder/golgari_rotwurm.txt deleted file mode 100644 index 2be96b648d4..00000000000 --- a/res/cardsfolder/golgari_rotwurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Golgari Rotwurm -ManaCost:3 B G -Types:Creature Zombie Wurm -Text:no text -PT:5/4 -A:AB$ LoseLife | Cost$ B Sac<1/Creature> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_rotwurm.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_signet.txt b/res/cardsfolder/golgari_signet.txt deleted file mode 100644 index e6d23fe74be..00000000000 --- a/res/cardsfolder/golgari_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Golgari Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ B G | SpellDescription$ Add B G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_signet.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/golgari_thug.txt b/res/cardsfolder/golgari_thug.txt deleted file mode 100644 index d270a0d606d..00000000000 --- a/res/cardsfolder/golgari_thug.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Golgari Thug -ManaCost:1 B -Types:Creature Human Warrior -Text:no text -PT:1/1 -K:Dredge 4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put target creature card from your graveyard on top of your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target creature card from your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/golgari_thug.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goliath_beetle.txt b/res/cardsfolder/goliath_beetle.txt deleted file mode 100644 index dd2987af5cb..00000000000 --- a/res/cardsfolder/goliath_beetle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goliath Beetle -ManaCost:2 G -Types:Creature Insect -Text:no text -PT:3/1 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card15223.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goliath_sphinx.txt b/res/cardsfolder/goliath_sphinx.txt deleted file mode 100644 index d47d6a87d7c..00000000000 --- a/res/cardsfolder/goliath_sphinx.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goliath Sphinx -ManaCost:5 U U -Types:Creature Sphinx -Text:no text -PT:8/7 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/goliath_sphinx.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goliath_spider.txt b/res/cardsfolder/goliath_spider.txt deleted file mode 100644 index 048c83346bb..00000000000 --- a/res/cardsfolder/goliath_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Goliath Spider -ManaCost:6 G G -Types:Creature Spider -Text:no text -PT:7/6 -K:Reach -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card88959.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gore_vassal.txt b/res/cardsfolder/gore_vassal.txt deleted file mode 100644 index 2710f42d04b..00000000000 --- a/res/cardsfolder/gore_vassal.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gore Vassal -ManaCost:2 W -Types:Creature Hound -Text:no text -PT:2/1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gore_vassal.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/goretusk_firebeast.txt b/res/cardsfolder/goretusk_firebeast.txt deleted file mode 100644 index 04bb58565da..00000000000 --- a/res/cardsfolder/goretusk_firebeast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Goretusk Firebeast -ManaCost:5 R -Types:Creature Beast -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 4 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/jud/en-us/card34917.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorger_wurm.txt b/res/cardsfolder/gorger_wurm.txt deleted file mode 100644 index 9d45242db72..00000000000 --- a/res/cardsfolder/gorger_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gorger Wurm -ManaCost:3 R G -Types:Creature Wurm -Text:no text -PT:5/5 -K:Devour:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorger_wurm.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorgon_flail.txt b/res/cardsfolder/gorgon_flail.txt deleted file mode 100644 index 5afb50b2103..00000000000 --- a/res/cardsfolder/gorgon_flail.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gorgon Flail -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1 and has deathtouch. -K:eqPump 2:+1/+1/Deathtouch -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorgon_flail.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorgon_recluse.txt b/res/cardsfolder/gorgon_recluse.txt deleted file mode 100644 index 7e038673c5f..00000000000 --- a/res/cardsfolder/gorgon_recluse.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Gorgon Recluse -ManaCost:3 B B -Types:Creature Gorgon -Text:no text -PT:2/4 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonBlack | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a nonblack creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -K:Madness:B B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorgon_recluse.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorilla_chieftain.txt b/res/cardsfolder/gorilla_chieftain.txt deleted file mode 100644 index 6a536c52531..00000000000 --- a/res/cardsfolder/gorilla_chieftain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gorilla Chieftain -ManaCost:2 G G -Types:Creature Ape -Text:no text -PT:3/3 -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorilla_chieftain.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/235.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/77.jpg|2 -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorilla_pack.txt b/res/cardsfolder/gorilla_pack.txt deleted file mode 100644 index a021f7cdba2..00000000000 --- a/res/cardsfolder/gorilla_pack.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gorilla Pack -ManaCost:2 G -Types:Creature Ape -text:no text -PT:3/3 -K:CARDNAME can't attack unless defending player controls a Forest. -K:When you control no Forests, sacrifice CARDNAME. -SVar:NeedsToPlay:Forest.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorilla_pack.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gorilla_shaman.txt b/res/cardsfolder/gorilla_shaman.txt deleted file mode 100644 index 2f6448dfdd7..00000000000 --- a/res/cardsfolder/gorilla_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gorilla Shaman -ManaCost:R -Types:Creature Ape Shaman -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ X X 1 | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Destroy target noncreature artifact with converted mana cost X. -# It may seem wrong to not use X in the target, but since the Target is what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gorilla_shaman.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/106.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/gorilla_warrior.txt b/res/cardsfolder/gorilla_warrior.txt deleted file mode 100644 index 855759ab9c9..00000000000 --- a/res/cardsfolder/gorilla_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gorilla Warrior -ManaCost:2 G -Types:Creature Ape Warrior -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5683.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/256.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/128.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gossamer_chains.txt b/res/cardsfolder/gossamer_chains.txt deleted file mode 100644 index 3518d9db520..00000000000 --- a/res/cardsfolder/gossamer_chains.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gossamer Chains -ManaCost:W W -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.attacking+unblocked | TgtPrompt$ Select target unblocked creature | IsCurse$ True | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target unblocked creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gossamer_chains.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gossamer_phantasm.txt b/res/cardsfolder/gossamer_phantasm.txt deleted file mode 100644 index 1280ddc0f14..00000000000 --- a/res/cardsfolder/gossamer_phantasm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gossamer Phantasm -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:2/1 -K:Flying -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gossamer_phantasm.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gosta_dirk.txt b/res/cardsfolder/gosta_dirk.txt deleted file mode 100644 index 5bc32a3dc22..00000000000 --- a/res/cardsfolder/gosta_dirk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gosta Dirk -ManaCost:3 W W U U -Types:Legendary Creature Human Warrior -Text:Creatures with islandwalk can be blocked as though they didn't have islandwalk. -PT:4/4 -K:First Strike -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gosta_dirk.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/graceful_adept.txt b/res/cardsfolder/graceful_adept.txt deleted file mode 100644 index dc3547a6a8a..00000000000 --- a/res/cardsfolder/graceful_adept.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Graceful Adept -ManaCost:2 U -Types:Creature Human Wizard -Text:You have no maximum hand size. -PT:1/3 -K:HandSize = INF Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/graceful_adept.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grafted_exoskeleton.txt b/res/cardsfolder/grafted_exoskeleton.txt deleted file mode 100644 index 7943dd48c8c..00000000000 --- a/res/cardsfolder/grafted_exoskeleton.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grafted Exoskeleton -ManaCost:4 -Types:Artifact Equipment -Text: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.) -K:eqPump 2:+2/+2/Infect -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ TriggeredCard -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_exoskeleton.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grafted_skullcap.txt b/res/cardsfolder/grafted_skullcap.txt deleted file mode 100644 index dfed19bf0b7..00000000000 --- a/res/cardsfolder/grafted_skullcap.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Grafted Skullcap -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your draw step, draw an additional card. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of your end step, discard your hand. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Mode$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_skullcap.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/296.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grafted_wargear.txt b/res/cardsfolder/grafted_wargear.txt deleted file mode 100644 index c14e91557b0..00000000000 --- a/res/cardsfolder/grafted_wargear.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grafted Wargear -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +3/+2. -K:eqPump 0:+3/+2 -T:Mode$ Unequip | ValidEquipment$ Card.Self | ValidCard$ Permanent | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ TriggeredCard -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grafted_wargear.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grand_arbiter_augustin_iv.txt b/res/cardsfolder/grand_arbiter_augustin_iv.txt deleted file mode 100644 index ed2739a4ed7..00000000000 --- a/res/cardsfolder/grand_arbiter_augustin_iv.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grand Arbiter Augustin IV -ManaCost:2 W U -Types:Legendary Creature Human Advisor -Text:White spells you cast cost 1 less to cast.\r\nBlue spells you cast cost 1 less to cast.\r\nSpells your opponents cast cost 1 more to cast. -PT:2/3 -K:CostChange:Player:Less:1:Spell:white:All:NoSpecial -K:CostChange:Player:Less:1:Spell:blue:All:NoSpecial -K:CostChange:Opponent:More:1:Spell:All:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grand_arbiter_augustin_iv.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grand_coliseum.txt b/res/cardsfolder/grand_coliseum.txt deleted file mode 100644 index 2d27cc10079..00000000000 --- a/res/cardsfolder/grand_coliseum.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Grand Coliseum -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grand_coliseum.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grandmother_sengir.txt b/res/cardsfolder/grandmother_sengir.txt deleted file mode 100644 index af923cca46f..00000000000 --- a/res/cardsfolder/grandmother_sengir.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grandmother Sengir -ManaCost:4 B -Types:Legendary Creature Human Wizard -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grandmother_sengir.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/granger_guildmage.txt b/res/cardsfolder/granger_guildmage.txt deleted file mode 100644 index 4d71be21832..00000000000 --- a/res/cardsfolder/granger_guildmage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Granger Guildmage -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -A:AB$ DealDamage | Cost$ R T | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or player and 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/granger_guildmage.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/118.jpg -End diff --git a/res/cardsfolder/granite_gargoyle.txt b/res/cardsfolder/granite_gargoyle.txt deleted file mode 100644 index 9c6ad922a3c..00000000000 --- a/res/cardsfolder/granite_gargoyle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Granite Gargoyle -ManaCost:2 R -Types:Creature Gargoyle -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ R | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/granite_gargoyle.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/156.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/157.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/155.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/granite_grip.txt b/res/cardsfolder/granite_grip.txt deleted file mode 100644 index f24f2036abf..00000000000 --- a/res/cardsfolder/granite_grip.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Granite Grip -ManaCost:2 R -Types:Enchantment Aura -Text:Enchanted creature gets +1/+0 for each Mountain you control. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/0:no Condition:no text -SVar:X:Count$Valid Mountain.YouCtrl/Times.1 -SVar:BuffedBy:Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/granite_grip.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/81.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/granite_shard.txt b/res/cardsfolder/granite_shard.txt deleted file mode 100644 index 8464411c4af..00000000000 --- a/res/cardsfolder/granite_shard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Granite Shard -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 3 T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -A:AB$ DealDamage | Cost$ R T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/granite_shard.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/granulate.txt b/res/cardsfolder/granulate.txt deleted file mode 100644 index b557ad66e26..00000000000 --- a/res/cardsfolder/granulate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Granulate -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 R R | ValidCards$ Artifact.nonLand+cmcLE4 | SpellDescription$ Destroy each nonland artifact with converted mana cost 4 or less. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/granulate.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/67.jpg -End diff --git a/res/cardsfolder/grapeshot.txt b/res/cardsfolder/grapeshot.txt deleted file mode 100644 index d9f0cc26386..00000000000 --- a/res/cardsfolder/grapeshot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grapeshot -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | TgtPrompt$ Select target creature or player | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grapeshot.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grapeshot_catapult.txt b/res/cardsfolder/grapeshot_catapult.txt deleted file mode 100644 index 9337a35478f..00000000000 --- a/res/cardsfolder/grapeshot_catapult.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Grapeshot Catapult -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:2/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grapeshot_catapult.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/375.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/17.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/340.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grappler_spider.txt b/res/cardsfolder/grappler_spider.txt deleted file mode 100644 index 678d4e81a6f..00000000000 --- a/res/cardsfolder/grappler_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grappler Spider -ManaCost:1 G -Types:Creature Spider -Text:no text -PT:2/1 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grappler_spider.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grasp_of_darkness.txt b/res/cardsfolder/grasp_of_darkness.txt deleted file mode 100644 index 249d630f858..00000000000 --- a/res/cardsfolder/grasp_of_darkness.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Grasp of Darkness -ManaCost:B B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grasp_of_darkness.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/65.jpg -End diff --git a/res/cardsfolder/grassland_crusader.txt b/res/cardsfolder/grassland_crusader.txt deleted file mode 100644 index a99f72f8e1d..00000000000 --- a/res/cardsfolder/grassland_crusader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grassland Crusader -ManaCost:5 W -Types:Creature Human Cleric Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature.Elf,Creature.Soldier | TgtPrompt$ Select target Elf or Soldier creature | SpellDescription$ Target Elf or Soldier creature gets +2/+2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grassland_crusader.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grasslands.txt b/res/cardsfolder/grasslands.txt deleted file mode 100644 index 12ff92851a6..00000000000 --- a/res/cardsfolder/grasslands.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grasslands -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest,Plains | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest or Plains card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grasslands.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gratuitous_violence.txt b/res/cardsfolder/gratuitous_violence.txt deleted file mode 100644 index cfafed36526..00000000000 --- a/res/cardsfolder/gratuitous_violence.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gratuitous Violence -ManaCost:2 R R R -Types:Enchantment -Text:If a creature you control would deal damage to a creature or player, it deals double that damage to that creature or player instead. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gratuitous_violence.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grave_defiler.txt b/res/cardsfolder/grave_defiler.txt deleted file mode 100644 index 04291780f7c..00000000000 --- a/res/cardsfolder/grave_defiler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grave Defiler -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/1 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Zombie -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_defiler.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grave_pact.txt b/res/cardsfolder/grave_pact.txt deleted file mode 100644 index 69930ed136f..00000000000 --- a/res/cardsfolder/grave_pact.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Grave Pact -ManaCost:1 B B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever a creature you control is put into a graveyard from the battlefield, each other player sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | SacValid$ Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_pact.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/137.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/10.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/135.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grave_robbers.txt b/res/cardsfolder/grave_robbers.txt deleted file mode 100644 index 00418ab1617..00000000000 --- a/res/cardsfolder/grave_robbers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grave Robbers -ManaCost:1 B B -Types:Creature Human Rogue -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ B T | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target artifact card in a graveyard | ValidTgts$ Artifact | SubAbility$ SVar=DBGainLife | SpellDescription$ Exile target artifact card from a graveyard. You gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_robbers.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grave_shell_scarab.txt b/res/cardsfolder/grave_shell_scarab.txt deleted file mode 100644 index 9860de83343..00000000000 --- a/res/cardsfolder/grave_shell_scarab.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grave-Shell Scarab -ManaCost:2 B G G -Types:Creature Insect -Text:no text -PT:4/4 -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -K:Dredge 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_shell_scarab.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grave_titan.txt b/res/cardsfolder/grave_titan.txt deleted file mode 100644 index b9a028db642..00000000000 --- a/res/cardsfolder/grave_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Grave Titan -ManaCost:4 B B -Types:Creature Giant -Text:no text -PT:6/6 -K:Deathtouch -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME enters the battlefield, put two 2/2 black Zombie creature tokens onto the battlefield. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, put two 2/2 black Zombie creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ B 2 2 Zombie | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenAmount$ 2 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_titan.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravebind.txt b/res/cardsfolder/gravebind.txt deleted file mode 100644 index d6b4dcc3d2b..00000000000 --- a/res/cardsfolder/gravebind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gravebind -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature can't be regenerated this turn. Draw a card at the beginning of the next turn's upkeep. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravebind.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/graveborn_muse.txt b/res/cardsfolder/graveborn_muse.txt deleted file mode 100644 index 91f84532041..00000000000 --- a/res/cardsfolder/graveborn_muse.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Graveborn Muse -ManaCost:2 B B -Types: Creature Zombie Spirit -Text:no text -PT:3/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, you draw X cards and you lose X life, where X is the number of Zombies you control. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Zombie.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/graveborn_muse.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/145.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravedigger.txt b/res/cardsfolder/gravedigger.txt deleted file mode 100644 index 4479dd1806e..00000000000 --- a/res/cardsfolder/gravedigger.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Gravedigger -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target creature card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83114.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/138.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/140.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/139.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/17.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/136.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/31.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/146.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/98.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/97.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/134.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravel_slinger.txt b/res/cardsfolder/gravel_slinger.txt deleted file mode 100644 index 58c74e9d752..00000000000 --- a/res/cardsfolder/gravel_slinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gravel Slinger -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:1/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking creature. -K:Morph:1 W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravel_slinger.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravelgill_axeshark.txt b/res/cardsfolder/gravelgill_axeshark.txt deleted file mode 100644 index 3dd7f92eff8..00000000000 --- a/res/cardsfolder/gravelgill_axeshark.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gravelgill Axeshark -ManaCost:4 UB -Types:Creature Merfolk Soldier -Text:no text -PT:3/3 -K:Persist -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravelgill_axeshark.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravelgill_duo.txt b/res/cardsfolder/gravelgill_duo.txt deleted file mode 100644 index cb5d55aa299..00000000000 --- a/res/cardsfolder/gravelgill_duo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gravelgill Duo -ManaCost:2 UB -Types:Creature Merfolk Rogue Warrior -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.Blue+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump11 | TriggerDescription$ Whenever you cast a blue spell, CARDNAME gets +1/+1 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Black+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpFear | TriggerDescription$ Whenever you cast a black spell, CARDNAME gains fear until end of turn. (It can't be blocked except by artifact creatures and/or black creatures.) -SVar:TrigPump11:AB$Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ +1 | Defined$ Self -SVar:TrigPumpFear:AB$Pump | Cost$ 0 | KW$ Fear | Defined$ Self -SVar:BuffedBy:Spell.Blue,Spell.Black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravelgill_duo.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/graven_cairns.txt b/res/cardsfolder/graven_cairns.txt deleted file mode 100644 index 5f6ddb78014..00000000000 --- a/res/cardsfolder/graven_cairns.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Graven Cairns -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ BR T | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -A:AB$ Mana | Cost$ BR T | Produced$ B R | SpellDescription$ Add B R to your mana pool. -A:AB$ Mana | Cost$ BR T | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/graven_cairns.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/175.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravespawn_sovereign.txt b/res/cardsfolder/gravespawn_sovereign.txt deleted file mode 100644 index 95dbfa14b8c..00000000000 --- a/res/cardsfolder/gravespawn_sovereign.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gravespawn Sovereign -ManaCost:4 B B -Types:Creature Zombie -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ tapXType<5/Zombie> | TgtPrompt$ Choose target creature card in a graveyard | GainControl$ True | ValidTgts$ Creature | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravespawn_sovereign.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gravitational_shift.txt b/res/cardsfolder/gravitational_shift.txt deleted file mode 100644 index 5059eee8c5a..00000000000 --- a/res/cardsfolder/gravitational_shift.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gravitational Shift -ManaCost:3 U U -Types:Enchantment -Text:no text -K:stPumpAll:Creature.withFlying:2/0:No Condition:Creatures with flying get +2/+0. -K:stPumpAll:Creature.withoutFlying:-2/0:No Condition:Creatures without flying get -2/-0. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gravitational_shift.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gray_ogre.txt b/res/cardsfolder/gray_ogre.txt deleted file mode 100644 index 7e219c0cb5b..00000000000 --- a/res/cardsfolder/gray_ogre.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gray Ogre -ManaCost:2 R -Types:Creature Ogre -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2283.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/157.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/158.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/156.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/218.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/graypelt_hunter.txt b/res/cardsfolder/graypelt_hunter.txt deleted file mode 100644 index 799a201c132..00000000000 --- a/res/cardsfolder/graypelt_hunter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Graypelt Hunter -ManaCost:3 G -Types:Creature Human Warrior Ally -Text:no text -PT:2/2 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/graypelt_hunter.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/graypelt_refuge.txt b/res/cardsfolder/graypelt_refuge.txt deleted file mode 100644 index c2364140847..00000000000 --- a/res/cardsfolder/graypelt_refuge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Graypelt Refuge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/graypelt_refuge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grayscaled_gharial.txt b/res/cardsfolder/grayscaled_gharial.txt deleted file mode 100644 index e8766e80ac0..00000000000 --- a/res/cardsfolder/grayscaled_gharial.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grayscaled Gharial -ManaCost:U -Types:Creature Crocodile -Text:no text -PT:1/1 -K:Islandwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87914.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grazing_gladehart.txt b/res/cardsfolder/grazing_gladehart.txt deleted file mode 100644 index 7bc3fb2b851..00000000000 --- a/res/cardsfolder/grazing_gladehart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grazing Gladehart -ManaCost:2 G -Types:Creature Antelope -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grazing_gladehart.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grazing_kelpie.txt b/res/cardsfolder/grazing_kelpie.txt deleted file mode 100644 index ee5e25ce9fc..00000000000 --- a/res/cardsfolder/grazing_kelpie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grazing Kelpie -ManaCost:3 GU -Types:Creature Beast -Text:no text -PT:2/3 -K:Persist -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | LibraryPosition$ -1 | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grazing_kelpie.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/great_defender.txt b/res/cardsfolder/great_defender.txt deleted file mode 100644 index ea2682c18b2..00000000000 --- a/res/cardsfolder/great_defender.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Great Defender -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | NumDef$ +X | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +0/+X until end of turn, where X is its converted mana cost. -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/great_defender.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/great_furnace.txt b/res/cardsfolder/great_furnace.txt deleted file mode 100644 index da6870511eb..00000000000 --- a/res/cardsfolder/great_furnace.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Great Furnace -ManaCost:no cost -Types:Artifact Land -Text:(Great Furnace isn't a spell.) -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/great_furnace.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/great_sable_stag.txt b/res/cardsfolder/great_sable_stag.txt deleted file mode 100644 index 4e43ce06259..00000000000 --- a/res/cardsfolder/great_sable_stag.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Great Sable Stag -ManaCost:1 G G -Types:Creature Elk -Text:no text -PT:3/3 -K:Protection from blue -K:Protection from black -K:CARDNAME can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/great_sable_stag.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/great_wall.txt b/res/cardsfolder/great_wall.txt deleted file mode 100644 index 7522068872a..00000000000 --- a/res/cardsfolder/great_wall.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Great Wall -ManaCost:2 W -Types:Enchantment -Text:Creatures with plainswalk can be blocked as though they didn't have plainswalk. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/great_wall.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/great_whale.txt b/res/cardsfolder/great_whale.txt deleted file mode 100644 index 73414b64219..00000000000 --- a/res/cardsfolder/great_whale.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Great Whale -ManaCost:5 U U -Types:Creature Whale -Text:no text -PT:5/5 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap up to seven lands. -SVar:TrigUntap:AB$ Untap | Cost$ 0 | UntapUpTo$ True | UntapType$ Land | Amount$ 7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/great_whale.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greatbow_doyen.txt b/res/cardsfolder/greatbow_doyen.txt deleted file mode 100644 index 243d763d236..00000000000 --- a/res/cardsfolder/greatbow_doyen.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Greatbow Doyen -ManaCost:4 G -Types:Creature Elf Archer -Text:no text -PT:2/4 -K:stPumpAll:Creature.Archer+Other+YouCtrl:1/1:No Condition:Other Archer creatures you control get +1/+1. -T:Mode$ DamageDone | ValidSource$ Archer.YouCtrl | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an Archer you control deals damage to a creature, that Archer deals that much damage to that creature's controller. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredTargetController | DamageSource$ TriggeredSource | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/greatbow_doyen.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greater_auramancy.txt b/res/cardsfolder/greater_auramancy.txt deleted file mode 100644 index b1811415c59..00000000000 --- a/res/cardsfolder/greater_auramancy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Greater Auramancy -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Enchantment.Other+YouCtrl:0/0/Shroud:No Condition:Other enchantments you control have shroud. -K:stPumpAll:Creature.enchanted+YouCtrl:0/0/Shroud:No Condition:Enchanted creatures you control have shroud. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_auramancy.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greater_basilisk.txt b/res/cardsfolder/greater_basilisk.txt deleted file mode 100644 index 0db7c197103..00000000000 --- a/res/cardsfolder/greater_basilisk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Greater Basilisk -ManaCost:3 G G -Types:Creature Basilisk -Text:no text -PT:3/5 -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_basilisk.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greater_forgeling.txt b/res/cardsfolder/greater_forgeling.txt deleted file mode 100644 index a1908a10cb4..00000000000 --- a/res/cardsfolder/greater_forgeling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Greater Forgeling -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ 1 R | NumAtt$ +3 | NumDef$ -3 | SpellDescription$ CARDNAME gets +3/-3 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_forgeling.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greater_good.txt b/res/cardsfolder/greater_good.txt deleted file mode 100644 index c30b82f1cb3..00000000000 --- a/res/cardsfolder/greater_good.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Greater Good -ManaCost:2 G G -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ Sac<1/Creature> | NumCards$ X | SubAbility$ SVar=DB | SpellDescription$ Draw cards equal to the sacrificed creature's power, then discard three cards. -SVar:DB:DB$Discard | NumCards$ 3 | Mode$ TgtChoose -SVar:X:Sacrificed$CardPower -SVar:Rarity:Rare -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_good.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/257.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greater_mossdog.txt b/res/cardsfolder/greater_mossdog.txt deleted file mode 100644 index 1531883fdf7..00000000000 --- a/res/cardsfolder/greater_mossdog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Greater Mossdog -ManaCost:3 G -Types:Creature Plant Hound -Text:no text -PT:3/3 -K:Dredge 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_mossdog.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greed.txt b/res/cardsfolder/greed.txt deleted file mode 100644 index a581d6a6ed6..00000000000 --- a/res/cardsfolder/greed.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Greed -ManaCost:3 B -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ B PayLife<2> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/greed.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/135.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/15.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/24.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/140.jpg -End diff --git a/res/cardsfolder/greel_mind_raker.txt b/res/cardsfolder/greel_mind_raker.txt deleted file mode 100644 index c2e86f09629..00000000000 --- a/res/cardsfolder/greel_mind_raker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Greel, Mind Raker -ManaCost:3 B B -Types:Legendary Creature Horror Spellshaper -Text:no text -PT:3/3 -A:AB$ Discard | Cost$ X B T Discard<2/Card> | ValidTgts$ Player | NumCards$ X | Mode$ Random | SpellDescription$ Target player discards X cards at random. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/greel_mind_raker.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greels_caress.txt b/res/cardsfolder/greels_caress.txt deleted file mode 100644 index 3e9103be904..00000000000 --- a/res/cardsfolder/greels_caress.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Greel's Caress -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:-3/-0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/greels_caress.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/green_mana_battery.txt b/res/cardsfolder/green_mana_battery.txt deleted file mode 100644 index d02616f23b7..00000000000 --- a/res/cardsfolder/green_mana_battery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Green Mana Battery -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/green_mana_battery.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/341.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/green_scarab.txt b/res/cardsfolder/green_scarab.txt deleted file mode 100644 index 05976d6d559..00000000000 --- a/res/cardsfolder/green_scarab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Green Scarab -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:CARDNAME can't be blocked by green creatures. -K:stPumpEnchanted:Creature:2/2:isPresent Permanent.Green+YouDontCtrl:Enchanted creature gets +2/+2 as long as an opponent controls a green permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/green_scarab.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/green_suns_zenith.txt b/res/cardsfolder/green_suns_zenith.txt deleted file mode 100644 index ebdb5e54fb2..00000000000 --- a/res/cardsfolder/green_suns_zenith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Green Sun's Zenith -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ X G | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Green+cmcLEX | ChangeNum$ 1 | SubAbility$ SVar=DBShuffle | SpellDescription$ Search your library for a green creature card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. -SVar:X:Count$xPaid -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/green_suns_zenith.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/81.jpg -End diff --git a/res/cardsfolder/green_ward.txt b/res/cardsfolder/green_ward.txt deleted file mode 100644 index e192e611147..00000000000 --- a/res/cardsfolder/green_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Green Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from green:Enchanted creature has protection from green. This effect doesn't remove Green Ward. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/green_ward.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/204.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/206.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/204.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/277.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greener_pastures.txt b/res/cardsfolder/greener_pastures.txt deleted file mode 100644 index d5187388edb..00000000000 --- a/res/cardsfolder/greener_pastures.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Greener Pastures -ManaCost:2 G -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/greener_pastures.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greenhilt_trainee.txt b/res/cardsfolder/greenhilt_trainee.txt deleted file mode 100644 index f222216832e..00000000000 --- a/res/cardsfolder/greenhilt_trainee.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Greenhilt Trainee -ManaCost:3 G -Types:Creature Elf Warrior -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsPresent$ Card.powerGE4+Self | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. Activate this ability only if CARDNAME's power is 4 or greater. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/greenhilt_trainee.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greenseeker.txt b/res/cardsfolder/greenseeker.txt deleted file mode 100644 index 8366dc68465..00000000000 --- a/res/cardsfolder/greenseeker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Greenseeker -ManaCost:G -Types:Creature Elf Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ G T Discard<1/Card> | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/greenseeker.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/greenweaver_druid.txt b/res/cardsfolder/greenweaver_druid.txt deleted file mode 100644 index e6d4400110f..00000000000 --- a/res/cardsfolder/greenweaver_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Greenweaver Druid -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/greenweaver_druid.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gremlin_mine.txt b/res/cardsfolder/gremlin_mine.txt deleted file mode 100644 index f11bd944949..00000000000 --- a/res/cardsfolder/gremlin_mine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gremlin Mine -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target artifact creature. -A:AB$ RemoveCounter | Cost$ 1 T Sac<1/CARDNAME> | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | CounterType$ CHARGE | CounterNum$ 4 | UpTo$ True | SpellDescription$ Remove up to four charge counters from target noncreature artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gremlin_mine.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/griffin_canyon.txt b/res/cardsfolder/griffin_canyon.txt deleted file mode 100644 index 1b9f5578af2..00000000000 --- a/res/cardsfolder/griffin_canyon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Griffin Canyon -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Untap | Cost$ T | ValidTgts$ Griffin | TgtPrompt$ Select target Griffin | SubAbility$ SVar=DBPump | SpellDescription$ Untap target Griffin. If it's a creature, it gets +1/+1 until end of turn. -SVar:DBPump:DB$Pump | NumAtt$ +1 | NumDef$ +1 | Defined$ Targeted -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/griffin_canyon.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/griffin_guide.txt b/res/cardsfolder/griffin_guide.txt deleted file mode 100644 index 35f2bd5b24f..00000000000 --- a/res/cardsfolder/griffin_guide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Griffin Guide -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Flying -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ When enchanted creature is put into a graveyard, put a 2/2 white Griffin creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Griffin | TokenTypes$ Creature,Griffin | TokenOwner$ You | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/griffin_guide.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/griffin_sentinel.txt b/res/cardsfolder/griffin_sentinel.txt deleted file mode 100644 index c73674ba095..00000000000 --- a/res/cardsfolder/griffin_sentinel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Griffin Sentinel -ManaCost:2 W -Types:Creature Griffin -Text:no text -PT:1/3 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/griffin_sentinel.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_affliction.txt b/res/cardsfolder/grim_affliction.txt deleted file mode 100644 index 14606695e5c..00000000000 --- a/res/cardsfolder/grim_affliction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grim Affliction -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SubAbility$ SVar=DBProliferate | SpellDescription$ 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.) -SVar:DBProliferate:DB$Proliferate -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_affliction.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_feast.txt b/res/cardsfolder/grim_feast.txt deleted file mode 100644 index 737995911f1..00000000000 --- a/res/cardsfolder/grim_feast.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Grim Feast -ManaCost:1 B G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you. -T:Mode$ ChangesZone | ValidCard$ Creature.YouDontCtrl | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature is put into an opponent's graveyard from the battlefield, you gain life equal to its toughness. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggeredCard$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_feast.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_harvest.txt b/res/cardsfolder/grim_harvest.txt deleted file mode 100644 index 03869e68cde..00000000000 --- a/res/cardsfolder/grim_harvest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grim Harvest -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature | SpellDescription$ Return target creature card from your graveyard to your hand. -K:Recover:2 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_harvest.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_lavamancer.txt b/res/cardsfolder/grim_lavamancer.txt deleted file mode 100644 index 2fc4f4a34d8..00000000000 --- a/res/cardsfolder/grim_lavamancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grim Lavamancer -ManaCost:R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ R T ExileFromGrave<2/Card> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_lavamancer.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_monolith.txt b/res/cardsfolder/grim_monolith.txt deleted file mode 100644 index 3adcc1e0ab7..00000000000 --- a/res/cardsfolder/grim_monolith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grim Monolith -ManaCost:2 -Types:Artifact -Text:no text -K:CARDNAME doesn't untap during your untap step. -A:AB$ Untap | Cost$ 4 | SpellDescription$ Untap CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_monolith.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_poppet.txt b/res/cardsfolder/grim_poppet.txt deleted file mode 100644 index 0da75821e6d..00000000000 --- a/res/cardsfolder/grim_poppet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grim Poppet -ManaCost:7 -Types:Artifact Creature Scarecrow -Text:no text -PT:4/4 -K:etbCounter:M1M1:3 -A:AB$ PutCounter | Cost$ SubCounter<1/M1M1> | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_poppet.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grim_tutor.txt b/res/cardsfolder/grim_tutor.txt deleted file mode 100644 index b176815b295..00000000000 --- a/res/cardsfolder/grim_tutor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grim Tutor -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | SubAbility$ SVar=DBLoseLife | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand, then shuffle your library. You lose 3 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grim_tutor.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grimclaw_bats.txt b/res/cardsfolder/grimclaw_bats.txt deleted file mode 100644 index 39c2be92e93..00000000000 --- a/res/cardsfolder/grimclaw_bats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grimclaw Bats -ManaCost:1 B -Types:Creature Bat -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ B PayLife<1> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grimclaw_bats.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grindclock.txt b/res/cardsfolder/grindclock.txt deleted file mode 100644 index 484302e598b..00000000000 --- a/res/cardsfolder/grindclock.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grindclock -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on Grindclock. -A:AB$ Mill | Cost$ T | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ 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. -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grindclock.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grinding_station.txt b/res/cardsfolder/grinding_station.txt deleted file mode 100644 index 36fb8e2b8c0..00000000000 --- a/res/cardsfolder/grinding_station.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grinding Station -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ T Sac<1/Artifact> | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top three cards of his or her library into his or her graveyard. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | IsPresent$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever an artifact enters the battlefield, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grinding_station.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grindstone.txt b/res/cardsfolder/grindstone.txt deleted file mode 100644 index 9db3edbaa43..00000000000 --- a/res/cardsfolder/grindstone.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Grindstone -ManaCost:1 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grindstone.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grinning_demon.txt b/res/cardsfolder/grinning_demon.txt deleted file mode 100644 index 36a90c3065b..00000000000 --- a/res/cardsfolder/grinning_demon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grinning Demon -ManaCost:2 B B -Types:Creature Demon -Text:no text -PT:6/6 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -K:Morph:2 B B -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grinning_demon.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grinning_ignus.txt b/res/cardsfolder/grinning_ignus.txt deleted file mode 100644 index 805e918c065..00000000000 --- a/res/cardsfolder/grinning_ignus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grinning Ignus -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ R Return<1/CARDNAME> | Produced$ 2 R | Amount$ 1 | SorcerySpeed$ True | SpellDescription$ Add 2 R to your mana pool. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grinning_ignus.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gristle_grinner.txt b/res/cardsfolder/gristle_grinner.txt deleted file mode 100644 index 6c27e8b0b4e..00000000000 --- a/res/cardsfolder/gristle_grinner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gristle Grinner -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gristle_grinner.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gristleback.txt b/res/cardsfolder/gristleback.txt deleted file mode 100644 index e17e82ae4e4..00000000000 --- a/res/cardsfolder/gristleback.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Gristleback -ManaCost:2 G -Types:Creature Boar Beast -Text:no text -PT:2/2 -K:Bloodthirst 1 -A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ X | SpellDescription$ You gain life equal to CARDNAME's power. -SVar:X:Sacrificed$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gristleback.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grixis_battlemage.txt b/res/cardsfolder/grixis_battlemage.txt deleted file mode 100644 index 60820d4d066..00000000000 --- a/res/cardsfolder/grixis_battlemage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grixis Battlemage -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_battlemage.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/78.jpg -End diff --git a/res/cardsfolder/grixis_charm.txt b/res/cardsfolder/grixis_charm.txt deleted file mode 100644 index 92fc3b95c37..00000000000 --- a/res/cardsfolder/grixis_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grixis Charm -ManaCost:U B R -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U B R | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Choose one - Return target permanent to its owner's hand; -A:SP$ Pump | Cost$ U B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ or target creature gets -4/-4 until end of turn. -A:SP$ PumpAll | Cost$ U B R | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ 0 | SpellDescription$ or creatures you control get +2/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_charm.jpg -SVar:Rarity:Uncommon -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/171.jpg -End diff --git a/res/cardsfolder/grixis_grimblade.txt b/res/cardsfolder/grixis_grimblade.txt deleted file mode 100644 index 87d08b89e2b..00000000000 --- a/res/cardsfolder/grixis_grimblade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grixis Grimblade -ManaCost:UR B -Types:Creature Zombie Warrior -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/Deathtouch:isPresent Permanent.MultiColor+Other+YouCtrl: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.) -SVar:BuffedBy:Permanent.MultiColor -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_grimblade.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grixis_panorama.txt b/res/cardsfolder/grixis_panorama.txt deleted file mode 100644 index 7719ace9cb2..00000000000 --- a/res/cardsfolder/grixis_panorama.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Grixis Panorama -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Island+Basic,Land.Swamp+Basic,Land.Mountain+Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic Island, Swamp, or Mountain card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_panorama.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grixis_slavedriver.txt b/res/cardsfolder/grixis_slavedriver.txt deleted file mode 100644 index 4f6cfb84927..00000000000 --- a/res/cardsfolder/grixis_slavedriver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grixis Slavedriver -ManaCost:5 B -Types:Creature Zombie Giant -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME leaves the battlefield, put a 2/2 black Zombie creature token onto the battlefield. -K:Unearth:3 B -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_slavedriver.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grixis_sojourners.txt b/res/cardsfolder/grixis_sojourners.txt deleted file mode 100644 index 93c152661c5..00000000000 --- a/res/cardsfolder/grixis_sojourners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Grixis Sojourners -ManaCost:1 U B R -Types:Creature Zombie Ogre -Text:no text -PT:4/3 -K:Cycling:2 B -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may exile target card from a graveyard. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may exile target card from a graveyard. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grixis_sojourners.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grizzled_leotau.txt b/res/cardsfolder/grizzled_leotau.txt deleted file mode 100644 index 0adf74870eb..00000000000 --- a/res/cardsfolder/grizzled_leotau.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Grizzled Leotau -ManaCost:G W -Types:Creature Cat -Text:no text -PT:1/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grizzled_leotau.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grizzled_wolverine.txt b/res/cardsfolder/grizzled_wolverine.txt deleted file mode 100644 index 3ac141f67bc..00000000000 --- a/res/cardsfolder/grizzled_wolverine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grizzled Wolverine -ManaCost:1 R R -Types:Creature Wolverine -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, you may pay R. If you do, CARDNAME gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ R | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grizzled_wolverine.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grizzly_bears.txt b/res/cardsfolder/grizzly_bears.txt deleted file mode 100644 index 22549aae881..00000000000 --- a/res/cardsfolder/grizzly_bears.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Grizzly Bears -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83115.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/256.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/108.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/108.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/251.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/134.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/94.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/246.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/268.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/236.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/108.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/163.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/129.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grizzly_fate.txt b/res/cardsfolder/grizzly_fate.txt deleted file mode 100644 index a03058b06cf..00000000000 --- a/res/cardsfolder/grizzly_fate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grizzly Fate -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G G | TokenAmount$ X | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ 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. -A:SP$ Token | Cost$ 5 G G | TokenAmount$ X | TokenName$ Bear | TokenTypes$ Creature,Bear | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | Flashback$ True | CostDesc$ Flashback 5 G G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:X:Count$Threshold.4.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grizzly_fate.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/groffskithur.txt b/res/cardsfolder/groffskithur.txt deleted file mode 100644 index e474b26fef6..00000000000 --- a/res/cardsfolder/groffskithur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Groffskithur -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ When CARDNAME becomes blocked, you may return target card named CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidCard$ Card.namedGroffskithur | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/groffskithur.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grollub.txt b/res/cardsfolder/grollub.txt deleted file mode 100644 index 264f2e8c2e9..00000000000 --- a/res/cardsfolder/grollub.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Grollub -ManaCost:2 B -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, each opponent gains that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ Opponent| LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grollub.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grotag_siege_runner.txt b/res/cardsfolder/grotag_siege_runner.txt deleted file mode 100644 index bcbf724fc46..00000000000 --- a/res/cardsfolder/grotag_siege_runner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grotag Siege-Runner -ManaCost:1 R -Types:Creature Goblin Rogue -Text:no text -PT:2/1 -A:AB$ Destroy | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.withDefender | TgtPrompt$ Select target creature with defender | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy target creature with defender. CARDNAME deals 2 damage to that creature's controller. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ 2 | Defined$ TargetedController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/grotag_siege_runner.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/149.jpg -End diff --git a/res/cardsfolder/grotag_thrasher.txt b/res/cardsfolder/grotag_thrasher.txt deleted file mode 100644 index 7a612644da6..00000000000 --- a/res/cardsfolder/grotag_thrasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Grotag Thrasher -ManaCost:4 R -Types:Creature Lizard -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, target creature can't block this turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grotag_thrasher.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grotesque_hybrid.txt b/res/cardsfolder/grotesque_hybrid.txt deleted file mode 100644 index 433d316487c..00000000000 --- a/res/cardsfolder/grotesque_hybrid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grotesque Hybrid -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget | NoRegen$ True -A:AB$Pump | Cost$ Discard<1/Card> | KW$ Flying & Protection from green & Protection from white | SpellDescription$ CARDNAME gains flying and protection from green and from white until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/grotesque_hybrid.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ground_rift.txt b/res/cardsfolder/ground_rift.txt deleted file mode 100644 index 3ba0d186015..00000000000 --- a/res/cardsfolder/ground_rift.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ground Rift -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature without flying can't block this turn. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ground_rift.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/groundbreaker.txt b/res/cardsfolder/groundbreaker.txt deleted file mode 100644 index bf37aca9632..00000000000 --- a/res/cardsfolder/groundbreaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Groundbreaker -ManaCost:G G G -Types:Creature Elemental -Text:no text -PT:6/1 -K:Haste -K:Trample -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122429.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/groundling_pouncer.txt b/res/cardsfolder/groundling_pouncer.txt deleted file mode 100644 index 7c9dc6d684d..00000000000 --- a/res/cardsfolder/groundling_pouncer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Groundling Pouncer -ManaCost:1 GU -Types:Creature Faerie -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ GU | NumAtt$ 1 | NumDef$ 3 | KW$ Flying | ActivationLimit$ 1 | IsPresent$ Creature.withFlying+YouDontCtrl | SpellDescription$ CARDNAME 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/groundling_pouncer.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/154.jpg -End diff --git a/res/cardsfolder/groundskeeper.txt b/res/cardsfolder/groundskeeper.txt deleted file mode 100644 index c591a9f19a0..00000000000 --- a/res/cardsfolder/groundskeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Groundskeeper -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 G | TgtPrompt$ Choose target basic land in your graveyard | ValidTgts$ Land.Basic | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target basic land card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/groundskeeper.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/250.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/grove_of_the_burnwillows.txt b/res/cardsfolder/grove_of_the_burnwillows.txt deleted file mode 100644 index 5cf30a6a156..00000000000 --- a/res/cardsfolder/grove_of_the_burnwillows.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Grove of the Burnwillows -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBLife | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBLife | SpellDescription$ Add R to your mana pool. -SVar:DBLife:DB$GainLife | LifeAmount$ 1 | Defined$ Opponent | SpellDescription$ Each opponent gains 1 life. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/grove_of_the_burnwillows.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/growth_spasm.txt b/res/cardsfolder/growth_spasm.txt deleted file mode 100644 index 831ae695888..00000000000 --- a/res/cardsfolder/growth_spasm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Growth Spasm -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | SubAbility$ SVar=DBToken | SpellDescription$ 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." -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/growth_spasm.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gruesome_encore.txt b/res/cardsfolder/gruesome_encore.txt deleted file mode 100644 index ae902ca4bd9..00000000000 --- a/res/cardsfolder/gruesome_encore.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gruesome Encore -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature in an opponent's graveyard | GainControl$ True | SubAbility$ SVar=DBPump | SpellDescription$ 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. -SVar:DBPump:DB$Pump | KW$ Haste & HIDDEN At the beginning of the end step, exile CARDNAME. & HIDDEN If CARDNAME would leave the battlefield, exile it instead of putting it anywhere else. | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gruesome_encore.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gruul_guildmage.txt b/res/cardsfolder/gruul_guildmage.txt deleted file mode 100644 index e72e891ad5d..00000000000 --- a/res/cardsfolder/gruul_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gruul Guildmage -ManaCost:RG RG -Types:Creature Human Shaman -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -A:AB$ DealDamage | Cost$ 3 R Sac<1/Land> | Tgt$ TgtP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_guildmage.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/144.jpg -End diff --git a/res/cardsfolder/gruul_signet.txt b/res/cardsfolder/gruul_signet.txt deleted file mode 100644 index 6cc4b39f87f..00000000000 --- a/res/cardsfolder/gruul_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gruul Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ R G | SpellDescription$ Add R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_signet.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gruul_turf.txt b/res/cardsfolder/gruul_turf.txt deleted file mode 100644 index 12fe5203c9c..00000000000 --- a/res/cardsfolder/gruul_turf.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gruul Turf -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R G | SpellDescription$ Add R G to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_turf.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gruul_war_plow.txt b/res/cardsfolder/gruul_war_plow.txt deleted file mode 100644 index 337085e144e..00000000000 --- a/res/cardsfolder/gruul_war_plow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gruul War Plow -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Trample:No Condition:Creatures you control have trample. -A:AB$ Animate | Cost$ 1 R G | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Juggernaut | SpellDescription$ CARDNAME becomes a 4/4 Juggernaut artifact creature until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gruul_war_plow.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guan_yu_sainted_warrior.txt b/res/cardsfolder/guan_yu_sainted_warrior.txt deleted file mode 100644 index ad9e9d0ca1d..00000000000 --- a/res/cardsfolder/guan_yu_sainted_warrior.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guan Yu, Sainted Warrior -ManaCost:3 W W -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:3/5 -K:Horsemanship -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into your graveyard from the battlefield, you may shuffle CARDNAME into your library. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guan_yu_sainted_warrior.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guan_yus_1000_li_march.txt b/res/cardsfolder/guan_yus_1000_li_march.txt deleted file mode 100644 index 65cf9cd0556..00000000000 --- a/res/cardsfolder/guan_yus_1000_li_march.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Guan Yu's 1,000-Li March -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature.tapped | SpellDescription$ Destroy all tapped creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guan_yus_1000_li_march.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guard_duty.txt b/res/cardsfolder/guard_duty.txt deleted file mode 100644 index ef3a6d7da49..00000000000 --- a/res/cardsfolder/guard_duty.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Guard Duty -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guard_duty.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guard_gomazoa.txt b/res/cardsfolder/guard_gomazoa.txt deleted file mode 100644 index 6f6167d3ea0..00000000000 --- a/res/cardsfolder/guard_gomazoa.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guard Gomazoa -ManaCost:2 U -Types:Creature Jellyfish -Text:no text -PT:1/3 -K:Defender -K:Flying -K:Prevent all combat damage that would be dealt to CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guard_gomazoa.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_idol.txt b/res/cardsfolder/guardian_idol.txt deleted file mode 100644 index 1d194a40693..00000000000 --- a/res/cardsfolder/guardian_idol.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Guardian Idol -ManaCost:2 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 2 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Golem | SpellDescription$ CARDNAME becomes a 2/2 Golem artifact creature until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_idol.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_of_cloverdell.txt b/res/cardsfolder/guardian_of_cloverdell.txt deleted file mode 100644 index 453b18272dc..00000000000 --- a/res/cardsfolder/guardian_of_cloverdell.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guardian of Cloverdell -ManaCost:5 G G -Types:Creature Treefolk Shaman -Text:no text -PT:4/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 1/1 white Kithkin Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -A:AB$ GainLife | Cost$ G Sac<1/Kithkin> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_cloverdell.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_of_solitude.txt b/res/cardsfolder/guardian_of_solitude.txt deleted file mode 100644 index 9fa7a99a50e..00000000000 --- a/res/cardsfolder/guardian_of_solitude.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guardian of Solitude -ManaCost:1 U -Types:Creature Spirit -Text:no text -PT:1/2 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target creature gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying -SVar:BuffedBy:Arcane,Spirit -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_solitude.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_of_the_guildpact.txt b/res/cardsfolder/guardian_of_the_guildpact.txt deleted file mode 100644 index 7a4364be6b8..00000000000 --- a/res/cardsfolder/guardian_of_the_guildpact.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Guardian of the Guildpact -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:2/3 -K:Protection:Card.MonoColor:Protection from monocolored -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_the_guildpact.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_seraph.txt b/res/cardsfolder/guardian_seraph.txt deleted file mode 100644 index 9a2dee12bd1..00000000000 --- a/res/cardsfolder/guardian_seraph.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Guardian Seraph -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:3/4 -K:Flying -K:stPreventDamage:You:Card.YouDontCtrl:1:If a source an opponent controls would deal damage to you, prevent 1 of that damage. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_seraph.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardian_zendikon.txt b/res/cardsfolder/guardian_zendikon.txt deleted file mode 100644 index 3a55ab19f0a..00000000000 --- a/res/cardsfolder/guardian_zendikon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guardian Zendikon -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:2/6/Defender:Creature,Wall:White:No Abilities:isPresent Card.AttachedBy:Enchanted land is a 2/6 white Wall creature with defender. It's still a land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land is put into a graveyard, return that card to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_zendikon.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardians_magemark.txt b/res/cardsfolder/guardians_magemark.txt deleted file mode 100644 index d0d2e79ce75..00000000000 --- a/res/cardsfolder/guardians_magemark.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guardian's Magemark -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Flash -K:enPump:+0/+0 -K:stPumpAll:Creature.enchanted+YouCtrl:1/1:no Condition:Creatures you control that are enchanted get +1/+1. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardians_magemark.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guardians_of_akrasa.txt b/res/cardsfolder/guardians_of_akrasa.txt deleted file mode 100644 index 715acc9343f..00000000000 --- a/res/cardsfolder/guardians_of_akrasa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Guardians of Akrasa -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:0/4 -K:Defender -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardians_of_akrasa.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guerrilla_tactics.txt b/res/cardsfolder/guerrilla_tactics.txt deleted file mode 100644 index 8df09d423dc..00000000000 --- a/res/cardsfolder/guerrilla_tactics.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Guerrilla Tactics -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -T:Mode$ Discarded | ValidCard$ Card.Self | ValidCause$ Card.YouDontCtrl | Execute$ TrigDoubleDmg | TriggerDescription$ When a spell or ability an opponent controls causes you to discard CARDNAME, CARDNAME deals 4 damage to target creature or player. -SVar:TrigDoubleDmg:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guerrilla_tactics.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/192.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/110.jpg|2 -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/196.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guided_strike.txt b/res/cardsfolder/guided_strike.txt deleted file mode 100644 index 33ba430fcac..00000000000 --- a/res/cardsfolder/guided_strike.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Guided Strike -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target creature gets +1/+0 and gains first strike until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guided_strike.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/132.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/13.jpg -End diff --git a/res/cardsfolder/guiltfeeder.txt b/res/cardsfolder/guiltfeeder.txt deleted file mode 100644 index 606a8e6999b..00000000000 --- a/res/cardsfolder/guiltfeeder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Guiltfeeder -ManaCost:3 B B -Types:Creature Horror -Text:no text -PT:0/4 -K:Fear -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player loses 1 life for each card in his or her graveyard. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ X -SVar:X:Count$InOppYard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guiltfeeder.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guilty_conscience.txt b/res/cardsfolder/guilty_conscience.txt deleted file mode 100644 index acb0cc5c840..00000000000 --- a/res/cardsfolder/guilty_conscience.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Guilty Conscience -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature Curse -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, CARDNAME deals that much damage to that creature. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Enchanted | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guilty_conscience.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guma.txt b/res/cardsfolder/guma.txt deleted file mode 100644 index 7cc1d7f641e..00000000000 --- a/res/cardsfolder/guma.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Guma -ManaCost:2 R -Types:Creature Cat -Text:no text -PT:2/2 -K:Protection from blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guma.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gush.txt b/res/cardsfolder/gush.txt deleted file mode 100644 index dc294f3aec5..00000000000 --- a/res/cardsfolder/gush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gush -ManaCost:4 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 4 U | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:AltCost:Return<2/Island> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gush.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gust_skimmer.txt b/res/cardsfolder/gust_skimmer.txt deleted file mode 100644 index 64fc5d8399d..00000000000 --- a/res/cardsfolder/gust_skimmer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gust-Skimmer -ManaCost:2 -Types:Artifact Creature Insect -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gust_skimmer.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gustrider_exuberant.txt b/res/cardsfolder/gustrider_exuberant.txt deleted file mode 100644 index 687b329489c..00000000000 --- a/res/cardsfolder/gustrider_exuberant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Gustrider Exuberant -ManaCost:2 W -Types:Creature Human Wizard -Text:no text -PT:1/2 -K:Flying -A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.powerGE5+YouCtrl | KW$ Flying | SpellDescription$ Creatures you control with power 5 or greater gain flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gustrider_exuberant.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/13.jpg -End diff --git a/res/cardsfolder/gut_shot.txt b/res/cardsfolder/gut_shot.txt deleted file mode 100644 index 60862790f7a..00000000000 --- a/res/cardsfolder/gut_shot.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Gut Shot -ManaCost:PR -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ PR | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gut_shot.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gutless_ghoul.txt b/res/cardsfolder/gutless_ghoul.txt deleted file mode 100644 index 19c93511f44..00000000000 --- a/res/cardsfolder/gutless_ghoul.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gutless Ghoul -ManaCost:2 B -Types:Snow Creature Zombie -Text:no text -PT:2/2 -A:AB$ GainLife | Cost$ 1 Sac<1/Creature> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/gutless_ghoul.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/60.jpg -End diff --git a/res/cardsfolder/guttural_response.txt b/res/cardsfolder/guttural_response.txt deleted file mode 100644 index 2dacfde7600..00000000000 --- a/res/cardsfolder/guttural_response.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Guttural Response -ManaCost:RG -Types:Instant -Text:no text -A:SP$ Counter | Cost$ RG | TargetType$ Spell | TgtPrompt$ Select target Blue Instant spell | ValidTgts$ Instant.Blue | SpellDescription$ Counter target blue instant spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/guttural_response.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gutwrencher_oni.txt b/res/cardsfolder/gutwrencher_oni.txt deleted file mode 100644 index dc34e1b4c1c..00000000000 --- a/res/cardsfolder/gutwrencher_oni.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Gutwrencher Oni -ManaCost:3 B B -Types:Creature Demon Spirit -Text:no text -PT:5/4 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, discard a card if you don't control an Ogre. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:NeedsToPlay:Ogre.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gutwrencher_oni.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guul_draz_assassin.txt b/res/cardsfolder/guul_draz_assassin.txt deleted file mode 100644 index a7bb63d7e1f..00000000000 --- a/res/cardsfolder/guul_draz_assassin.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Guul Draz Assassin -ManaCost:B -Types:Creature Vampire Assassin -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE2:2:2:LevelGE4:4:4:LEVEL 2-3 2/2 B, tap: Target creature gets -2/-2 until end of turn. LEVEL 4+ 4/4 B, tap: Target creature gets -4/-4 until end of turn. -K:stPumpSelf:Creature:0/0/SVar=LowLvl:isPresent Card.Self+countersGE2LEVEL+countersLT4LEVEL:no text -K:stPumpSelf:Creature:0/0/SVar=HighLvl:isPresent Card.Self+countersGE4LEVEL:no text -K:Level up:1 B -K:maxLevel:4 -SVar:LowLvl:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:HighLvl:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. -SVar:X:Number$4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guul_draz_assassin.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guul_draz_specter.txt b/res/cardsfolder/guul_draz_specter.txt deleted file mode 100644 index 810eb99ed21..00000000000 --- a/res/cardsfolder/guul_draz_specter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Guul Draz Specter -ManaCost:2 B B -Types:Creature Specter -Text:no text -PT:2/2 -K:Flying -K:stPumpSelf:Permanent:3/3:OppHandEmpty:CARDNAME gets +3/+3 as long as an opponent has no cards in hand. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/guul_draz_specter.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/guul_draz_vampire.txt b/res/cardsfolder/guul_draz_vampire.txt deleted file mode 100644 index 485ad0a2bdc..00000000000 --- a/res/cardsfolder/guul_draz_vampire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Guul Draz Vampire -ManaCost:B -Types:Creature Vampire Rogue -Text:no text -PT:1/1 -K:stPumpSelf:Permanent:2/1/Intimidate:OppLifeLE/10:As long as an opponent has 10 or less life, CARDNAME gets +2/+1 and has intimidate. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/guul_draz_vampire.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gwafa_hazid_profiteer.txt b/res/cardsfolder/gwafa_hazid_profiteer.txt deleted file mode 100644 index 9e94ae07328..00000000000 --- a/res/cardsfolder/gwafa_hazid_profiteer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gwafa Hazid, Profiteer -ManaCost:1 W U -Types:Legendary Creature Human Rogue -Text:no text -#Creatures with bribery counters on them can't attack or block. -PT:2/2 -A:AB$ PutCounter | Cost$ W U T | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control. | CounterType$ BRIBERY | CounterNum$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Put a bribery counter on target creature you don't control. Its controller draws a card. -K:stPumpAll:Creature.countersGE1BRIBERY:0/0/HIDDEN CARDNAME can't attack or block.:No Condition:Creatures with bribery counters on them can't attack or block. -SVar:DBDraw:DB$Draw | Defined$ TargetedController | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gwafa_hazid_profiteer.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gwendlyn_di_corci.txt b/res/cardsfolder/gwendlyn_di_corci.txt deleted file mode 100644 index db210c5ef74..00000000000 --- a/res/cardsfolder/gwendlyn_di_corci.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Gwendlyn Di Corci -ManaCost:R B B U -Types:Legendary Creature Human Rogue -Text:no text -PT:3/5 -A:AB$ Discard | Cost$ T | ValidTgts$ Player | PlayerTurn$ True | NumCards$ 1 | Mode$ Random | SpellDescription$ Target player discards a card at random. Activate this ability only during your turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/gwendlyn_di_corci.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/gwyllion_hedge_mage.txt b/res/cardsfolder/gwyllion_hedge_mage.txt deleted file mode 100644 index 3fa0e083a86..00000000000 --- a/res/cardsfolder/gwyllion_hedge_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Gwyllion Hedge-Mage -ManaCost:2 WB -Types:Creature Hag Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Plains.YouCtrl | PresentCompare$ GE2 | OptionalDecider$ You | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Plains, you may put a 1/1 white Kithkin Soldier creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Swamp.YouCtrl | PresentCompare$ GE2 | OptionalDecider$ You | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Swamps, you may put a -1/-1 counter on target creature. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/gwyllion_hedge_mage.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haazda_exonerator.txt b/res/cardsfolder/haazda_exonerator.txt deleted file mode 100644 index 5b46337c9f4..00000000000 --- a/res/cardsfolder/haazda_exonerator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Haazda Exonerator -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Aura | TgtPrompt$ Select target Aura | SpellDescription$ Destroy target Aura. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/haazda_exonerator.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/11.jpg -End diff --git a/res/cardsfolder/hada_freeblade.txt b/res/cardsfolder/hada_freeblade.txt deleted file mode 100644 index 3a145c34346..00000000000 --- a/res/cardsfolder/hada_freeblade.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hada Freeblade -ManaCost:W -Types:Creature Human Soldier Ally -Text:no text -PT:0/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hada_freeblade.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hada_spy_patrol.txt b/res/cardsfolder/hada_spy_patrol.txt deleted file mode 100644 index 3b745d3868a..00000000000 --- a/res/cardsfolder/hada_spy_patrol.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hada Spy Patrol -ManaCost:1 U -Types:Creature Human Rogue -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:2:2:LevelGE3:3:3:LEVEL 1-2 2/2 Unblockable LEVEL 3+ 3/3 Unblockable Shroud -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/HIDDEN Unblockable:No Condition:no text -K:stPumpSelf:Creature.countersGE3LEVEL:0/0/Shroud:No Condition:no text -K:Level up:2 U -K:maxLevel:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hada_spy_patrol.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hag_hedge_mage.txt b/res/cardsfolder/hag_hedge_mage.txt deleted file mode 100644 index d1554218b39..00000000000 --- a/res/cardsfolder/hag_hedge_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hag Hedge-Mage -ManaCost:2 BG -Types:Creature Hag Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Swamp.YouCtrl | PresentCompare$ GE2 | OptionalDecider$ You | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Swamps, you may have target player discard a card. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Forest.YouCtrl | PresentCompare$ GE2 | OptionalDecider$ You | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Forests, you may put target card from your graveyard on top of your library. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | Mode$ TgtChoose -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Select target card in your graveyard | ValidTgts$ Card.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hag_hedge_mage.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hagra_crocodile.txt b/res/cardsfolder/hagra_crocodile.txt deleted file mode 100644 index 2350e3ac661..00000000000 --- a/res/cardsfolder/hagra_crocodile.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hagra Crocodile -ManaCost:3 B -Types:Creature Crocodile -Text:no text -PT:3/1 -K:CARDNAME can't block. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hagra_crocodile.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hagra_diabolist.txt b/res/cardsfolder/hagra_diabolist.txt deleted file mode 100644 index 39eea5e62a6..00000000000 --- a/res/cardsfolder/hagra_diabolist.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Hagra Diabolist -ManaCost:4 B -Types:Creature Orge Shaman Ally -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have target player lose life equal to the number of Allies you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have target player lose life equal to the number of Allies you control. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | LifeAmount$ NumAllies | TgtPrompt$ Select a target player. -SVar:NumAllies:Count$Valid Ally.YouCtrl -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hagra_diabolist.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hail_storm.txt b/res/cardsfolder/hail_storm.txt deleted file mode 100644 index 8ae3a152b06..00000000000 --- a/res/cardsfolder/hail_storm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hail Storm -ManaCost:1 G G -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 1 G G | NumDmg$ 2 | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | SubAbility$ SVar=DBDamage | SpellDescription$ CARDNAME deals 2 damage to each attacking creature and 1 damage to you and each creature you control. -SVar:DBDamage:DB$DealDamage | NumDmg$ 1 | SubAbility$ SVar=DBDamageAll -SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.YouCtrl | ValidDescription$ each creature you control. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hail_storm.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/79.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hair_strung_koto.txt b/res/cardsfolder/hair_strung_koto.txt deleted file mode 100644 index 1f327b9b9df..00000000000 --- a/res/cardsfolder/hair_strung_koto.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hair-Strung Koto -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ tapXType<1/Creature> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hair_strung_koto.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halberdier.txt b/res/cardsfolder/halberdier.txt deleted file mode 100644 index 700fc27f2ae..00000000000 --- a/res/cardsfolder/halberdier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Halberdier -ManaCost:3 R -Types:Creature Human Barbarian -Text:no text -PT:3/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/halberdier.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halcyon_glaze.txt b/res/cardsfolder/halcyon_glaze.txt deleted file mode 100644 index 476fdaa2f0c..00000000000 --- a/res/cardsfolder/halcyon_glaze.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Halcyon Glaze -ManaCost:1 U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a creature spell, CARDNAME becomes a 4/4 Illusion creature with flying until end of turn. It's still an enchantment. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Illusion | Keywords$ Flying -SVar:BuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/halcyon_glaze.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halimar_depths.txt b/res/cardsfolder/halimar_depths.txt deleted file mode 100644 index b8b62cd4fbd..00000000000 --- a/res/cardsfolder/halimar_depths.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Halimar Depths -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When Halimar Depths enters the battlefield, look at the top three cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/halimar_depths.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halimar_excavator.txt b/res/cardsfolder/halimar_excavator.txt deleted file mode 100644 index c9e2111bacb..00000000000 --- a/res/cardsfolder/halimar_excavator.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Halimar Excavator -ManaCost:1 U -Types:Creature Human Wizard Ally -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME 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. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | Secondary$ True | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigMill:AB$Mill | Cost$ 0 | ValidTgts$ Player | NumCards$ X | TgtPrompt$ Select a target player. | SpellDescription$ 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. -SVar:X:Count$Valid Ally.YouCtrl -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/halimar_excavator.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halimar_wavewatch.txt b/res/cardsfolder/halimar_wavewatch.txt deleted file mode 100644 index 183e2b10321..00000000000 --- a/res/cardsfolder/halimar_wavewatch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Halimar Wavewatch -ManaCost:1 U -Types:Creature Merfolk Soldier -Text:no text -PT:0/3 -K:stSetPT:0:3:LevelGE1:0:6:LevelGE5:6:6:LEVEL 1-4 0/6 LEVEL 5+ 6/6 Islandwalk -K:stPumpSelf:Creature.countersGE5LEVEL:0/0/Islandwalk:No Condition:no text -K:Level up:2 -K:maxLevel:5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/halimar_wavewatch.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hallowed_burial.txt b/res/cardsfolder/hallowed_burial.txt deleted file mode 100644 index 1e69d98a22c..00000000000 --- a/res/cardsfolder/hallowed_burial.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hallowed Burial -ManaCost:3 W W -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 W W | ChangeType$ Creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 |SpellDescription$ Put all creatures on the bottom of their owners' libraries. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hallowed_burial.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hallowed_fountain.txt b/res/cardsfolder/hallowed_fountain.txt deleted file mode 100644 index 8ff518707f0..00000000000 --- a/res/cardsfolder/hallowed_fountain.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Hallowed Fountain -ManaCost:no cost -Types:Land Plains Island -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97071.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hallowed_ground.txt b/res/cardsfolder/hallowed_ground.txt deleted file mode 100644 index f27d3c28259..00000000000 --- a/res/cardsfolder/hallowed_ground.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hallowed Ground -ManaCost:1 W -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ W W | ValidTgts$ Land.nonSnow+YouCtrl | TgtPrompt$ Target nonsnow land you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonsnow land you control to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hallowed_ground.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halo_hunter.txt b/res/cardsfolder/halo_hunter.txt deleted file mode 100644 index 120e109b3df..00000000000 --- a/res/cardsfolder/halo_hunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Halo Hunter -ManaCost:2 B B B -Types:Creature Demon -Text:no text -PT:6/3 -K:Intimidate -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target Angel. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Angel | TgtPrompt$ Select target Angel -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/halo_hunter.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/halt_order.txt b/res/cardsfolder/halt_order.txt deleted file mode 100644 index a62b2f93633..00000000000 --- a/res/cardsfolder/halt_order.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Halt Order -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target Artifact spell | ValidTgts$ Artifact | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target artifact spell. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/halt_order.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hamletback_goliath.txt b/res/cardsfolder/hamletback_goliath.txt deleted file mode 100644 index 72241b31cdf..00000000000 --- a/res/cardsfolder/hamletback_goliath.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hamletback Goliath -ManaCost:6 R -Types:Creature Giant Warrior -Text:no text -PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature enters the battlefield, you may put X +1/+1 counters on CARDNAME, where X is that creature's power. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:TriggeredCard$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hamletback_goliath.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hammer_mage.txt b/res/cardsfolder/hammer_mage.txt deleted file mode 100644 index d232978c4c1..00000000000 --- a/res/cardsfolder/hammer_mage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hammer Mage -ManaCost:1 R -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ DestroyAll | Cost$ X R T Discard<1/Card> | ValidCards$ Artifact.cmcLEX | SpellDescription$ Destroy all artifacts with converted mana cost X or less. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hammer_mage.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hammer_of_bogardan.txt b/res/cardsfolder/hammer_of_bogardan.txt deleted file mode 100644 index fbe78d875b1..00000000000 --- a/res/cardsfolder/hammer_of_bogardan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hammer of Bogardan -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -A:AB$ ChangeZone | Cost$ 2 R R R | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your upkeep. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hammer_of_bogardan.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/193.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/188.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hammer_of_ruin.txt b/res/cardsfolder/hammer_of_ruin.txt deleted file mode 100644 index 1d0e8a07e24..00000000000 --- a/res/cardsfolder/hammer_of_ruin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hammer of Ruin -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 2:+2/+0 -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may destroy target Equipment that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Equipment.YouDontCtrl | TgtPrompt$ Select target equipment defending player controls -SVar:Picture:http://www.wizards.com/global/images/magic/general/hammer_of_ruin.jpg -SVar:Rarity:Uncommon -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/124.jpg -End diff --git a/res/cardsfolder/hammerfist_giant.txt b/res/cardsfolder/hammerfist_giant.txt deleted file mode 100644 index 2defdbe3e96..00000000000 --- a/res/cardsfolder/hammerfist_giant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hammerfist Giant -ManaCost:4 R R -Types:Creature Giant Warrior -Text:no text -PT:5/4 -A:AB$ DamageAll | Cost$ T | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | ValidDescription$ each creature without flying and each player. | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to each creature without flying and each player. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83712.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hammerhead_shark.txt b/res/cardsfolder/hammerhead_shark.txt deleted file mode 100644 index 8702ebbe1a7..00000000000 --- a/res/cardsfolder/hammerhead_shark.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hammerhead Shark -ManaCost:1 U -Types:Creature Fish -Text:no text -PT:2/3 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hammerhead_shark.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hammerheim_deadeye.txt b/res/cardsfolder/hammerheim_deadeye.txt deleted file mode 100644 index 9657a0a7fd8..00000000000 --- a/res/cardsfolder/hammerheim_deadeye.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hammerheim Deadeye -ManaCost:3 R -Types:Creature Giant Warrior -Text:no text -PT:3/3 -K:Echo:5 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target creature with flying. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hammerheim_deadeye.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hana_kami.txt b/res/cardsfolder/hana_kami.txt deleted file mode 100644 index 5c28699c96d..00000000000 --- a/res/cardsfolder/hana_kami.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hana Kami -ManaCost:G -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 G Sac<1/CARDNAME> | TgtPrompt$ Choose target Arcane card in your graveyard | ValidTgts$ Arcane | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Arcane card from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hana_kami.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hand_of_cruelty.txt b/res/cardsfolder/hand_of_cruelty.txt deleted file mode 100644 index 42e2656d49d..00000000000 --- a/res/cardsfolder/hand_of_cruelty.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hand of Cruelty -ManaCost:B B -Types:Creature Human Samurai -Text:no text -PT:2/2 -K:Protection from white -K:Bushido 1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card74063.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hand_of_death.txt b/res/cardsfolder/hand_of_death.txt deleted file mode 100644 index 1adb491670a..00000000000 --- a/res/cardsfolder/hand_of_death.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hand of Death -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_death.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/14.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/80.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/18.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/hand_of_emrakul.txt b/res/cardsfolder/hand_of_emrakul.txt deleted file mode 100644 index 708d86af2b6..00000000000 --- a/res/cardsfolder/hand_of_emrakul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hand of Emrakul -ManaCost:9 -Types:Creature Eldrazi -Text:no text -PT:7/7 -K:Annihilator 1 -SVar:AltCost:Sac<4/Eldrazi.Spawn>$You may sacrifice four Eldrazi Spawn rather than pay Hand of Emrakul's mana cost. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_emrakul.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hand_of_honor.txt b/res/cardsfolder/hand_of_honor.txt deleted file mode 100644 index 63afb07ab3d..00000000000 --- a/res/cardsfolder/hand_of_honor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hand of Honor -ManaCost:W W -Types:Creature Human Samurai -Text:no text -PT:2/2 -K:Protection from black -K:Bushido 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_honor.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hand_of_justice.txt b/res/cardsfolder/hand_of_justice.txt deleted file mode 100644 index 2010973f0ae..00000000000 --- a/res/cardsfolder/hand_of_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hand of Justice -ManaCost:5 W -Types:Creature Avatar -Text:no text -PT:2/6 -A:AB$ Destroy | Cost$ T tapXType<3/Creature.White> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CostDesc$ Tap, tap three untapped white creatures you control: | SpellDescription$ Destroy target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_justice.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/142.jpg -End diff --git a/res/cardsfolder/hand_of_the_praetors.txt b/res/cardsfolder/hand_of_the_praetors.txt deleted file mode 100644 index 72cec917dd7..00000000000 --- a/res/cardsfolder/hand_of_the_praetors.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hand of the Praetors -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:3/2 -K:Infect -K:stPumpAll:Creature.withInfect+Other+YouCtrl:1/1:No Condition:Other creatures you control with infect get +1/+1. -T:Mode$ SpellCast | ValidCard$ Creature.withInfect | Execute$ TrigPoison | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with infect, target player gets a poison counter. -SVar:TrigPoison:AB$Poison | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | Num$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hand_of_the_praetors.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hanna_ships_navigator.txt b/res/cardsfolder/hanna_ships_navigator.txt deleted file mode 100644 index 99077fefc2f..00000000000 --- a/res/cardsfolder/hanna_ships_navigator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hanna, Ship's Navigator -ManaCost:1 W U -Types:Legendary Creature Human Artificer -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ 1 W U T | TgtPrompt$ Choose target artifact or enchantment in your graveyard | ValidTgts$ Artifact.YouCtrl,Enchantment.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact or enchantment card from your graveyard to your hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hanna_ships_navigator.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hannas_custody.txt b/res/cardsfolder/hannas_custody.txt deleted file mode 100644 index e24725896b3..00000000000 --- a/res/cardsfolder/hannas_custody.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hanna's Custody -ManaCost:2 W -Types:Enchantment -Text:no text -K:stPumpAll:Artifact:0/0/Shroud:No Condition:All artifacts have shroud. (They can't be the targets of spells or abilities.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hannas_custody.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hapless_researcher.txt b/res/cardsfolder/hapless_researcher.txt deleted file mode 100644 index 89fa93ab400..00000000000 --- a/res/cardsfolder/hapless_researcher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hapless Researcher -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hapless_researcher.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/42.jpg -End diff --git a/res/cardsfolder/harabaz_druid.txt b/res/cardsfolder/harabaz_druid.txt deleted file mode 100644 index 9807e3250bf..00000000000 --- a/res/cardsfolder/harabaz_druid.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Harabaz Druid -ManaCost:1 G -Types:Creature Human Druid Ally -Text:no text -PT:0/1 -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ X | SpellDescription$ Add W to your mana pool for each Ally you control. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ X | SpellDescription$ Add U to your mana pool for each Ally you control. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each Ally you control. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ X | SpellDescription$ Add R to your mana pool for each Ally you control. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Ally you control. -SVar:X:Count$Valid Ally.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/harabaz_druid.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harbinger_of_night.txt b/res/cardsfolder/harbinger_of_night.txt deleted file mode 100644 index 7fad86694cc..00000000000 --- a/res/cardsfolder/harbinger_of_night.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Harbinger of Night -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:2/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on each creature. -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/harbinger_of_night.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harbinger_of_spring.txt b/res/cardsfolder/harbinger_of_spring.txt deleted file mode 100644 index 075b24989f7..00000000000 --- a/res/cardsfolder/harbinger_of_spring.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Harbinger of Spring -ManaCost:4 G -Types:Creature Spirit -Text:no text -PT:2/1 -K:Protection:Creature.nonSpirit:Protection from non-Spirit creatures -K:Soulshift:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/harbinger_of_spring.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harbor_guardian.txt b/res/cardsfolder/harbor_guardian.txt deleted file mode 100644 index ef5000cf646..00000000000 --- a/res/cardsfolder/harbor_guardian.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Harbor Guardian -ManaCost:2 W U -Types:Creature Gargoyle -Text:no text -PT:3/4 -K:Reach -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ Opponent | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, defending player may draw a card. -SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_guardian.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harbor_serpent.txt b/res/cardsfolder/harbor_serpent.txt deleted file mode 100644 index 8360c233300..00000000000 --- a/res/cardsfolder/harbor_serpent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Harbor Serpent -ManaCost:4 U U -Types:Creature Serpent -Text:Harbor Serpent can't attack unless there are five or more Islands on the battlefield. -PT:5/5 -K:Islandwalk -SVar:BuffedBy:Island -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/harbor_serpent.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harmattan_efreet.txt b/res/cardsfolder/harmattan_efreet.txt deleted file mode 100644 index 98f1077464b..00000000000 --- a/res/cardsfolder/harmattan_efreet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Harmattan Efreet -ManaCost:2 U U -Types:Creature Efreet -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ 1 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/harmattan_efreet.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/73.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/69.jpg -End diff --git a/res/cardsfolder/harmonic_convergence.txt b/res/cardsfolder/harmonic_convergence.txt deleted file mode 100644 index 63c64ece4af..00000000000 --- a/res/cardsfolder/harmonic_convergence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Harmonic Convergence -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 G | ChangeType$ Enchantment | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 |SpellDescription$ Put all enchantments on top of their owners' libraries. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/harmonic_convergence.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harmonize.txt b/res/cardsfolder/harmonize.txt deleted file mode 100644 index b827a4519ef..00000000000 --- a/res/cardsfolder/harmonize.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Harmonize -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 G G | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122362.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harpoon_sniper.txt b/res/cardsfolder/harpoon_sniper.txt deleted file mode 100644 index 1d261bf3905..00000000000 --- a/res/cardsfolder/harpoon_sniper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Harpoon Sniper -ManaCost:2 W -Types:Creature Merfolk Archer -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target attacking or blocking creature, where X is the number of Merfolk you control. -SVar:X:Count$TypeYouCtrl.Merfolk -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/harpoon_sniper.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harrier_griffin.txt b/res/cardsfolder/harrier_griffin.txt deleted file mode 100644 index 0b210797aa4..00000000000 --- a/res/cardsfolder/harrier_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Harrier Griffin -ManaCost:5 W -Types:Creature Griffin -Text:no text -PT:3/3 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ At the beginning of your upkeep, tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/harrier_griffin.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harrow.txt b/res/cardsfolder/harrow.txt deleted file mode 100644 index 9aa9323080f..00000000000 --- a/res/cardsfolder/harrow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Harrow -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 G Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic land cards and put them onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/harrow.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/124.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/189.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haru_onna.txt b/res/cardsfolder/haru_onna.txt deleted file mode 100644 index 130afa0f8c6..00000000000 --- a/res/cardsfolder/haru_onna.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Haru-Onna -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haru_onna.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harvest_gwyllion.txt b/res/cardsfolder/harvest_gwyllion.txt deleted file mode 100644 index 54642e9c1a1..00000000000 --- a/res/cardsfolder/harvest_gwyllion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Harvest Gwyllion -ManaCost:2 WB WB -Types:Creature Hag -Text:no text -PT:2/4 -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/harvest_gwyllion.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/harvester_druid.txt b/res/cardsfolder/harvester_druid.txt deleted file mode 100644 index 5b1ffa8b190..00000000000 --- a/res/cardsfolder/harvester_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Harvester Druid -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Land.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color that a land you control could produce. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/harvester_druid.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hasran_ogress.txt b/res/cardsfolder/hasran_ogress.txt deleted file mode 100644 index 4824195383c..00000000000 --- a/res/cardsfolder/hasran_ogress.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hasran Ogress -ManaCost:B B -Types:Creature Ogre -Text:no text -PT:3/2 -T:Mode$ Attacks | ValidCard$ Creature.Self | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals 3 damage to you unless you pay 2. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 3 | UnlessCost$ 2 | UnlessPayer$ You -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hasran_ogress.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hatchet_bully.txt b/res/cardsfolder/hatchet_bully.txt deleted file mode 100644 index 4066f8cb96b..00000000000 --- a/res/cardsfolder/hatchet_bully.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hatchet Bully -ManaCost:3 R -Types:Creature Goblin Warrior -Text:no text -PT:3/3 -A:AB$ PutCounter | Cost$ 2 R T | CounterType$ M1M1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ SVar=DBDamage | SpellDescription$ Put a -1/-1 counter on a creature you control: CARDNAME deals 2 damage to target creature or player. -SVar:DBDamage:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hatchet_bully.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hatching_plans.txt b/res/cardsfolder/hatching_plans.txt deleted file mode 100644 index cdb02e7c7fb..00000000000 --- a/res/cardsfolder/hatching_plans.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hatching Plans -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw three cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 3 -SVar:RemAIDeck:True -SVar:SacMe:5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hatching_plans.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hate_weaver.txt b/res/cardsfolder/hate_weaver.txt deleted file mode 100644 index 9b0966f321b..00000000000 --- a/res/cardsfolder/hate_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hate Weaver -ManaCost:1 B -Types:Creature Zombie Wizard -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Blue,Creature.Red | NumAtt$ +1 | SpellDescription$ Target blue or red creature gets +1/+0 until end of turn. | TgtPrompt$ Select target blue or red creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hate_weaver.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/108.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hateflayer.txt b/res/cardsfolder/hateflayer.txt deleted file mode 100644 index 64f61de6fb7..00000000000 --- a/res/cardsfolder/hateflayer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hateflayer -ManaCost:5 R R -Types:Creature Elemental -Text:no text -PT:5/5 -K:Wither -A:AB$ DealDamage | Cost$ 2 R Untap | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature or player. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hateflayer.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunted_angel.txt b/res/cardsfolder/haunted_angel.txt deleted file mode 100644 index fc8100c857c..00000000000 --- a/res/cardsfolder/haunted_angel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Haunted Angel -ManaCost:2 W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, exile CARDNAME and each other player puts a 3/3 black Angel creature token with flying onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile | Defined$ Self | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Angel | TokenTypes$ Creature,Angel | TokenOwner$ Opponent | TokenColors$ Black | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card25910.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunted_cadaver.txt b/res/cardsfolder/haunted_cadaver.txt deleted file mode 100644 index 7c814cb0d06..00000000000 --- a/res/cardsfolder/haunted_cadaver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Haunted Cadaver -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, that player discards three cards. -SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ Opponent | NumCards$ 3 | Mode$ TgtChoose -K:Morph:1 B -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunted_cadaver.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunted_crossroads.txt b/res/cardsfolder/haunted_crossroads.txt deleted file mode 100644 index 4c1b33bda98..00000000000 --- a/res/cardsfolder/haunted_crossroads.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Haunted Crossroads -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ B | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target creature card from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunted_crossroads.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunting_apparition.txt b/res/cardsfolder/haunting_apparition.txt deleted file mode 100644 index c6ad9be7706..00000000000 --- a/res/cardsfolder/haunting_apparition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Haunting Apparition -ManaCost:1 U B -Types:Creature Spirit -Text:no text -PT:*/2 -K:Flying -K:stSetPT:Count$InOppYard.Creature+Green/Plus.1:2:CARDNAME's power is equal to 1 plus the number of green creature cards in opponent's graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_apparition.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunting_echoes.txt b/res/cardsfolder/haunting_echoes.txt deleted file mode 100644 index 57dfe65476c..00000000000 --- a/res/cardsfolder/haunting_echoes.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Haunting Echoes -ManaCost:3 B B -Types:Sorcery -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_echoes.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/99.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/98.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunting_hymn.txt b/res/cardsfolder/haunting_hymn.txt deleted file mode 100644 index 8280a28b5ff..00000000000 --- a/res/cardsfolder/haunting_hymn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Haunting Hymn -ManaCost:4 B B -Types:Instant -Text:no text -A:SP$ Discard | Cost$ 4 B B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. If you cast this spell during your main phase, that player discards four cards instead. -SVar:X:Count$IfMainPhase.4.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_hymn.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunting_misery.txt b/res/cardsfolder/haunting_misery.txt deleted file mode 100644 index 1f4df7ad1cd..00000000000 --- a/res/cardsfolder/haunting_misery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Haunting Misery -ManaCost:1 B B -Types:Sorcery -Text:As an additional cost, exile X creature cards from your graveyard. Haunting Misery deals X damage to target player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_misery.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haunting_wind.txt b/res/cardsfolder/haunting_wind.txt deleted file mode 100644 index 116298d061b..00000000000 --- a/res/cardsfolder/haunting_wind.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Haunting Wind -ManaCost:3 B -Types:Enchantment -Text:no text -T:Mode$ AbilityCast | NonTapCost$ True | ValidCard$ Artifact | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an artifact becomes tapped or a player activates an artifact's ability without T in its activation cost, CARDNAME deals 1 damage to that artifact's controller. -T:Mode$ Taps | ValidCard$ Artifact | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever an artifact becomes tapped or a player activates an artifact's ability without T in its activation cost, CARDNAME deals 1 damage to that artifact's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haunting_wind.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/havenwood_battleground.txt b/res/cardsfolder/havenwood_battleground.txt deleted file mode 100644 index 6b6fbbb6a78..00000000000 --- a/res/cardsfolder/havenwood_battleground.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Havenwood Battleground -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | Amount$ 2 |SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/havenwood_battleground.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/421.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/325.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/havenwood_wurm.txt b/res/cardsfolder/havenwood_wurm.txt deleted file mode 100644 index 648822c05cc..00000000000 --- a/res/cardsfolder/havenwood_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Havenwood Wurm -ManaCost:6 G -Types:Creature Wurm -Text:no text -PT:5/6 -K:Flash -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/havenwood_wurm.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/havoc.txt b/res/cardsfolder/havoc.txt deleted file mode 100644 index edff5472727..00000000000 --- a/res/cardsfolder/havoc.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Havoc -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever an opponent casts a white spell, he or she loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/havoc.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/havoc_demon.txt b/res/cardsfolder/havoc_demon.txt deleted file mode 100644 index f9224c37dbe..00000000000 --- a/res/cardsfolder/havoc_demon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Havoc Demon -ManaCost:5 B B -Types:Creature Demon -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, all creatures get -5/-5 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature | NumAtt$ -5 | NumDef$ -5 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/havoc_demon.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hawkeater_moth.txt b/res/cardsfolder/hawkeater_moth.txt deleted file mode 100644 index e5353e27d6a..00000000000 --- a/res/cardsfolder/hawkeater_moth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hawkeater Moth -ManaCost:3 G -Types:Creature Insect -Text:no text -PT:1/2 -K:Flying -K:Shroud -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hawkeater_moth.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/haze_of_rage.txt b/res/cardsfolder/haze_of_rage.txt deleted file mode 100644 index 3aaf75878d4..00000000000 --- a/res/cardsfolder/haze_of_rage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Haze of Rage -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 R | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -SVar:Buyback:2 -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/haze_of_rage.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hazerider_drake.txt b/res/cardsfolder/hazerider_drake.txt deleted file mode 100644 index 43cd3c89fff..00000000000 --- a/res/cardsfolder/hazerider_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hazerider Drake -ManaCost:2 W U -Types:Creature Drake -Text:no text -PT:2/3 -K:Flying -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hazerider_drake.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hazy_homunculus.txt b/res/cardsfolder/hazy_homunculus.txt deleted file mode 100644 index a35cae328e9..00000000000 --- a/res/cardsfolder/hazy_homunculus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hazy Homunculus -ManaCost:1 U -Types:Creature Homunculus Illusion -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/0/HIDDEN Unblockable:isPresent Land.untapped+YouDontCtrl:CARDNAME is unblockable as long as defending player controls an untapped land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hazy_homunculus.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/36.jpg -End diff --git a/res/cardsfolder/he_who_hungers.txt b/res/cardsfolder/he_who_hungers.txt deleted file mode 100644 index d87764307ad..00000000000 --- a/res/cardsfolder/he_who_hungers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:He Who Hungers -ManaCost:4 B -Types:Legendary Creature Spirit -Text:no text -PT:3/2 -K:Flying -A:AB$ Discard | Cost$ 1 Sac<1/Spirit> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ 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. -K:Soulshift:4 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/he_who_hungers.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/headhunter.txt b/res/cardsfolder/headhunter.txt deleted file mode 100644 index 916582a31f1..00000000000 --- a/res/cardsfolder/headhunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Headhunter -ManaCost:1 B -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Morph:B -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/headhunter.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/headless_horseman.txt b/res/cardsfolder/headless_horseman.txt deleted file mode 100644 index c700802aadd..00000000000 --- a/res/cardsfolder/headless_horseman.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Headless Horseman -ManaCost:2 B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1442.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/headlong_rush.txt b/res/cardsfolder/headlong_rush.txt deleted file mode 100644 index 1a236f49b75..00000000000 --- a/res/cardsfolder/headlong_rush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Headlong Rush -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 R | ValidCards$ Creature.attacking | KW$ First Strike | SpellDescription$ Attacking creatures gain first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/headlong_rush.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/headstone.txt b/res/cardsfolder/headstone.txt deleted file mode 100644 index c6a88287886..00000000000 --- a/res/cardsfolder/headstone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Headstone -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/headstone.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heal.txt b/res/cardsfolder/heal.txt deleted file mode 100644 index a874a7afdd2..00000000000 --- a/res/cardsfolder/heal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heal -ManaCost:W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ W | Tgt$ TgtCP | Amount$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ 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. -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heal.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/308.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/healing_leaves.txt b/res/cardsfolder/healing_leaves.txt deleted file mode 100644 index 621b5178ad7..00000000000 --- a/res/cardsfolder/healing_leaves.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Healing Leaves -ManaCost:G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ G | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 3 | PrecostDesc$ Choose one - | SpellDescription$ Target player gains 3 life; -A:SP$ PreventDamage | Cost$ G | Tgt$ TgtCP | Amount$ 3 | PrecostDesc$ or | SpellDescription$ prevent the next 3 damage that would be dealt to target creature or player this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/healing_leaves.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/healing_salve.txt b/res/cardsfolder/healing_salve.txt deleted file mode 100644 index 2f662b2f189..00000000000 --- a/res/cardsfolder/healing_salve.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Healing Salve -ManaCost:W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 3 | PrecostDesc$ Choose one - | SpellDescription$ Target player gains 3 life; -A:SP$ PreventDamage | Cost$ W | Tgt$ TgtCP | Amount$ 3 | PrecostDesc$ or | SpellDescription$ prevent the next 3 damage that would be dealt to target creature or player this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/healing_salve.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/22.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/16.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/208.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/18.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/309.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/278.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/22.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/206.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/224.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/207.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heap_doll.txt b/res/cardsfolder/heap_doll.txt deleted file mode 100644 index 43cf623eb8a..00000000000 --- a/res/cardsfolder/heap_doll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heap Doll -ManaCost:1 -Types:Artifact Creature Scarecrow -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heap_doll.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heart_of_light.txt b/res/cardsfolder/heart_of_light.txt deleted file mode 100644 index 49ed7bcbe7f..00000000000 --- a/res/cardsfolder/heart_of_light.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heart of Light -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN Prevent all damage that would be dealt to and dealt by CARDNAME.:Prevent all damage that would be dealt to and dealt by enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_of_light.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/6.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heart_of_ramos.txt b/res/cardsfolder/heart_of_ramos.txt deleted file mode 100644 index e06c5c023f6..00000000000 --- a/res/cardsfolder/heart_of_ramos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heart of Ramos -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_of_ramos.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heart_of_yavimaya.txt b/res/cardsfolder/heart_of_yavimaya.txt deleted file mode 100644 index 2958abc9069..00000000000 --- a/res/cardsfolder/heart_of_yavimaya.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heart of Yavimaya -ManaCost:no cost -Types:Land -Text:If CARDNAME would enter the battlefield, sacrifice a Forest instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:NeedsToPlay:Forest.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_of_yavimaya.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heart_sliver.txt b/res/cardsfolder/heart_sliver.txt deleted file mode 100644 index 9d3f253b953..00000000000 --- a/res/cardsfolder/heart_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Heart Sliver -ManaCost:1 R -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/Haste:no Condition:All Sliver creatures have haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:AntiBuffedBy:Sliver -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_sliver.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heart_warden.txt b/res/cardsfolder/heart_warden.txt deleted file mode 100644 index 1782659a471..00000000000 --- a/res/cardsfolder/heart_warden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Heart Warden -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heart_warden.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hearth_charm.txt b/res/cardsfolder/hearth_charm.txt deleted file mode 100644 index 3d042b98b1e..00000000000 --- a/res/cardsfolder/hearth_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hearth Charm -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | PrecostDesc$ Choose one - | SpellDescription$ Destroy target artifact creature; -A:SP$ PumpAll | Cost$ R | ValidCards$ Creature.attacking | NumAtt$ +1 | SpellDescription$ or attacking creatures get +1/+0 until end of turn; -A:SP$ Pump | Cost$ R | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | KW$ HIDDEN Unblockable | SpellDescription$ or target creature with power 2 or less is unblockable this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hearth_charm.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hearthcage_giant.txt b/res/cardsfolder/hearthcage_giant.txt deleted file mode 100644 index 291ac701339..00000000000 --- a/res/cardsfolder/hearthcage_giant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hearthcage Giant -ManaCost:6 R R -Types:Creature Giant Warrior -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 3/1 red Elemental Shaman creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ R 3 1 Elemental Shaman | TokenName$ Elemental Shaman | TokenColors$ Red | TokenTypes$ Creature,Elemental,Shaman | TokenPower$ 3 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ 2 -A:AB$ Pump | Cost$ Sac<1/Elemental> | ValidTgts$ Creature.Giant | TgtPrompt$ Select target Giant creature | NumAtt$ +3 | NumDef$ +1 | SpellDescription$ Target Giant creature gets +3/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hearthcage_giant.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hearthfire_hobgoblin.txt b/res/cardsfolder/hearthfire_hobgoblin.txt deleted file mode 100644 index 50e4d7b05a1..00000000000 --- a/res/cardsfolder/hearthfire_hobgoblin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hearthfire Hobgoblin -ManaCost:RW RW RW -Types:Creature Goblin Soldier -Text:no text -PT:2/2 -K:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hearthfire_hobgoblin.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartlash_cinder.txt b/res/cardsfolder/heartlash_cinder.txt deleted file mode 100644 index fa255f37286..00000000000 --- a/res/cardsfolder/heartlash_cinder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Heartlash Cinder -ManaCost:1 R -Types:Creature Elemental Warrior -Text:no text -PT:1/1 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Chroma - When CARDNAME 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. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ X | Defined$ Self -SVar:X:Count$Chroma.R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartlash_cinder.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartless_hidetsugu.txt b/res/cardsfolder/heartless_hidetsugu.txt deleted file mode 100644 index 7106227bdc6..00000000000 --- a/res/cardsfolder/heartless_hidetsugu.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Heartless Hidetsugu -ManaCost:3 R R -Types:Legendary Creature Ogre Shaman -Text:no text -PT:4/3 -A:AB$ DealDamage | Cost$ T | Defined$ Opponent | NumDmg$ XOpp | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals damage to each player equal to half that player's life total, rounded down. -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ XYou -SVar:XOpp:Count$OppLifeTotal/HalfDown -SVar:XYou:Count$YourLifeTotal/HalfDown -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartless_hidetsugu.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartmender.txt b/res/cardsfolder/heartmender.txt deleted file mode 100644 index 486d41030c0..00000000000 --- a/res/cardsfolder/heartmender.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Heartmender -ManaCost:2 GW GW -Types:Creature Elemental -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMend | TriggerDescription$ At the beginning of your upkeep, remove a -1/-1 counter from each creature you control. -SVar:TrigMend:AB$ RemoveCounterAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | CounterType$ M1M1 | CounterNum$ 1 -K:Persist -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartmender.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartstabber_mosquito.txt b/res/cardsfolder/heartstabber_mosquito.txt deleted file mode 100644 index 34c45ce3de1..00000000000 --- a/res/cardsfolder/heartstabber_mosquito.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Heartstabber Mosquito -ManaCost:3 B -Types:Creature Insect -Text:no text -PT:2/2 -K:Flying -K:Kicker:2 B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Heartstabber_Mosquito.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartstone.txt b/res/cardsfolder/heartstone.txt deleted file mode 100644 index 2b263eda029..00000000000 --- a/res/cardsfolder/heartstone.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Heartstone -ManaCost:3 -Types:Artifact -Text:Activated abilities of creatures you control cost 1 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. -K:CostChange:Player:Less:1:Ability:All:Creature:TargetInPlay -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartstone.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartwood_dryad.txt b/res/cardsfolder/heartwood_dryad.txt deleted file mode 100644 index d14a9e61ea5..00000000000 --- a/res/cardsfolder/heartwood_dryad.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Heartwood Dryad -ManaCost:1 G -Types:Creature Dryad -Text:no text -PT:2/1 -K:CARDNAME can block creatures with shadow as though they didn't have shadow. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartwood_dryad.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heartwood_shard.txt b/res/cardsfolder/heartwood_shard.txt deleted file mode 100644 index da90784dff3..00000000000 --- a/res/cardsfolder/heartwood_shard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Heartwood Shard -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heartwood_shard.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/184.jpg -End diff --git a/res/cardsfolder/heartwood_treefolk.txt b/res/cardsfolder/heartwood_treefolk.txt deleted file mode 100644 index 77fedc43e86..00000000000 --- a/res/cardsfolder/heartwood_treefolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Heartwood Treefolk -ManaCost:2 G G -Types:Creature Treefolk -Text:no text -PT:3/4 -K:Forestwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4767.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heat_of_battle.txt b/res/cardsfolder/heat_of_battle.txt deleted file mode 100644 index 9d125835de3..00000000000 --- a/res/cardsfolder/heat_of_battle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heat of Battle -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature blocks, CARDNAME deals 1 damage to that creature's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredBlockerController | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_of_battle.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heat_ray.txt b/res/cardsfolder/heat_ray.txt deleted file mode 100644 index 7a63cc62ed5..00000000000 --- a/res/cardsfolder/heat_ray.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heat Ray -ManaCost:X R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ X R | Tgt$ TgtC | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature. -SVar:X:Count$xPaid -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_ray.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/199.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heat_shimmer.txt b/res/cardsfolder/heat_shimmer.txt deleted file mode 100644 index f6ad315a8d6..00000000000 --- a/res/cardsfolder/heat_shimmer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Heat Shimmer -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$CopyPermanent | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Haste | AtEOT$ Exile | SpellDescription$ 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." -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heat_shimmer.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heavens_gate.txt b/res/cardsfolder/heavens_gate.txt deleted file mode 100644 index 384e37e9964..00000000000 --- a/res/cardsfolder/heavens_gate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heaven's Gate -ManaCost:W -Types:Instant -Text:no text -A:SP$ Animate | Cost$ W | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ White | OverwriteColors$ True | SpellDescription$ Any number of target creatures become white until end of turn. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heavens_gate.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heavy_arbalest.txt b/res/cardsfolder/heavy_arbalest.txt deleted file mode 100644 index 46e6d06a119..00000000000 --- a/res/cardsfolder/heavy_arbalest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Heavy Arbalest -ManaCost:3 -Types:Artifact Equipment -Text:no text -K:eqPump 4:0/0 -K:stPumpEquipped:Creature:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:no condition:Equipped creature doesn't untap during its controller's untap step. -K:stPumpEquipped:Creature:0/0/SVar=Damage:no condition:Equipped creature has "Tap: This creature deals 2 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heavy_arbalest.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heavy_ballista.txt b/res/cardsfolder/heavy_ballista.txt deleted file mode 100644 index 96ff273dfff..00000000000 --- a/res/cardsfolder/heavy_ballista.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Heavy Ballista -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heavy_ballista.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/133.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/23.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hedge_troll.txt b/res/cardsfolder/hedge_troll.txt deleted file mode 100644 index 33bc2b5bfb7..00000000000 --- a/res/cardsfolder/hedge_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hedge Troll -ManaCost:2 G -Types:Creature Troll Cleric -Text:no text -PT:2/2 -K:stPumpSelf:Creature:1/1:isPresent Plains.YouCtrl:CARDNAME gets +1/+1 as long as you control a Plains. -A:AB$ Regenerate | Cost$ W | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedge_troll.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hedron_crab.txt b/res/cardsfolder/hedron_crab.txt deleted file mode 100644 index 64853f4bfb2..00000000000 --- a/res/cardsfolder/hedron_crab.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hedron Crab -ManaCost:U -Types:Creature Crab -Text:no text -PT:0/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ 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. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedron_crab.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hedron_matrix.txt b/res/cardsfolder/hedron_matrix.txt deleted file mode 100644 index f0634dea81d..00000000000 --- a/res/cardsfolder/hedron_matrix.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Hedron Matrix -ManaCost:4 -Types:Artifact Equipment -Text:Equipped creature gets +X/+X, where X is its converted mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedron_matrix.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hedron_rover.txt b/res/cardsfolder/hedron_rover.txt deleted file mode 100644 index e594a092b4d..00000000000 --- a/res/cardsfolder/hedron_rover.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hedron Rover -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedron_rover.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hedron_scrabbler.txt b/res/cardsfolder/hedron_scrabbler.txt deleted file mode 100644 index 0bb64cb9cc5..00000000000 --- a/res/cardsfolder/hedron_scrabbler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hedron Scrabbler -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedron_scrabbler.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heedless_one.txt b/res/cardsfolder/heedless_one.txt deleted file mode 100644 index 7cea5ccabe4..00000000000 --- a/res/cardsfolder/heedless_one.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Heedless One -ManaCost:3 G -Types:Creature Elf Avatar -Text:no text -PT:*/* -K:Trample -K:stSetPT:Count$TypeOnBattlefield.Elf:Count$TypeOnBattlefield.Elf:CARDNAME's power and toughness are each equal to the number of Elves on the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heedless_one.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heidar_rimewind_master.txt b/res/cardsfolder/heidar_rimewind_master.txt deleted file mode 100644 index c87a9b8056d..00000000000 --- a/res/cardsfolder/heidar_rimewind_master.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heidar, Rimewind Master -ManaCost:4 U -Types:Legendary Creature Human Wizard -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent | TgtPrompt$ Select target Permanent | Origin$ Battlefield | Destination$ Hand | IsPresent$ Permanent.Snow.YouCtrl | PresentCompare$ GE4 | SpellDescription$ Return target permanent to its owner's hand. Play this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heidar_rimewind_master.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heightened_awareness.txt b/res/cardsfolder/heightened_awareness.txt deleted file mode 100644 index 2f770f5ea72..00000000000 --- a/res/cardsfolder/heightened_awareness.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Heightened Awareness -ManaCost:3 U U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ As CARDNAME enters the battlefield, discard your hand. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your draw step, draw an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Mode$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heightened_awareness.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/37.jpg -End diff --git a/res/cardsfolder/helionaut.txt b/res/cardsfolder/helionaut.txt deleted file mode 100644 index c94c728af17..00000000000 --- a/res/cardsfolder/helionaut.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Helionaut -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:Flying -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/helionaut.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heliophial.txt b/res/cardsfolder/heliophial.txt deleted file mode 100644 index b2272a3703a..00000000000 --- a/res/cardsfolder/heliophial.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heliophial -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 2 Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of charge counters on it to target creature or player. -K:Sunburst -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heliophial.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/helix_pinnacle.txt b/res/cardsfolder/helix_pinnacle.txt deleted file mode 100644 index 7682179fa13..00000000000 --- a/res/cardsfolder/helix_pinnacle.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Helix Pinnacle -ManaCost:G -Types:Enchantment -# This cannot yet be converted to AF_WinsGame due to a limitation in how hasProperty determines the numeric value to compare Counters to -Text:At the beginning of your upkeep, if there are 100 or more tower counters on Helix Pinnacle, you win the game. -K:Shroud -A:AB$ PutCounter | Cost$ X | CounterType$ TOWER | CounterNum$ X | SpellDescription$ Put a tower counter on CARDNAME. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/helix_pinnacle.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hell_bent_raider.txt b/res/cardsfolder/hell_bent_raider.txt deleted file mode 100644 index 4d1f0bbb026..00000000000 --- a/res/cardsfolder/hell_bent_raider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hell-Bent Raider -ManaCost:1 R R -Types:Creature Human Barbarian -Text:no text -PT:2/2 -K:First Strike -K:Haste -A:AB$ Pump | Cost$ Discard<1/Random> | KW$ Protection from white | SpellDescription$ CARDNAME gains protection from white until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hell_bent_raider.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hell_swarm.txt b/res/cardsfolder/hell_swarm.txt deleted file mode 100644 index 75a8f1cef0a..00000000000 --- a/res/cardsfolder/hell_swarm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hell Swarm -ManaCost:B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ B | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -0 | IsCurse$ True | SpellDescription$ All creatures get -1/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hell_swarm.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/helldozer.txt b/res/cardsfolder/helldozer.txt deleted file mode 100644 index 106973a123d..00000000000 --- a/res/cardsfolder/helldozer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Helldozer -ManaCost:3 B B B -Types:Creature Zombie Giant -Text:no text -PT:6/5 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card88990.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hellfire.txt b/res/cardsfolder/hellfire.txt deleted file mode 100644 index 1318a497f85..00000000000 --- a/res/cardsfolder/hellfire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hellfire -ManaCost:2 B B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 B B B | ValidCards$ Creature.nonBlack | RememberDestroyed$ True | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy all nonblack creatures. CARDNAME deals X plus 3 damage to you, where X is the number of creatures put into all graveyards this way. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ X | Defined$ You -SVar:X:Remembered$Amount.Plus.3 -# Remember Destroyed still isn't quite right since Hellfire cares about Replacement effects too -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellfire.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/18.jpg -End diff --git a/res/cardsfolder/hellfire_mongrel.txt b/res/cardsfolder/hellfire_mongrel.txt deleted file mode 100644 index 06d1f1f2364..00000000000 --- a/res/cardsfolder/hellfire_mongrel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hellfire Mongrel -ManaCost:2 R -Types:Creature Elemental Hound -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LT3 | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, CARDNAME deals 2 damage to him or her. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellfire_mongrel.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hellhole_rats.txt b/res/cardsfolder/hellhole_rats.txt deleted file mode 100644 index 0c8221c6e07..00000000000 --- a/res/cardsfolder/hellhole_rats.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hellhole Rats -ManaCost:2 B R -Types:Creature Rat -Text:no text -PT:2/2 -K:Haste -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards a card. CARDNAME deals damage to that player equal to that card's converted mana cost. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | NumCards$ 1 | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$DealDamage | Defined$ Targeted | NumDmg$ X -SVar:X:Discarded$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellhole_rats.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hellion_eruption.txt b/res/cardsfolder/hellion_eruption.txt deleted file mode 100644 index c422b620bfc..00000000000 --- a/res/cardsfolder/hellion_eruption.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Hellion Eruption -ManaCost:5 R -Types:Sorcery -Text:Sacrifice all creatures you control, then put that many 4/4 red Hellion creature tokens onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellion_eruption.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hellkite_igniter.txt b/res/cardsfolder/hellkite_igniter.txt deleted file mode 100644 index ff31327f443..00000000000 --- a/res/cardsfolder/hellkite_igniter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hellkite Igniter -ManaCost:5 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -K:Haste -A:AB$ Pump | Cost$ 1 R | NumAtt$ +X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the number of artifacts you control. -SVar:X:Count$TypeYouCtrl.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellkite_igniter.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/65.jpg -End diff --git a/res/cardsfolder/hellkite_overlord.txt b/res/cardsfolder/hellkite_overlord.txt deleted file mode 100644 index 8d29743b660..00000000000 --- a/res/cardsfolder/hellkite_overlord.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hellkite Overlord -ManaCost:4 B R R G -Types:Creature Dragon -Text:no text -PT:8/8 -K:Flying -K:Trample -K:Haste -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Regenerate | Cost$ B G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellkite_overlord.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/172.jpg -End diff --git a/res/cardsfolder/hells_caretaker.txt b/res/cardsfolder/hells_caretaker.txt deleted file mode 100644 index 9789a7ec137..00000000000 --- a/res/cardsfolder/hells_caretaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hell's Caretaker -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T Sac<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only during your upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hells_caretaker.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/137.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hells_thunder.txt b/res/cardsfolder/hells_thunder.txt deleted file mode 100644 index b4b8bd0c026..00000000000 --- a/res/cardsfolder/hells_thunder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hell's Thunder -ManaCost:1 R R -Types:Creature Elemental -Text:no text -PT:4/4 -K:Flying -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -K:Unearth:4 R -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hells_thunder.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hellspark_elemental.txt b/res/cardsfolder/hellspark_elemental.txt deleted file mode 100644 index 891ce55d17e..00000000000 --- a/res/cardsfolder/hellspark_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hellspark Elemental -ManaCost:1 R -Types:Creature Elemental -Text:no text -PT:3/1 -K:Trample -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -K:Unearth:1 R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hellspark_elemental.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/helm_of_awakening.txt b/res/cardsfolder/helm_of_awakening.txt deleted file mode 100644 index b6279554683..00000000000 --- a/res/cardsfolder/helm_of_awakening.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Helm of Awakening -ManaCost:2 -Types:Artifact -Text:Spells cost 1 less to cast. -K:CostChange:All:Less:1:Spell:All:All:NoSpecial -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_awakening.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/helm_of_possession.txt b/res/cardsfolder/helm_of_possession.txt deleted file mode 100644 index 6d280bd767c..00000000000 --- a/res/cardsfolder/helm_of_possession.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Helm of Possession -ManaCost:4 -Types:Artifact -Text:no text -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ 2 T Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target creature for as long as you control CARDNAME and CARDNAME remains tapped. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_possession.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/helm_of_the_ghastlord.txt b/res/cardsfolder/helm_of_the_ghastlord.txt deleted file mode 100644 index 5922da23a41..00000000000 --- a/res/cardsfolder/helm_of_the_ghastlord.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Helm of the Ghastlord -ManaCost:3 UB -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature.Blue:1/1:No Condition:no text -K:stPumpEnchanted:Creature.Black:1/1:No Condition:no text -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy+Blue | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ As long as enchanted creature is blue, it gets +1/+1 and has "Whenever this creature deals damage to an opponent, draw a card." -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy+Black | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ 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." -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/helm_of_the_ghastlord.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hematite_golem.txt b/res/cardsfolder/hematite_golem.txt deleted file mode 100644 index fb01fe3c250..00000000000 --- a/res/cardsfolder/hematite_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hematite Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:1/4 -A:AB$ Pump | Cost$ 1 R | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hematite_golem.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/185.jpg -End diff --git a/res/cardsfolder/hematite_talisman.txt b/res/cardsfolder/hematite_talisman.txt deleted file mode 100644 index 12ec715b834..00000000000 --- a/res/cardsfolder/hematite_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hematite Talisman -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a red spell, you may pay 3. If you do, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hematite_talisman.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/henchfiend_of_ukor.txt b/res/cardsfolder/henchfiend_of_ukor.txt deleted file mode 100644 index c57b7f3aed6..00000000000 --- a/res/cardsfolder/henchfiend_of_ukor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Henchfiend of Ukor -ManaCost:3 R -Types:Creature Ogre -Text:no text -PT:3/2 -K:Haste -K:Echo:1 B -A:AB$ Pump | Cost$ BR | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/henchfiend_of_ukor.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/117.jpg -End diff --git a/res/cardsfolder/henge_guardian.txt b/res/cardsfolder/henge_guardian.txt deleted file mode 100644 index 93d5bbf1085..00000000000 --- a/res/cardsfolder/henge_guardian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Henge Guardian -ManaCost:5 -Types:Artifact Creature Dragon Wurm -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ 2 | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/henge_guardian.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/297.jpg -End diff --git a/res/cardsfolder/henge_of_ramos.txt b/res/cardsfolder/henge_of_ramos.txt deleted file mode 100644 index 9b7a85fa054..00000000000 --- a/res/cardsfolder/henge_of_ramos.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Henge of Ramos -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/henge_of_ramos.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/herald_of_serra.txt b/res/cardsfolder/herald_of_serra.txt deleted file mode 100644 index a04060f443d..00000000000 --- a/res/cardsfolder/herald_of_serra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Herald of Serra -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:3/4 -K:Flying -K:Vigilance -K:Echo:2 W W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/herald_of_serra.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/herbal_poultice.txt b/res/cardsfolder/herbal_poultice.txt deleted file mode 100644 index fe907d69ff8..00000000000 --- a/res/cardsfolder/herbal_poultice.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Herbal Poultice -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ 3 Sac<1/CARDNAME> | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/herbal_poultice.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/herd_gnarr.txt b/res/cardsfolder/herd_gnarr.txt deleted file mode 100644 index 6ff624866cf..00000000000 --- a/res/cardsfolder/herd_gnarr.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Herd Gnarr -ManaCost:3 G -Types:Creature Beast -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever another creature enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/herd_gnarr.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heritage_druid.txt b/res/cardsfolder/heritage_druid.txt deleted file mode 100644 index 83ffa850d10..00000000000 --- a/res/cardsfolder/heritage_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Heritage Druid -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ tapXType<3/Elf> | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heritage_druid.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hermetic_study.txt b/res/cardsfolder/hermetic_study.txt deleted file mode 100644 index 44b50c59075..00000000000 --- a/res/cardsfolder/hermetic_study.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hermetic Study -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hermetic_study.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hermit_druid.txt b/res/cardsfolder/hermit_druid.txt deleted file mode 100644 index 254e1498b82..00000000000 --- a/res/cardsfolder/hermit_druid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hermit Druid -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:1/1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hermit_druid.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hero_of_bladehold.txt b/res/cardsfolder/hero_of_bladehold.txt deleted file mode 100644 index 1101bb3e36a..00000000000 --- a/res/cardsfolder/hero_of_bladehold.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hero of Bladehold -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:3/4 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks, put two 1/1 white Soldier creature tokens onto the battlefield tapped and attacking. -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenTapped$ True | TokenAttacking$ True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/hero_of_bladehold.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hero_of_oxid_ridge.txt b/res/cardsfolder/hero_of_oxid_ridge.txt deleted file mode 100644 index 7b56f462458..00000000000 --- a/res/cardsfolder/hero_of_oxid_ridge.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Hero of Oxid Ridge -ManaCost:2 R R -Types:Creature Human Knight -Text:no text -PT:4/2 -K:Haste -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ When CARDNAME attacks, creatures with power 1 or less can't block this turn. -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:TrigEffect:AB$Effect | Cost$ 0 | Name$ Hero of Oxid Ridge Effect | Keywords$ KWPump -SVar:KWPump:stPumpAll:Creature.powerLE1:0/0/HIDDEN CARDNAME can't block.:no Condition:Creatures with power 1 or less can't block this turn. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/hero_of_oxid_ridge.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/heroes_remembered.txt b/res/cardsfolder/heroes_remembered.txt deleted file mode 100644 index f36a85c121a..00000000000 --- a/res/cardsfolder/heroes_remembered.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Heroes Remembered -ManaCost:6 W W W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 6 W W W | LifeAmount$ 20 | SpellDescription$ You gain 20 life. -K:Suspend:10:W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heroes_remembered.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/7.jpg -End diff --git a/res/cardsfolder/heroes_reunion.txt b/res/cardsfolder/heroes_reunion.txt deleted file mode 100644 index 5b1ea6615a7..00000000000 --- a/res/cardsfolder/heroes_reunion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Heroes' Reunion -ManaCost:W G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ W G | LifeAmount$ 7 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 7 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/heroes_reunion.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/250.jpg -End diff --git a/res/cardsfolder/heros_demise.txt b/res/cardsfolder/heros_demise.txt deleted file mode 100644 index 799e6f77d3f..00000000000 --- a/res/cardsfolder/heros_demise.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hero's Demise -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | SpellDescription$ Destroy target legendary creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/heros_demise.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/68.jpg -End diff --git a/res/cardsfolder/heros_resolve.txt b/res/cardsfolder/heros_resolve.txt deleted file mode 100644 index b42c9765053..00000000000 --- a/res/cardsfolder/heros_resolve.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hero's Resolve -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/heros_resolve.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/235.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hex.txt b/res/cardsfolder/hex.txt deleted file mode 100644 index ee0297244e7..00000000000 --- a/res/cardsfolder/hex.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hex -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B B | TargetMin$ 6 | TargetMax$ 6 | ValidTgts$ Creature | TgtPrompt$ Select target creatures | SpellDescription$ Destroy six target creatures. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89059.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hexplate_golem.txt b/res/cardsfolder/hexplate_golem.txt deleted file mode 100644 index 44c765c5ad7..00000000000 --- a/res/cardsfolder/hexplate_golem.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hexplate Golem -ManaCost:7 -Types:Artifact Creature Golem -Text:no text -PT:5/7 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hexplate_golem.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hibernation.txt b/res/cardsfolder/hibernation.txt deleted file mode 100644 index 78c58451e54..00000000000 --- a/res/cardsfolder/hibernation.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hibernation -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Permanent.Green | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all green permanents to their owners' hands. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hibernation.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/82.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/79.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hibernation_sliver.txt b/res/cardsfolder/hibernation_sliver.txt deleted file mode 100644 index 470e0a24013..00000000000 --- a/res/cardsfolder/hibernation_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hibernation Sliver -ManaCost:U B -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Bounce:no Condition:All Slivers have "Pay 2 life, Return this permanent to its owner's hand." -SVar:Bounce:AB$ChangeZone | Cost$ PayLife<2> | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return this permanent to its owner's hand -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hibernation_sliver.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hickory_woodlot.txt b/res/cardsfolder/hickory_woodlot.txt deleted file mode 100644 index 1731aa2bb60..00000000000 --- a/res/cardsfolder/hickory_woodlot.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hickory Woodlot -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:DEPLETION:2 -A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ G | Deplete$ DEPLETION | Amount$ 2 | SpellDescription$ Add G G to your mana pool. If there are no depletion counters on CARDNAME, sacrifice it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://wizards.com/global/images/magic/general/hickory_woodlot.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/319.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_ancients.txt b/res/cardsfolder/hidden_ancients.txt deleted file mode 100644 index f44ba780f27..00000000000 --- a/res/cardsfolder/hidden_ancients.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Ancients -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an enchantment spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/5 Treefolk creature. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 5 | Toughness$ 5 | Types$ Creature,Treefolk | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_ancients.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_gibbons.txt b/res/cardsfolder/hidden_gibbons.txt deleted file mode 100644 index 37f4d4dda4b..00000000000 --- a/res/cardsfolder/hidden_gibbons.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Gibbons -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an instant spell, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Ape creature. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Ape | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_gibbons.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_guerrillas.txt b/res/cardsfolder/hidden_guerrillas.txt deleted file mode 100644 index 22db3d8edb6..00000000000 --- a/res/cardsfolder/hidden_guerrillas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Guerrillas -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an artifact spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/3 Soldier creature with trample. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 5 | Toughness$ 3 | Keywords$ Trample | Types$ Creature,Soldier | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_guerrillas.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_herd.txt b/res/cardsfolder/hidden_herd.txt deleted file mode 100644 index 9ae6d7e5067..00000000000 --- a/res/cardsfolder/hidden_herd.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Herd -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ LandPlayed | ValidCard$ Land.nonBasic+YouDontCtrl | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent plays a nonbasic land, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Beast creature. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Beast | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_herd.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_path.txt b/res/cardsfolder/hidden_path.txt deleted file mode 100644 index c0235a93837..00000000000 --- a/res/cardsfolder/hidden_path.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Path -ManaCost:2 G G G G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Green:0/0/Forestwalk:No Condition:Green creatures have forestwalk. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_path.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hidden_spider.txt b/res/cardsfolder/hidden_spider.txt deleted file mode 100644 index af8907f49ab..00000000000 --- a/res/cardsfolder/hidden_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hidden Spider -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature.withFlying | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell with flying, if CARDNAME is an enchantment, CARDNAME becomes a 3/5 Spider creature with reach. (It can block creatures with flying.) -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 5 | Keywords$ Reach | Types$ Creature,Spider | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_spider.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hideous_end.txt b/res/cardsfolder/hideous_end.txt deleted file mode 100644 index 85ab323c931..00000000000 --- a/res/cardsfolder/hideous_end.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hideous End -ManaCost:1 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ SVar=DBDrain | SpellDescription$ Destroy target nonblack creature. Its controller loses 2 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hideous_end.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/98.jpg -End diff --git a/res/cardsfolder/hidetsugus_second_rite.txt b/res/cardsfolder/hidetsugus_second_rite.txt deleted file mode 100644 index 07fe7ca9a87..00000000000 --- a/res/cardsfolder/hidetsugus_second_rite.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hidetsugu's Second Rite -ManaCost:3 R -Types:Instant -Text:If target player has exactly 10 life, Hidetsugu's Second Rite deals 10 damage to that player. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card88818.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/high_market.txt b/res/cardsfolder/high_market.txt deleted file mode 100644 index 6e8b7d59948..00000000000 --- a/res/cardsfolder/high_market.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:High Market -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ GainLife | Cost$ 1 Sac<1/Creature> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/high_market.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/high_seas.txt b/res/cardsfolder/high_seas.txt deleted file mode 100644 index fa7fccd5e40..00000000000 --- a/res/cardsfolder/high_seas.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:High Seas -ManaCost:2 U -Types:Enchantment -Text:Red creature spells and green creature spells cost 1 more to cast. -K:CostChange:All:More:1:Spell:red:Creature:NoSpecial -K:CostChange:All:More:1:Spell:green:Creature:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/high_seas.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/high_tide.txt b/res/cardsfolder/high_tide.txt deleted file mode 100644 index e50a1a78220..00000000000 --- a/res/cardsfolder/high_tide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:High Tide -ManaCost:U -Types:Instant -Text:no text -A:SP$ Effect | Cost$ U | Name$ High Tide Effect | Triggers$ IslandTrigger | SVars$ TrigMana | SpellDescription$ 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). -SVar:IslandTrigger:Mode$ TapsForMana | ValidCard$ Island | Execute$ TrigMana | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ U | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/high_tide.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/35.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/highland_berserker.txt b/res/cardsfolder/highland_berserker.txt deleted file mode 100644 index 19c46f1240a..00000000000 --- a/res/cardsfolder/highland_berserker.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Highland Berserker -ManaCost:1 R -Types:Creature Human Berserker Ally -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain first strike until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain first strike until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Ally.YouCtrl | KW$ First Strike -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/highland_berserker.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/highland_giant.txt b/res/cardsfolder/highland_giant.txt deleted file mode 100644 index 8846cdc0d15..00000000000 --- a/res/cardsfolder/highland_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Highland Giant -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:3/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4343.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/highland_weald.txt b/res/cardsfolder/highland_weald.txt deleted file mode 100644 index 4d5f4f8e63b..00000000000 --- a/res/cardsfolder/highland_weald.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Highland Weald -ManaCost:no cost -Types:Snow Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/highland_weald.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/highway_robber.txt b/res/cardsfolder/highway_robber.txt deleted file mode 100644 index f97578b8ea9..00000000000 --- a/res/cardsfolder/highway_robber.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Highway Robber -ManaCost:2 B B -Types:Creature Human Mercenary -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ When CARDNAME enters the battlefield, target opponent loses 2 life and you gain 2 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84505.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/139.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/138.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/higure_the_still_wind.txt b/res/cardsfolder/higure_the_still_wind.txt deleted file mode 100644 index 6e4fbf85d95..00000000000 --- a/res/cardsfolder/higure_the_still_wind.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Higure, the Still Wind -ManaCost:3 U U -Types:Legendary Creature Human Ninja -Text:no text -PT:3/4 -A:AB$ ChangeZone | Cost$ 2 U U Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 2 U U | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (2 U U, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigSearch | OptionalDecider$ You | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigSearch:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Ninja | ChangeNum$ 1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Ninja | KW$ HIDDEN Unblockable | SpellDescription$ Target Ninja creature is unblockable this turn. | TgtPrompt$ Select target Ninja creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/higure_the_still_wind.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hill_giant.txt b/res/cardsfolder/hill_giant.txt deleted file mode 100644 index a4fe7fade5b..00000000000 --- a/res/cardsfolder/hill_giant.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Hill Giant -ManaCost:3 R -Types:Creature Giant -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hill_giant.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/194.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/158.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/159.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/196.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/219.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/138.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/197.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/212.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/157.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/239.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hillcomber_giant.txt b/res/cardsfolder/hillcomber_giant.txt deleted file mode 100644 index 016e2f0bfb5..00000000000 --- a/res/cardsfolder/hillcomber_giant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hillcomber Giant -ManaCost:2 W W -Types:Creature Giant Scout -Text:no text -PT:3/3 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card145971.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hindering_light.txt b/res/cardsfolder/hindering_light.txt deleted file mode 100644 index 1200e7e2c4c..00000000000 --- a/res/cardsfolder/hindering_light.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hindering Light -ManaCost:W U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ W U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl,You | SpellDescription$ Counter target spell that targets you or a permanent you control. Draw a card. | SubAbility$ SVar=DB -SVar:DB:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hindering_light.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hindering_touch.txt b/res/cardsfolder/hindering_touch.txt deleted file mode 100644 index c16f1c9e214..00000000000 --- a/res/cardsfolder/hindering_touch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hindering Touch -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 3 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays 2. -K:Storm -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hindering_touch.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hired_giant.txt b/res/cardsfolder/hired_giant.txt deleted file mode 100644 index 17b4075961b..00000000000 --- a/res/cardsfolder/hired_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hired Giant -ManaCost:3 R -Types:Creature Giant -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hired_giant.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hisokas_defiance.txt b/res/cardsfolder/hisokas_defiance.txt deleted file mode 100644 index e2f83dbbbc6..00000000000 --- a/res/cardsfolder/hisokas_defiance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hisoka's Defiance -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Spirit or Arcane spell | ValidTgts$ Spirit,Arcane | SpellDescription$ Counter target Spirit or Arcane spell. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hisokas_defiance.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hissing_iguanar.txt b/res/cardsfolder/hissing_iguanar.txt deleted file mode 100644 index 76c66d8360a..00000000000 --- a/res/cardsfolder/hissing_iguanar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hissing Iguanar -ManaCost:2 R -Types:Creature Lizard -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may have CARDNAME deal 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hissing_iguanar.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hissing_miasma.txt b/res/cardsfolder/hissing_miasma.txt deleted file mode 100644 index 396218dab49..00000000000 --- a/res/cardsfolder/hissing_miasma.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hissing Miasma -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature attacks you, its controller loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 | SpellDescription$ Whenever a creature attacks you, its controller loses 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hissing_miasma.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hivestone.txt b/res/cardsfolder/hivestone.txt deleted file mode 100644 index 1567cca5486..00000000000 --- a/res/cardsfolder/hivestone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hivestone -ManaCost:2 -Types:Artifact -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Types=Sliver:No Condition:Creatures you control are Slivers in addition to their other creature types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hivestone.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hivis_of_the_scale.txt b/res/cardsfolder/hivis_of_the_scale.txt deleted file mode 100644 index 1f0c8ceda48..00000000000 --- a/res/cardsfolder/hivis_of_the_scale.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hivis of the Scale -ManaCost:3 R R -Types:Legendary Creature Viashino Shaman -Text:no text -PT:3/4 -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ T | ValidTgts$ Dragon | TgtPrompt$ Select target Dragon. | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target Dragon for as long as you control CARDNAME and CARDNAME remains tapped. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hivis_of_the_scale.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoar_shade.txt b/res/cardsfolder/hoar_shade.txt deleted file mode 100644 index 20937249fc8..00000000000 --- a/res/cardsfolder/hoar_shade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hoar Shade -ManaCost:3 B -Types:Creature Shade -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoar_shade.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/19.jpg -End diff --git a/res/cardsfolder/hoard_smelter_dragon.txt b/res/cardsfolder/hoard_smelter_dragon.txt deleted file mode 100644 index f291b742afc..00000000000 --- a/res/cardsfolder/hoard_smelter_dragon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hoard-Smelter Dragon -ManaCost:4 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -A:AB$ Destroy | Cost$ 3 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBPump | SpellDescription$ Destroy target artifact. CARDNAME gets +X/+0 until end of turn, where X is that artifact's converted mana cost. -SVar:DBPump:DB$Pump | NumAtt$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoard_smelter_dragon.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoarders_greed.txt b/res/cardsfolder/hoarders_greed.txt deleted file mode 100644 index a78175a071c..00000000000 --- a/res/cardsfolder/hoarders_greed.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hoarder's Greed -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 3 B | Defined$ You | LifeAmount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ You lose 2 life and draw two cards, then clash with an opponent. If you win, repeat this process. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 2 | SubAbility$ SVar=DBClash -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 2 | SubAbility$ SVar=DBDraw -SVar:DBClash:DB$Clash | WinSubAbility$ DBLoseLife -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoarders_greed.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hobble.txt b/res/cardsfolder/hobble.txt deleted file mode 100644 index 11fe96529e2..00000000000 --- a/res/cardsfolder/hobble.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hobble -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:enPumpCurse:0/0/HIDDEN CARDNAME can't attack.:Enchanted creature can't attack. -K:stPumpEnchanted:Creature:0/0/HIDDEN CARDNAME can't block.:isPresent Creature.AttachedBy+Black:Enchanted creature can't block if it's black. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hobble.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hobgoblin_dragoon.txt b/res/cardsfolder/hobgoblin_dragoon.txt deleted file mode 100644 index 0ee16b9e7e1..00000000000 --- a/res/cardsfolder/hobgoblin_dragoon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hobgoblin Dragoon -ManaCost:2 RW -Types:Creature Goblin Knight -Text:no text -PT:1/2 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hobgoblin_dragoon.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hokori_dust_drinker.txt b/res/cardsfolder/hokori_dust_drinker.txt deleted file mode 100644 index 77b4bc3cb80..00000000000 --- a/res/cardsfolder/hokori_dust_drinker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hokori, Dust Drinker -ManaCost:2 W W -Types:Legendary Creature Spirit -Text:Players may only untap one land during their untap steps. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hokori_dust_drinker.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hold_the_line.txt b/res/cardsfolder/hold_the_line.txt deleted file mode 100644 index acb3103ac1c..00000000000 --- a/res/cardsfolder/hold_the_line.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hold the Line -ManaCost:1 W W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.blocking | NumAtt$ +7 | NumDef$ +7 | SpellDescription$ Blocking creatures get +7/+7 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hold_the_line.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hollow_dogs.txt b/res/cardsfolder/hollow_dogs.txt deleted file mode 100644 index 9b1b805413d..00000000000 --- a/res/cardsfolder/hollow_dogs.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hollow Dogs -ManaCost:4 B -Types:Creature Zombie Hound -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hollow_dogs.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/137.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/81.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/139.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hollow_trees.txt b/res/cardsfolder/hollow_trees.txt deleted file mode 100644 index f3912b294a8..00000000000 --- a/res/cardsfolder/hollow_trees.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hollow Trees -ManaCost:no cost -Types:Land -Text:At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. -K:CARDNAME enters the battlefield tapped. -K:You may choose not to untap CARDNAME during your untap step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hollow_trees.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/422.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hollowborn_barghest.txt b/res/cardsfolder/hollowborn_barghest.txt deleted file mode 100644 index 45e2c0f7dba..00000000000 --- a/res/cardsfolder/hollowborn_barghest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hollowborn Barghest -ManaCost:5 B B -Types:Creature Demon Hound -Text:no text -PT:7/6 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.YouCtrl | PresentCompare$ EQ0 | PresentZone$ Hand | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, if you have no cards in hand, each opponent loses 2 life. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.YouDontCtrl | PresentCompare$ EQ0 | PresentZone$ Hand | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has no cards in hand, he or she loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hollowborn_barghest.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hollowsage.txt b/res/cardsfolder/hollowsage.txt deleted file mode 100644 index 12a1af59c50..00000000000 --- a/res/cardsfolder/hollowsage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hollowsage -ManaCost:3 B -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes untapped, you may have target player discard a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hollowsage.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/holy_armor.txt b/res/cardsfolder/holy_armor.txt deleted file mode 100644 index ac62b7d5e29..00000000000 --- a/res/cardsfolder/holy_armor.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Holy Armor -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+2 -A:AB$ Pump | Cost$ W | Defined$ Enchanted | NumDef$ +1 | SpellDescription$ Enchanted creature gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/holy_armor.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/207.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/209.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/207.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/279.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/holy_day.txt b/res/cardsfolder/holy_day.txt deleted file mode 100644 index 7429d35f9d8..00000000000 --- a/res/cardsfolder/holy_day.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Holy Day -ManaCost:W -Types:Instant -Text:no text -A:SP$ Fog | Cost$ W | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/holy_day.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/23.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/20.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/189.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/18.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/21.jpg -End diff --git a/res/cardsfolder/holy_light.txt b/res/cardsfolder/holy_light.txt deleted file mode 100644 index 64b7dfd07cf..00000000000 --- a/res/cardsfolder/holy_light.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Holy Light -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.nonWhite | IsCurse$ True | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Nonwhite creatures get -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/holy_light.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/83.jpg -End diff --git a/res/cardsfolder/holy_strength.txt b/res/cardsfolder/holy_strength.txt deleted file mode 100644 index bf067b0c8f5..00000000000 --- a/res/cardsfolder/holy_strength.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Holy Strength -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/holy_strength.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/24.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/208.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/210.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/20.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/311.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/280.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/19.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/22.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/16.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/15.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/208.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/homarid.txt b/res/cardsfolder/homarid.txt deleted file mode 100644 index 5ba173d7e2f..00000000000 --- a/res/cardsfolder/homarid.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Homarid -ManaCost:2 U -Types:Creature Homarid -Text:Whenever there are four tide counters on CARDNAME, remove all tide counters from it. -PT:2/2 -K:etbCounter:TIDE:1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a tide counter on CARDNAME. -K:stPumpSelf:Permanent:-1/-1:isValid Permanent.countersEQ1TIDE:As long as there is exactly one tide counter on CARDNAME, it gets -1/-1. -K:stPumpSelf:Permanent:1/1:isValid Permanent.countersEQ3TIDE:As long as there are exactly three tide counters on CARDNAME, it gets +1/+1. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TIDE | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/38.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/homarid_shaman.txt b/res/cardsfolder/homarid_shaman.txt deleted file mode 100644 index cc8e2a43dc7..00000000000 --- a/res/cardsfolder/homarid_shaman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Homarid Shaman -ManaCost:2 U U -Types:Creature Homarid Shaman -Text:no text -PT:2/1 -A:AB$ Tap | Cost$ U | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | SpellDescription$ Tap target green creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid_shaman.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/42.jpg -End diff --git a/res/cardsfolder/homarid_spawning_bed.txt b/res/cardsfolder/homarid_spawning_bed.txt deleted file mode 100644 index 7f96a2256fa..00000000000 --- a/res/cardsfolder/homarid_spawning_bed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Homarid Spawning Bed -ManaCost:U U -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 1 U U Sac<1/Creature.Blue> | CostDesc$ 1 U U, Sacrifice a blue creature: | TokenImage$ U 1 1 Camarid | TokenAmount$ X | TokenName$ Camarid | TokenTypes$ Creature,Camarid | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put X 1/1 blue Camarid creature tokens onto the battlefield, where X is the sacrificed creature's converted mana cost. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid_spawning_bed.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/homarid_warrior.txt b/res/cardsfolder/homarid_warrior.txt deleted file mode 100644 index a0bbf9bd613..00000000000 --- a/res/cardsfolder/homarid_warrior.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Homarid Warrior -ManaCost:4 U -Types:Creature Homarid Warrior -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ U | KW$ Shroud | SubAbility$ SVar=DBPumpNoUntap | SpellDescription$ CARDNAME gains shroud until end of turn and doesn't untap during your next untap step. Tap CARDNAME. (A permanent with shroud can't be the target of spells or abilities.) -SVar:DBPumpNoUntap:DB$Pump | Defined$ Self | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ SVar=DBTap -SVar:DBTap:DB$Tap | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/homarid_warrior.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/92.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/44.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/honden_of_cleansing_fire.txt b/res/cardsfolder/honden_of_cleansing_fire.txt deleted file mode 100644 index 56e06cca543..00000000000 --- a/res/cardsfolder/honden_of_cleansing_fire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honden of Cleansing Fire -ManaCost:3 W -Types:Legendary Enchantment Shrine -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, you gain 2 life for each Shrine you control. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$TypeYouCtrl.Shrine/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honden_of_cleansing_fire.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honden_of_infinite_rage.txt b/res/cardsfolder/honden_of_infinite_rage.txt deleted file mode 100644 index f9f7619b88f..00000000000 --- a/res/cardsfolder/honden_of_infinite_rage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honden of Infinite Rage -ManaCost:2 R -Types:Legendary Enchantment Shrine -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals damage to target creature or player equal to the number of Shrines you control. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X -SVar:X:Count$TypeYouCtrl.Shrine -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honden_of_infinite_rage.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honden_of_lifes_web.txt b/res/cardsfolder/honden_of_lifes_web.txt deleted file mode 100644 index 1139a3207e5..00000000000 --- a/res/cardsfolder/honden_of_lifes_web.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honden of Life's Web -ManaCost:4 G -Types:Legendary Enchantment Shrine -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, put a 1/1 colorless Spirit creature token onto the battlefield for each Shrine you control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$TypeYouCtrl.Shrine -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honden_of_lifes_web.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honden_of_nights_reach.txt b/res/cardsfolder/honden_of_nights_reach.txt deleted file mode 100644 index dd52b700d32..00000000000 --- a/res/cardsfolder/honden_of_nights_reach.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honden of Night's Reach -ManaCost:3 B -Types:Legendary Enchantment Shrine -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of your upkeep, target opponent discards a card for each Shrine you control. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ X | Mode$ TgtChoose -SVar:X:Count$TypeYouCtrl.Shrine -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honden_of_nights_reach.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honden_of_seeing_winds.txt b/res/cardsfolder/honden_of_seeing_winds.txt deleted file mode 100644 index 94545e71c86..00000000000 --- a/res/cardsfolder/honden_of_seeing_winds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honden of Seeing Winds -ManaCost:4 U -Types:Legendary Enchantment Shrine -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, draw a card for each Shrine you control. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:Count$TypeYouCtrl.Shrine -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honden_of_seeing_winds.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honor_guard.txt b/res/cardsfolder/honor_guard.txt deleted file mode 100644 index d95155b17d6..00000000000 --- a/res/cardsfolder/honor_guard.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Honor Guard -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/honor_guard.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/25.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/23.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/107.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/20.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/21.jpg -End diff --git a/res/cardsfolder/honor_of_the_pure.txt b/res/cardsfolder/honor_of_the_pure.txt deleted file mode 100644 index 4daae20344f..00000000000 --- a/res/cardsfolder/honor_of_the_pure.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honor of the Pure -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White+YouCtrl:1/1:No Condition:White creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/honor_of_the_pure.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/17.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/honor_worn_shaku.txt b/res/cardsfolder/honor_worn_shaku.txt deleted file mode 100644 index 493c02505a2..00000000000 --- a/res/cardsfolder/honor_worn_shaku.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Honor-Worn Shaku -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Untap | Cost$ tapXType<1/Permanent.Legendary> | CostDesc$ Tap an untapped legendary permanent you control: | SpellDescription$ Untap CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/honor_worn_shaku.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hooded_kavu.txt b/res/cardsfolder/hooded_kavu.txt deleted file mode 100644 index 2ddf59a7806..00000000000 --- a/res/cardsfolder/hooded_kavu.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hooded Kavu -ManaCost:2 R -Types:Creature Kavu -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ B | KW$ Fear | SpellDescription$ CARDNAME gains fear until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hooded_kavu.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/147.jpg -End diff --git a/res/cardsfolder/hoodwink.txt b/res/cardsfolder/hoodwink.txt deleted file mode 100644 index fef0196a420..00000000000 --- a/res/cardsfolder/hoodwink.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hoodwink -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Artifact,Enchantment,Land | TgtPrompt$ Select target artifact, enchantment, or land | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target artifact, enchantment, or land to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoodwink.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoof_skulkin.txt b/res/cardsfolder/hoof_skulkin.txt deleted file mode 100644 index 92a3dc82b61..00000000000 --- a/res/cardsfolder/hoof_skulkin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hoof Skulkin -ManaCost:3 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 3 | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target green creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoof_skulkin.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoofprints_of_the_stag.txt b/res/cardsfolder/hoofprints_of_the_stag.txt deleted file mode 100644 index 916e72d30e5..00000000000 --- a/res/cardsfolder/hoofprints_of_the_stag.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hoofprints of the Stag -ManaCost:1 W -Types:Tribal Enchantment Elemental -Text:no text -T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw a card, you may put a hoofprint counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ HOOFPRINT | CounterNum$ 1 -A:AB$ Token | Cost$ 2 W SubCounter<4/HOOFPRINT> | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ White | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | PlayerTurn$ True | SpellDescription$ Put a 4/4 white Elemental creature token with flying onto the battlefield. Activate this ability only during your turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoofprints_of_the_stag.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hope_and_glory.txt b/res/cardsfolder/hope_and_glory.txt deleted file mode 100644 index ccdf4398212..00000000000 --- a/res/cardsfolder/hope_and_glory.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hope and Glory -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Untap | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | SubAbility$ SVar=DBPump1 | SpellDescription$ Untap two target creatures. Each of them gets +1/+1 until end of turn. -SVar:DBPump1:DB$Pump | Defined$ Targeted | NumAtt$ +1 | NumDef$ +1 | SubAbility$ SVar=DBUntap -SVar:DBUntap:DB$Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | SubAbility$ SVar=DBPump2 -SVar:DBPump2:DB$Pump | Defined$ Targeted | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hope_and_glory.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hope_charm.txt b/res/cardsfolder/hope_charm.txt deleted file mode 100644 index 4c8ed11c828..00000000000 --- a/res/cardsfolder/hope_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hope Charm -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | PrecostDesc$ Choose one - | SpellDescription$ Target creature gains first strike until end of turn; -A:SP$ GainLife | Cost$ W | LifeAmount$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ or target player gains 2 life; -A:SP$ Destroy | Cost$ W | ValidTgts$ Aura | TgtPrompt$ Select target Aura | SpellDescription$ or destroy target Aura. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hope_charm.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hopping_automaton.txt b/res/cardsfolder/hopping_automaton.txt deleted file mode 100644 index 31a088d7dbe..00000000000 --- a/res/cardsfolder/hopping_automaton.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hopping Automaton -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | NumDef$ -1 | KW$ Flying | SpellDescription$ CARDNAME gets -1/-1 and gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hopping_automaton.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/297.jpg -End diff --git a/res/cardsfolder/horde_of_notions.txt b/res/cardsfolder/horde_of_notions.txt deleted file mode 100644 index f2e8c37c575..00000000000 --- a/res/cardsfolder/horde_of_notions.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Horde of Notions -ManaCost:W U B R G -Types:Legendary Creature Elemental -Text:no text -PT:5/5 -K:Vigilance -K:Trample -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horde_of_notions.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horizon_canopy.txt b/res/cardsfolder/horizon_canopy.txt deleted file mode 100644 index 26b7114254f..00000000000 --- a/res/cardsfolder/horizon_canopy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Horizon Canopy -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Draw | Cost$ 1 T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_canopy.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horizon_drake.txt b/res/cardsfolder/horizon_drake.txt deleted file mode 100644 index c7af812aad1..00000000000 --- a/res/cardsfolder/horizon_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horizon Drake -ManaCost:1 U U -Types:Creature Drake -Text:no text -PT:3/1 -K:Flying -K:Protection:Land:Protection from lands -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_drake.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horizon_spellbomb.txt b/res/cardsfolder/horizon_spellbomb.txt deleted file mode 100644 index 9295dd9c086..00000000000 --- a/res/cardsfolder/horizon_spellbomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horizon Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ChangeType$ Land.Basic | Origin$ Library | Destination$ Hand | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay G. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ G | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/horizon_spellbomb.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horn_of_deafening.txt b/res/cardsfolder/horn_of_deafening.txt deleted file mode 100644 index 95e3bb89680..00000000000 --- a/res/cardsfolder/horn_of_deafening.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Horn of Deafening -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_deafening.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/224.jpg -End diff --git a/res/cardsfolder/horn_of_greed.txt b/res/cardsfolder/horn_of_greed.txt deleted file mode 100644 index f9027d14fb1..00000000000 --- a/res/cardsfolder/horn_of_greed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horn of Greed -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ LandPlayed | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player plays a land, that player draws a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_greed.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horn_of_ramos.txt b/res/cardsfolder/horn_of_ramos.txt deleted file mode 100644 index 666914c00b9..00000000000 --- a/res/cardsfolder/horn_of_ramos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horn of Ramos -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horn_of_ramos.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horned_cheetah.txt b/res/cardsfolder/horned_cheetah.txt deleted file mode 100644 index 1d9f4d0b71e..00000000000 --- a/res/cardsfolder/horned_cheetah.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Horned Cheetah -ManaCost:2 G W -Types:Creature Cat -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/horned_cheetah.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horned_kavu.txt b/res/cardsfolder/horned_kavu.txt deleted file mode 100644 index 5859a28ac6a..00000000000 --- a/res/cardsfolder/horned_kavu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Horned Kavu -ManaCost:R G -Types:Creature Kavu -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a red or green creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Red+YouCtrl,Creature.Green+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/horned_kavu.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horned_sliver.txt b/res/cardsfolder/horned_sliver.txt deleted file mode 100644 index e72c8e221f4..00000000000 --- a/res/cardsfolder/horned_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horned Sliver -ManaCost:2 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Trample:no Condition:All Sliver creatures have trample. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/horned_sliver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horned_troll.txt b/res/cardsfolder/horned_troll.txt deleted file mode 100644 index fe7194476ca..00000000000 --- a/res/cardsfolder/horned_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horned Troll -ManaCost:2 G -Types:Creature Troll -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/horned_troll.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/257.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horned_turtle.txt b/res/cardsfolder/horned_turtle.txt deleted file mode 100644 index b2893ad47b5..00000000000 --- a/res/cardsfolder/horned_turtle.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Horned Turtle -ManaCost:2 U -Types:Creature Turtle -Text:no text -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83125.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/83.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/67.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/80.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/58.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/81.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/55.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hornet_cannon.txt b/res/cardsfolder/hornet_cannon.txt deleted file mode 100644 index 1bb47473789..00000000000 --- a/res/cardsfolder/hornet_cannon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hornet Cannon -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 3 T | TokenAmount$ 1 | TokenName$ Hornet | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying<>Haste<>HIDDEN At the beginning of the end step, destroy CARDNAME. | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hornet_cannon.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hornet_cobra.txt b/res/cardsfolder/hornet_cobra.txt deleted file mode 100644 index a46ab92991a..00000000000 --- a/res/cardsfolder/hornet_cobra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hornet Cobra -ManaCost:1 G G -Types:Creature Snake -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hornet_cobra.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hornet_harasser.txt b/res/cardsfolder/hornet_harasser.txt deleted file mode 100644 index 70472442afb..00000000000 --- a/res/cardsfolder/hornet_harasser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hornet Harasser -ManaCost:2 B B -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target creature gets -2/-2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hornet_harasser.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hornet_sting.txt b/res/cardsfolder/hornet_sting.txt deleted file mode 100644 index 55c6a6067bc..00000000000 --- a/res/cardsfolder/hornet_sting.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hornet Sting -ManaCost:G -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ G | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Hornet Sting deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hornet_sting.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/181.jpg -End diff --git a/res/cardsfolder/horobi_deaths_wail.txt b/res/cardsfolder/horobi_deaths_wail.txt deleted file mode 100644 index edfb5c7161c..00000000000 --- a/res/cardsfolder/horobi_deaths_wail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Horobi, Death's Wail -ManaCost:2 B B -Types:Legendary Creature Spirit -Text:Whenever a creature becomes the target of a spell or ability, destroy that creature. -PT:4/4 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/horobi_deaths_wail.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horrible_hordes.txt b/res/cardsfolder/horrible_hordes.txt deleted file mode 100644 index 5675487c8f1..00000000000 --- a/res/cardsfolder/horrible_hordes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Horrible Hordes -ManaCost:3 -Types:Artifact Creature Spirit -Text:no text -PT:2/2 -K:Rampage 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/horrible_hordes.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horrifying_revelation.txt b/res/cardsfolder/horrifying_revelation.txt deleted file mode 100644 index 1629e50696b..00000000000 --- a/res/cardsfolder/horrifying_revelation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Horrifying Revelation -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ SVar=DBMill | SpellDescription$ Target player discards a card, then puts the top card of his or her library into his or her graveyard. -SVar:DBMill:DB$Mill | NumCards$ 1 | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/horrifying_revelation.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horror_of_horrors.txt b/res/cardsfolder/horror_of_horrors.txt deleted file mode 100644 index b22187e62a2..00000000000 --- a/res/cardsfolder/horror_of_horrors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horror of Horrors -ManaCost:3 B B -Types:Enchantment -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | Cost$ Sac<1/Swamp> | SpellDescription$ Regenerate target black creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/horror_of_horrors.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/140.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/horseshoe_crab.txt b/res/cardsfolder/horseshoe_crab.txt deleted file mode 100644 index 473d290876f..00000000000 --- a/res/cardsfolder/horseshoe_crab.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Horseshoe Crab -ManaCost:2 U -Types:Creature Crab -Text:no text -PT:1/3 -A:AB$ Untap | Cost$ U | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/horseshoe_crab.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/80.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hostile_realm.txt b/res/cardsfolder/hostile_realm.txt deleted file mode 100644 index 1c484d1e507..00000000000 --- a/res/cardsfolder/hostile_realm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hostile Realm -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=Pump:No Condition:Enchanted land has "T: Target creature can't block this turn." -SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | SpellDescription$ Target creature can't block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hostile_realm.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoverguard_observer.txt b/res/cardsfolder/hoverguard_observer.txt deleted file mode 100644 index dff381b47b5..00000000000 --- a/res/cardsfolder/hoverguard_observer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hoverguard Observer -ManaCost:2 U U -Types:Creature Drone -Text:no text -PT:3/3 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoverguard_observer.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hoverguard_sweepers.txt b/res/cardsfolder/hoverguard_sweepers.txt deleted file mode 100644 index a4e467aec6f..00000000000 --- a/res/cardsfolder/hoverguard_sweepers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hoverguard Sweepers -ManaCost:6 U U -Types:Creature Drone -Text:no text -PT:5/6 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return up to two target creatures to their owners' hands. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoverguard_sweepers.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hovermyr.txt b/res/cardsfolder/hovermyr.txt deleted file mode 100644 index e9ff91c8821..00000000000 --- a/res/cardsfolder/hovermyr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hovermyr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/2 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hovermyr.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howl_from_beyond.txt b/res/cardsfolder/howl_from_beyond.txt deleted file mode 100644 index 1811dba0aef..00000000000 --- a/res/cardsfolder/howl_from_beyond.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Howl from Beyond -ManaCost:X B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/howl_from_beyond.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/20.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/20.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/142.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/30.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/25.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/20.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/138.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/22.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howl_of_the_night_pack.txt b/res/cardsfolder/howl_of_the_night_pack.txt deleted file mode 100644 index 85551dc2889..00000000000 --- a/res/cardsfolder/howl_of_the_night_pack.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Howl of the Night Pack -ManaCost:6 G -Types:Sorcery -Text:Put a 2/2 green Wolf creature token onto the battlefield for each Forest you control. -A:SP$ Token | Cost$ 6 G | TokenAmount$ X | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 -SVar:X:Count$TypeYouCtrl.Forest -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/howl_of_the_night_pack.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/187.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howling_banshee.txt b/res/cardsfolder/howling_banshee.txt deleted file mode 100644 index ed197c86953..00000000000 --- a/res/cardsfolder/howling_banshee.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Howling Banshee -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, each player loses 3 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Each | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/howling_banshee.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/100.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howling_fury.txt b/res/cardsfolder/howling_fury.txt deleted file mode 100644 index 402ff509f4e..00000000000 --- a/res/cardsfolder/howling_fury.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Howling Fury -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | SpellDescription$ Target creature gets +4/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/howling_fury.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/82.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/20.jpg -End diff --git a/res/cardsfolder/howling_gale.txt b/res/cardsfolder/howling_gale.txt deleted file mode 100644 index 6622c6a7f64..00000000000 --- a/res/cardsfolder/howling_gale.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Howling Gale -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 1 G | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying and each player. -A:SP$ DamageAll | Cost$ 1 G | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. | Flashback$ True | CostDesc$ Flashback 1 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/howling_gale.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howling_mine.txt b/res/cardsfolder/howling_mine.txt deleted file mode 100644 index 27173986863..00000000000 --- a/res/cardsfolder/howling_mine.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Howling Mine -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | IsPresent$ Card.Self+untapped | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, if CARDNAME is untapped, that player draws an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredPlayer -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/howling_mine.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/303.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/247.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/249.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/300.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/377.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/343.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/298.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/325.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/212.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/289.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/251.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/howling_wolf.txt b/res/cardsfolder/howling_wolf.txt deleted file mode 100644 index b5938aa09c0..00000000000 --- a/res/cardsfolder/howling_wolf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Howling Wolf -ManaCost:2 G G -Types:Creature Wolf -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for up to three cards named CARDNAME, reveal them, and put them into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedHowling Wolf | ChangeNum$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/howling_wolf.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hua_tuo_honored_physician.txt b/res/cardsfolder/hua_tuo_honored_physician.txt deleted file mode 100644 index 002be60e43a..00000000000 --- a/res/cardsfolder/hua_tuo_honored_physician.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hua Tuo, Honored Physician -ManaCost:1 G G -Types:Legendary Creature Human -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ T | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Put target creature card from your graveyard on top of your library. Activate this ability only during your turn, before attackers are declared. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hua_tuo_honored_physician.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/huang_zhong_shu_general.txt b/res/cardsfolder/huang_zhong_shu_general.txt deleted file mode 100644 index 360cd67fa0f..00000000000 --- a/res/cardsfolder/huang_zhong_shu_general.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Huang Zhong, Shu General -ManaCost:2 W W -Types:Legendary Creature Human Soldier -Text:no text -PT:2/3 -K:CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/huang_zhong_shu_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hulking_cyclops.txt b/res/cardsfolder/hulking_cyclops.txt deleted file mode 100644 index f7b62ef3326..00000000000 --- a/res/cardsfolder/hulking_cyclops.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hulking Cyclops -ManaCost:3 R R -Types:Creature Cyclops -Text:no text -PT:5/5 -K:CARDNAME can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/vi/en-us/card3691.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/195.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/84.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/189.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hulking_goblin.txt b/res/cardsfolder/hulking_goblin.txt deleted file mode 100644 index 0ccd53587cc..00000000000 --- a/res/cardsfolder/hulking_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hulking Goblin -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20212.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/107.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hulking_ogre.txt b/res/cardsfolder/hulking_ogre.txt deleted file mode 100644 index e197fa45e5a..00000000000 --- a/res/cardsfolder/hulking_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hulking Ogre -ManaCost:2 R -Types:Creature Ogre -Text:no text -PT:3/3 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20197.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/87.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hull_breach.txt b/res/cardsfolder/hull_breach.txt deleted file mode 100644 index 11932a1ed9f..00000000000 --- a/res/cardsfolder/hull_breach.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hull Breach -ManaCost:R G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ R G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | PrecostDesc$ Choose one - | SpellDescription$ Destroy target artifact; -A:SP$ Destroy | Cost$ R G | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | PrecostDesc$ or | SpellDescription$ destroy target enchantment; -A:SP$ Destroy | Cost$ R G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | PrecostDesc$ or | SpellDescription$ destroy target artifact and target enchantment. | SubAbility$ SVar=DestroyEnch -SVar:DestroyEnch:DB$ Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hull_breach.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hum_of_the_radix.txt b/res/cardsfolder/hum_of_the_radix.txt deleted file mode 100644 index b4c14b24b9a..00000000000 --- a/res/cardsfolder/hum_of_the_radix.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hum of the Radix -ManaCost:2 G G -Types:Enchantment -Text:Each artifact spell costs 1 more to cast for each artifact its controller controls. -K:CostChange:Player:More:1:Spell:All:Artifact:Affinity/Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hum_of_the_radix.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/humble_budoka.txt b/res/cardsfolder/humble_budoka.txt deleted file mode 100644 index a55b2c01ea5..00000000000 --- a/res/cardsfolder/humble_budoka.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Humble Budoka -ManaCost:1 G -Types:Creature Human Monk -Text:no text -PT:2/2 -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/humble_budoka.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunding_gjornersen.txt b/res/cardsfolder/hunding_gjornersen.txt deleted file mode 100644 index 28789dd9c48..00000000000 --- a/res/cardsfolder/hunding_gjornersen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hunding Gjornersen -ManaCost:3 U U W -Types:Legendary Creature Human Warrior -Text:no text -PT:5/4 -K:Rampage 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunding_gjornersen.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hundroog.txt b/res/cardsfolder/hundroog.txt deleted file mode 100644 index 1e402dccd56..00000000000 --- a/res/cardsfolder/hundroog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hundroog -ManaCost:6 G -Types:Creature Beast -Text:no text -PT:4/7 -K:Cycling:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hundroog.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunger_of_the_nim.txt b/res/cardsfolder/hunger_of_the_nim.txt deleted file mode 100644 index 126860a5920..00000000000 --- a/res/cardsfolder/hunger_of_the_nim.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hunger of the Nim -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SpellDescription$ Target creature gets +1/+0 until end of turn for each artifact you control. -SVar:X:Count$TypeYouCtrl.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunger_of_the_nim.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/46.jpg -End diff --git a/res/cardsfolder/hungry_mist.txt b/res/cardsfolder/hungry_mist.txt deleted file mode 100644 index 2bbac4db8f9..00000000000 --- a/res/cardsfolder/hungry_mist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hungry Mist -ManaCost:2 G G -Types:Creature Elemental -Text:no text -PT:6/2 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hungry_mist.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/60.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hungry_spriggan.txt b/res/cardsfolder/hungry_spriggan.txt deleted file mode 100644 index 2f3f122d4e8..00000000000 --- a/res/cardsfolder/hungry_spriggan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hungry Spriggan -ManaCost:2 G -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +3/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 | NumDef$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hungry_spriggan.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_dragon.txt b/res/cardsfolder/hunted_dragon.txt deleted file mode 100644 index 550f6ca32c0..00000000000 --- a/res/cardsfolder/hunted_dragon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hunted Dragon -ManaCost:3 R R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 2/2 white Knight creature tokens with first strike onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Knight | TokenImage$ W 2 2 Knight First Strike | TokenTypes$ Creature,Knight | TokenOwner$ Opponent | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ First Strike -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_dragon.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_horror.txt b/res/cardsfolder/hunted_horror.txt deleted file mode 100644 index d229f4e8359..00000000000 --- a/res/cardsfolder/hunted_horror.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hunted Horror -ManaCost:B B -Types:Creature Horror -Text:no text -PT:7/7 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 3/3 green Centaur creature tokens with protection from black onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Protection from black -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_horror.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_lammasu.txt b/res/cardsfolder/hunted_lammasu.txt deleted file mode 100644 index ebb4b280a6b..00000000000 --- a/res/cardsfolder/hunted_lammasu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hunted Lammasu -ManaCost:2 W W -Types:Creature Lammasu -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 4/4 black Horror creature token onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Horror | TokenTypes$ Creature,Horror | TokenOwner$ Opponent | TokenColors$ Black | TokenPower$ 4 | TokenToughness$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_lammasu.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_phantasm.txt b/res/cardsfolder/hunted_phantasm.txt deleted file mode 100644 index ae3b38bb646..00000000000 --- a/res/cardsfolder/hunted_phantasm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hunted Phantasm -ManaCost:1 U U -Types:Creature Spirit -Text:no text -PT:4/6 -K:Unblockable -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put five 1/1 red Goblin creature tokens onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 5 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ Opponent | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_phantasm.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_troll.txt b/res/cardsfolder/hunted_troll.txt deleted file mode 100644 index 4ac81aeb2a7..00000000000 --- a/res/cardsfolder/hunted_troll.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hunted Troll -ManaCost:2 G G -Types:Creature Troll Warrior -Text:no text -PT:8/4 -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put four 1/1 blue Faerie creature tokens with flying onto the battlefield under target opponent's control. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 4 | TokenName$ Faerie | TokenTypes$ Creature,Faerie | TokenOwner$ Opponent | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89079.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunted_wumpus.txt b/res/cardsfolder/hunted_wumpus.txt deleted file mode 100644 index 65ec6fa37bb..00000000000 --- a/res/cardsfolder/hunted_wumpus.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hunted Wumpus -ManaCost:3 G -Types:Creature Beast -Text:no text -PT:6/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, each other player may put a creature card from his or her hand onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_wumpus.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/258.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/253.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/248.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_cheetah.txt b/res/cardsfolder/hunting_cheetah.txt deleted file mode 100644 index d3d2174bd03..00000000000 --- a/res/cardsfolder/hunting_cheetah.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hunting Cheetah -ManaCost:2 G -Types:Creature Cat -Text:no text -PT:2/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigSearch | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigSearch:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_cheetah.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_drake.txt b/res/cardsfolder/hunting_drake.txt deleted file mode 100644 index 62dc97cbd94..00000000000 --- a/res/cardsfolder/hunting_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hunting Drake -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target red or green creature on top of its owner's library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ Select target red or green creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_drake.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_grounds.txt b/res/cardsfolder/hunting_grounds.txt deleted file mode 100644 index 5f25317dd2a..00000000000 --- a/res/cardsfolder/hunting_grounds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hunting Grounds -ManaCost:G W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Spell.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | Threshold$ True | TriggerDescription$ Threshold - Whenever an opponent casts a spell, you may put a creature card from your hand onto the battlefield. -SVar:TrigChangeZone:AB$ ChangeZone | Cost$ 0 | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_grounds.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_moa.txt b/res/cardsfolder/hunting_moa.txt deleted file mode 100644 index 313c3af77eb..00000000000 --- a/res/cardsfolder/hunting_moa.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hunting Moa -ManaCost:2 G -Types:Creature Bird Beast -Text:no text -PT:3/2 -K:Echo:2 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a +1/+1 counter on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_moa.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/109.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_pack.txt b/res/cardsfolder/hunting_pack.txt deleted file mode 100644 index 1b54ac1e710..00000000000 --- a/res/cardsfolder/hunting_pack.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hunting Pack -ManaCost:5 G G -Types:Instant -Text:Put a 4/4 green Beast creature token onto the battlefield. -A:SP$ Token | Cost$ 5 G G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_pack.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hunting_triad.txt b/res/cardsfolder/hunting_triad.txt deleted file mode 100644 index 7bcc20ead95..00000000000 --- a/res/cardsfolder/hunting_triad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hunting Triad -ManaCost:3 G -Types:Tribal Sorcery Elf -Text:no text -#This may look funny, but it works correctly AFAICT from my testing. -A:SP$ Token | Cost$ 3 G | TokenAmount$ 3 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put three 1/1 green Elf Warrior creature tokens onto the battlefield. -A:AB$ PutCounter | Cost$ 3 G Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 3 | ActivatingZone$ Hand | PrecostDesc$ Reinforce 3 - | SpellDescription$ Put three +1/+1 counters on target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_triad.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurkyls_recall.txt b/res/cardsfolder/hurkyls_recall.txt deleted file mode 100644 index a14f710958c..00000000000 --- a/res/cardsfolder/hurkyls_recall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hurkyl's Recall -ManaCost:1 U -Types:Instant -Text:Return all artifacts target player owns to his or her hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hurkyls_recall.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/93.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/60.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/77.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/88.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurloon_minotaur.txt b/res/cardsfolder/hurloon_minotaur.txt deleted file mode 100644 index 36f33580829..00000000000 --- a/res/cardsfolder/hurloon_minotaur.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Hurloon Minotaur -ManaCost:1 R R -Types:Creature Minotaur -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4061.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/159.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/160.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/240.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/220.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/158.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurloon_shaman.txt b/res/cardsfolder/hurloon_shaman.txt deleted file mode 100644 index 1ccf0c5acde..00000000000 --- a/res/cardsfolder/hurloon_shaman.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hurloon Shaman -ManaCost:1 R R -Types:Creature Minotaur Shaman -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player sacrifices a land. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ Each -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hurloon_shaman.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurly_burly.txt b/res/cardsfolder/hurly_burly.txt deleted file mode 100644 index 7fb477af9c9..00000000000 --- a/res/cardsfolder/hurly_burly.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hurly-Burly -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature without flying. | PrecostDesc$ Choose one - | SpellDescription$ CARDNAME deals 1 damage to each creature without flying; -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | SpellDescription$ or CARDNAME deals 1 damage to each creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hurly_burly.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurr_jackal.txt b/res/cardsfolder/hurr_jackal.txt deleted file mode 100644 index ee38d274426..00000000000 --- a/res/cardsfolder/hurr_jackal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hurr Jackal -ManaCost:R -Types:Creature Hound -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hurr_jackal.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/221.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hurricane.txt b/res/cardsfolder/hurricane.txt deleted file mode 100644 index 25961a50aad..00000000000 --- a/res/cardsfolder/hurricane.txt +++ /dev/null @@ -1,22 +0,0 @@ -Name:Hurricane -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X G | ValidCards$ Creature.withFlying | ValidPlayers$ Each | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature with flying and each player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hurricane.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/109.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/109.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/252.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/95.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/135.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/69.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/137.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/270.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/237.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/109.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/165.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hush.txt b/res/cardsfolder/hush.txt deleted file mode 100644 index 7b3cc120f35..00000000000 --- a/res/cardsfolder/hush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hush -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hush.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/266.jpg -End diff --git a/res/cardsfolder/hyalopterous_lemure.txt b/res/cardsfolder/hyalopterous_lemure.txt deleted file mode 100644 index 90fc0552c95..00000000000 --- a/res/cardsfolder/hyalopterous_lemure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Hyalopterous Lemure -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:4/3 -A:AB$Pump | Cost$ 0 | NumAtt$ -1 | KW$ Flying | SpellDescription$ Hyalopterous Lemure gets -1/-0 and gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hyalopterous_lemure.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/21.jpg -End diff --git a/res/cardsfolder/hydromorph_guardian.txt b/res/cardsfolder/hydromorph_guardian.txt deleted file mode 100644 index ba6c6162765..00000000000 --- a/res/cardsfolder/hydromorph_guardian.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hydromorph Guardian -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:2/2 -A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets one or more creatures you control. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hydromorph_guardian.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hydromorph_gull.txt b/res/cardsfolder/hydromorph_gull.txt deleted file mode 100644 index 4aa2541f7c0..00000000000 --- a/res/cardsfolder/hydromorph_gull.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Hydromorph Gull -ManaCost:3 U U -Types:Creature Elemental Bird -Text:no text -PT:3/3 -K:Flying -A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature.YouCtrl | SpellDescription$ Counter target spell that targets one or more creatures you control. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hydromorph_gull.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hyena_umbra.txt b/res/cardsfolder/hyena_umbra.txt deleted file mode 100644 index 4a44ffd71f9..00000000000 --- a/res/cardsfolder/hyena_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hyena Umbra -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+1/+1/First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/hyena_umbra.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hymn_of_rebirth.txt b/res/cardsfolder/hymn_of_rebirth.txt deleted file mode 100644 index 9411cc513d6..00000000000 --- a/res/cardsfolder/hymn_of_rebirth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hymn of Rebirth -ManaCost:3 W G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 W G | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hymn_of_rebirth.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/373.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hymn_to_tourach.txt b/res/cardsfolder/hymn_to_tourach.txt deleted file mode 100644 index 84d4ed92420..00000000000 --- a/res/cardsfolder/hymn_to_tourach.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Hymn to Tourach -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B B | ValidTgts$ Player | NumCards$ 2 | Mode$ Random | SpellDescription$ Target player discards two cards at random. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fe/en-us/card1849.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/12.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/hyperion_blacksmith.txt b/res/cardsfolder/hyperion_blacksmith.txt deleted file mode 100644 index b300b4acdd1..00000000000 --- a/res/cardsfolder/hyperion_blacksmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hyperion Blacksmith -ManaCost:1 R R -Types:Creature Human Artificer -Text:no text -PT:2/2 -A:AB$ TapOrUntap | Cost$ T | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact an opponent controls | SpellDescription$ You may tap or untap target artifact an opponent controls. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hyperion_blacksmith.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/150.jpg -End diff --git a/res/cardsfolder/hypervolt_grasp.txt b/res/cardsfolder/hypervolt_grasp.txt deleted file mode 100644 index 15ccf6477ad..00000000000 --- a/res/cardsfolder/hypervolt_grasp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hypervolt Grasp -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature or player." -A:AB$ ChangeZone | Cost$ 1 U | Defined$ Self | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hypervolt_grasp.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hypnotic_specter.txt b/res/cardsfolder/hypnotic_specter.txt deleted file mode 100644 index 436ea2b8af5..00000000000 --- a/res/cardsfolder/hypnotic_specter.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Hypnotic Specter -ManaCost:1 B B -Types:Creature Specter -Text:no text -PT:2/2 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that player discards a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ Random -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hypnotic_specter.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/21.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/21.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/26.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/141.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/151.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/100.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/23.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hypochondria.txt b/res/cardsfolder/hypochondria.txt deleted file mode 100644 index 8a4b628d1b5..00000000000 --- a/res/cardsfolder/hypochondria.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Hypochondria -ManaCost:1 W -Types:Enchantment -Text:no text -A:AB$ PreventDamage | Cost$ W Discard<1/Card> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. -A:AB$ PreventDamage | Cost$ W Sac<1/CARDNAME> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/hypochondria.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/hystrodon.txt b/res/cardsfolder/hystrodon.txt deleted file mode 100644 index a9dac405be9..00000000000 --- a/res/cardsfolder/hystrodon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Hystrodon -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:3/4 -K:Trample -K:Morph:1 G G -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/hystrodon.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icatian_crier.txt b/res/cardsfolder/icatian_crier.txt deleted file mode 100644 index e29d36953e0..00000000000 --- a/res/cardsfolder/icatian_crier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Icatian Crier -ManaCost:2 W -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Token | Cost$ 1 W T Discard<1/Card> | TokenAmount$ 2 | TokenName$ Citizen | TokenTypes$ Creature,Citizen | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 white Citizen creature tokens onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_crier.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icatian_javelineers.txt b/res/cardsfolder/icatian_javelineers.txt deleted file mode 100644 index e67bd1ae8bc..00000000000 --- a/res/cardsfolder/icatian_javelineers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Icatian Javelineers -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:etbCounter:JAVELIN:1 -A:AB$ DealDamage | Cost$ T SubCounter<1/JAVELIN> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_javelineers.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/148.jpg|3 -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icatian_lieutenant.txt b/res/cardsfolder/icatian_lieutenant.txt deleted file mode 100644 index 728614a4597..00000000000 --- a/res/cardsfolder/icatian_lieutenant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Icatian Lieutenant -ManaCost:W W -Types:Creature Human Soldier -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.Soldier | NumAtt$ +1 | SpellDescription$ Target Soldier creature gets +1/+0 until end of turn. | TgtPrompt$ Select target Soldier creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_lieutenant.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icatian_moneychanger.txt b/res/cardsfolder/icatian_moneychanger.txt deleted file mode 100644 index a4a24f70ccd..00000000000 --- a/res/cardsfolder/icatian_moneychanger.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Icatian Moneychanger -ManaCost:W -Types:Creature Human -Text:no text -PT:0/2 -K:etbCounter:CREDIT:3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a credit counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CREDIT | CounterNum$ 1 | SpellDescription$ Put a credit counter on CARDNAME. -A:AB$ GainLife | Cost$ Sac<1/CARDNAME> | LifeAmount$ X | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ You gain life equal to the number of credit counters on CARDNAME. -SVar:X:Count$CardCounters.CREDIT -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_moneychanger.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/152.jpg|3 -End diff --git a/res/cardsfolder/icatian_priest.txt b/res/cardsfolder/icatian_priest.txt deleted file mode 100644 index 4bd579e762e..00000000000 --- a/res/cardsfolder/icatian_priest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Icatian Priest -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 W W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_priest.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/156.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/24.jpg -End diff --git a/res/cardsfolder/icatian_scout.txt b/res/cardsfolder/icatian_scout.txt deleted file mode 100644 index 817db738125..00000000000 --- a/res/cardsfolder/icatian_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Icatian Scout -ManaCost:W -Types:Creature Human Soldier Scout -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_scout.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/313.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/157.jpg|4 -End diff --git a/res/cardsfolder/icatian_store.txt b/res/cardsfolder/icatian_store.txt deleted file mode 100644 index ac702111819..00000000000 --- a/res/cardsfolder/icatian_store.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Icatian Store -ManaCost:no cost -Types:Land -Text:At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. -K:CARDNAME enters the battlefield tapped. -K:You may choose not to untap CARDNAME during your untap step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_store.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/423.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icatian_town.txt b/res/cardsfolder/icatian_town.txt deleted file mode 100644 index c06dfeff740..00000000000 --- a/res/cardsfolder/icatian_town.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Icatian Town -ManaCost:5 W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 5 W | TokenAmount$ 4 | TokenName$ Citizen | TokenTypes$ Creature,Citizen | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put four 1/1 white Citizen creature tokens onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/icatian_town.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/314.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/25.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ice_cage.txt b/res/cardsfolder/ice_cage.txt deleted file mode 100644 index cb153769d84..00000000000 --- a/res/cardsfolder/ice_cage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ice Cage -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:enPumpCurse:HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated.:Enchanted creature can't attack or block and its activated abilities can't be activated. -K:When enchanted creature becomes the target of a spell or ability, destroy CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ice_cage.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/57.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ice_storm.txt b/res/cardsfolder/ice_storm.txt deleted file mode 100644 index 120c70fe712..00000000000 --- a/res/cardsfolder/ice_storm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ice Storm -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ice_storm.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/110.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/110.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iceberg.txt b/res/cardsfolder/iceberg.txt deleted file mode 100644 index 4b06cbdabae..00000000000 --- a/res/cardsfolder/iceberg.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Iceberg -ManaCost:X U U -Types:Enchantment -Text:no text -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -A:AB$ PutCounter | Cost$ 3 | CounterType$ ICE | CounterNum$ 1 | SpellDescription$ Put an ice counter on CARDNAME. -A:AB$ Mana | Cost$ SubCounter<1/ICE> | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/iceberg.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icefall.txt b/res/cardsfolder/icefall.txt deleted file mode 100644 index 9d0ec049a3b..00000000000 --- a/res/cardsfolder/icefall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Icefall -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land. | SpellDescription$ Destroy target artifact or land. -K:Recover:R R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icefall.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icequake.txt b/res/cardsfolder/icequake.txt deleted file mode 100644 index e349bca4a04..00000000000 --- a/res/cardsfolder/icequake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Icequake -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target land. If that land was a snow land, Icequake deals 1 damage to that land's controller. -SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Land.Snow | ConditionCompare$ EQ1 | ConditionDescription$ If that land was a snow land, -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/icequake.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichneumon_druid.txt b/res/cardsfolder/ichneumon_druid.txt deleted file mode 100644 index cedb2c1f4f5..00000000000 --- a/res/cardsfolder/ichneumon_druid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ichneumon Druid -ManaCost:1 G G -Types:Creature Human Druid -Text:Whenever an opponent casts an instant spell other than the first instant spell that player casts each turn, CARDNAME deals 4 damage to him or her. -PT:1/1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichneumon_druid.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichor_explosion.txt b/res/cardsfolder/ichor_explosion.txt deleted file mode 100644 index 4a8584ef400..00000000000 --- a/res/cardsfolder/ichor_explosion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ichor Explosion -ManaCost:5 B B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 5 B B Sac<1/Creature> | ValidCards$ Creature | IsCurse$ True | NumAtt$ -X | NumDef$ -X | SpellDescription$ All creatures get -X/-X until end of turn, where X is the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_explosion.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichor_rats.txt b/res/cardsfolder/ichor_rats.txt deleted file mode 100644 index 8827fcdca55..00000000000 --- a/res/cardsfolder/ichor_rats.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ichor Rats -ManaCost:1 B B -Types:Creature Rat -Text:no text -PT:2/1 -K:Infect -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPoison | TriggerDescription$ When CARDNAME enters the battlefield, each player gets a poison counter. -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ Each | Num$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_rats.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichor_slick.txt b/res/cardsfolder/ichor_slick.txt deleted file mode 100644 index d15b4211989..00000000000 --- a/res/cardsfolder/ichor_slick.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ichor Slick -ManaCost:2 B -Types:Sorcery -Text:no text -K:Cycling:2 -K:Madness:3 B -A:SP$ Pump | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_slick.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichor_wellspring.txt b/res/cardsfolder/ichor_wellspring.txt deleted file mode 100644 index ebb2b88a432..00000000000 --- a/res/cardsfolder/ichor_wellspring.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ichor Wellspring -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredCardController -SVar:RemRandomDeck:True -SVar:SacMe:5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichor_wellspring.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichorclaw_myr.txt b/res/cardsfolder/ichorclaw_myr.txt deleted file mode 100644 index ac72de14588..00000000000 --- a/res/cardsfolder/ichorclaw_myr.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ichorclaw Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -K:Infect -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichorclaw_myr.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ichorid.txt b/res/cardsfolder/ichorid.txt deleted file mode 100644 index aaa4a2f21c4..00000000000 --- a/res/cardsfolder/ichorid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ichorid -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:3/1 -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may exile a black creature card other than CARDNAME from your graveyard. If you do, return CARDNAME to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ ExileFromGrave<1/Creature.Black+Other> | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ichorid.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/icy_manipulator.txt b/res/cardsfolder/icy_manipulator.txt deleted file mode 100644 index 1c6b6740803..00000000000 --- a/res/cardsfolder/icy_manipulator.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Icy Manipulator -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ 1 T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land. | SpellDescription$ Tap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/icy_manipulator.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/248.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/250.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/299.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/297.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/326.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/186.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/identity_crisis.txt b/res/cardsfolder/identity_crisis.txt deleted file mode 100644 index 60085af45c5..00000000000 --- a/res/cardsfolder/identity_crisis.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Identity Crisis -ManaCost:2 W W B B -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 W W B B | Origin$ Hand | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | SubAbility$ SVar=DBChangeZoneAll | SpellDescription$ Exile all cards from target player's hand and graveyard. -SVar:DBChangeZoneAll:DB$ChangeZoneAll | Defined$ Targeted | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/identity_crisis.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/idle_thoughts.txt b/res/cardsfolder/idle_thoughts.txt deleted file mode 100644 index 16fe0402fc7..00000000000 --- a/res/cardsfolder/idle_thoughts.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Idle Thoughts -ManaCost:3 U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 2 | NumCards$ 1 | ActivatingCardsInHand$ 0 | SpellDescription$ Draw a card if you have no cards in hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/idle_thoughts.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/idyllic_tutor.txt b/res/cardsfolder/idyllic_tutor.txt deleted file mode 100644 index 797008c7e6c..00000000000 --- a/res/cardsfolder/idyllic_tutor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Idyllic Tutor -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/idyllic_tutor.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ifh_biff_efreet.txt b/res/cardsfolder/ifh_biff_efreet.txt deleted file mode 100644 index 5e03b04a96a..00000000000 --- a/res/cardsfolder/ifh_biff_efreet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ifh-Biff Efreet -ManaCost:2 G G -Types:Creature Efreet -Text:no text -PT:3/3 -K:Flying -A:AB$ DamageAll | Cost$ G | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. | AnyPlayer$ True | SpellDescription$ CARDNAME deals 1 damage to each creature with flying and each player. Any player may activate this ability. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/an/en-us/card947.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/igneous_golem.txt b/res/cardsfolder/igneous_golem.txt deleted file mode 100644 index 15239fbeb9a..00000000000 --- a/res/cardsfolder/igneous_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Igneous Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ 2 | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/igneous_golem.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/270.jpg -End diff --git a/res/cardsfolder/igneous_pouncer.txt b/res/cardsfolder/igneous_pouncer.txt deleted file mode 100644 index bc9cfc801d3..00000000000 --- a/res/cardsfolder/igneous_pouncer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Igneous Pouncer -ManaCost:4 B R -Types:Creature Elemental -Text:no text -PT:5/1 -K:Haste -K:TypeCycling:Swamp:2 -K:TypeCycling:Mountain:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/igneous_pouncer.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ignite_disorder.txt b/res/cardsfolder/ignite_disorder.txt deleted file mode 100644 index 73e2b319673..00000000000 --- a/res/cardsfolder/ignite_disorder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ignite Disorder -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.Blue,Creature.White | TgtPrompt$ Select target white and/or blue creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 3 damage divided as you choose among one, two, or three target white and/or blue creatures. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature.Blue,Creature.White | TgtPrompt$ Select target white and/or blue creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature.Blue,Creature.White | TgtPrompt$ Select target white and/or blue creature (3) | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/ignite_disorder.jpg -SVar:Rarity:Uncommon -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ignite_memories.txt b/res/cardsfolder/ignite_memories.txt deleted file mode 100644 index fbfeec49257..00000000000 --- a/res/cardsfolder/ignite_memories.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ignite Memories -ManaCost:4 R -Types:Sorcery -Text: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. -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ignite_memories.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ihsans_shade.txt b/res/cardsfolder/ihsans_shade.txt deleted file mode 100644 index bf0ab20cbb6..00000000000 --- a/res/cardsfolder/ihsans_shade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ihsan's Shade -ManaCost:3 B B B -Types:Legendary Creature Shade Knight -Text:no text -PT:5/5 -K:Protection from white -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ihsans_shade.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iizuka_the_ruthless.txt b/res/cardsfolder/iizuka_the_ruthless.txt deleted file mode 100644 index e324a2d4d06..00000000000 --- a/res/cardsfolder/iizuka_the_ruthless.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Iizuka the Ruthless -ManaCost:3 R R -Types:Legendary Creature Human Samurai -Text:no text -PT:3/3 -K:Bushido 2 -A:AB$ PumpAll | Cost$ 2 R Sac<1/Samurai> | ValidCards$ Creature.Samurai+YouCtrl | KW$ Double Strike | SpellDescription$ Samurai creatures you control gain double strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/iizuka_the_ruthless.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ikiral_outrider.txt b/res/cardsfolder/ikiral_outrider.txt deleted file mode 100644 index 5dc8ef34322..00000000000 --- a/res/cardsfolder/ikiral_outrider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ikiral Outrider -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:stSetPT:1:2:LevelGE1:2:6:LevelGE4:3:10:LEVEL 1-3 2/6 Vigilance LEVEL 4+ 3/10 Vigilance -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/Vigilance:No Condition:no text -K:Level up:4 -K:maxLevel:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ikiral_outrider.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ill_gotten_gains.txt b/res/cardsfolder/ill_gotten_gains.txt deleted file mode 100644 index 78c59fa12d6..00000000000 --- a/res/cardsfolder/ill_gotten_gains.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ill-Gotten Gains -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B B | Mode$ Hand | Defined$ Each | SubAbility$ SVar=DBExile | SpellDescription$ Exile CARDNAME. Each player discards his or her hand, then returns up to three cards from his or her graveyard to his or her hand. -SVar:DBExile:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBChangeZoneChoose -SVar:DBChangeZoneChoose:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 3 | ChangeType$ Card | SubAbility$ SVar=DBChangeZonePC | Hidden$ True -SVar:DBChangeZonePC:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeNum$ 3 | ChangeType$ Card | Defined$ Opponent | Hidden$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ill_gotten_gains.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illuminated_wings.txt b/res/cardsfolder/illuminated_wings.txt deleted file mode 100644 index 91b0513aa66..00000000000 --- a/res/cardsfolder/illuminated_wings.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Illuminated Wings -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/illuminated_wings.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illumination.txt b/res/cardsfolder/illumination.txt deleted file mode 100644 index acf0c136415..00000000000 --- a/res/cardsfolder/illumination.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Illumination -ManaCost:W W -Types:Instant -Text:(NOTE: This spell is rather buggy and should not be used at this time. When cast, it would cause a NPE. As a temporary fix, this card no longer has a drawback.) -# -# When Targeted can handle SpellAbilities along with Cards, this can be converted to the New SubAbilities -# May also need a check in TgtCardManaCost to convert from SA to Card -# -A:SP$ Counter | Cost$ W W | TargetType$ Spell | TgtPrompt$ Select target Artifact or Enchantment spell | ValidTgts$ Artifact,Enchantment | SpellDescription$ Counter target artifact or enchantment spell. Its controller gains life equal to its converted mana cost. -# | SubAbility$ SVar=DBGainLife -# SVar:DBGainLife:DB$ GainLife | Defined$ TargetedController | LifeAmount$ X -# SVar:X:Count$TgtCardManaCost -SVar:Rarity:None -SVar:Picture:http://www.wizards.com/global/images/magic/general/illumination.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illusionary_forces.txt b/res/cardsfolder/illusionary_forces.txt deleted file mode 100644 index cd9db8bf69a..00000000000 --- a/res/cardsfolder/illusionary_forces.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Illusionary Forces -ManaCost:3 U -Types:Creature Illusion -Text:no text -PT:4/4 -K:Flying -K:Cumulative upkeep:U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionary_forces.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illusionary_servant.txt b/res/cardsfolder/illusionary_servant.txt deleted file mode 100644 index 861048ffa9b..00000000000 --- a/res/cardsfolder/illusionary_servant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Illusionary Servant -ManaCost:1 U U -Types:Creature Illusion -Text:no text -PT:3/4 -K:Flying -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionary_servant.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illusionary_wall.txt b/res/cardsfolder/illusionary_wall.txt deleted file mode 100644 index 284eed81e8c..00000000000 --- a/res/cardsfolder/illusionary_wall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Illusionary Wall -ManaCost:4 U -Types:Creature Illusion Wall -Text:no text -PT:7/4 -K:Defender -K:Flying -K:First Strike -K:Cumulative upkeep:U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/illusionary_wall.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illusions_of_grandeur.txt b/res/cardsfolder/illusions_of_grandeur.txt deleted file mode 100644 index 164173d169d..00000000000 --- a/res/cardsfolder/illusions_of_grandeur.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Illusions of Grandeur -ManaCost:3 U -Types:Enchantment -Text:no text -K:Cumulative upkeep:2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 20 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME leaves the battlefield, you lose 20 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 20 -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 20 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/illusions_of_grandeur.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/illusory_demon.txt b/res/cardsfolder/illusory_demon.txt deleted file mode 100644 index d968a560159..00000000000 --- a/res/cardsfolder/illusory_demon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Illusory Demon -ManaCost:1 U B -Types:Creature Demon Illusion -Text:no text -PT:4/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ When you cast a spell, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/illusory_demon.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imaginary_pet.txt b/res/cardsfolder/imaginary_pet.txt deleted file mode 100644 index f8286246c03..00000000000 --- a/res/cardsfolder/imaginary_pet.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Imaginary Pet -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you have a card in hand, return CARDNAME to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/imaginary_pet.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/81.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imi_statue.txt b/res/cardsfolder/imi_statue.txt deleted file mode 100644 index ab26beaba47..00000000000 --- a/res/cardsfolder/imi_statue.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Imi Statue -ManaCost:3 -Types:Artifact -Text:Players can't untap more than one artifact during their untap steps. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/imi_statue.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/immaculate_magistrate.txt b/res/cardsfolder/immaculate_magistrate.txt deleted file mode 100644 index 56c8a50ecb7..00000000000 --- a/res/cardsfolder/immaculate_magistrate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Immaculate Magistrate -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ X | SpellDescription$ Put a +1/+1 counter on target creature for each Elf you control. -SVar:X:Count$Valid Elf.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/immaculate_magistrate.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/immobilizing_ink.txt b/res/cardsfolder/immobilizing_ink.txt deleted file mode 100644 index c9dfa55d467..00000000000 --- a/res/cardsfolder/immobilizing_ink.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Immobilizing Ink -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -K:stPumpEnchanted:Creature:0/0/SVar=Untap:No Condition:Enchanted creature has "1, Discard a card: Untap this creature." -SVar:Untap:AB$Untap | Cost$ 1 Discard<1/Card> | Defined$ Self | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/immobilizing_ink.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/immolating_souleater.txt b/res/cardsfolder/immolating_souleater.txt deleted file mode 100644 index 736d1641197..00000000000 --- a/res/cardsfolder/immolating_souleater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Immolating Souleater -ManaCost:2 -Types:Artifact Creature Hound -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ PR | Defined$ Self | NumAtt$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/immolating_souleater.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/immolation.txt b/res/cardsfolder/immolation.txt deleted file mode 100644 index 525b0b187f7..00000000000 --- a/res/cardsfolder/immolation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Immolation -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/-2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/immolation.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/222.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/impaler_shrike.txt b/res/cardsfolder/impaler_shrike.txt deleted file mode 100644 index 10fb6273fed..00000000000 --- a/res/cardsfolder/impaler_shrike.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Impaler Shrike -ManaCost:2 U U -Types:Creature Bird -Text:no text -PT:3/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice it. If you do, draw three cards. -SVar:TrigDraw:AB$Draw | Cost$ Sac<1/CARDNAME> | Defined$ You | NumCards$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/impaler_shrike.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/impending_disaster.txt b/res/cardsfolder/impending_disaster.txt deleted file mode 100644 index 88411092e14..00000000000 --- a/res/cardsfolder/impending_disaster.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Impending Disaster -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | IsPresent$ Land | PresentCompare$ GE7 | TriggerDescription$ At the beginning of your upkeep, if there are seven or more lands on the battlefield, sacrifice CARDNAME and destroy all lands. -SVar:TrigSac:AB$Sacrifice | Defined$ Self | Cost$ 0 | SubAbility$ SVar=DBDestroyAll -SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/impending_disaster.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperial_edict.txt b/res/cardsfolder/imperial_edict.txt deleted file mode 100644 index e817efc15a8..00000000000 --- a/res/cardsfolder/imperial_edict.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Imperial Edict -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Opponent | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target opponent sacrifices a creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/imperial_edict.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperial_hellkite.txt b/res/cardsfolder/imperial_hellkite.txt deleted file mode 100644 index ff624f73713..00000000000 --- a/res/cardsfolder/imperial_hellkite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Imperial Hellkite -ManaCost:5 R R -Types:Creature Dragon -Text:no text -PT:6/6 -K:Flying -K:Morph:6 R R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Dragon | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/imperial_hellkite.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperial_recruiter.txt b/res/cardsfolder/imperial_recruiter.txt deleted file mode 100644 index 0a3cb9f0777..00000000000 --- a/res/cardsfolder/imperial_recruiter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Imperial Recruiter -ManaCost:2 R -Types:Creature Human Advisor -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Creature.powerLE2 | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/imperial_recruiter.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperial_seal.txt b/res/cardsfolder/imperial_seal.txt deleted file mode 100644 index f9e276200d0..00000000000 --- a/res/cardsfolder/imperial_seal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Imperial Seal -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SubAbility$ SVar=DBLoseLife | SpellDescription$ Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/imperial_seal.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperiosaur.txt b/res/cardsfolder/imperiosaur.txt deleted file mode 100644 index f7b75fcc893..00000000000 --- a/res/cardsfolder/imperiosaur.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Imperiosaur -ManaCost:2 G G -Types:Creature Lizard -Text:(NOTE: "Spend only mana produced by basic lands to cast Imperiosaur." is not implemented.) -PT:5/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130634.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/imperious_perfect.txt b/res/cardsfolder/imperious_perfect.txt deleted file mode 100644 index 0de65980739..00000000000 --- a/res/cardsfolder/imperious_perfect.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Imperious Perfect -ManaCost:2 G -Types:Creature Elf Warrior -Text:no text -PT:2/2 -K:stPumpAll:Creature.Elf+Other+YouCtrl:1/1:No Condition:Other Elf creatures you control get +1/+1. -A:AB$ Token | Cost$ G T | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/imperious_perfect.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/implements_of_sacrifice.txt b/res/cardsfolder/implements_of_sacrifice.txt deleted file mode 100644 index 0245124f6a6..00000000000 --- a/res/cardsfolder/implements_of_sacrifice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Implements of Sacrifice -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -A:AB$ Mana | Cost$ 1 T Sac<1/CARDNAME> | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/implements_of_sacrifice.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/implode.txt b/res/cardsfolder/implode.txt deleted file mode 100644 index c80263fad28..00000000000 --- a/res/cardsfolder/implode.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Implode -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/implode.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/62.jpg -End diff --git a/res/cardsfolder/improvised_armor.txt b/res/cardsfolder/improvised_armor.txt deleted file mode 100644 index 33a2234461d..00000000000 --- a/res/cardsfolder/improvised_armor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Improvised Armor -ManaCost:3 W -Types:Enchantment Aura -Text:no text -K:Cycling:3 -K:Enchant creature -K:enPump:+2/+5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/improvised_armor.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/impulse.txt b/res/cardsfolder/impulse.txt deleted file mode 100644 index 2fba7483983..00000000000 --- a/res/cardsfolder/impulse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Impulse -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Dig | Cost$ 1 U | DigNum$ 4 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/vi/en-us/card3641.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/in_the_web_of_war.txt b/res/cardsfolder/in_the_web_of_war.txt deleted file mode 100644 index ba05157421b..00000000000 --- a/res/cardsfolder/in_the_web_of_war.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:In the Web of War -ManaCost:3 R R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature enters the battlefield under your control, it gets +2/+0 and gains haste until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredCard | NumAtt$ +2 | KW$ Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/in_the_web_of_war.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/incendiary.txt b/res/cardsfolder/incendiary.txt deleted file mode 100644 index 33bf407f886..00000000000 --- a/res/cardsfolder/incendiary.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Incendiary -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant Creature -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a fuse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ FUSE | CounterNum$ 1 -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Any | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ When enchanted creature is put into a graveyard, CARDNAME deals X damage to target creature or player, where X is the number of fuse counters on CARDNAME. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$TgtCP | NumDmg$ X -SVar:X:Count$CardCounters.FUSE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/incendiary.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/incendiary_command.txt b/res/cardsfolder/incendiary_command.txt deleted file mode 100644 index dba284191eb..00000000000 --- a/res/cardsfolder/incendiary_command.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Incendiary Command -ManaCost:3 R R -Types:Sorcery -Text: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 cards in his or her hand, then draws that many cards. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card141830.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/incinerate.txt b/res/cardsfolder/incinerate.txt deleted file mode 100644 index 0c7c11264ee..00000000000 --- a/res/cardsfolder/incinerate.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Incinerate -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 3 damage to target creature or player. A creature dealt damage this way can't be regenerated this turn. -SVar:DB:DB$Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/incinerate.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/242.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/184.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/194.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/incurable_ogre.txt b/res/cardsfolder/incurable_ogre.txt deleted file mode 100644 index 9c08f1d473b..00000000000 --- a/res/cardsfolder/incurable_ogre.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Incurable Ogre -ManaCost:3 R -Types:Creature Ogre Mutant -Text:no text -PT:5/1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/incurable_ogre.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indebted_samurai.txt b/res/cardsfolder/indebted_samurai.txt deleted file mode 100644 index d68986a4938..00000000000 --- a/res/cardsfolder/indebted_samurai.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Indebted Samurai -ManaCost:3 W -Types:Creature Human Samurai -Text:no text -PT:2/3 -K:Bushido 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Samurai.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a Samurai you control is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/indebted_samurai.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/independent_troops.txt b/res/cardsfolder/independent_troops.txt deleted file mode 100644 index 5dc3c849619..00000000000 --- a/res/cardsfolder/independent_troops.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Independent Troops -ManaCost:1 R -Types:Creature Human Soldier -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10541.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indestructible_aura.txt b/res/cardsfolder/indestructible_aura.txt deleted file mode 100644 index a9e014e56e7..00000000000 --- a/res/cardsfolder/indestructible_aura.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Indestructible Aura -ManaCost:W -Types:Instant -Text:no text -A:AB$ Pump | Cost$ W | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/indestructible_aura.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/index.txt b/res/cardsfolder/index.txt deleted file mode 100644 index 8eb29922365..00000000000 --- a/res/cardsfolder/index.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Index -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 5 | SpellDescription$ Look at the top five cards of your library, then put them back in any order. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/index.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/84.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/25.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9eb/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indigo_faerie.txt b/res/cardsfolder/indigo_faerie.txt deleted file mode 100644 index b92313da0b4..00000000000 --- a/res/cardsfolder/indigo_faerie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Indigo Faerie -ManaCost:1 U -Types:Creature Faerie Wizard -Text:no text -PT:1/1 -K:Flying -A:AB$ Animate | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ Blue | SpellDescription$ Target permanent becomes blue in addition to its other colors until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/indigo_faerie.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indomitable_ancients.txt b/res/cardsfolder/indomitable_ancients.txt deleted file mode 100644 index a78feda82e1..00000000000 --- a/res/cardsfolder/indomitable_ancients.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Indomitable Ancients -ManaCost:2 W W -Types:Creature Treefolk Warrior -Text:no text -PT:2/10 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/indomitable_ancients.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indomitable_archangel.txt b/res/cardsfolder/indomitable_archangel.txt deleted file mode 100644 index 462b1d80c00..00000000000 --- a/res/cardsfolder/indomitable_archangel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Indomitable Archangel -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -K:stPumpAll:Artifact.YouCtrl:0/0/Shroud:Metalcraft:Metalcraft - Artifacts you control have shroud as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/indomitable_archangel.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indomitable_will.txt b/res/cardsfolder/indomitable_will.txt deleted file mode 100644 index 540cf2923f8..00000000000 --- a/res/cardsfolder/indomitable_will.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Indomitable Will -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/indomitable_will.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/indrik_stomphowler.txt b/res/cardsfolder/indrik_stomphowler.txt deleted file mode 100644 index dc6a266540c..00000000000 --- a/res/cardsfolder/indrik_stomphowler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Indrik Stomphowler -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact or enchantment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/indrik_stomphowler.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inexorable_tide.txt b/res/cardsfolder/inexorable_tide.txt deleted file mode 100644 index bd7443f9909..00000000000 --- a/res/cardsfolder/inexorable_tide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inexorable Tide -ManaCost:3 U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | Execute$ TrigProliferate | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell, proliferate. -SVar:TrigProliferate:AB$Proliferate | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/inexorable_tide.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infantry_veteran.txt b/res/cardsfolder/infantry_veteran.txt deleted file mode 100644 index b5afeb2dd86..00000000000 --- a/res/cardsfolder/infantry_veteran.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Infantry Veteran -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature. | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target attacking creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infantry_veteran.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/18.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/109.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/26.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infected_vermin.txt b/res/cardsfolder/infected_vermin.txt deleted file mode 100644 index 505371e405c..00000000000 --- a/res/cardsfolder/infected_vermin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infected Vermin -ManaCost:2 B -Types:Creature Rat -Text:no text -PT:1/1 -A:AB$ DamageAll | Cost$ 2 B | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -A:AB$ DamageAll | Cost$ 3 B | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 3 | ValidDescription$ each creature and each player. | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ CARDNAME deals 3 damage to each creature and each player. Activate this ability only if seven or more cards are in your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/infected_vermin.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infectious_horror.txt b/res/cardsfolder/infectious_horror.txt deleted file mode 100644 index ac1fa0de6e5..00000000000 --- a/res/cardsfolder/infectious_horror.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infectious Horror -ManaCost:3 B -Types:Creature Zombie Horror -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks, each opponent loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infectious_horror.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infectious_host.txt b/res/cardsfolder/infectious_host.txt deleted file mode 100644 index cee515906b1..00000000000 --- a/res/cardsfolder/infectious_host.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infectious Host -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target player loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infectious_host.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infernal_caretaker.txt b/res/cardsfolder/infernal_caretaker.txt deleted file mode 100644 index 6871377d05b..00000000000 --- a/res/cardsfolder/infernal_caretaker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Infernal Caretaker -ManaCost:3 B -Types:Creature Human Cleric -Text:no text -PT:2/2 -K:Morph:3 B -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is turned face up, return all Zombie cards from all graveyards to their owners' hands. -SVar:TrigChange:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Zombie | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_caretaker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infernal_contract.txt b/res/cardsfolder/infernal_contract.txt deleted file mode 100644 index 13ff40b103e..00000000000 --- a/res/cardsfolder/infernal_contract.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Infernal Contract -ManaCost:B B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ B B B | NumCards$ 4 | SubAbility$ SVar=DBLoseLife | SpellDescription$ Draw four cards. You lose half your life, rounded up. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ X -SVar:X:Count$YourLifeTotal/HalfUp -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_contract.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/139.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infernal_kirin.txt b/res/cardsfolder/infernal_kirin.txt deleted file mode 100644 index a9b6ac7c8c1..00000000000 --- a/res/cardsfolder/infernal_kirin.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Infernal Kirin -ManaCost:2 B B -Types:Legendary Creature Kirin Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidControllingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ 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. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | Mode$ RevealDiscardAll | DiscardValid$ Card.cmcEQX -SVar:X:TriggeredCard$CardManaCost -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_kirin.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infernal_medusa.txt b/res/cardsfolder/infernal_medusa.txt deleted file mode 100644 index 8eadaf181a0..00000000000 --- a/res/cardsfolder/infernal_medusa.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Infernal Medusa -ManaCost:3 B B -Types:Creature Gorgon -Text:no text -PT:2/4 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks a creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonWall | DelayedTrigger$ DelTrigBlocker | TriggerDescription$ Whenever CARDNAME becomes blocked by a non-Wall creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_medusa.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infernal_tribute.txt b/res/cardsfolder/infernal_tribute.txt deleted file mode 100644 index 08c3a112432..00000000000 --- a/res/cardsfolder/infernal_tribute.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Infernal Tribute -ManaCost:B B B -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 2 Sac<1/Permanent.nonToken> | NumCards$ 1 | CostDesc$ 2, Sacrifice a nontoken permanent: | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/infernal_tribute.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inferno.txt b/res/cardsfolder/inferno.txt deleted file mode 100644 index f54aad09247..00000000000 --- a/res/cardsfolder/inferno.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Inferno -ManaCost:5 R R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 5 R R | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 6 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 6 damage to each creature and each player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/inferno.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/196.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/198.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/243.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/223.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/70.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inferno_titan.txt b/res/cardsfolder/inferno_titan.txt deleted file mode 100644 index a77902181c2..00000000000 --- a/res/cardsfolder/inferno_titan.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Inferno Titan -ManaCost:4 R R -Types:Creature Giant -Text:no text -PT:6/6 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Dmg1 | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, it deals 3 damage divided as you choose among one, two, or three target creatures and/or players. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ Dmg1 | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, it deals 3 damage divided as you choose among one, two, or three target creatures and/or players. -SVar:Dmg1:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=Dmg2 -SVar:Dmg2:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=Dmg3 -SVar:Dmg3:DB$DealDamage | Tgt$ TgtCP | TgtPrompt$ Select target creature or player (3) | NumDmg$ 1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/inferno_titan.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/146.jpg -End diff --git a/res/cardsfolder/infest.txt b/res/cardsfolder/infest.txt deleted file mode 100644 index 8584eff74e1..00000000000 --- a/res/cardsfolder/infest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Infest -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 B B | ValidCards$ Creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ All creatures get -2/-2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/infest.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/157.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infested_roothold.txt b/res/cardsfolder/infested_roothold.txt deleted file mode 100644 index fecb5b4ac0c..00000000000 --- a/res/cardsfolder/infested_roothold.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Infested Roothold -ManaCost:4 G -Types:Creature Wall -Text:no text -PT:0/3 -K:Defender -K:Protection from artifacts -T:Mode$ SpellCast | ValidCard$ Artifact.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever an opponent casts an artifact spell, you may put a 1/1 green Insect creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/infested_roothold.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infiltrate.txt b/res/cardsfolder/infiltrate.txt deleted file mode 100644 index 679e6ea5910..00000000000 --- a/res/cardsfolder/infiltrate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Infiltrate -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Target creature is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infiltrate.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/33.jpg -End diff --git a/res/cardsfolder/infiltration_lens.txt b/res/cardsfolder/infiltration_lens.txt deleted file mode 100644 index f574bdb22f1..00000000000 --- a/res/cardsfolder/infiltration_lens.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infiltration Lens -ManaCost:1 -Types:Artifact Equipment -Text:no text -K:eqPump 1:0/0 -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.AttachedBy | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever equipped creature becomes blocked by a creature, you may draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/infiltration_lens.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infiltrator_il_kor.txt b/res/cardsfolder/infiltrator_il_kor.txt deleted file mode 100644 index e947a7af7e9..00000000000 --- a/res/cardsfolder/infiltrator_il_kor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infiltrator il-Kor -ManaCost:4 U -Types:Creature Kor Rogue -Text:no text -PT:3/1 -K:Shadow -K:Suspend:2:1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infiltrator_il_kor.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inflame.txt b/res/cardsfolder/inflame.txt deleted file mode 100644 index 1a85bfef29e..00000000000 --- a/res/cardsfolder/inflame.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inflame -ManaCost:R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ R | NumDmg$ 2 | ValidCards$ Creature.wasDealtDamageThisTurn | ValidDescription$ each creature dealt damage this turn. | SpellDescription$ CARDNAME deals 2 damage to each creature dealt damage this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inflame.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/64.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/information_dealer.txt b/res/cardsfolder/information_dealer.txt deleted file mode 100644 index af67bd5bf25..00000000000 --- a/res/cardsfolder/information_dealer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Information Dealer -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ RearrangeTopOfLibrary | Cost$ T | Defined$ You | NumCards$ X | SpellDescription$ 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. -SVar:X:Count$TypeYouCtrl.Wizard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/information_dealer.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/infuse.txt b/res/cardsfolder/infuse.txt deleted file mode 100644 index b1064ddb097..00000000000 --- a/res/cardsfolder/infuse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Infuse -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Untap | Cost$ 2 U | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Untap target artifact, creature or land. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/infuse.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ingenious_thief.txt b/res/cardsfolder/ingenious_thief.txt deleted file mode 100644 index 5e764c5e307..00000000000 --- a/res/cardsfolder/ingenious_thief.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ingenious Thief -ManaCost:1 U -Types:Creature Human Rogue -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target player's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ingenious_thief.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/40.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ingot_chewer.txt b/res/cardsfolder/ingot_chewer.txt deleted file mode 100644 index 7c199169bae..00000000000 --- a/res/cardsfolder/ingot_chewer.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ingot Chewer -ManaCost:4 R -Types:Creature Elemental -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -K:Evoke:R -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ingot_chewer.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inheritance.txt b/res/cardsfolder/inheritance.txt deleted file mode 100644 index 989c8eb7c96..00000000000 --- a/res/cardsfolder/inheritance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inheritance -ManaCost:W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, you may pay 3. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 3 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/inheritance.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/initiates_of_the_ebon_hand.txt b/res/cardsfolder/initiates_of_the_ebon_hand.txt deleted file mode 100644 index 6211873a548..00000000000 --- a/res/cardsfolder/initiates_of_the_ebon_hand.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Initiates of the Ebon Hand -ManaCost:B -Types:Creature Cleric -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ 1 | Produced$ B | ActivationNumberSacrifice$ 4 | SpellDescription$ Add B to your mana pool. If this ability has been activated four or more times this turn, sacrifice CARDNAME at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/initiates_of_the_ebon_hand.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/31.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/16.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/ink_dissolver.txt b/res/cardsfolder/ink_dissolver.txt deleted file mode 100644 index 9bf0ebce648..00000000000 --- a/res/cardsfolder/ink_dissolver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ink Dissolver -ManaCost:1 U -Types:Creature Merfolk Wizard -Text: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. -PT:2/1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ink_dissolver.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ink_eyes_servant_of_oni.txt b/res/cardsfolder/ink_eyes_servant_of_oni.txt deleted file mode 100644 index d95af96b5b4..00000000000 --- a/res/cardsfolder/ink_eyes_servant_of_oni.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ink-Eyes, Servant of Oni -ManaCost:4 B B -Types:Legendary Creature Rat Ninja -Text:no text -PT:5/4 -A:AB$ ChangeZone | Cost$ 3 B B Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 3 B B | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (3 B B, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigAnimate | OptionalDecider$ You | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -SVar:TrigAnimate:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in an opponent's graveyard | ValidTgts$ Creature.YouDontCtrl | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ink_eyes_servant_of_oni.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inkfathom_divers.txt b/res/cardsfolder/inkfathom_divers.txt deleted file mode 100644 index 91a74b609d4..00000000000 --- a/res/cardsfolder/inkfathom_divers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Inkfathom Divers -ManaCost:3 U U -Types:Creature Merfolk Soldier -Text:no text -PT:3/3 -K:Islandwalk -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inkfathom_divers.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inkfathom_infiltrator.txt b/res/cardsfolder/inkfathom_infiltrator.txt deleted file mode 100644 index 1fea55667d7..00000000000 --- a/res/cardsfolder/inkfathom_infiltrator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Inkfathom Infiltrator -ManaCost:UB UB -Types:Creature Merfolk Rogue -Text:no text -PT:2/1 -K:CARDNAME can't block. -K:Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/inkfathom_infiltrator.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inkmoth_nexus.txt b/res/cardsfolder/inkmoth_nexus.txt deleted file mode 100644 index 4d66510de97..00000000000 --- a/res/cardsfolder/inkmoth_nexus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inkmoth Nexus -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 1 | Defined$ Self | Power$ 1 | Toughness$ 1 | Types$ Creature,Artifact,Blinkmoth | Keywords$ Flying & Infect | SpellDescription$ CARDNAME 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.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/inkmoth_nexus.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inkwell_leviathan.txt b/res/cardsfolder/inkwell_leviathan.txt deleted file mode 100644 index 3b717e662c8..00000000000 --- a/res/cardsfolder/inkwell_leviathan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Inkwell Leviathan -ManaCost:7 U U -Types:Artifact Creature Leviathan -Text:no text -PT:7/11 -K:Islandwalk -K:Trample -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/inkwell_leviathan.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inner_calm_outer_strength.txt b/res/cardsfolder/inner_calm_outer_strength.txt deleted file mode 100644 index 5ef35070237..00000000000 --- a/res/cardsfolder/inner_calm_outer_strength.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inner Calm, Outer Strength -ManaCost:2 G -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of cards in your hand. -SVar:X:Count$CardsInYourHand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_calm_outer_strength.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/133.jpg -End diff --git a/res/cardsfolder/inner_chamber_guard.txt b/res/cardsfolder/inner_chamber_guard.txt deleted file mode 100644 index dacddfa1db1..00000000000 --- a/res/cardsfolder/inner_chamber_guard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inner-Chamber Guard -ManaCost:1 W -Types:Creature Human Samurai -Text:no text -PT:0/2 -K:Bushido 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_chamber_guard.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inner_fire.txt b/res/cardsfolder/inner_fire.txt deleted file mode 100644 index d6eb8e8858a..00000000000 --- a/res/cardsfolder/inner_fire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Inner Fire -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Mana | Cost$ 3 R | Produced$ R | Amount$ X | SpellDescription$ Add R to your mana pool for each card in your hand. -SVar:X:Count$CardsInYourHand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_fire.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inner_flame_acolyte.txt b/res/cardsfolder/inner_flame_acolyte.txt deleted file mode 100644 index 8b338b09dc5..00000000000 --- a/res/cardsfolder/inner_flame_acolyte.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Inner-Flame Acolyte -ManaCost:1 R R -Types:Creature Elemental Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+0 and gains haste until end of turn. -K:Evoke:R -SVar:TrigPump:DB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inner_flame_acolyte.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/innocence_kami.txt b/res/cardsfolder/innocence_kami.txt deleted file mode 100644 index 8d02da06ef6..00000000000 --- a/res/cardsfolder/innocence_kami.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Innocence Kami -ManaCost:3 W W -Types:Creature Spirit -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, untap CARDNAME. -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/innocence_kami.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/innocent_blood.txt b/res/cardsfolder/innocent_blood.txt deleted file mode 100644 index 4ee3576249e..00000000000 --- a/res/cardsfolder/innocent_blood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Innocent Blood -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ B | SacValid$ Creature | Defined$ Each | SpellDescription$ Each player sacrifices a creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/innocent_blood.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inquisition_of_kozilek.txt b/res/cardsfolder/inquisition_of_kozilek.txt deleted file mode 100644 index 7c6d50ba60c..00000000000 --- a/res/cardsfolder/inquisition_of_kozilek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Inquisition of Kozilek -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand+cmcLE3 | NumCards$ 1 | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/inquisition_of_kozilek.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/insatiable_souleater.txt b/res/cardsfolder/insatiable_souleater.txt deleted file mode 100644 index 8444249e9ad..00000000000 --- a/res/cardsfolder/insatiable_souleater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Insatiable Souleater -ManaCost:4 -Types:Artifact Creature Beast -Text:no text -PT:5/1 -A:AB$ Pump | Cost$ PG | Defined$ Self | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/insatiable_souleater.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inside_out.txt b/res/cardsfolder/inside_out.txt deleted file mode 100644 index 68414312111..00000000000 --- a/res/cardsfolder/inside_out.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Inside Out -ManaCost:1 UR -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 UR | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inside_out.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/insidious_bookworms.txt b/res/cardsfolder/insidious_bookworms.txt deleted file mode 100644 index 6ef6c19fcec..00000000000 --- a/res/cardsfolder/insidious_bookworms.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Insidious Bookworms -ManaCost:B -Types:Creature Worm -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay 1 B. If you do, target player discards a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 1 B | NumCards$ 1 | ValidTgts$ Player | NumCards$ 1 | Mode$ Random -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/insidious_bookworms.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/12.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/insight.txt b/res/cardsfolder/insight.txt deleted file mode 100644 index 0057285c118..00000000000 --- a/res/cardsfolder/insight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Insight -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a green spell, you draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/insight.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/68.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/insolence.txt b/res/cardsfolder/insolence.txt deleted file mode 100644 index d5390d3f6ee..00000000000 --- a/res/cardsfolder/insolence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Insolence -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 2 damage to that creature's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/insolence.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inspiration.txt b/res/cardsfolder/inspiration.txt deleted file mode 100644 index a87ed46daf3..00000000000 --- a/res/cardsfolder/inspiration.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Inspiration -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 3 U | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inspiration.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/35.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/76.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inspired_charge.txt b/res/cardsfolder/inspired_charge.txt deleted file mode 100644 index b8f54d5ac7d..00000000000 --- a/res/cardsfolder/inspired_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Inspired Charge -ManaCost:2 W W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 W W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +1 | SpellDescription$ Creatures you control get +2/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inspired_charge.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inspired_sprite.txt b/res/cardsfolder/inspired_sprite.txt deleted file mode 100644 index 70f9a7396ca..00000000000 --- a/res/cardsfolder/inspired_sprite.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Inspired Sprite -ManaCost:3 U -Types:Creature Faerie Wizard -Text:no text -PT:2/2 -K:Flash -K:Flying -T:Mode$ SpellCast | ValidCard$ Wizard.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a Wizard spell, you may untap CARDNAME. -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/inspired_sprite.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/37.jpg -End diff --git a/res/cardsfolder/inspirit.txt b/res/cardsfolder/inspirit.txt deleted file mode 100644 index 5f891f9a0b7..00000000000 --- a/res/cardsfolder/inspirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Inspirit -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +4 | SubAbility$ SVar=DBUntap | SpellDescription$ Untap target creature. It gets +2/+4 until end of turn. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84552.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/41.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/22.jpg -End diff --git a/res/cardsfolder/instill_energy.txt b/res/cardsfolder/instill_energy.txt deleted file mode 100644 index c7d2ea28577..00000000000 --- a/res/cardsfolder/instill_energy.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Instill Energy -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Untap | Cost$ 0 | PlayerTurn$ True | ActivationLimit$ 1 | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. Activate this ability only during your turn and only once each turn. -SVar:PlayMain1:True -#AI can't use this effectively right now -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/instill_energy.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/111.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/111.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/166.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/136.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/110.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/instill_furor.txt b/res/cardsfolder/instill_furor.txt deleted file mode 100644 index 1addf62fa4f..00000000000 --- a/res/cardsfolder/instill_furor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Instill Furor -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:At the beginning of your end step, sacrifice this creature unless it attacked this turn.:Enchanted creature has "At the beginning of your end step, sacrifice this creature unless it attacked this turn." -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/instill_furor.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/instill_infection.txt b/res/cardsfolder/instill_infection.txt deleted file mode 100644 index bbd57b2fdff..00000000000 --- a/res/cardsfolder/instill_infection.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Instill Infection -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ 3 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/instill_infection.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/insurrection.txt b/res/cardsfolder/insurrection.txt deleted file mode 100644 index 08989418e9a..00000000000 --- a/res/cardsfolder/insurrection.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Insurrection -ManaCost:5 R R R -Types:Sorcery -Text:Untap all creatures and gain control of them until end of turn. They gain haste until end of turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/insurrection.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/intervene.txt b/res/cardsfolder/intervene.txt deleted file mode 100644 index f0821cb4ff5..00000000000 --- a/res/cardsfolder/intervene.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Intervene -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Creature | SpellDescription$ Counter target spell that targets a creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/intervene.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/intimidation.txt b/res/cardsfolder/intimidation.txt deleted file mode 100644 index 97487588a20..00000000000 --- a/res/cardsfolder/intimidation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Intimidation -ManaCost:2 B B B -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Fear:No Condition:Creatures you control have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/intimidation.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/intimidator_initiate.txt b/res/cardsfolder/intimidator_initiate.txt deleted file mode 100644 index b1cc1012ad6..00000000000 --- a/res/cardsfolder/intimidator_initiate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Intimidator Initiate -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | Execute$ TrigPumpCurse | OptionalDecider$ You | TriggerDescription$ Whenever a player casts a red spell, you may pay 1. If you do, target creature can't block this turn. -SVar:TrigPumpCurse:AB$Pump | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ HIDDEN CARDNAME can't block. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/intimidator_initiate.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/into_the_core.txt b/res/cardsfolder/into_the_core.txt deleted file mode 100644 index 4f7b6f63fda..00000000000 --- a/res/cardsfolder/into_the_core.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Into the Core -ManaCost:2 R R -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 R R | Origin$ Battlefield | Destination$ Exile | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Exile two target artifacts. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/into_the_core.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/into_the_north.txt b/res/cardsfolder/into_the_north.txt deleted file mode 100644 index c6957151745..00000000000 --- a/res/cardsfolder/into_the_north.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Into the North -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Snow | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a snow land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/into_the_north.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/into_the_roil.txt b/res/cardsfolder/into_the_roil.txt deleted file mode 100644 index 1301adc7331..00000000000 --- a/res/cardsfolder/into_the_roil.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Into the Roil -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target nonland permanent to its owner's hand. If CARDNAME was kicked, draw a card. -A:SP$ ChangeZone | Cost$ 2 U U | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBDraw | SpellDescription$ Kicker 1 U (You may pay an additional 1 U as you cast this spell.) -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/into_the_roil.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/into_thin_air.txt b/res/cardsfolder/into_thin_air.txt deleted file mode 100644 index f79d65a10ea..00000000000 --- a/res/cardsfolder/into_thin_air.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Into Thin Air -ManaCost:5 U -Types:Instant -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.)\r\n -A:SP$ ChangeZone | Cost$ 5 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target artifact to its owner's hand. -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/into_thin_air.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/intrepid_hero.txt b/res/cardsfolder/intrepid_hero.txt deleted file mode 100644 index 11768158b96..00000000000 --- a/res/cardsfolder/intrepid_hero.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Intrepid Hero -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | SpellDescription$ Destroy target creature with power 4 or greater. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45208.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/26.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/19.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/22.jpg -End diff --git a/res/cardsfolder/intruder_alarm.txt b/res/cardsfolder/intruder_alarm.txt deleted file mode 100644 index 46329abbc59..00000000000 --- a/res/cardsfolder/intruder_alarm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Intruder Alarm -ManaCost:2 U -Types:Enchantment -Text:Creatures don't untap during their controllers' untap steps. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigUntapAll | TriggerDescription$ Whenever a creature enters the battlefield, untap all creatures. -SVar:TrigUntapAll:AB$UntapAll | Cost$ 0 | ValidCards$ Creature | SpellDescription$ untap all creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/intruder_alarm.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/86.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/intuition.txt b/res/cardsfolder/intuition.txt deleted file mode 100644 index cc47283fa4b..00000000000 --- a/res/cardsfolder/intuition.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Intuition -ManaCost:2 U -Types:Instant -Text:Search your library for any three cards and reveal them. An opponent chooses one. Put that card into your hand and the rest into your graveyard. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/intuition.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inundate.txt b/res/cardsfolder/inundate.txt deleted file mode 100644 index 1c0b032c901..00000000000 --- a/res/cardsfolder/inundate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inundate -ManaCost:3 U U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U U | ChangeType$ Creature.nonBlue | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all nonblue creatures to their owners' hands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/inundate.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/invigorating_boon.txt b/res/cardsfolder/invigorating_boon.txt deleted file mode 100644 index c7e2b1e49bd..00000000000 --- a/res/cardsfolder/invigorating_boon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Invigorating Boon -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player cycles a card, you may put a +1/+1 counter on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/invigorating_boon.jpg -SVar:Rarity:Uncommon -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/267.jpg -End diff --git a/res/cardsfolder/invigorating_falls.txt b/res/cardsfolder/invigorating_falls.txt deleted file mode 100644 index 9a2088db25c..00000000000 --- a/res/cardsfolder/invigorating_falls.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Invigorating Falls -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 G G | LifeAmount$ X | SpellDescription$ You gain life equal to the number of creature cards in all graveyards. -SVar:X:Count$TypeInAllYards.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/invigorating_falls.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/128.jpg -End diff --git a/res/cardsfolder/invincible_hymn.txt b/res/cardsfolder/invincible_hymn.txt deleted file mode 100644 index 615b303b432..00000000000 --- a/res/cardsfolder/invincible_hymn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Invincible Hymn -ManaCost:6 W W -Types:Sorcery -Text:no text -A:SP$ SetLife | Cost$ 6 W W | Defined$ You | LifeAmount$ X | SpellDescription$ Count the number of cards in your library. Your life total becomes that number. -SVar:X:Count$InYourLibrary.Card -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/invincible_hymn.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/inviolability.txt b/res/cardsfolder/inviolability.txt deleted file mode 100644 index bd68dcc39aa..00000000000 --- a/res/cardsfolder/inviolability.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Inviolability -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN Prevent all damage that would be dealt to CARDNAME.:Prevent all damage that would be dealt to enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/inviolability.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/invisibility.txt b/res/cardsfolder/invisibility.txt deleted file mode 100644 index 83bb6dd2f03..00000000000 --- a/res/cardsfolder/invisibility.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Invisibility -ManaCost:U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN CARDNAME can't be blocked except by Walls.:Enchanted creature can't be blocked except by Walls. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/invisibility.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/87.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/60.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/60.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/invoke_the_firemind.txt b/res/cardsfolder/invoke_the_firemind.txt deleted file mode 100644 index e87ea4d94db..00000000000 --- a/res/cardsfolder/invoke_the_firemind.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Invoke the Firemind -ManaCost:X U U R -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ X U U R | NumCards$ X | SpellDescription$ Choose one - Draw X cards; -A:SP$ DealDamage | Cost$ X U U R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ or CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/invoke_the_firemind.jpg -SVar:RemAIDeck:True -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iona_shield_of_emeria.txt b/res/cardsfolder/iona_shield_of_emeria.txt deleted file mode 100644 index 7569b4a24ea..00000000000 --- a/res/cardsfolder/iona_shield_of_emeria.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Iona, Shield of Emeria -ManaCost:6 W W W -Types:Legendary Creature Angel -Text:As Iona, Shield of Emeria enters the battlefield, choose a color.\r\nYour opponents can't cast spells of the chosen color. -PT:7/7 -K:Flying -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/iona_shield_of_emeria.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ionas_judgment.txt b/res/cardsfolder/ionas_judgment.txt deleted file mode 100644 index 72ab17c8b50..00000000000 --- a/res/cardsfolder/ionas_judgment.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Iona's Judgment -ManaCost:4 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 W | ValidTgts$ Creature,Enchantment | TgtPrompt$ Select target creature or enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ionas_judgment.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ior_ruin_expedition.txt b/res/cardsfolder/ior_ruin_expedition.txt deleted file mode 100644 index ee73313dd6c..00000000000 --- a/res/cardsfolder/ior_ruin_expedition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ior Ruin Expedition -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -A:AB$ Draw | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ior_ruin_expedition.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ire_of_kaminari.txt b/res/cardsfolder/ire_of_kaminari.txt deleted file mode 100644 index 98cb76f3139..00000000000 --- a/res/cardsfolder/ire_of_kaminari.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ire of Kaminari -ManaCost:3 R -Types:Instant Arcane -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ Ire of Kaminari deals damage to target creature or player equal to the number of Arcane cards in your graveyard. -SVar:X:Count$TypeInYourYard.Arcane -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ire_of_kaminari.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/109.jpg -End diff --git a/res/cardsfolder/iridescent_angel.txt b/res/cardsfolder/iridescent_angel.txt deleted file mode 100644 index 5e94cdf7f1d..00000000000 --- a/res/cardsfolder/iridescent_angel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Iridescent Angel -ManaCost:5 W U -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -K:Protection from white -K:Protection from blue -K:Protection from black -K:Protection from red -K:Protection from green -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/iridescent_angel.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/288.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/irini_sengir.txt b/res/cardsfolder/irini_sengir.txt deleted file mode 100644 index 50c668b1b98..00000000000 --- a/res/cardsfolder/irini_sengir.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Irini Sengir -ManaCost:2 B B -Types:Legendary Creature Vampire Dwarf -Text:White enchantment spells and green enchantment spells cost 2 more to cast. -PT:2/2 -K:CostChange:All:More:2:Spell:white/green:Enchantment:OnlyOneBonus -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/irini_sengir.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_barb_hellion.txt b/res/cardsfolder/iron_barb_hellion.txt deleted file mode 100644 index 10bd73233e8..00000000000 --- a/res/cardsfolder/iron_barb_hellion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Iron-Barb Hellion -ManaCost:5 R -Types:Creature Hellion Beast -Text:no text -PT:5/4 -K:CARDNAME can't block. -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card44608.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_heart_chimera.txt b/res/cardsfolder/iron_heart_chimera.txt deleted file mode 100644 index e030e54db58..00000000000 --- a/res/cardsfolder/iron_heart_chimera.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Iron-Heart Chimera -ManaCost:4 -Types:Artifact Creature Chimera -Text:no text -PT:2/2 -K:Vigilance -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) -SVar:DBPump:DB$Pump | KW$ Vigilance | Defined$ Targeted | Permanent$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_heart_chimera.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_lance.txt b/res/cardsfolder/iron_lance.txt deleted file mode 100644 index 75094acc083..00000000000 --- a/res/cardsfolder/iron_lance.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Iron Lance -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_lance.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/300.jpg -End diff --git a/res/cardsfolder/iron_maiden.txt b/res/cardsfolder/iron_maiden.txt deleted file mode 100644 index 6b1cde6ffd7..00000000000 --- a/res/cardsfolder/iron_maiden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Iron Maiden -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ GT4 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each opponent's upkeep, CARDNAME deals X damage to that player, where X is the number of cards in his or her hand minus 4. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/Minus.4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_maiden.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_myr.txt b/res/cardsfolder/iron_myr.txt deleted file mode 100644 index eb0ae773147..00000000000 --- a/res/cardsfolder/iron_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Iron Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_myr.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/187.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_star.txt b/res/cardsfolder/iron_star.txt deleted file mode 100644 index f7273a9f523..00000000000 --- a/res/cardsfolder/iron_star.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Iron Star -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a red spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_star.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/304.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/250.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/252.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/301.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/379.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/344.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/290.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/252.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_tusk_elephant.txt b/res/cardsfolder/iron_tusk_elephant.txt deleted file mode 100644 index 65083ea852a..00000000000 --- a/res/cardsfolder/iron_tusk_elephant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Iron Tusk Elephant -ManaCost:4 W -Types:Creature Elephant -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3497.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iron_will.txt b/res/cardsfolder/iron_will.txt deleted file mode 100644 index 726b0a40323..00000000000 --- a/res/cardsfolder/iron_will.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Iron Will -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +4 | SpellDescription$ Target creature gets +0/+4 until end of turn. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/iron_will.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/10.jpg -End diff --git a/res/cardsfolder/ironclaw_buzzardiers.txt b/res/cardsfolder/ironclaw_buzzardiers.txt deleted file mode 100644 index 107cb05d288..00000000000 --- a/res/cardsfolder/ironclaw_buzzardiers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ironclaw Buzzardiers -ManaCost:2 R -Types:Creature Orc Scout -Text:no text -PT:2/2 -K:CARDNAME can't block creatures with power 2 or greater. -A:AB$ Pump | Cost$ R | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_buzzardiers.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/165.jpg -End diff --git a/res/cardsfolder/ironclaw_curse.txt b/res/cardsfolder/ironclaw_curse.txt deleted file mode 100644 index 92620d8eb45..00000000000 --- a/res/cardsfolder/ironclaw_curse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ironclaw Curse -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-0/-1/HIDDEN CARDNAME can't block creatures with power equal to or greater than CARDNAME's toughness.:Enchanted creature gets -0/-1 and can't block creatures with power equal to or greater than the enchanted creature's toughness. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_curse.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/96.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ironclaw_orcs.txt b/res/cardsfolder/ironclaw_orcs.txt deleted file mode 100644 index e4987202a63..00000000000 --- a/res/cardsfolder/ironclaw_orcs.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ironclaw Orcs -ManaCost:1 R -Types:Creature Orc -Text:no text -PT:2/2 -K:CARDNAME can't block creatures with power 2 or greater. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_orcs.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/160.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/161.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/224.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/160.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ironhoof_ox.txt b/res/cardsfolder/ironhoof_ox.txt deleted file mode 100644 index f3e4c4538ae..00000000000 --- a/res/cardsfolder/ironhoof_ox.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ironhoof Ox -ManaCost:3 G G -Types:Creature Ox -Text:no text -PT:4/4 -K:CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6628.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ironroot_treefolk.txt b/res/cardsfolder/ironroot_treefolk.txt deleted file mode 100644 index 7e052a2f568..00000000000 --- a/res/cardsfolder/ironroot_treefolk.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ironroot Treefolk -ManaCost:4 G -Types:Creature Treefolk -Text:no text -PT:3/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3988.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/112.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/112.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/167.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/137.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/111.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ironshell_beetle.txt b/res/cardsfolder/ironshell_beetle.txt deleted file mode 100644 index 67b21f82d1b..00000000000 --- a/res/cardsfolder/ironshell_beetle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ironshell Beetle -ManaCost:1 G -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on target creature. -SVar:TrigPut:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironshell_beetle.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/irradiate.txt b/res/cardsfolder/irradiate.txt deleted file mode 100644 index 23f9ffe41d3..00000000000 --- a/res/cardsfolder/irradiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Irradiate -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn for each artifact you control. -SVar:X:Count$NumTypeYouCtrl.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/irradiate.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/67.jpg -End diff --git a/res/cardsfolder/irrigation_ditch.txt b/res/cardsfolder/irrigation_ditch.txt deleted file mode 100644 index c74c244b617..00000000000 --- a/res/cardsfolder/irrigation_ditch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Irrigation Ditch -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G U | SpellDescription$ Add G U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/irrigation_ditch.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/isamaru_hound_of_konda.txt b/res/cardsfolder/isamaru_hound_of_konda.txt deleted file mode 100644 index e7ba08def5c..00000000000 --- a/res/cardsfolder/isamaru_hound_of_konda.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Isamaru, Hound of Konda -ManaCost:W -Types:Legendary Creature Hound -Text:no text -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79217.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/isao_enlightened_bushi.txt b/res/cardsfolder/isao_enlightened_bushi.txt deleted file mode 100644 index c70f7322443..00000000000 --- a/res/cardsfolder/isao_enlightened_bushi.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Isao, Enlightened Bushi -ManaCost:2 G -Types:Legendary Creature Human Samurai -Text:no text -PT:2/1 -K:CARDNAME can't be countered. -K:Bushido 2 -A:AB$ Regenerate | Cost$ 2 | ValidTgts$ Samurai | TgtPrompt$ Select target Samurai. | SpellDescription$ Regenerate target Samurai. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/isao_enlightened_bushi.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ishi_ishi_akki_crackshot.txt b/res/cardsfolder/ishi_ishi_akki_crackshot.txt deleted file mode 100644 index c4757273225..00000000000 --- a/res/cardsfolder/ishi_ishi_akki_crackshot.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ishi-Ishi, Akki Crackshot -ManaCost:1 R -Types:Legendary Creature Goblin Warrior -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Spirit.YouDontCtrl,Arcane.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent casts a Spirit or Arcane spell, CARDNAME deals 2 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ishi_ishi_akki_crackshot.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/island.txt b/res/cardsfolder/island.txt deleted file mode 100644 index e487b2c46db..00000000000 --- a/res/cardsfolder/island.txt +++ /dev/null @@ -1,44 +0,0 @@ -Name:Island -ManaCost:no cost -Types:Basic Land Island -Text:no text -SVar:PicCount:4 -SVar:Rarity:Land -SVar:Picture:http://resources.wizards.com/magic/cards/unh/en-us/card73951.jpg\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159281\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159282\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=25964 -SetInfo:USG|Land|http://magiccards.info/scans/en/us/335.jpg|4 -SetInfo:TMP|Land|http://magiccards.info/scans/en/tp/313.jpg|4 -SetInfo:ZEN|Land|http://magiccards.info/scans/en/zen/234.jpg|4 -SetInfo:4ED|Land|http://magiccards.info/scans/en/4e/178.jpg|3 -SetInfo:3ED|Land|http://magiccards.info/scans/en/rv/287.jpg|3 -SetInfo:SOM|Land|http://magiccards.info/scans/en/som/234.jpg|4 -SetInfo:TSP|Land|http://magiccards.info/scans/en/ts/286.jpg|4 -SetInfo:ODY|Land|http://magiccards.info/scans/en/od/335.jpg|4 -SetInfo:MIR|Land|http://magiccards.info/scans/en/mr/297.jpg|4 -SetInfo:PTK|Land|http://magiccards.info/scans/en/p3k/169.jpg|3 -SetInfo:7ED|Land|http://magiccards.info/scans/en/7e/332.jpg|4 -SetInfo:POR|Land|http://magiccards.info/scans/en/po/207.jpg|4 -SetInfo:ROE|Land|http://magiccards.info/scans/en/roe/233.jpg|4 -SetInfo:10E|Land|http://magiccards.info/scans/en/10e/368.jpg|4 -SetInfo:RAV|Land|http://magiccards.info/scans/en/rav/291.jpg|4 -SetInfo:6ED|Land|http://magiccards.info/scans/en/6e/335.jpg|4 -SetInfo:5ED|Land|http://magiccards.info/scans/en/5e/425.jpg|4 -SetInfo:ONS|Land|http://magiccards.info/scans/en/on/335.jpg|4 -SetInfo:S99|Land|http://magiccards.info/scans/en/st/158.jpg|4 -SetInfo:MBS|Land|http://magiccards.info/scans/en/mbs/148.jpg|2 -SetInfo:8ED|Land|http://magiccards.info/scans/en/8e/335.jpg|4 -SetInfo:CHK|Land|http://magiccards.info/scans/en/chk/291.jpg|4 -SetInfo:PO2|Land|http://magiccards.info/scans/en/po2/154.jpg|3 -SetInfo:9ED|Land|http://magiccards.info/scans/en/9e/335.jpg|4 -SetInfo:ICE|Land|http://magiccards.info/scans/en/ia/334.jpg|3 -SetInfo:MRD|Land|http://magiccards.info/scans/en/mi/291.jpg|4 -SetInfo:SHM|Land|http://magiccards.info/scans/en/shm/286.jpg|4 -SetInfo:LEA|Land|http://magiccards.info/scans/en/al/281.jpg|2 -SetInfo:LEB|Land|http://magiccards.info/scans/en/be/283.jpg|3 -SetInfo:INV|Land|http://magiccards.info/scans/en/in/335.jpg|4 -SetInfo:MMQ|Land|http://magiccards.info/scans/en/mm/335.jpg|4 -SetInfo:ALA|Land|http://magiccards.info/scans/en/ala/234.jpg|4 -SetInfo:M11|Land|http://magiccards.info/scans/en/m11/234.jpg|4 -SetInfo:M10|Land|http://magiccards.info/scans/en/m10/234.jpg|4 -SetInfo:LRW|Land|http://magiccards.info/scans/en/lw/286.jpg|4 -SetInfo:2ED|Land|http://magiccards.info/scans/en/un/283.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/island_fish_jasconius.txt b/res/cardsfolder/island_fish_jasconius.txt deleted file mode 100644 index 83638ca7d8c..00000000000 --- a/res/cardsfolder/island_fish_jasconius.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Island Fish Jasconius -ManaCost:4 U U U -Types:Creature Fish -Text:no text -PT:6/8 -K:CARDNAME can't attack unless defending player controls an Island. -K:CARDNAME doesn't untap during your untap step. -K:When you control no Islands, sacrifice CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may pay U U U. If you do, untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ U U U | Defined$ Self -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/island_fish_jasconius.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/61.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/78.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/island_of_wak_wak.txt b/res/cardsfolder/island_of_wak_wak.txt deleted file mode 100644 index ce7387f6afe..00000000000 --- a/res/cardsfolder/island_of_wak_wak.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Island of Wak-Wak -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Animate | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | Power$ 0 | SpellDescription$ The power of target creature with flying becomes 0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/island_of_wak_wak.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/isleback_spawn.txt b/res/cardsfolder/isleback_spawn.txt deleted file mode 100644 index 3cbd44549c1..00000000000 --- a/res/cardsfolder/isleback_spawn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Isleback Spawn -ManaCost:5 U U -Types:Creature Kraken -Text:no text -PT:4/8 -K:Shroud -K:stPumpSelf:Creature:4/8:LibraryLE/20:Isleback Spawn gets +4/+8 as long as a library has twenty or fewer cards in it. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/isleback_spawn.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/isochron_scepter.txt b/res/cardsfolder/isochron_scepter.txt deleted file mode 100644 index bd9ed60744d..00000000000 --- a/res/cardsfolder/isochron_scepter.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Isochron Scepter -ManaCost:2 -Types:Artifact -Text:Imprint - When Isochron Scepter enters the battlefield, you may exile an instant card with converted mana cost 2 or less from your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/isochron_scepter.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/isolation_cell.txt b/res/cardsfolder/isolation_cell.txt deleted file mode 100644 index 9ed6aae0ad8..00000000000 --- a/res/cardsfolder/isolation_cell.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Isolation Cell -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigLose | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a creature spell, that player loses 2 life unless he or she pays 2. -SVar:TrigLose:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 2 | UnlessCost$ 2 | UnlessPayer$ TriggeredCardController -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/isolation_cell.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/it_that_betrays.txt b/res/cardsfolder/it_that_betrays.txt deleted file mode 100644 index 93a095e8a89..00000000000 --- a/res/cardsfolder/it_that_betrays.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:It That Betrays -ManaCost:12 -Types:Creature Eldrazi -Text:no text -PT:11/11 -K:Annihilator 2 -T:Mode$ Sacrificed | ValidCard$ Permanent.nonToken+YouDontCtrl | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent sacrifices a nontoken permanent, put that card onto the battlefield under your control. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/it_that_betrays.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/7.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ith_high_arcanist.txt b/res/cardsfolder/ith_high_arcanist.txt deleted file mode 100644 index 78d7343d9a5..00000000000 --- a/res/cardsfolder/ith_high_arcanist.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ith, High Arcanist -ManaCost:5 W U -Types:Legendary Creature Human Wizard -Text:no text -PT:3/5 -K:Vigilance -A:AB$ Untap | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SubAbility$ SVar=DBPump | SpellDescription$ Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -SVar:DBPump:DB$Pump | Cost$ 0 | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. -K:Suspend:4:W U -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ith_high_arcanist.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivory_crane_netsuke.txt b/res/cardsfolder/ivory_crane_netsuke.txt deleted file mode 100644 index 1e5ade5debb..00000000000 --- a/res/cardsfolder/ivory_crane_netsuke.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ivory Crane Netsuke -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ GT6 | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if you have seven or more cards in hand, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 4 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_crane_netsuke.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivory_cup.txt b/res/cardsfolder/ivory_cup.txt deleted file mode 100644 index 03b995c924f..00000000000 --- a/res/cardsfolder/ivory_cup.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Ivory Cup -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a white spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_cup.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/305.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/251.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/253.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/302.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/380.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/345.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/291.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/253.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivory_giant.txt b/res/cardsfolder/ivory_giant.txt deleted file mode 100644 index 4ed2956b580..00000000000 --- a/res/cardsfolder/ivory_giant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ivory Giant -ManaCost:5 W W -Types:Creature Giant -Text:no text -PT:3/4 -K:Suspend:5:W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When Ivory Giant enters the battlefield, tap all nonwhite creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.nonWhite -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_giant.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivory_guardians.txt b/res/cardsfolder/ivory_guardians.txt deleted file mode 100644 index d4a114f4eba..00000000000 --- a/res/cardsfolder/ivory_guardians.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ivory Guardians -ManaCost:4 W W -Types:Creature Giant Cleric -Text:no text -PT:3/3 -K:Protection from red -K:stPumpAll:Creature.namedIvory Guardians:1/1:isPresent Permanent.Red+nonToken+YouDontCtrl:Creatures named Ivory Guardians get +1/+1 as long as an opponent controls a nontoken red permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_guardians.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/316.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivory_tower.txt b/res/cardsfolder/ivory_tower.txt deleted file mode 100644 index c342322d187..00000000000 --- a/res/cardsfolder/ivory_tower.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ivory Tower -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ GT4 | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, you gain X life, where X is the number of cards in your hand minus four. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$InYourHand/Minus.4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivory_tower.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/254.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/346.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ivy_dancer.txt b/res/cardsfolder/ivy_dancer.txt deleted file mode 100644 index b1e82089369..00000000000 --- a/res/cardsfolder/ivy_dancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ivy Dancer -ManaCost:2 G -Types:Creature Dryad Shaman -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Forestwalk | SpellDescription$ Target creature gains forestwalk until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivy_dancer.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/171.jpg -End diff --git a/res/cardsfolder/ivy_elemental.txt b/res/cardsfolder/ivy_elemental.txt deleted file mode 100644 index e9db7801c3a..00000000000 --- a/res/cardsfolder/ivy_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ivy Elemental -ManaCost:X G -Types:Creature Elemental -Text:no text -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -PT:0/0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ivy_elemental.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/iwamori_of_the_open_fist.txt b/res/cardsfolder/iwamori_of_the_open_fist.txt deleted file mode 100644 index 7a3ae214865..00000000000 --- a/res/cardsfolder/iwamori_of_the_open_fist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Iwamori of the Open Fist -ManaCost:2 G G -Types:Legendary Creature Human Monk -Text:no text -PT:5/5 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, each opponent may put a legendary creature card from his or her hand onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Legendary | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/iwamori_of_the_open_fist.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ixidors_will.txt b/res/cardsfolder/ixidors_will.txt deleted file mode 100644 index 1185ff153fe..00000000000 --- a/res/cardsfolder/ixidors_will.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ixidor's Will -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Counter target spell unless its controller pays 2 for each Wizard on the battlefield. -SVar:X:Count$TypeYouCtrl.Wizard/Twice -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ixidors_will.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/izzet_boilerworks.txt b/res/cardsfolder/izzet_boilerworks.txt deleted file mode 100644 index a1f1763bbfe..00000000000 --- a/res/cardsfolder/izzet_boilerworks.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Izzet Boilerworks -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U R | SpellDescription$ Add U R to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_boilerworks.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/izzet_chronarch.txt b/res/cardsfolder/izzet_chronarch.txt deleted file mode 100644 index 9fbee7a6430..00000000000 --- a/res/cardsfolder/izzet_chronarch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Izzet Chronarch -ManaCost:3 U R -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target instant or sorcery card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_chronarch.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/izzet_signet.txt b/res/cardsfolder/izzet_signet.txt deleted file mode 100644 index 209388ed585..00000000000 --- a/res/cardsfolder/izzet_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Izzet Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ U R | SpellDescription$ Add U R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/izzet_signet.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jabaris_banner.txt b/res/cardsfolder/jabaris_banner.txt deleted file mode 100644 index caffe5e0ba8..00000000000 --- a/res/cardsfolder/jabaris_banner.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jabari's Banner -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flanking | SpellDescription$ Target creature gains flanking until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jabaris_banner.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/150.jpg -End diff --git a/res/cardsfolder/jace_beleren.txt b/res/cardsfolder/jace_beleren.txt deleted file mode 100644 index ded7b814911..00000000000 --- a/res/cardsfolder/jace_beleren.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Jace Beleren -ManaCost:1 U U -Types:Planeswalker Jace -Text:no text -Loyalty:3 -A:AB$ Draw | Cost$ AddCounter<2/LOYALTY> | Defined$ Each | Planeswalker$ True | SpellDescription$ Each player draws a card. -A:AB$ Draw | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Player | Planeswalker$ True | SpellDescription$ Target player draws a card. -A:AB$ Mill | Cost$ SubCounter<10/LOYALTY> | NumCards$ 20 | ValidTgts$ Player | Planeswalker$ True | SpellDescription$ Target player puts the top twenty cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jace_beleren.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/58.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/58.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jace_the_mind_sculptor.txt b/res/cardsfolder/jace_the_mind_sculptor.txt deleted file mode 100644 index a3bd650a989..00000000000 --- a/res/cardsfolder/jace_the_mind_sculptor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jace, the Mind Sculptor -ManaCost:2 U U -Types:Planeswalker Jace -Text:no text -Loyalty:3 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/jace_the_mind_sculptor.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jaces_erasure.txt b/res/cardsfolder/jaces_erasure.txt deleted file mode 100644 index c6c74726d39..00000000000 --- a/res/cardsfolder/jaces_erasure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jace's Erasure -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMill | TriggerDescription$ Whenever you draw a card, you may have target player put the top card of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jaces_erasure.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jaces_ingenuity.txt b/res/cardsfolder/jaces_ingenuity.txt deleted file mode 100644 index 1abe47efc99..00000000000 --- a/res/cardsfolder/jaces_ingenuity.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jace's Ingenuity -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 3 U U | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jaces_ingenuity.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jackal_pup.txt b/res/cardsfolder/jackal_pup.txt deleted file mode 100644 index c3265fb1ffa..00000000000 --- a/res/cardsfolder/jackal_pup.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jackal Pup -ManaCost:R -Types:Creature Hound -Text:no text -PT:2/1 -T:Mode$ DamageDone | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to you. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | NumDmg$ X | Defined$ You -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jackal_pup.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jackalope_herd.txt b/res/cardsfolder/jackalope_herd.txt deleted file mode 100644 index c1b791a64e6..00000000000 --- a/res/cardsfolder/jackalope_herd.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jackalope Herd -ManaCost:3 G -Types:Creature Rabbit Beast -Text:no text -PT:4/5 -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When you cast a spell, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jackalope_herd.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jacques_le_vert.txt b/res/cardsfolder/jacques_le_vert.txt deleted file mode 100644 index 0ee8cdfa02e..00000000000 --- a/res/cardsfolder/jacques_le_vert.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jacques le Vert -ManaCost:1 W G R -Types:Legendary Creature Human Warrior -Text:no text -PT:3/2 -K:stPumpAll:Creature.Green+YouCtrl:0/2:No Condition:Green creatures you control get +0/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jacques_le_vert.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jade_idol.txt b/res/cardsfolder/jade_idol.txt deleted file mode 100644 index ea64911c17d..00000000000 --- a/res/cardsfolder/jade_idol.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jade Idol -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME becomes a 4/4 Spirit artifact creature until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Artifact,Spirit -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_idol.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jade_leech.txt b/res/cardsfolder/jade_leech.txt deleted file mode 100644 index b97609d8de6..00000000000 --- a/res/cardsfolder/jade_leech.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jade Leech -ManaCost:2 G G -Types:Creature Leech -Text:Green spells you cast cost G more to cast. -PT:5/5 -K:CostChange:Player:More:G:Spell:green:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_leech.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jade_statue.txt b/res/cardsfolder/jade_statue.txt deleted file mode 100644 index ae5524f90cc..00000000000 --- a/res/cardsfolder/jade_statue.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jade Statue -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ 2 | Defined$ Self | Power$ 3 | Toughness$ 6 | Types$ Creature,Artifact,Golem | UntilEndOfCombat$ True | ActivatingPhases$ BeginCombat->EndCombat | SpellDescription$ CARDNAME becomes a 3/6 Golem artifact creature until end of combat. Activate this ability only during combat. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_statue.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/253.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/255.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/300.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jagged_lightning.txt b/res/cardsfolder/jagged_lightning.txt deleted file mode 100644 index 05c47a04e63..00000000000 --- a/res/cardsfolder/jagged_lightning.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jagged Lightning -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to each of two target creatures. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jagged_lightning.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/200.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/106.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jagged_poppet.txt b/res/cardsfolder/jagged_poppet.txt deleted file mode 100644 index cbe49be8270..00000000000 --- a/res/cardsfolder/jagged_poppet.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Jagged Poppet -ManaCost:1 B R -Types:Creature Ogre Warrior -Text:no text -PT:3/4 -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigYouDiscard | TriggerDescription$ Whenever CARDNAME is dealt damage, discard that many cards. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Hellbent$ True | CombatDamage$ True | Execute$ TrigOppDiscard | TriggerDescription$ Hellbent - Whenever CARDNAME deals combat damage to a player, if you have no cards in hand, that player discards cards equal to the damage. -SVar:TrigYouDiscard:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ X | Mode$ TgtChoose -SVar:TrigOppDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ X | Mode$ TgtChoose -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jagged_poppet.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jagged_scar_archers.txt b/res/cardsfolder/jagged_scar_archers.txt deleted file mode 100644 index 731e57414a2..00000000000 --- a/res/cardsfolder/jagged_scar_archers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jagged-Scar Archers -ManaCost:1 G G -Types:Creature Elf Archer -Text:no text -PT:*/* -K:stSetPT:Count$Valid Elf.YouCtrl:Count$Valid Elf.YouCtrl:CARDNAME's power and toughness are each equal to the number of Elves you control. -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature with flying. -SVar:X:Count$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jagged_scar_archers.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jagwasp_swarm.txt b/res/cardsfolder/jagwasp_swarm.txt deleted file mode 100644 index d160ca42acd..00000000000 --- a/res/cardsfolder/jagwasp_swarm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jagwasp Swarm -ManaCost:3 B -Types:Creature Insect -Text:no text -PT:3/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jagwasp_swarm.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jalum_tome.txt b/res/cardsfolder/jalum_tome.txt deleted file mode 100644 index 58de27c12f2..00000000000 --- a/res/cardsfolder/jalum_tome.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jalum Tome -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jalum_tome.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/382.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/293.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jamuraan_lion.txt b/res/cardsfolder/jamuraan_lion.txt deleted file mode 100644 index 4e0352013b2..00000000000 --- a/res/cardsfolder/jamuraan_lion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jamuraan Lion -ManaCost:2 W -Types:Creature Cat -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jamuraan_lion.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jandors_ring.txt b/res/cardsfolder/jandors_ring.txt deleted file mode 100644 index d5dd4b43546..00000000000 --- a/res/cardsfolder/jandors_ring.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jandor's Ring -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T Discard<1/LastDrawn> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jandors_ring.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jandors_saddlebags.txt b/res/cardsfolder/jandors_saddlebags.txt deleted file mode 100644 index 115a0856388..00000000000 --- a/res/cardsfolder/jandors_saddlebags.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Jandor's Saddlebags -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jandors_saddlebags.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/383.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/257.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/348.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/79.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jangling_automaton.txt b/res/cardsfolder/jangling_automaton.txt deleted file mode 100644 index b68322d1482..00000000000 --- a/res/cardsfolder/jangling_automaton.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jangling Automaton -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:3/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks, untap all creatures defending player controls. -SVar:TrigUntap:AB$UntapAll | Cost$ 0 | ValidCards$ Creature.YouDontCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jangling_automaton.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jareth_leonine_titan.txt b/res/cardsfolder/jareth_leonine_titan.txt deleted file mode 100644 index c80a95f22ab..00000000000 --- a/res/cardsfolder/jareth_leonine_titan.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Jareth, Leonine Titan -ManaCost:3 W W W -Types:Legendary Creature Cat Giant -Text:no text -PT:4/7 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +7/+7 until end of turn. -A:AB$ Pump | Cost$ W | KW$ Protection from white | SpellDescription$ CARDNAME gains protection from white until end of turn. -A:AB$ Pump | Cost$ W | KW$ Protection from blue | SpellDescription$ CARDNAME gains protection from blue until end of turn. -A:AB$ Pump | Cost$ W | KW$ Protection from black | SpellDescription$ CARDNAME gains protection from black until end of turn. -A:AB$ Pump | Cost$ W | KW$ Protection from red | SpellDescription$ CARDNAME gains protection from red until end of turn. -A:AB$ Pump | Cost$ W | KW$ Protection from green | SpellDescription$ CARDNAME gains protection from green until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 7 | NumDef$ 7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jareth_leonine_titan.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jasmine_boreal.txt b/res/cardsfolder/jasmine_boreal.txt deleted file mode 100644 index d60467a1430..00000000000 --- a/res/cardsfolder/jasmine_boreal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jasmine Boreal -ManaCost:3 W G -Types:Legendary Creature Human -Text:no text -PT:4/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card109764.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/93.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jawbone_skulkin.txt b/res/cardsfolder/jawbone_skulkin.txt deleted file mode 100644 index b174fc3008d..00000000000 --- a/res/cardsfolder/jawbone_skulkin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jawbone Skulkin -ManaCost:1 -Types:Artifact Creature Scarecrow -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Red | TgtPrompt$ Select target red creature | KW$ Haste | SpellDescription$ Target red creature gains haste until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jawbone_skulkin.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jaya_ballard_task_mage.txt b/res/cardsfolder/jaya_ballard_task_mage.txt deleted file mode 100644 index 8fccc103ec0..00000000000 --- a/res/cardsfolder/jaya_ballard_task_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jaya Ballard, Task Mage -ManaCost:1 R R -Types:Legendary Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ R T Discard<1/Card> | ValidTgts$ Permanent.Blue | TgtPrompt$ Select target blue permanent | SpellDescription$ Destroy target blue permanent. -A:AB$ DealDamage | Cost$ 1 R T Discard<1/Card> | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DBNoRegen | SpellDescription$ CARDNAME deals 3 damage to target creature or player. A creature dealt damage this way can't be regenerated this turn. -A:AB$ DamageAll | Cost$ 5 R R T Discard<1/Card> | NumDmg$ 6 | ValidPlayers$ Each | ValidCards$ Creature | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 6 damage to each creature and each player. -SVar:DBNoRegen:DB$Pump | KW$ HIDDEN CARDNAME can't be regenerated. | Defined$ Targeted -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jaya_ballard_task_mage.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jayemdae_tome.txt b/res/cardsfolder/jayemdae_tome.txt deleted file mode 100644 index 37eeaab9f35..00000000000 --- a/res/cardsfolder/jayemdae_tome.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Jayemdae Tome -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 4 T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jayemdae_tome.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/306.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/254.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/256.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/305.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/384.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/349.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/327.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/294.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/258.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jedit_ojanen.txt b/res/cardsfolder/jedit_ojanen.txt deleted file mode 100644 index e69c144b4a6..00000000000 --- a/res/cardsfolder/jedit_ojanen.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jedit Ojanen -ManaCost:4 W W U -Types:Legendary Creature Cat Warrior -Text:no text -PT:5/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1660.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jedit_ojanen_of_efrava.txt b/res/cardsfolder/jedit_ojanen_of_efrava.txt deleted file mode 100644 index 16c7c4928bc..00000000000 --- a/res/cardsfolder/jedit_ojanen_of_efrava.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jedit Ojanen of Efrava -ManaCost:3 G G G -Types:Legendary Creature Cat Warrior -Text:no text -PT:5/5 -K:Forestwalk -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME attacks or blocks, put a 2/2 green Cat Warrior creature token with forestwalk onto the battlefield. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, put a 2/2 green Cat Warrior creature token with forestwalk onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Cat Warrior | TokenTypes$ Creature,Cat,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Forestwalk -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jedit_ojanen_of_efrava.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jedits_dragoons.txt b/res/cardsfolder/jedits_dragoons.txt deleted file mode 100644 index 20ac86d0189..00000000000 --- a/res/cardsfolder/jedits_dragoons.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jedit's Dragoons -ManaCost:5 W -Types:Creature Cat Soldier -Text:no text -PT:2/5 -K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jedits_dragoons.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jenara_asura_of_war.txt b/res/cardsfolder/jenara_asura_of_war.txt deleted file mode 100644 index 6835dc43b57..00000000000 --- a/res/cardsfolder/jenara_asura_of_war.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jenara, Asura of War -ManaCost:G W U -Types:Legendary Creature Angel -Text:no text -PT:3/3 -K:Flying -A:AB$ PutCounter | Cost$ 1 W | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/jenara_asura_of_war.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jerrard_of_the_closed_fist.txt b/res/cardsfolder/jerrard_of_the_closed_fist.txt deleted file mode 100644 index 4ce67119817..00000000000 --- a/res/cardsfolder/jerrard_of_the_closed_fist.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jerrard of the Closed Fist -ManaCost:3 G G R -Types:Creature Human Knight -Text:no text -PT:6/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1661.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jeska_warrior_adept.txt b/res/cardsfolder/jeska_warrior_adept.txt deleted file mode 100644 index 5c34cd360b7..00000000000 --- a/res/cardsfolder/jeska_warrior_adept.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jeska, Warrior Adept -ManaCost:2 R R -Types:Legendary Creature Human Barbarian Warrior -Text:no text -PT:3/1 -K:First Strike -K:Haste -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jeska_warrior_adept.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jesters_cap.txt b/res/cardsfolder/jesters_cap.txt deleted file mode 100644 index bd72f8f43f2..00000000000 --- a/res/cardsfolder/jesters_cap.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jester's Cap -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Player | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | IsCurse$ True | SpellDescription$ Search target player's library for three cards and exile them. Then that player shuffles his or her library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jesters_cap.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/385.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/301.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jet_medallion.txt b/res/cardsfolder/jet_medallion.txt deleted file mode 100644 index 772dbe9f2bf..00000000000 --- a/res/cardsfolder/jet_medallion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jet Medallion -ManaCost:2 -Types:Artifact -Text:Black spells you cast cost 1 less to cast. -K:CostChange:Player:Less:1:Spell:black:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jet_medallion.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jeweled_spirit.txt b/res/cardsfolder/jeweled_spirit.txt deleted file mode 100644 index 3fc75038adb..00000000000 --- a/res/cardsfolder/jeweled_spirit.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Jeweled Spirit -ManaCost:3 W W -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from white | SpellDescription$ Jeweled Spirit gains protection from white until end of turn. -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from blue | SpellDescription$ Jeweled Spirit gains protection from blue until end of turn. -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from black | SpellDescription$ Jeweled Spirit gains protection from black until end of turn. -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from red | SpellDescription$ Jeweled Spirit gains protection from red until end of turn. -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from green | SpellDescription$ Jeweled Spirit gains protection from green until end of turn. -A:AB$ Pump | Cost$ Sac<2/Land> | KW$ Protection from artifacts | SpellDescription$ Jeweled Spirit gains protection from artifacts until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jeweled_spirit.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhessian_infiltrator.txt b/res/cardsfolder/jhessian_infiltrator.txt deleted file mode 100644 index a6428b8d925..00000000000 --- a/res/cardsfolder/jhessian_infiltrator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jhessian Infiltrator -ManaCost:G U -Types:Creature Human Rogue -Text:no text -PT:2/2 -K:Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhessian_infiltrator.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhessian_lookout.txt b/res/cardsfolder/jhessian_lookout.txt deleted file mode 100644 index 96d9263a8ce..00000000000 --- a/res/cardsfolder/jhessian_lookout.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jhessian Lookout -ManaCost:1 U -Types:Creature Human Scout -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhessian_lookout.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhessian_zombies.txt b/res/cardsfolder/jhessian_zombies.txt deleted file mode 100644 index a4c8c9ca070..00000000000 --- a/res/cardsfolder/jhessian_zombies.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jhessian Zombies -ManaCost:4 U B -Types:Creature Zombie -Text:no text -PT:2/4 -K:Fear -K:TypeCycling:Swamp:2 -K:TypeCycling:Island:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhessian_zombies.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhoira_of_the_ghitu.txt b/res/cardsfolder/jhoira_of_the_ghitu.txt deleted file mode 100644 index 9e734bcf917..00000000000 --- a/res/cardsfolder/jhoira_of_the_ghitu.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jhoira of the Ghitu -ManaCost:1 U R -Types:Legendary Creature Human Wizard -Text: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. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhoira_of_the_ghitu.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhoiras_toolbox.txt b/res/cardsfolder/jhoiras_toolbox.txt deleted file mode 100644 index e3da948bd4d..00000000000 --- a/res/cardsfolder/jhoiras_toolbox.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jhoira's Toolbox -ManaCost:2 -Types:Artifact Creature Insect -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ 2 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature. | SpellDescription$ Regenerate target artifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhoiras_toolbox.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhovall_queen.txt b/res/cardsfolder/jhovall_queen.txt deleted file mode 100644 index 3333b592023..00000000000 --- a/res/cardsfolder/jhovall_queen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jhovall Queen -ManaCost:4 W W -Types:Creature Cat Rebel -Text:no text -PT:4/7 -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jhovall_queen.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jhovall_rider.txt b/res/cardsfolder/jhovall_rider.txt deleted file mode 100644 index c8faf06a4a1..00000000000 --- a/res/cardsfolder/jhovall_rider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jhovall Rider -ManaCost:4 W -Types:Creature Human Rebel -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card20172.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jin_gitaxias_core_augur.txt b/res/cardsfolder/jin_gitaxias_core_augur.txt deleted file mode 100644 index 727cafc2ec1..00000000000 --- a/res/cardsfolder/jin_gitaxias_core_augur.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jin-Gitaxias, Core Augur -ManaCost:8 U U -Types:Legendary Creature Praetor -Text:Each opponent's maximum hand size is reduced by seven. -PT:5/4 -K:Flash -K:HandSize - 7 Opponent -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, draw seven cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 7 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/jin_gitaxias_core_augur.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jiwari_the_earth_aflame.txt b/res/cardsfolder/jiwari_the_earth_aflame.txt deleted file mode 100644 index 67d7cc5bef3..00000000000 --- a/res/cardsfolder/jiwari_the_earth_aflame.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jiwari, the Earth Aflame -ManaCost:3 R R -Types:Legendary Creature Spirit -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ X R T | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying. | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature without flying. -A:AB$ DamageAll | PrecostDesc$ Channel - | Cost$ X R R R Discard<1/CARDNAME> | ActivatingZone$ Hand | ValidCards$ Creature.withoutFlying | NumDmg$ X | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals X damage to each creature without flying. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jiwari_the_earth_aflame.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jodahs_avenger.txt b/res/cardsfolder/jodahs_avenger.txt deleted file mode 100644 index d62898cf196..00000000000 --- a/res/cardsfolder/jodahs_avenger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jodah's Avenger -ManaCost:5 U -Types:Creature Shapeshifter -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | NumDef$ -1 | KW$ Double Strike | SpellDescription$ CARDNAME gets -1/-1 and gains double strike until end of turn. -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | NumDef$ -1 | KW$ Protection from red | SpellDescription$ CARDNAME gets -1/-1 and gains protection from red until end of turn. -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | NumDef$ -1 | KW$ Vigilance | SpellDescription$ CARDNAME gets -1/-1 and gains vigilance until end of turn. -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | NumDef$ -1 | KW$ Shadow | SpellDescription$ CARDNAME gets -1/-1 and gains shadow until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jodahs_avenger.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/42.jpg -End diff --git a/res/cardsfolder/join_the_ranks.txt b/res/cardsfolder/join_the_ranks.txt deleted file mode 100644 index d0b997aa8e2..00000000000 --- a/res/cardsfolder/join_the_ranks.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Join the Ranks -ManaCost:3 W -Types:Instant -Text:Put two 1/1 white Soldier Ally creature tokens onto the battlefield. -A:SP$ Token | Cost$ 3 W | TokenAmount$ 2 | TokenName$ Soldier Ally | TokenTypes$ Creature,Soldier,Ally | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/join_the_ranks.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joiner_adept.txt b/res/cardsfolder/joiner_adept.txt deleted file mode 100644 index 28eeafcfcce..00000000000 --- a/res/cardsfolder/joiner_adept.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Joiner Adept -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:2/1 -K:stPumpAll:Land.YouCtrl:0/0/SVar=WMana & SVar=UMana & SVar=BMana & SVar=RMana & SVar=GMana & :no Condition:Lands you control have "Tap: Add one mana of any color to your mana pool." -SVar:WMana:AB$Mana | Cost$ T | Produced$ W | Amount$ 1 | SpellDescription$ Add W to your mana pool. -SVar:UMana:AB$Mana | Cost$ T | Produced$ U | Amount$ 1 | SpellDescription$ Add U to your mana pool. -SVar:BMana:AB$Mana | Cost$ T | Produced$ B | Amount$ 1 | SpellDescription$ Add B to your mana pool. -SVar:RMana:AB$Mana | Cost$ T | Produced$ R | Amount$ 1 | SpellDescription$ Add R to your mana pool. -SVar:GMana:AB$Mana | Cost$ T | Produced$ G | Amount$ 1 | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/joiner_adept.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/89.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jokulhaups.txt b/res/cardsfolder/jokulhaups.txt deleted file mode 100644 index 26d018fbfd2..00000000000 --- a/res/cardsfolder/jokulhaups.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jokulhaups -ManaCost:4 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 R R | ValidCards$ Artifact,Creature,Land | NoRegen$ True | SpellDescription$ Destroy all artifacts, creatures, and lands. They can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14653.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/246.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/192.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/195.jpg -End diff --git a/res/cardsfolder/jolraels_centaur.txt b/res/cardsfolder/jolraels_centaur.txt deleted file mode 100644 index f6b8f35cfdf..00000000000 --- a/res/cardsfolder/jolraels_centaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jolrael's Centaur -ManaCost:1 G G -Types:Creature Centaur Archer -Text:no text -PT:2/2 -K:Flanking -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jolraels_centaur.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jolraels_favor.txt b/res/cardsfolder/jolraels_favor.txt deleted file mode 100644 index 09e384085da..00000000000 --- a/res/cardsfolder/jolraels_favor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jolrael's Favor -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Regenerate | Cost$ 1 G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -#TODO - check rarity on this -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jolraels_favor.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jolt.txt b/res/cardsfolder/jolt.txt deleted file mode 100644 index 838f631aab2..00000000000 --- a/res/cardsfolder/jolt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jolt -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SubAbility$ SVar=DBDraw | SpellDescription$ You may tap or untap target artifact, creature, or land. Draw a card at the beginning of the next turn's upkeep. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 | NextUpkeep$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jolt.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jolting_merfolk.txt b/res/cardsfolder/jolting_merfolk.txt deleted file mode 100644 index 7ff352731b2..00000000000 --- a/res/cardsfolder/jolting_merfolk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jolting Merfolk -ManaCost:2 U U -Types:Creature Merfolk -Text:no text -PT:2/2 -K:Fading:4 -A:AB$ Tap | Cost$ SubCounter<1/FADE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jolting_merfolk.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/34.jpg -End diff --git a/res/cardsfolder/jor_kadeen_the_prevailer.txt b/res/cardsfolder/jor_kadeen_the_prevailer.txt deleted file mode 100644 index 39e6a7445e4..00000000000 --- a/res/cardsfolder/jor_kadeen_the_prevailer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jor Kadeen, the Prevailer -ManaCost:3 R W -Types:Legendary Creature Human Warrior -Text:no text -PT:5/4 -K:First Strike -K:stPumpAll:Creature.YouCtrl:3/0:Metalcraft:Metalcraft - Creatures you control get +3/+0 as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jor_kadeen_the_prevailer.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joraga_bard.txt b/res/cardsfolder/joraga_bard.txt deleted file mode 100644 index ce09a79edd7..00000000000 --- a/res/cardsfolder/joraga_bard.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Joraga Bard -ManaCost:3 G -Types:Creature Elf Rogue Ally -Text:no text -PT:1/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain vigilance until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain vigilance until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Ally.YouCtrl | KW$ Vigilance -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/joraga_bard.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joraga_treespeaker.txt b/res/cardsfolder/joraga_treespeaker.txt deleted file mode 100644 index 208b54d5210..00000000000 --- a/res/cardsfolder/joraga_treespeaker.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Joraga Treespeaker -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:1:2:LevelGE5:1:4:LEVEL 1-4 1/2 tap: Add G G to your mana pool. LEVEL 5+ 1/4 Elves you control have "Tap: Add G G to your mana pool." -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/SVar=Mana:isPresent Creature.Self+countersGE1LEVEL+countersLT5LEVEL:no text -K:stPumpAll:Elf.YouCtrl:0/0/SVar=Mana:isPresent Creature.countersGE5LEVEL+Self:no text -K:Level up:1 G -K:maxLevel:5 -SVar:Mana:AB$Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/joraga_treespeaker.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joraga_warcaller.txt b/res/cardsfolder/joraga_warcaller.txt deleted file mode 100644 index ba35cbd7b9a..00000000000 --- a/res/cardsfolder/joraga_warcaller.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Joraga Warcaller -ManaCost:G -Types:Creature Elf Warrior -Text:Joraga Warcaller enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:1/1 -K:Multikicker 1 G -K:stPumpAll:Creature.Elf+Other+YouCtrl:X/X:no Condition:Other Elf creatures you control get +1/+1 for each +1/+1 counter on CARDNAME. -SVar:X:Count$CardCounters.P1P1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/joraga_warcaller.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/journey_to_nowhere.txt b/res/cardsfolder/journey_to_nowhere.txt deleted file mode 100644 index e70e11ec022..00000000000 --- a/res/cardsfolder/journey_to_nowhere.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Journey to Nowhere -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:DB$ChangeZone | Cost$ 0 | TargetMin$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:DB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/journey_to_nowhere.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/journeyers_kite.txt b/res/cardsfolder/journeyers_kite.txt deleted file mode 100644 index d266a2571cc..00000000000 --- a/res/cardsfolder/journeyers_kite.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Journeyer's Kite -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal it, and put it into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/journeyers_kite.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joven.txt b/res/cardsfolder/joven.txt deleted file mode 100644 index a07e663e002..00000000000 --- a/res/cardsfolder/joven.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Joven -ManaCost:3 R R -Types:Legendary Creature Human Rogue -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ R R R T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Destroy target noncreature artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/joven.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/97.jpg -End diff --git a/res/cardsfolder/jovens_tools.txt b/res/cardsfolder/jovens_tools.txt deleted file mode 100644 index 92c7f479cde..00000000000 --- a/res/cardsfolder/jovens_tools.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Joven's Tools -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 4 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be blocked except by Walls. | SpellDescription$ Target creature can't be blocked this turn except by Walls. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jovens_tools.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/133.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/386.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jovial_evil.txt b/res/cardsfolder/jovial_evil.txt deleted file mode 100644 index 617fbab9755..00000000000 --- a/res/cardsfolder/jovial_evil.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jovial Evil -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B | ValidTgts$ Opponent | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target opponent, where X is twice the number of white creatures that player controls. -SVar:X:Count$NumTypeWhiteOppCtrl.Creature/Twice -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jovial_evil.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/joyous_respite.txt b/res/cardsfolder/joyous_respite.txt deleted file mode 100644 index 102d47abe28..00000000000 --- a/res/cardsfolder/joyous_respite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Joyous Respite -ManaCost:3 G -Types:Sorcery Arcane -Text:no text -A:SP$ GainLife | Cost$ 3 G | LifeAmount$ X | SpellDescription$ You gain 1 life for each land you control. -SVar:X:Count$TypeYouCtrl.Land -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/joyous_respite.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/judge_of_currents.txt b/res/cardsfolder/judge_of_currents.txt deleted file mode 100644 index 5ccabef0092..00000000000 --- a/res/cardsfolder/judge_of_currents.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Judge of Currents -ManaCost:1 W -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -T:Mode$ Taps | ValidCard$ Merfolk.YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a Merfolk you control becomes tapped, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/judge_of_currents.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jugan_the_rising_star.txt b/res/cardsfolder/jugan_the_rising_star.txt deleted file mode 100644 index 94244b526be..00000000000 --- a/res/cardsfolder/jugan_the_rising_star.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Jugan, the Rising Star -ManaCost:3 G G G -Types:Legendary Creature Dragon Spirit -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may distribute five +1/+1 counters among any number of target creatures. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter2 -SVar:PutCounter2:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter3 -SVar:PutCounter3:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (3) | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter4 -SVar:PutCounter4:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (4) | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter5 -SVar:PutCounter5:DB$PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature (5) | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jugan_the_rising_star.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juggernaut.txt b/res/cardsfolder/juggernaut.txt deleted file mode 100644 index 80b3a6bae19..00000000000 --- a/res/cardsfolder/juggernaut.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Juggernaut -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:5/3 -K:CARDNAME attacks each turn if able. -K:CARDNAME can't be blocked by Walls. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/juggernaut.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/255.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/257.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/125.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/328.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/209.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/259.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juju_bubble.txt b/res/cardsfolder/juju_bubble.txt deleted file mode 100644 index c8e47bd04ce..00000000000 --- a/res/cardsfolder/juju_bubble.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Juju Bubble -ManaCost:1 -Types:Artifact -Text:no text -K:Cumulative upkeep:1 -A:AB$ GainLife | Cost$ 2 | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When you play a card, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/juju_bubble.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jukai_messenger.txt b/res/cardsfolder/jukai_messenger.txt deleted file mode 100644 index 0aa3646e864..00000000000 --- a/res/cardsfolder/jukai_messenger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jukai Messenger -ManaCost:G -Types:Creature Human Monk -Text:no text -PT:1/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80525.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jump.txt b/res/cardsfolder/jump.txt deleted file mode 100644 index d221cc476eb..00000000000 --- a/res/cardsfolder/jump.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Jump -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jump.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/61.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/61.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/79.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/59.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/62.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jund_battlemage.txt b/res/cardsfolder/jund_battlemage.txt deleted file mode 100644 index db4f37ce801..00000000000 --- a/res/cardsfolder/jund_battlemage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jund Battlemage -ManaCost:2 R -Types:Creature Human Shaman -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -A:AB$ Token | Cost$ G T | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_battlemage.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jund_charm.txt b/res/cardsfolder/jund_charm.txt deleted file mode 100644 index 8fb235f1286..00000000000 --- a/res/cardsfolder/jund_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jund Charm -ManaCost:R B G -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ R B G | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Choose one - Exile all cards from target player's graveyard; -A:SP$ DamageAll | Cost$ R B G | NumDmg$ 2 | ValidCards$ Creature | SpellDescription$ or Jund Charm deals 2 damage to each creature; -A:SP$ PutCounter | Cost$ R B G | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 2 | SpellDescription$ or put two +1/+1 counters on target creature. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_charm.jpg -SVar:Rarity:Uncommon -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/175.jpg -End diff --git a/res/cardsfolder/jund_hackblade.txt b/res/cardsfolder/jund_hackblade.txt deleted file mode 100644 index f97f49879de..00000000000 --- a/res/cardsfolder/jund_hackblade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jund Hackblade -ManaCost:BG R -Types:Creature Goblin Berserker -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/Haste:isPresent Permanent.MultiColor+Other+YouCtrl:As long as you control another multicolored permanent, Jund Hackblade gets +1/+1 and has haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Permanent.MultiColor -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_hackblade.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jund_panorama.txt b/res/cardsfolder/jund_panorama.txt deleted file mode 100644 index 062c2503896..00000000000 --- a/res/cardsfolder/jund_panorama.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jund Panorama -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Swamp+Basic,Land.Mountain+Basic,Land.Forest+Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic Swamp, Mountain, or Forest card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_panorama.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jund_sojourners.txt b/res/cardsfolder/jund_sojourners.txt deleted file mode 100644 index cafe0ee5dbd..00000000000 --- a/res/cardsfolder/jund_sojourners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jund Sojourners -ManaCost:B R G -Types:Creature Viashino Shaman -Text:no text -PT:3/2 -K:Cycling:2 R -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may have it deal 1 damage to target creature or player. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may have it deal 1 damage to target creature or player. -SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jund_sojourners.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_barrier.txt b/res/cardsfolder/jungle_barrier.txt deleted file mode 100644 index 0b5d6d05892..00000000000 --- a/res/cardsfolder/jungle_barrier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jungle Barrier -ManaCost:2 G U -Types:Creature Plant Wall -Text:no text -PT:2/6 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_barrier.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_basin.txt b/res/cardsfolder/jungle_basin.txt deleted file mode 100644 index 7a73bafcdf8..00000000000 --- a/res/cardsfolder/jungle_basin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jungle Basin -ManaCost:no cost -Types:Land -Text:When CARDNAME enters the battlefield, sacrifice it unless you return an untapped Forest you control to its owner's hand. -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 G | SpellDescription$ Add 1 G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_basin.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_lion.txt b/res/cardsfolder/jungle_lion.txt deleted file mode 100644 index a259b793cec..00000000000 --- a/res/cardsfolder/jungle_lion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jungle Lion -ManaCost:G -Types:Creature Cat -Text:no text -PT:2/1 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4302.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_patrol.txt b/res/cardsfolder/jungle_patrol.txt deleted file mode 100644 index 0bd18e9f466..00000000000 --- a/res/cardsfolder/jungle_patrol.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jungle Patrol -ManaCost:3 G -Types:Creature Human Soldier -Text:no text -PT:3/2 -A:AB$ Token | Cost$ 1 G T | TokenAmount$ 1 | TokenName$ Wood | TokenTypes$ Creature,Wall | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 | TokenKeywords$ Defender | SpellDescription$ Put a 0/1 green Wall creature token with defender named Wood onto the battlefield. -A:AB$ Mana | Cost$ Sac<1/Permanent.token+namedWood> | CostDesc$ Sacrifice a token named Wood: | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_patrol.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_shrine.txt b/res/cardsfolder/jungle_shrine.txt deleted file mode 100644 index 31dd6d1727d..00000000000 --- a/res/cardsfolder/jungle_shrine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jungle Shrine -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_shrine.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_troll.txt b/res/cardsfolder/jungle_troll.txt deleted file mode 100644 index dd1c1f1bb3b..00000000000 --- a/res/cardsfolder/jungle_troll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jungle Troll -ManaCost:1 R G -Types:Creature Troll -Text:no text -PT:2/1 -A:AB$ Regenerate | Cost$ R | SpellDescription$ Regenerate CARDNAME. -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_troll.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_weaver.txt b/res/cardsfolder/jungle_weaver.txt deleted file mode 100644 index 75d7517d13c..00000000000 --- a/res/cardsfolder/jungle_weaver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Jungle Weaver -ManaCost:5 G G -Types:Creature Spider -Text:no text -PT:5/6 -K:Reach -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_weaver.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jungle_wurm.txt b/res/cardsfolder/jungle_wurm.txt deleted file mode 100644 index 7f4878034cb..00000000000 --- a/res/cardsfolder/jungle_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Jungle Wurm -ManaCost:3 G G -Types:Creature Wurm -Text:no text -PT:5/5 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets -1/-1 until end of turn for each creature blocking it beyond the first. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -X | NumDef$ -X -SVar:X:TriggerCount$NumBlockers/Minus.1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jungle_wurm.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juniper_order_advocate.txt b/res/cardsfolder/juniper_order_advocate.txt deleted file mode 100644 index 5b80bdf9d4d..00000000000 --- a/res/cardsfolder/juniper_order_advocate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Juniper Order Advocate -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:1/2 -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:isUntapped:As long as Juniper Order Advocate is untapped, green creatures you control get +1/+1. -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/juniper_order_advocate.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juniper_order_druid.txt b/res/cardsfolder/juniper_order_druid.txt deleted file mode 100644 index e39f6bdd470..00000000000 --- a/res/cardsfolder/juniper_order_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Juniper Order Druid -ManaCost:2 G -Types:Creature Human Cleric Druid -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/juniper_order_druid.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/139.jpg -End diff --git a/res/cardsfolder/juniper_order_ranger.txt b/res/cardsfolder/juniper_order_ranger.txt deleted file mode 100644 index c05772ddf80..00000000000 --- a/res/cardsfolder/juniper_order_ranger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Juniper Order Ranger -ManaCost:3 W G -Types:Creature Human Knight -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature enters the battlefield under your control, put a +1/+1 counter on that creature and a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/juniper_order_ranger.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/junk_diver.txt b/res/cardsfolder/junk_diver.txt deleted file mode 100644 index ad9ca8aa5ed..00000000000 --- a/res/cardsfolder/junk_diver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Junk Diver -ManaCost:3 -Types:Artifact Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return another target artifact card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other+YouCtrl | Cost$ 0 -SVar:SacMe:1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/junk_diver.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/junktroller.txt b/res/cardsfolder/junktroller.txt deleted file mode 100644 index ed832df057c..00000000000 --- a/res/cardsfolder/junktroller.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Junktroller -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:0/6 -K:Defender -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card | TgtPrompt$ Select target card | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/junktroller.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juntu_stakes.txt b/res/cardsfolder/juntu_stakes.txt deleted file mode 100644 index e8c854415dd..00000000000 --- a/res/cardsfolder/juntu_stakes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Juntu Stakes -ManaCost:2 -Types:Artifact -Text:Creatures with power 1 or less don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Creature.powerLE1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/juntu_stakes.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/junun_efreet.txt b/res/cardsfolder/junun_efreet.txt deleted file mode 100644 index 00c5696a9b9..00000000000 --- a/res/cardsfolder/junun_efreet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Junun Efreet -ManaCost:1 B B -Types:Creature Efreet -Text:no text -PT:3/3 -K:Flying -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/junun_efreet.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/27.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/just_fate.txt b/res/cardsfolder/just_fate.txt deleted file mode 100644 index fda7910f39a..00000000000 --- a/res/cardsfolder/just_fate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Just Fate -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ Cast CARDNAME only during the declare attackers step and only if you've been attacked this step. Destroy target attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6519.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juvenile_gloomwidow.txt b/res/cardsfolder/juvenile_gloomwidow.txt deleted file mode 100644 index d0eff7bb3e0..00000000000 --- a/res/cardsfolder/juvenile_gloomwidow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Juvenile Gloomwidow -ManaCost:G G -Types:Creature Spider -Text:no text -PT:1/3 -K:Reach -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/juvenile_gloomwidow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/juzam_djinn.txt b/res/cardsfolder/juzam_djinn.txt deleted file mode 100644 index f58a0cd2b07..00000000000 --- a/res/cardsfolder/juzam_djinn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Juzam Djinn -ManaCost:2 B B -Types:Creature Djinn -Text:no text -PT:5/5 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/an/en-us/card922.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jwar_isle_refuge.txt b/res/cardsfolder/jwar_isle_refuge.txt deleted file mode 100644 index 259dc4c43d5..00000000000 --- a/res/cardsfolder/jwar_isle_refuge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Jwar Isle Refuge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/jwar_isle_refuge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jwari_scuttler.txt b/res/cardsfolder/jwari_scuttler.txt deleted file mode 100644 index 8b4384e0cd2..00000000000 --- a/res/cardsfolder/jwari_scuttler.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Jwari Scuttler -ManaCost:2 U -Types:Creature Crab -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/jwari_scuttler.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/jwari_shapeshifter.txt b/res/cardsfolder/jwari_shapeshifter.txt deleted file mode 100644 index 677d2e27a33..00000000000 --- a/res/cardsfolder/jwari_shapeshifter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Jwari Shapeshifter -ManaCost:1 U -Types:Creature Shapeshifter Ally -Text:You may have CARDNAME enter the battlefield as a copy of any Ally creature on the battlefield. -PT:0/0 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/jwari_shapeshifter.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kabira_crossroads.txt b/res/cardsfolder/kabira_crossroads.txt deleted file mode 100644 index 21d43711823..00000000000 --- a/res/cardsfolder/kabira_crossroads.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kabira Crossroads -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kabira_crossroads.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kabira_vindicator.txt b/res/cardsfolder/kabira_vindicator.txt deleted file mode 100644 index dbb40e318a7..00000000000 --- a/res/cardsfolder/kabira_vindicator.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kabira Vindicator -ManaCost:3 W -Types:Creature Human Knight -Text:no text -PT:2/4 -K:stSetPT:2:4:LevelGE2:3:6:LevelGE5:4:8:LEVEL 2-4 3/6 Other creatures you control get +1/+1. LEVEL 5+ 4/8 Other creatures you control get +2/+2. -K:stPumpAll:Creature.YouCtrl+Other:1/1:isPresent Creature.countersGE2LEVEL+countersLT5LEVEL+Self:no text. -K:stPumpAll:Creature.YouCtrl+Other:2/2:isPresent Creature.countersGE5LEVEL+Self:no text. -K:Level up:2 W -K:maxLevel:5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kabira_vindicator.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kabuto_moth.txt b/res/cardsfolder/kabuto_moth.txt deleted file mode 100644 index 618952da933..00000000000 --- a/res/cardsfolder/kabuto_moth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kabuto Moth -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:1/2 -K:Flying -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ Target creature gets +1/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79105.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/20.jpg -End diff --git a/res/cardsfolder/kaervek_the_merciless.txt b/res/cardsfolder/kaervek_the_merciless.txt deleted file mode 100644 index 3c635e7d4de..00000000000 --- a/res/cardsfolder/kaervek_the_merciless.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kaervek the Merciless -ManaCost:5 B R -Types:Legendary Creature Human Shaman -Text:no text -PT:5/4 -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent casts a spell, CARDNAME deals damage to target creature or player equal to that spell's converted mana cost. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X -SVar:X:TriggeredCard$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaervek_the_merciless.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/242.jpg -End diff --git a/res/cardsfolder/kaerveks_hex.txt b/res/cardsfolder/kaerveks_hex.txt deleted file mode 100644 index 6372de8ec36..00000000000 --- a/res/cardsfolder/kaerveks_hex.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kaervek's Hex -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 B | NumDmg$ 1 | ValidCards$ Creature.nonBlack | ValidDescription$ each nonblack creature. | SubAbility$ SVar=DBDamageAll | SpellDescription$ CARDNAME deals 1 damage to each nonblack creature and an additional 1 damage to each green creature. -SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature.Green | ValidDescription$ each green creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaerveks_hex.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kaerveks_spite.txt b/res/cardsfolder/kaerveks_spite.txt deleted file mode 100644 index df8222f9798..00000000000 --- a/res/cardsfolder/kaerveks_spite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kaervek's Spite -ManaCost:B B B -Types:Instant -Text:no text -A:SP$LoseLife | Cost$ B B B Sac Discard<0/Hand> | ValidTgts$ Player | LifeAmount$ 5 | CostDesc$ As an additional cost to cast Kaervek's Spite, sacrifice all permanents you control and discard your hand. | SpellDescription$ Target player loses 5 life. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaerveks_spite.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kaijin_of_the_vanishing_touch.txt b/res/cardsfolder/kaijin_of_the_vanishing_touch.txt deleted file mode 100644 index d066cd38842..00000000000 --- a/res/cardsfolder/kaijin_of_the_vanishing_touch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kaijin of the Vanishing Touch -ManaCost:1 U -Types:Creature Spirit -Text:no text -PT:0/3 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelayedTrig | TriggerDescription$ Whenever CARDNAME blocks a creature, return that creature to its owner's hand at end of combat. -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return blocked creature to its owner's hand at end of combat. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredAttacker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaijin_of_the_vanishing_touch.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kalastria_highborn.txt b/res/cardsfolder/kalastria_highborn.txt deleted file mode 100644 index 15458b59b8c..00000000000 --- a/res/cardsfolder/kalastria_highborn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kalastria Highborn -ManaCost:B B -Types:Creature Vampire Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Vampire.YouCtrl | Execute$ TrigLoseLife | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another Vampire you control is put into a graveyard from the battlefield, you may pay B. If you do, target player loses 2 life and you gain 2 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Vampire you control is put into a graveyard from the battlefield, you may pay B. If you do, target player loses 2 life and you gain 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kalastria_highborn.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kaleidostone.txt b/res/cardsfolder/kaleidostone.txt deleted file mode 100644 index c9762182da4..00000000000 --- a/res/cardsfolder/kaleidostone.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kaleidostone -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -A:AB$ Mana | Cost$ 5 T Sac<1/CARDNAME> | Produced$ W U B R G | SpellDescription$ Add W U B R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaleidostone.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kalonian_behemoth.txt b/res/cardsfolder/kalonian_behemoth.txt deleted file mode 100644 index edc619defe7..00000000000 --- a/res/cardsfolder/kalonian_behemoth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kalonian Behemoth -ManaCost:5 G G -Types:Creature Beast -Text:no text -PT:9/9 -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kalonian_behemoth.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kamahl_fist_of_krosa.txt b/res/cardsfolder/kamahl_fist_of_krosa.txt deleted file mode 100644 index 7676626fa03..00000000000 --- a/res/cardsfolder/kamahl_fist_of_krosa.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kamahl, Fist of Krosa -ManaCost:4 G G -Types:Legendary Creature Human Nomad -Text:no text -PT:4/3 -A:AB$ Animate | Cost$ G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 1 | Toughness$ 1 | Types$ Creature | SpellDescription$ Target land becomes a 1/1 creature until end of turn. It's still a land. -A:AB$ PumpAll | Cost$ 2 G G G | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Creatures you control get +3/+3 and gain trample until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kamahl_fist_of_krosa.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kamahl_pit_fighter.txt b/res/cardsfolder/kamahl_pit_fighter.txt deleted file mode 100644 index a2bbb9bd2b8..00000000000 --- a/res/cardsfolder/kamahl_pit_fighter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kamahl, Pit Fighter -ManaCost:4 R R -Types:Legendary Creature Human Barbarian -Text:no text -PT:6/1 -K:Haste -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kamahl_pit_fighter.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/198.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kamahls_desire.txt b/res/cardsfolder/kamahls_desire.txt deleted file mode 100644 index 03d1286653d..00000000000 --- a/res/cardsfolder/kamahls_desire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kamahl's Desire -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike -K:stPumpEnchanted:Creature:3/0:Threshold:Threshold - Enchanted creature gets +3/+0 as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kamahls_desire.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_ancient_law.txt b/res/cardsfolder/kami_of_ancient_law.txt deleted file mode 100644 index 90d483ceab9..00000000000 --- a/res/cardsfolder/kami_of_ancient_law.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of Ancient Law -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_ancient_law.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/21.jpg -End diff --git a/res/cardsfolder/kami_of_empty_graves.txt b/res/cardsfolder/kami_of_empty_graves.txt deleted file mode 100644 index b12acc523fd..00000000000 --- a/res/cardsfolder/kami_of_empty_graves.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kami of Empty Graves -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:4/1 -K:Soulshift:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_empty_graves.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_false_hope.txt b/res/cardsfolder/kami_of_false_hope.txt deleted file mode 100644 index de566c1dc23..00000000000 --- a/res/cardsfolder/kami_of_false_hope.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kami of False Hope -ManaCost:W -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Fog | Cost$ Sac<1/CARDNAME> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_false_hope.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_fires_roar.txt b/res/cardsfolder/kami_of_fires_roar.txt deleted file mode 100644 index a6232214519..00000000000 --- a/res/cardsfolder/kami_of_fires_roar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of Fire's Roar -ManaCost:3 R -Types:Creature Spirit -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | TriggerZones$ Battlefield | Execute$ TrigCurse | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target creature can't block this turn. -SVar:TrigCures:AB$Pump | Cost$ 0 | Tgt$ TgtC | IsCurse$ True | KW$ CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_fires_roar.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_lunacy.txt b/res/cardsfolder/kami_of_lunacy.txt deleted file mode 100644 index 2f7d5f4e09f..00000000000 --- a/res/cardsfolder/kami_of_lunacy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of Lunacy -ManaCost:4 B B -Types:Creature Spirit -Text:no text -PT:4/1 -K:Flying -K:Soulshift:5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_lunacy.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_old_stone.txt b/res/cardsfolder/kami_of_old_stone.txt deleted file mode 100644 index b67898ef498..00000000000 --- a/res/cardsfolder/kami_of_old_stone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kami of Old Stone -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:1/7 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83461.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/22.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_tattered_shoji.txt b/res/cardsfolder/kami_of_tattered_shoji.txt deleted file mode 100644 index 4c451ebbf25..00000000000 --- a/res/cardsfolder/kami_of_tattered_shoji.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kami of Tattered Shoji -ManaCost:4 W -Types:Creature Spirit -Text:no text -PT:2/5 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Flying -SVar:BuffedBy:Arcane,Spirit -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_tattered_shoji.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_crescent_moon.txt b/res/cardsfolder/kami_of_the_crescent_moon.txt deleted file mode 100644 index 18a7dc8eca1..00000000000 --- a/res/cardsfolder/kami_of_the_crescent_moon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of the Crescent Moon -ManaCost:U U -Types:Legendary Creature Spirit -Text: -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredPlayer -PT:1/3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_crescent_moon.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_honored_dead.txt b/res/cardsfolder/kami_of_the_honored_dead.txt deleted file mode 100644 index 4dd618c5441..00000000000 --- a/res/cardsfolder/kami_of_the_honored_dead.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kami of the Honored Dead -ManaCost:5 W W -Types:Creature Spirit -Text:no text -PT:3/5 -K:Flying -T:Mode$ DamageDone | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigGain | TriggerDescription$ Whenever CARDNAME is dealt damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_honored_dead.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_hunt.txt b/res/cardsfolder/kami_of_the_hunt.txt deleted file mode 100644 index 9b6d7047dff..00000000000 --- a/res/cardsfolder/kami_of_the_hunt.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kami of the Hunt -ManaCost:2 G -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:BuffedBy:Arcane,Spirit -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_hunt.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_palace_fields.txt b/res/cardsfolder/kami_of_the_palace_fields.txt deleted file mode 100644 index 9e131ad60f5..00000000000 --- a/res/cardsfolder/kami_of_the_palace_fields.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kami of the Palace Fields -ManaCost:5 W -Types:Creature Spirit -Text:no text -PT:3/2 -K:Flying -K:First Strike -K:Soulshift:5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_palace_fields.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_tended_garden.txt b/res/cardsfolder/kami_of_the_tended_garden.txt deleted file mode 100644 index 9260b7105d2..00000000000 --- a/res/cardsfolder/kami_of_the_tended_garden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of the Tended Garden -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:4/4 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G -K:Soulshift:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_tended_garden.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_the_waning_moon.txt b/res/cardsfolder/kami_of_the_waning_moon.txt deleted file mode 100644 index 246a48a8b41..00000000000 --- a/res/cardsfolder/kami_of_the_waning_moon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kami of the Waning Moon -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:1/1 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ 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.) -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_the_waning_moon.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kami_of_twisted_reflection.txt b/res/cardsfolder/kami_of_twisted_reflection.txt deleted file mode 100644 index f7a3260df13..00000000000 --- a/res/cardsfolder/kami_of_twisted_reflection.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kami of Twisted Reflection -ManaCost:1 U U -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature you control to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kami_of_twisted_reflection.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karakas.txt b/res/cardsfolder/karakas.txt deleted file mode 100644 index 76438cdbe6c..00000000000 --- a/res/cardsfolder/karakas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Karakas -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target legendary creature to its owner's hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karakas.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kargan_dragonlord.txt b/res/cardsfolder/kargan_dragonlord.txt deleted file mode 100644 index a3395b2ae37..00000000000 --- a/res/cardsfolder/kargan_dragonlord.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kargan Dragonlord -ManaCost:R R -Types:Creature Human Warrior -Text:no text -PT:2/2 -K:stSetPT:2:2:LevelGE4:4:4:LevelGE8:8:8:LEVEL 4-7 4/4 Flying LEVEL 8+ 8/8 Flying, Trample, R: CARDNAME gets +1/+0 until end of turn. -K:stPumpSelf:Creature.countersGE4LEVEL:0/0/Flying:No Condition:no text -K:stPumpSelf:Creature.countersGE8LEVEL:0/0/Trample & SVar=Pump:No Condition:no text -K:Level up:R -K:maxLevel:8 -SVar:Pump:AB$Pump | Cost$ R | Defined$ Self | NumAtt$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/kargan_dragonlord.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karma.txt b/res/cardsfolder/karma.txt deleted file mode 100644 index e31a52269d6..00000000000 --- a/res/cardsfolder/karma.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Karma -ManaCost:2 W W -Types:Enchantment -Text:At the beginning of each player's upkeep, Karma deals damage to that player equal to the number of Swamps he or she controls. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karma.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/28.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/210.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/212.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/318.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/282.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/210.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karmic_guide.txt b/res/cardsfolder/karmic_guide.txt deleted file mode 100644 index 13e6ea333c2..00000000000 --- a/res/cardsfolder/karmic_guide.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Karmic Guide -ManaCost:3 W W -Types:Creature Angel Spirit -Text:no text -PT:2/2 -K:Flying -K:Protection from black -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to the battlefield. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl -K:Echo:3 W W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/karmic_guide.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karn_silver_golem.txt b/res/cardsfolder/karn_silver_golem.txt deleted file mode 100644 index c855359e218..00000000000 --- a/res/cardsfolder/karn_silver_golem.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Karn, Silver Golem -ManaCost:5 -Types:Legendary Artifact Creature Golem -Text:no text -PT:4/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -4/+4 until end of turn. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -4/+4 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -4 | NumDef$ 4 -A:AB$ Animate | Cost$ 1 | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Creature | SpellDescription$ Target noncreature artifact becomes an artifact creature with power and toughness each equal to its converted mana cost until end of turn. -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/karn_silver_golem.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karns_touch.txt b/res/cardsfolder/karns_touch.txt deleted file mode 100644 index 27d6fa3d567..00000000000 --- a/res/cardsfolder/karns_touch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Karn's Touch -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Animate | Cost$ U U | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select noncreature artifact | Power$ X | Toughness$ X | Types$ Creature | SpellDescription$ 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.) -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/karns_touch.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karoo.txt b/res/cardsfolder/karoo.txt deleted file mode 100644 index 043283b215c..00000000000 --- a/res/cardsfolder/karoo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Karoo -ManaCost:no cost -Types:Land -Text:When CARDNAME enters the battlefield, sacrifice it unless you return an untapped Plains you control to its owner's hand. -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 W | SpellDescription$ Add 1 W to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karoo.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karoo_meerkat.txt b/res/cardsfolder/karoo_meerkat.txt deleted file mode 100644 index 4e1654c9826..00000000000 --- a/res/cardsfolder/karoo_meerkat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Karoo Meerkat -ManaCost:1 G -Types:Creature Mongoose -Text:no text -PT:2/1 -K:Protection from blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karoo_meerkat.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karplusan_forest.txt b/res/cardsfolder/karplusan_forest.txt deleted file mode 100644 index 3aafb70f202..00000000000 --- a/res/cardsfolder/karplusan_forest.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Karplusan Forest -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_forest.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/336.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/429.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/321.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/337.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/354.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karplusan_giant.txt b/res/cardsfolder/karplusan_giant.txt deleted file mode 100644 index 59ee91aa577..00000000000 --- a/res/cardsfolder/karplusan_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Karplusan Giant -ManaCost:6 R -Types:Creature Giant -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ tapXType<1/Land.Snow> | NumAtt$ +1 | NumDef$ +1 | CostDesc$ Tap an untapped snow land you control: | SpellDescription$ Karplusan Giant gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_giant.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karplusan_strider.txt b/res/cardsfolder/karplusan_strider.txt deleted file mode 100644 index 49a5e090298..00000000000 --- a/res/cardsfolder/karplusan_strider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Karplusan Strider -ManaCost:3 G -Types:Creature Yeti -Text:no text -PT:3/4 -K:CARDNAME can't be the target of blue spells. -K:CARDNAME can't be the target of black spells. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121214.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/112.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karplusan_wolverine.txt b/res/cardsfolder/karplusan_wolverine.txt deleted file mode 100644 index 29c569c7aad..00000000000 --- a/res/cardsfolder/karplusan_wolverine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Karplusan Wolverine -ManaCost:R -Types:Snow Creature Wolverine Beast -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_wolverine.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karplusan_yeti.txt b/res/cardsfolder/karplusan_yeti.txt deleted file mode 100644 index ba1514330c4..00000000000 --- a/res/cardsfolder/karplusan_yeti.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Karplusan Yeti -ManaCost:3 R R -Types:Creature Yeti -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DamageThis | SpellDescription$ CARDNAME deals damage equal to its power to target creature. That creature deals damage equal to its power to CARDNAME. -SVar:DamageThis:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y -SVar:X:Count$CardPower -SVar:Y:Targeted$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/karplusan_yeti.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/198.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/karstoderm.txt b/res/cardsfolder/karstoderm.txt deleted file mode 100644 index 6c5d8960b0e..00000000000 --- a/res/cardsfolder/karstoderm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Karstoderm -ManaCost:2 G G -Types:Creature Beast -Text:no text -PT:0/0 -K:etbCounter:P1P1:5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact enters the battlefield, remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/karstoderm.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kashi_tribe_elite.txt b/res/cardsfolder/kashi_tribe_elite.txt deleted file mode 100644 index 0db8235c167..00000000000 --- a/res/cardsfolder/kashi_tribe_elite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kashi-Tribe Elite -ManaCost:1 G G -Types:Creature Snake Warrior -Text:no text -PT:2/3 -K:stPumpAll:Snake.Legendary+YouCtrl:0/0/Shroud:no Condition:Legendary Snakes you control have shroud. (They can't be the targets of spells or abilities.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kashi_tribe_elite.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kashi_tribe_reaver.txt b/res/cardsfolder/kashi_tribe_reaver.txt deleted file mode 100644 index 9fc5a269f34..00000000000 --- a/res/cardsfolder/kashi_tribe_reaver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kashi-Tribe Reaver -ManaCost:3 G -Types:Creature Snake Warrior -Text:no text -PT:3/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kashi_tribe_reaver.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kashi_tribe_warriors.txt b/res/cardsfolder/kashi_tribe_warriors.txt deleted file mode 100644 index 57e9c7b87f5..00000000000 --- a/res/cardsfolder/kashi_tribe_warriors.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kashi-Tribe Warriors -ManaCost:3 G G -Types:Creature Snake Warrior -Text:no text -PT:2/4 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kashi_tribe_warriors.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kasimir_the_lone_wolf.txt b/res/cardsfolder/kasimir_the_lone_wolf.txt deleted file mode 100644 index d7be919b67a..00000000000 --- a/res/cardsfolder/kasimir_the_lone_wolf.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kasimir the Lone Wolf -ManaCost:4 W U -Types:Legendary Creature Human Warrior -Text:no text -PT:5/3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1663.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kataki_wars_wage.txt b/res/cardsfolder/kataki_wars_wage.txt deleted file mode 100644 index 461c9e07297..00000000000 --- a/res/cardsfolder/kataki_wars_wage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kataki, War's Wage -ManaCost:1 W -Types:Legendary Creature Spirit -Text:no text -PT:2/1 -K:stPumpAll:Artifact:0/0/At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1:No Condition:All artifacts have "At the beginning of your upkeep, sacrifice this artifact unless you pay 1." -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kataki_wars_wage.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kathari_bomber.txt b/res/cardsfolder/kathari_bomber.txt deleted file mode 100644 index 5ef70f10bf5..00000000000 --- a/res/cardsfolder/kathari_bomber.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kathari Bomber -ManaCost:1 B R -Types:Creature Bird Shaman -Text:no text -PT:2/2 -K:Flying -K:Unearth:3 B R -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ When CARDNAME deals combat damage to a player, put two 1/1 red Goblin creature tokens onto the battlefield and sacrifice CARDNAME. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SVar=DBSac -SVar:DBSac:DB$Sacrifice | Cost$ 0 | SacValid$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kathari_bomber.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kathari_remnant.txt b/res/cardsfolder/kathari_remnant.txt deleted file mode 100644 index 3662b6d79dc..00000000000 --- a/res/cardsfolder/kathari_remnant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kathari Remnant -ManaCost:2 U B -Types:Creature Bird Skeleton -Text:no text -PT:0/1 -K:Flying -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -K:Cascade -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kathari_remnant.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kathari_screecher.txt b/res/cardsfolder/kathari_screecher.txt deleted file mode 100644 index b53e141f9f1..00000000000 --- a/res/cardsfolder/kathari_screecher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kathari Screecher -ManaCost:2 U -Types:Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -K:Unearth:2 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kathari_screecher.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_aggressor.txt b/res/cardsfolder/kavu_aggressor.txt deleted file mode 100644 index d6c1c6af7ac..00000000000 --- a/res/cardsfolder/kavu_aggressor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kavu Aggressor -ManaCost:2 R -Types:Creature Kavu -Text:no text -PT:3/2 -K:CARDNAME can't block. -K:Kicker:4 -K:etbCounter:P1P1:1:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_aggressor.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_climber.txt b/res/cardsfolder/kavu_climber.txt deleted file mode 100644 index b4524129562..00000000000 --- a/res/cardsfolder/kavu_climber.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kavu Climber -ManaCost:3 G G -Types:Creature Kavu -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83175.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/192.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/249.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_glider.txt b/res/cardsfolder/kavu_glider.txt deleted file mode 100644 index d649b5e3f00..00000000000 --- a/res/cardsfolder/kavu_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kavu Glider -ManaCost:2 R -Types:Creature Kavu -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_glider.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/64.jpg -End diff --git a/res/cardsfolder/kavu_howler.txt b/res/cardsfolder/kavu_howler.txt deleted file mode 100644 index 43678415e91..00000000000 --- a/res/cardsfolder/kavu_howler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kavu Howler -ManaCost:4 G G -Types:Creature Kavu -Text:no text -PT:4/5 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Kavu -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_howler.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_lair.txt b/res/cardsfolder/kavu_lair.txt deleted file mode 100644 index 4b9c8e586a9..00000000000 --- a/res/cardsfolder/kavu_lair.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kavu Lair -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE4 | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with power 4 or greater enters the battlefield, its controller draws a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_lair.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_mauler.txt b/res/cardsfolder/kavu_mauler.txt deleted file mode 100644 index 408c71910ce..00000000000 --- a/res/cardsfolder/kavu_mauler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kavu Mauler -ManaCost:4 G G -Types:Creature Kavu -Text:no text -PT:4/4 -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn for each other attacking Kavu. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Kavu.attacking+Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_mauler.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_monarch.txt b/res/cardsfolder/kavu_monarch.txt deleted file mode 100644 index 6d31a19da50..00000000000 --- a/res/cardsfolder/kavu_monarch.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kavu Monarch -ManaCost:2 R R -Types:Creature Kavu -Text:no text -PT:3/3 -K:stPumpAll:Creature.Kavu:0/0/Trample:No Condition:Kavu creatures have trample. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Kavu.Other | TriggerZones$ Battlefield | Execute$TrigPutCounter | TriggerDescription$ Whenever another Kavu enters the battlefield, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:PlayMain1:TRUE -SVar:BuffedBy:Kavu -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_monarch.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_predator.txt b/res/cardsfolder/kavu_predator.txt deleted file mode 100644 index 65d0b23980d..00000000000 --- a/res/cardsfolder/kavu_predator.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kavu Predator -ManaCost:1 G -Types:Creature Kavu -Text:no text -PT:2/2 -K:Trample -T:Mode$ LifeGained | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPut | TriggerDescription$ Whenever an opponent gains life, put that many +1/+1 counters on CARDNAME. -SVar:TrigPut:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:TriggerCount$LifeAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_predator.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_runner.txt b/res/cardsfolder/kavu_runner.txt deleted file mode 100644 index 4031722d8b1..00000000000 --- a/res/cardsfolder/kavu_runner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kavu Runner -ManaCost:3 R -Types:Creature Kavu -Text:no text -PT:3/3 -K:stPumpSelf:Creature:0/0/Haste:isNotPresent Creature.White+YouDontCtrl,Creature.Blue+YouDontCtrl:Kavu Runner has haste as long as no opponent controls a white or blue creature. -SVar:AntiBuffedBy:Creature.White,Creature.Blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_runner.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_scout.txt b/res/cardsfolder/kavu_scout.txt deleted file mode 100644 index 45acdebeec2..00000000000 --- a/res/cardsfolder/kavu_scout.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kavu Scout -ManaCost:2 R -Types:Creature Kavu Scout -Text:Domain - Kavu Scout gets +1/+0 for each basic land type among lands you control. -PT:0/2 -K:stPumpSelf:Creature:X/0:no Condition:no text -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_scout.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kavu_titan.txt b/res/cardsfolder/kavu_titan.txt deleted file mode 100644 index 2f4cfad3d51..00000000000 --- a/res/cardsfolder/kavu_titan.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kavu Titan -ManaCost:1 G -Types:Creature Kavu -Text:Kavu Titan enters the battlefield with 3 +1/+1 counters and gains trample if it is kicked. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_titan.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kaysa.txt b/res/cardsfolder/kaysa.txt deleted file mode 100644 index 5c9ec415cf6..00000000000 --- a/res/cardsfolder/kaysa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kaysa -ManaCost:3 G G -Types:Legendary Creature Elf Druid -Text:no text -PT:2/3 -K:stPumpAll:Creature.Green+YouCtrl:1/1:No Condition:Green creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kaysa.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kazandu_blademaster.txt b/res/cardsfolder/kazandu_blademaster.txt deleted file mode 100644 index 32b3a755d2c..00000000000 --- a/res/cardsfolder/kazandu_blademaster.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kazandu Blademaster -ManaCost:W W -Types:Creature Human Soldier Ally -Text:no text -PT:1/1 -K:First Strike -K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kazandu_blademaster.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kazandu_refuge.txt b/res/cardsfolder/kazandu_refuge.txt deleted file mode 100644 index fb337a2d105..00000000000 --- a/res/cardsfolder/kazandu_refuge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kazandu Refuge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kazandu_refuge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kazandu_tuskcaller.txt b/res/cardsfolder/kazandu_tuskcaller.txt deleted file mode 100644 index a8ae529ac88..00000000000 --- a/res/cardsfolder/kazandu_tuskcaller.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Kazandu Tuskcaller -ManaCost:1 G -Types:Creature Human Shaman -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:1:1:LevelGE6:1:1:LEVEL 2-5 1/1 -K:stPumpSelf:Creature:0/0/SVar=TokenLow:isPresent Card.Self+countersGE2LEVEL+countersLT6LEVEL:Put a 3/3 green Elephant creature token onto the battlefield. LEVEL 6+ 1/1 -K:stPumpSelf:Creature:0/0/SVar=TokenHigh:isPresent Card.Self+countersGE6LEVEL:Put two 3/3 green Elephant creature tokens onto the battlefield. -SVar:TokenLow:AB$Token | Cost$ T | TokenAmount$ 1 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Elephant creature token onto the battlefield. -SVar:TokenHigh:AB$Token | Cost$ T | TokenAmount$ 2 | TokenName$ Elephant | TokenTypes$ Creature,Elephant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put two 3/3 green Elephant creature tokens onto the battlefield. -K:Level up:1 G -K:maxLevel:6 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kazandu_tuskcaller.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kazuul_warlord.txt b/res/cardsfolder/kazuul_warlord.txt deleted file mode 100644 index dfdaaaed902..00000000000 --- a/res/cardsfolder/kazuul_warlord.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kazuul Warlord -ManaCost:4 R -Types:Creature Minotaur Warrior Ally -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on each Ally creature you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on each Ally creature you control. -SVar:TrigPutCounter:AB$PutCounterAll | Cost$ 0 | ValidCards$ Ally.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kazuul_warlord.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kederekt_leviathan.txt b/res/cardsfolder/kederekt_leviathan.txt deleted file mode 100644 index 8af42e2305d..00000000000 --- a/res/cardsfolder/kederekt_leviathan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kederekt Leviathan -ManaCost:6 U U -Types:Creature Leviathan -Text:no text -PT:5/5 -K:Unearth:6 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return all other nonland permanents to their owners' hands. -SVar:TrigChange:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Permanent.nonLand+Other | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kederekt_leviathan.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kederekt_parasite.txt b/res/cardsfolder/kederekt_parasite.txt deleted file mode 100644 index f3d18b8b8c7..00000000000 --- a/res/cardsfolder/kederekt_parasite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kederekt Parasite -ManaCost:B -Types:Creature Horror -Text:no text -PT:1/1 -T:Mode$ Drawn | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | IsPresent$ Permanent.Red+YouCtrl | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, if you control a red permanent, you may have CARDNAME deal 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kederekt_parasite.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keen_eyed_archers.txt b/res/cardsfolder/keen_eyed_archers.txt deleted file mode 100644 index e32bd71c42e..00000000000 --- a/res/cardsfolder/keen_eyed_archers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Keen-Eyed Archers -ManaCost:2 W -Types:Creature Elf Archer -Text:no text -PT:2/2 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/keen_eyed_archers.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keen_sense.txt b/res/cardsfolder/keen_sense.txt deleted file mode 100644 index 1b409259a13..00000000000 --- a/res/cardsfolder/keen_sense.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Keen Sense -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Opponent | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/keen_sense.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keeneye_aven.txt b/res/cardsfolder/keeneye_aven.txt deleted file mode 100644 index cf1f08152c8..00000000000 --- a/res/cardsfolder/keeneye_aven.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keeneye Aven -ManaCost:3 U -Types:Creature Bird Soldier -Text:no text -PT:2/3 -K:Flying -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keeneye_aven.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keening_banshee.txt b/res/cardsfolder/keening_banshee.txt deleted file mode 100644 index 0cdab306947..00000000000 --- a/res/cardsfolder/keening_banshee.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Keening Banshee -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpCurse | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets -2/-2 until end of turn. -SVar:TrigPumpCurse:DB$Pump| ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | NumAtt$ -2 | NumDef$ -2 -K:Flying -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83599.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keening_stone.txt b/res/cardsfolder/keening_stone.txt deleted file mode 100644 index 8f26e2ecfb7..00000000000 --- a/res/cardsfolder/keening_stone.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Keening Stone -ManaCost:6 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/keening_stone.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keep_watch.txt b/res/cardsfolder/keep_watch.txt deleted file mode 100644 index 906c653b6b4..00000000000 --- a/res/cardsfolder/keep_watch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keep Watch -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ X | SpellDescription$ Draw a card for each attacking creature. -SVar:X:Count$Valid Creature.attacking -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keep_watch.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keeper_of_kookus.txt b/res/cardsfolder/keeper_of_kookus.txt deleted file mode 100644 index e6fdd5582dd..00000000000 --- a/res/cardsfolder/keeper_of_kookus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keeper of Kookus -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R | KW$ Protection from red | SpellDescription$ Keeper of Kookus gains protection from red until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keeper_of_kookus.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/85.jpg -End diff --git a/res/cardsfolder/keeper_of_the_nine_gales.txt b/res/cardsfolder/keeper_of_the_nine_gales.txt deleted file mode 100644 index 215e2185284..00000000000 --- a/res/cardsfolder/keeper_of_the_nine_gales.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Keeper of the Nine Gales -ManaCost:2 U -Types:Creature Bird Wizard -Text:no text -PT:1/2 -K:Flying -A:AB$ ChangeZone | Cost$ T tapXType<2/Bird> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/keeper_of_the_nine_gales.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keeper_of_tresserhorn.txt b/res/cardsfolder/keeper_of_tresserhorn.txt deleted file mode 100644 index a4164bd1be6..00000000000 --- a/res/cardsfolder/keeper_of_tresserhorn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Keeper of Tresserhorn -ManaCost:5 B -Types:Creature Avatar -Text:no text -PT:6/6 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, it assigns no combat damage this turn and defending player loses 2 life. -SVar:TrigPump:DB$Pump | Cost$ 0 | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ SVar=DBLose -SVar:DBLose:DB$LoseLife | Defined$ Opponent | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/keeper_of_tresserhorn.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keepers_of_the_faith.txt b/res/cardsfolder/keepers_of_the_faith.txt deleted file mode 100644 index 9da44642bb6..00000000000 --- a/res/cardsfolder/keepers_of_the_faith.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Keepers of the Faith -ManaCost:1 W W -Types:Creature Human Cleric -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ch/en-us/card2860.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kei_takahashi.txt b/res/cardsfolder/kei_takahashi.txt deleted file mode 100644 index e336b397b58..00000000000 --- a/res/cardsfolder/kei_takahashi.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kei Takahashi -ManaCost:2 G W -Types:Legendary Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature | Amount$ 2 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kei_takahashi.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keiga_the_tide_star.txt b/res/cardsfolder/keiga_the_tide_star.txt deleted file mode 100644 index 9ff5b80ecdc..00000000000 --- a/res/cardsfolder/keiga_the_tide_star.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Keiga, the Tide Star -ManaCost:5 U -Types:Legendary Creature Dragon Spirit -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, gain control of target creature. -SVar:TrigGainControl:AB$GainControl | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card75286.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_arsonist.txt b/res/cardsfolder/keldon_arsonist.txt deleted file mode 100644 index 52219482a26..00000000000 --- a/res/cardsfolder/keldon_arsonist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Keldon Arsonist -ManaCost:2 R -Types:Creature Human Soldier -PT:1/1 -Text:no text -A:AB$ Destroy | Cost$ T Sac<2/Land> | ValidTgts$ Land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_arsonist.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_battlewagon.txt b/res/cardsfolder/keldon_battlewagon.txt deleted file mode 100644 index b4631a72143..00000000000 --- a/res/cardsfolder/keldon_battlewagon.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Keldon Battlewagon -ManaCost:5 -Types:Artifact Creature Juggernaut -Text:no text -PT:0/3 -K:Trample -K:CARDNAME can't block. -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks, sacrifice it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | Defined$ Self -A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the power of the creature tapped this way. -SVar:X:Tapped$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_battlewagon.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_berserker.txt b/res/cardsfolder/keldon_berserker.txt deleted file mode 100644 index ad2b0a2d41e..00000000000 --- a/res/cardsfolder/keldon_berserker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keldon Berserker -ManaCost:3 R -Types:Creature Human Soldier Berserker -Text:no text -PT:2/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | IsPresent$ Land.untapped+YouCtrl | PresentCompare$ EQ0 | TriggerDescription$ Whenever CARDNAME attacks, if you control no untapped lands, it gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_berserker.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/93.jpg -End diff --git a/res/cardsfolder/keldon_champion.txt b/res/cardsfolder/keldon_champion.txt deleted file mode 100644 index 37ac00cb348..00000000000 --- a/res/cardsfolder/keldon_champion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Keldon Champion -ManaCost:2 R R -Types:Creature Human Barbarian -Text:no text -PT:3/2 -K:Haste -K:Echo:2 R R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_champion.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_halberdier.txt b/res/cardsfolder/keldon_halberdier.txt deleted file mode 100644 index 84f66ab2b3a..00000000000 --- a/res/cardsfolder/keldon_halberdier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keldon Halberdier -ManaCost:4 R -Types:Creature Human Warrior -Text:no text -PT:4/1 -K:First Strike -K:Suspend:4:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_halberdier.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_mantle.txt b/res/cardsfolder/keldon_mantle.txt deleted file mode 100644 index cc9ec4b4bdc..00000000000 --- a/res/cardsfolder/keldon_mantle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Keldon Mantle -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Regenerate | Cost$ B | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ G | Defined$ Enchanted | KW$ Trample | SpellDescription$ Enchanted creature gains Trample until end of turn. -#TODO - check rarity on this -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_mantle.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_marauders.txt b/res/cardsfolder/keldon_marauders.txt deleted file mode 100644 index cb258f61693..00000000000 --- a/res/cardsfolder/keldon_marauders.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Keldon Marauders -ManaCost:1 R -Types:Creature Human Warrior -Text:no text -PT:3/3 -K:Vanishing:2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target player. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME leaves the battlefield, it deals 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_marauders.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_megaliths.txt b/res/cardsfolder/keldon_megaliths.txt deleted file mode 100644 index 1835d8971f8..00000000000 --- a/res/cardsfolder/keldon_megaliths.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keldon Megaliths -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtCP | NumDmg$ 1 | ActivatingCardsInHand$ 0 | PrecostDesc$ Hellbent - | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only if you have no cards in hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_megaliths.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_necropolis.txt b/res/cardsfolder/keldon_necropolis.txt deleted file mode 100644 index 309c676baf8..00000000000 --- a/res/cardsfolder/keldon_necropolis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Keldon Necropolis -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ DealDamage | Cost$ 4 R T Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_necropolis.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_vandals.txt b/res/cardsfolder/keldon_vandals.txt deleted file mode 100644 index e40be51d566..00000000000 --- a/res/cardsfolder/keldon_vandals.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Keldon Vandals -ManaCost:2 R -Types:Creature Human Rogue -Text:no text -PT:4/1 -K:Echo:2 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_vandals.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/keldon_warlord.txt b/res/cardsfolder/keldon_warlord.txt deleted file mode 100644 index 44341d510cd..00000000000 --- a/res/cardsfolder/keldon_warlord.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Keldon Warlord -ManaCost:2 R R -Types:Creature Human Barbarian -Text:no text -PT:*/* -K:stSetPT:Count$Valid Creature.nonWall+YouCtrl:Count$Valid Creature.nonWall+YouCtrl:Keldon Warlord's power and toughness are each equal to the number of non-Wall creatures you control. -SVar:BuffedBy:Creature.nonWall -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_warlord.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/161.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/162.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/247.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/225.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/159.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kelinore_bat.txt b/res/cardsfolder/kelinore_bat.txt deleted file mode 100644 index 430f437bae9..00000000000 --- a/res/cardsfolder/kelinore_bat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kelinore Bat -ManaCost:2 B -Types:Creature Bat -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kelinore_bat.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kelsinko_ranger.txt b/res/cardsfolder/kelsinko_ranger.txt deleted file mode 100644 index 5908f08e0b8..00000000000 --- a/res/cardsfolder/kelsinko_ranger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kelsinko Ranger -ManaCost:W -Types:Creature Human -PT:1/1 -Text:no text -A:AB$ Pump | Cost$ 1 W | TgtPrompt$ Choose target green creature | ValidTgts$ Creature.Green | KW$ First Strike | SpellDescription$ Target green creature gains first strike until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kelsinko_ranger.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kemba_kha_regent.txt b/res/cardsfolder/kemba_kha_regent.txt deleted file mode 100644 index 1c6793de66f..00000000000 --- a/res/cardsfolder/kemba_kha_regent.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kemba, Kha Regent -ManaCost:1 W W -Types:Legendary Creature Cat Cleric -Text:no text -PT:2/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, put a 2/2 white Cat creature token onto the battlefield for each Equipment attached to CARDNAME. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ W 2 2 Cat | TokenName$ Cat | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenTypes$ Creature,Cat | TokenAmount$ X | TokenOwner$ You -SVar:X:Count$Valid Equipment.Attached -SVar:EquipMe:Multiple -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kemba_kha_regent.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kembas_skyguard.txt b/res/cardsfolder/kembas_skyguard.txt deleted file mode 100644 index 9219dfc6e25..00000000000 --- a/res/cardsfolder/kembas_skyguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kemba's Skyguard -ManaCost:1 W W -Types:Creature Cat Knight -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kembas_skyguard.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kemuri_onna.txt b/res/cardsfolder/kemuri_onna.txt deleted file mode 100644 index 4c2046223ec..00000000000 --- a/res/cardsfolder/kemuri_onna.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kemuri-Onna -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards a card. -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 1 | Mode$ TgtChoose -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card84705.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kezzerdrix.txt b/res/cardsfolder/kezzerdrix.txt deleted file mode 100644 index 6a432eb2143..00000000000 --- a/res/cardsfolder/kezzerdrix.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kezzerdrix -ManaCost:2 B B -Types:Creature Rabbit Beast -Text:no text -PT:4/4 -K:First Strike -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Creature.YouDontCtrl | PresentCompare$ EQ0 | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if your opponents control no creatures, CARDNAME deals 4 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kezzerdrix.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/khabal_ghoul.txt b/res/cardsfolder/khabal_ghoul.txt deleted file mode 100644 index 25bd0fc0eb8..00000000000 --- a/res/cardsfolder/khabal_ghoul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Khabal Ghoul -ManaCost:2 B -Types:Creature Ghoul -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, put a +1/+1 counter on CARDNAME for each creature put into a graveyard from the battlefield this turn. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/khabal_ghoul.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/khalni_garden.txt b/res/cardsfolder/khalni_garden.txt deleted file mode 100644 index 30db8613d1c..00000000000 --- a/res/cardsfolder/khalni_garden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Khalni Garden -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 0/1 green Plant creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Plant | TokenTypes$ Creature,Plant | TokenOwner$ You | TokenColors$ Green | TokenPower$ 0 | TokenToughness$ 1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/khalni_garden.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/khalni_gem.txt b/res/cardsfolder/khalni_gem.txt deleted file mode 100644 index 7c6c89a04ea..00000000000 --- a/res/cardsfolder/khalni_gem.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Khalni Gem -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -T:Mode$ ChangesZone$ | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, return two lands you control to their owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | ChangeType$ Land.YouCtrl | ChangeNum$ 2 | Hidden$ True | TgtPrompt$ Select 2 target lands you control -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/khalni_gem.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/khalni_heart_expedition.txt b/res/cardsfolder/khalni_heart_expedition.txt deleted file mode 100644 index 60b5d0d489d..00000000000 --- a/res/cardsfolder/khalni_heart_expedition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Khalni Heart Expedition -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -A:AB$ ChangeZone | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 2 | Tapped$ True | SpellDescription$ Search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/khalni_heart_expedition.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/khalni_hydra.txt b/res/cardsfolder/khalni_hydra.txt deleted file mode 100644 index 931cee56a00..00000000000 --- a/res/cardsfolder/khalni_hydra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Khalni Hydra -ManaCost:G G G G G G G G -Types:Creature Hydra -Text:Khalni Hydra costs Green less to cast for each green creature you control. -PT:8/8 -K:Trample -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/khalni_hydra.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kher_keep.txt b/res/cardsfolder/kher_keep.txt deleted file mode 100644 index ee9daf857d9..00000000000 --- a/res/cardsfolder/kher_keep.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kher Keep -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Token | Cost$ 1 R T | TokenAmount$ 1 | TokenName$ Kobolds of Kher Keep | TokenTypes$ Creature,Kobold | TokenOwner$ You | TokenColors$ Red | TokenPower$ 0 | TokenToughness$ 1 | SpellDescription$ Put a 0/1 red Kobold creature token named Kobolds of Kher Keep onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kher_keep.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiki_jiki_mirror_breaker.txt b/res/cardsfolder/kiki_jiki_mirror_breaker.txt deleted file mode 100644 index 4506b4d5f5e..00000000000 --- a/res/cardsfolder/kiki_jiki_mirror_breaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kiki-Jiki, Mirror Breaker -ManaCost:2 R R R -Types:Legendary Creature Goblin Shaman -Text:no text -PT:2/2 -K:Haste -A:AB$CopyPermanent | Cost$ T | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target nonlegendary creature you control | Keywords$ Haste | AtEOT$ Sacrifice | SpellDescription$ 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. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50321.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiku_nights_flower.txt b/res/cardsfolder/kiku_nights_flower.txt deleted file mode 100644 index 85685f437b7..00000000000 --- a/res/cardsfolder/kiku_nights_flower.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kiku, Night's Flower -ManaCost:B B -Types:Legendary Creature Human Assassin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ 2 B B T | Tgt$ TgtC | NumDmg$ X | DamageSource$ Targeted | SpellDescription$ Target creature deals damage to itself equal to its power. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kiku_nights_flower.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/121.jpg -End diff --git a/res/cardsfolder/kikus_shadow.txt b/res/cardsfolder/kikus_shadow.txt deleted file mode 100644 index 735777f45cf..00000000000 --- a/res/cardsfolder/kikus_shadow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kiku's Shadow -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ B B | Tgt$ TgtC | NumDmg$ X | DamageSource$ Targeted | SpellDescription$ Target creature deals damage to itself equal to its power. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kikus_shadow.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/77.jpg -End diff --git a/res/cardsfolder/killer_bees.txt b/res/cardsfolder/killer_bees.txt deleted file mode 100644 index 46c544612ce..00000000000 --- a/res/cardsfolder/killer_bees.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Killer Bees -ManaCost:1 G G -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ G | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/killer_bees.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/169.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/138.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/106.jpg -End diff --git a/res/cardsfolder/killer_whale.txt b/res/cardsfolder/killer_whale.txt deleted file mode 100644 index f3a5405320f..00000000000 --- a/res/cardsfolder/killer_whale.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Killer Whale -ManaCost:3 U U -Types:Creature Whale -Text:no text -PT:3/5 -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ex/en-us/card6065.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiln_fiend.txt b/res/cardsfolder/kiln_fiend.txt deleted file mode 100644 index 833ceb57cb9..00000000000 --- a/res/cardsfolder/kiln_fiend.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kiln Fiend -ManaCost:1 R -Types:Creature Elemental Beast -Text:no text -PT:1/2 -T:Mode$ SpellCast | ValidCard$ Instant.YouCtrl,Sorcery.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a instant or sorcery spell, CARDNAME gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ +3 | NumDef$ +0 | Defined$ Self -SVar:BuffedBy:Instant,Sorcery -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kiln_fiend.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiln_walker.txt b/res/cardsfolder/kiln_walker.txt deleted file mode 100644 index 1d3a96fd2d8..00000000000 --- a/res/cardsfolder/kiln_walker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kiln Walker -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:0/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kiln_walker.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kindle.txt b/res/cardsfolder/kindle.txt deleted file mode 100644 index 8a2a5a30d55..00000000000 --- a/res/cardsfolder/kindle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kindle -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player, where X is 2 plus the number of cards named CARDNAME in all graveyards. -SVar:X:Count$NamedInAllYards.Kindle/Plus.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kindle.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/184.jpg -End diff --git a/res/cardsfolder/kindled_fury.txt b/res/cardsfolder/kindled_fury.txt deleted file mode 100644 index 2c35ba67000..00000000000 --- a/res/cardsfolder/kindled_fury.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kindled Fury -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target creature gets +1/+0 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kindled_fury.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/92.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/144.jpg -End diff --git a/res/cardsfolder/king_cheetah.txt b/res/cardsfolder/king_cheetah.txt deleted file mode 100644 index 94f0712dd25..00000000000 --- a/res/cardsfolder/king_cheetah.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:King Cheetah -ManaCost:3 G -Types:Creature Cat -Text:no text -PT:3/2 -K:Flash -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/king_cheetah.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/60.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/king_crab.txt b/res/cardsfolder/king_crab.txt deleted file mode 100644 index e51e090ea9f..00000000000 --- a/res/cardsfolder/king_crab.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:King Crab -ManaCost:4 U U -Types:Creature Crab -Text:no text -PT:4/5 -A:AB$ ChangeZone | Cost$ 1 U T | ValidTgts$ Creature.Green | TgtPrompt$ Select target green Creature | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target green creature on top of its owner's library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/king_crab.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/king_suleiman.txt b/res/cardsfolder/king_suleiman.txt deleted file mode 100644 index a5356c5fb14..00000000000 --- a/res/cardsfolder/king_suleiman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:King Suleiman -ManaCost:1 W -Types:Creature Human -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Djinn,Efreet | TgtPrompt$ Select target Djinn or Efreet | SpellDescription$ Destroy target Djinn or Efreet. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/king_suleiman.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kingfisher.txt b/res/cardsfolder/kingfisher.txt deleted file mode 100644 index b9a0d1de58a..00000000000 --- a/res/cardsfolder/kingfisher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kingfisher -ManaCost:3 U -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kingfisher.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kings_assassin.txt b/res/cardsfolder/kings_assassin.txt deleted file mode 100644 index 890b591afb3..00000000000 --- a/res/cardsfolder/kings_assassin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:King's Assassin -ManaCost:1 B B -Types:Creature Human Assassin -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Destroy target tapped creature. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/kings_assassin.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kinsbaile_balloonist.txt b/res/cardsfolder/kinsbaile_balloonist.txt deleted file mode 100644 index fbb95422b8c..00000000000 --- a/res/cardsfolder/kinsbaile_balloonist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kinsbaile Balloonist -ManaCost:3 W -Types:Creature Kithkin Soldier -Text:no text -PT:2/2 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may have target creature gain flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | KW$ Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kinsbaile_balloonist.jpg -SetInfo:LRW|Common|http://magiccards.info/lw/en/23.html -End \ No newline at end of file diff --git a/res/cardsfolder/kinsbaile_borderguard.txt b/res/cardsfolder/kinsbaile_borderguard.txt deleted file mode 100644 index ab64706d626..00000000000 --- a/res/cardsfolder/kinsbaile_borderguard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kinsbaile Borderguard -ManaCost:1 W W -Types:Creature Kithkin Soldier -Text:CARDNAME enters the battlefield with a +1/+1 counter on it for each other Kithkin you control.\r\nWhen CARDNAME is put into a graveyard from the battlefield, put a 1/1 white Kithkin Soldier creature token onto the battlefield for each counter on it. -PT:1/1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kinsbaile_borderguard.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kinsbaile_cavalier.txt b/res/cardsfolder/kinsbaile_cavalier.txt deleted file mode 100644 index 2cd0b254330..00000000000 --- a/res/cardsfolder/kinsbaile_cavalier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kinsbaile Cavalier -ManaCost:3 W -Types:Creature Kithkin Knight -Text:no text -PT:2/2 -K:stPumpAll:Creature.Knight+YouCtrl:0/0/Double Strike:No Condition:Knight creatures you control have double strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kinsbaile_cavalier.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kinsbaile_skirmisher.txt b/res/cardsfolder/kinsbaile_skirmisher.txt deleted file mode 100644 index 48e2dc24218..00000000000 --- a/res/cardsfolder/kinsbaile_skirmisher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kinsbaile Skirmisher -ManaCost:1 W -Types:Creature Kithkin Soldier -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kinsbaile_skirmisher.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kird_ape.txt b/res/cardsfolder/kird_ape.txt deleted file mode 100644 index b2f33751e94..00000000000 --- a/res/cardsfolder/kird_ape.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kird Ape -ManaCost:R -Types:Creature Ape -Text:no text -PT:1/1 -#Kird Ape gets +1/+2 as long as you control a Forest. -K:stPumpSelf:Creature:1/2:isPresent Forest.YouCtrl:CARDNAME gets +1/+2 as long as you control a Forest. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kird_ape.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/160.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/199.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiri_onna.txt b/res/cardsfolder/kiri_onna.txt deleted file mode 100644 index 7cde97d0866..00000000000 --- a/res/cardsfolder/kiri_onna.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kiri-Onna -ManaCost:4 U -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturnOther | TriggerDescription$ When CARDNAME enters the battlefield, return target creature to its owner's hand. -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturnThis | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. -SVar:TrigReturnOther:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:TrigReturnThis:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kiri_onna.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kirtars_desire.txt b/res/cardsfolder/kirtars_desire.txt deleted file mode 100644 index 4e25da4cb76..00000000000 --- a/res/cardsfolder/kirtars_desire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kirtar's Desire -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack.:Enchanted creature can't attack. -K:stPumpEnchanted:Creature:0/0/HIDDEN CARDNAME can't block.:Threshold:Threshold - Enchanted creature can't block as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kirtars_desire.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kismet.txt b/res/cardsfolder/kismet.txt deleted file mode 100644 index e7acf8da9f3..00000000000 --- a/res/cardsfolder/kismet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kismet -ManaCost:3 W -Types:Enchantment -Text:Artifacts, creatures, and lands your opponents control enter the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kismet.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/319.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/27.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/283.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiss_of_death.txt b/res/cardsfolder/kiss_of_death.txt deleted file mode 100644 index 492650dd530..00000000000 --- a/res/cardsfolder/kiss_of_death.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kiss of Death -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 B B | ValidTgts$ Opponent | NumDmg$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target opponent. You gain 4 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/kiss_of_death.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kiss_of_the_amesha.txt b/res/cardsfolder/kiss_of_the_amesha.txt deleted file mode 100644 index 9154c86d08f..00000000000 --- a/res/cardsfolder/kiss_of_the_amesha.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kiss of the Amesha -ManaCost:4 W U -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 4 W U | LifeAmount$ 7 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ SVar=DBDraw | SpellDescription$ Target player gains 7 life and draws two cards. -SVar:DBDraw:DB$Draw | Defined$ Targeted | NumCards$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kiss_of_the_amesha.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/177.jpg -End diff --git a/res/cardsfolder/kitchen_finks.txt b/res/cardsfolder/kitchen_finks.txt deleted file mode 100644 index ce332fd9943..00000000000 --- a/res/cardsfolder/kitchen_finks.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kitchen Finks -ManaCost:1 GW GW -Types:Creature Ouphe -Text:no text -PT:3/2 -K:Persist -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitchen_finks.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kitesail.txt b/res/cardsfolder/kitesail.txt deleted file mode 100644 index 74f781a44ef..00000000000 --- a/res/cardsfolder/kitesail.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kitesail -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0 and has flying. -K:eqPump 2:+1/+0/Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitesail.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kitesail_apprentice.txt b/res/cardsfolder/kitesail_apprentice.txt deleted file mode 100644 index cd9dd152db4..00000000000 --- a/res/cardsfolder/kitesail_apprentice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kitesail Apprentice -ManaCost:W -Types:Creature Kor Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Permanent.equipped:1/1/Flying:No Condition:As long as Kitesail Apprentice is equipped, it gets +1/+1 and has flying. -SVar:EquipMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitesail_apprentice.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_daggerdare.txt b/res/cardsfolder/kithkin_daggerdare.txt deleted file mode 100644 index deaf9b7ac00..00000000000 --- a/res/cardsfolder/kithkin_daggerdare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kithkin Daggerdare -ManaCost:1 G -Types:Creature Kithkin Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T G | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Target attacking creature gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_daggerdare.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_greatheart.txt b/res/cardsfolder/kithkin_greatheart.txt deleted file mode 100644 index 5e1c0bbe563..00000000000 --- a/res/cardsfolder/kithkin_greatheart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kithkin Greatheart -ManaCost:1 W -Types:Creature Kithkin Soldier -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/First Strike:isPresent Giant.YouCtrl:As long as you control a Giant, Kithkin Greatheart gets +1/+1 and has first strike. -SVar:BuffedBy:Giant -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_greatheart.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_harbinger.txt b/res/cardsfolder/kithkin_harbinger.txt deleted file mode 100644 index 236639e05bb..00000000000 --- a/res/cardsfolder/kithkin_harbinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kithkin Harbinger -ManaCost:2 W -Types:Creature Kithkin Wizard -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Kithkin | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_healer.txt b/res/cardsfolder/kithkin_healer.txt deleted file mode 100644 index 3e7ccd5d614..00000000000 --- a/res/cardsfolder/kithkin_healer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kithkin Healer -ManaCost:2 W -Types:Creature Kithkin Cleric -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_healer.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_rabble.txt b/res/cardsfolder/kithkin_rabble.txt deleted file mode 100644 index 2cad77c5eaa..00000000000 --- a/res/cardsfolder/kithkin_rabble.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kithkin Rabble -ManaCost:3 W -Types:Creature Kithkin -Text:no text -PT:*/* -K:Vigilance -K:stSetPT:Count$Valid Permanent.White+YouCtrl:Count$Valid Permanent.White+YouCtrl:CARDNAME's power and toughness are each equal to the number of white permanents you control. -SVar:BuffedBy:Permanent.White -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_rabble.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_shielddare.txt b/res/cardsfolder/kithkin_shielddare.txt deleted file mode 100644 index d820a6900ef..00000000000 --- a/res/cardsfolder/kithkin_shielddare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kithkin Shielddare -ManaCost:1 W -Types:Creature Kithkin Soldier -PT:1/1 -Text:no text -A:AB$ Pump | Cost$ W T | ValidTgts$ Creature.blocking | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target blocking creature gets +2/+2 until end of turn. | TgtPrompt$ Select target blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_shielddare.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_spellduster.txt b/res/cardsfolder/kithkin_spellduster.txt deleted file mode 100644 index f1a1e56a4a4..00000000000 --- a/res/cardsfolder/kithkin_spellduster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kithkin Spellduster -ManaCost:4 W -Types:Creature Kithkin Wizard -Text:no text -PT:2/3 -K:Flying -K:Persist -A:AB$ Destroy | Cost$ 1 W Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_spellduster.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kithkin_zephyrnaut.txt b/res/cardsfolder/kithkin_zephyrnaut.txt deleted file mode 100644 index 6c4bacb9efc..00000000000 --- a/res/cardsfolder/kithkin_zephyrnaut.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kithkin Zephyrnaut -ManaCost:2 W -Types:Creature Kithkin Soldier -Text: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. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_zephyrnaut.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kitsune_blademaster.txt b/res/cardsfolder/kitsune_blademaster.txt deleted file mode 100644 index d6cb615a5ab..00000000000 --- a/res/cardsfolder/kitsune_blademaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kitsune Blademaster -ManaCost:2 W -Types:Creature Fox Samurai -Text:no text -PT:2/2 -K:First Strike -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_blademaster.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kitsune_dawnblade.txt b/res/cardsfolder/kitsune_dawnblade.txt deleted file mode 100644 index 420196b81de..00000000000 --- a/res/cardsfolder/kitsune_dawnblade.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kitsune Dawnblade -ManaCost:4 W -Types:Creature Fox Samurai -Text:no text -PT:2/3 -K:Bushido 1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_dawnblade.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kitsune_diviner.txt b/res/cardsfolder/kitsune_diviner.txt deleted file mode 100644 index f1868c9a7d3..00000000000 --- a/res/cardsfolder/kitsune_diviner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kitsune Diviner -ManaCost:W -Types:Creature Fox Cleric -Text:no text -PT:0/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Spirit | TgtPrompt$ Select target Spirit | SpellDescription$ Tap target Spirit. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_diviner.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/26.jpg -End diff --git a/res/cardsfolder/kitsune_loreweaver.txt b/res/cardsfolder/kitsune_loreweaver.txt deleted file mode 100644 index 0284008a6f6..00000000000 --- a/res/cardsfolder/kitsune_loreweaver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kitsune Loreweaver -ManaCost:1 W -Types:Creature Fox Cleric -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 1 W | NumDef$ +X | SpellDescription$ Kitsune Loreweaver gets +0/+X until end of turn, where X is the number of cards in your hand. -SVar:X:Count$NumCardsInYourHand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_loreweaver.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/17.jpg -End diff --git a/res/cardsfolder/kitsune_riftwalker.txt b/res/cardsfolder/kitsune_riftwalker.txt deleted file mode 100644 index 1ed977f3faa..00000000000 --- a/res/cardsfolder/kitsune_riftwalker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kitsune Riftwalker -ManaCost:1 W W -Types:Creature Fox Wizard -Text:no text -PT:2/1 -K:Protection:Spirit,Arcane:Protection from Spirits and from Arcane -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kitsune_riftwalker.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_dead.txt b/res/cardsfolder/kjeldoran_dead.txt deleted file mode 100644 index 9be9942b0d9..00000000000 --- a/res/cardsfolder/kjeldoran_dead.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kjeldoran Dead -ManaCost:B -Types:Creature Skeleton -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_dead.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/32.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/140.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_gargoyle.txt b/res/cardsfolder/kjeldoran_gargoyle.txt deleted file mode 100644 index 125892faaae..00000000000 --- a/res/cardsfolder/kjeldoran_gargoyle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kjeldoran Gargoyle -ManaCost:5 W -Types:Creature Gargoyle -Text:no text -PT:3/3 -K:Flying -K:First Strike -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_gargoyle.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_home_guard.txt b/res/cardsfolder/kjeldoran_home_guard.txt deleted file mode 100644 index 62dad54f7c3..00000000000 --- a/res/cardsfolder/kjeldoran_home_guard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kjeldoran Home Guard -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:1/6 -T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | IsPresent$ Card.attacking+Self,Card.blocking+Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At end of combat, if CARDNAME attacked or blocked this combat, put a -0/-1 counter on CARDNAME and put a 0/1 white Deserter creature token onto the battlefield. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ M0M1 | CounterNum$ 1 | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Deserter | TokenTypes$ Creature,Deserter | TokenOwner$ You | TokenColors$ White | TokenPower$ 0 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_home_guard.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_javelineer.txt b/res/cardsfolder/kjeldoran_javelineer.txt deleted file mode 100644 index 84ebbe4890e..00000000000 --- a/res/cardsfolder/kjeldoran_javelineer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kjeldoran Javelineer -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:Cumulative upkeep:W -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of age counters on it to target attacking or blocking creature. -SVar:X:Count$CardCounters.AGE -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_javelineer.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_outpost.txt b/res/cardsfolder/kjeldoran_outpost.txt deleted file mode 100644 index 058b26d4db8..00000000000 --- a/res/cardsfolder/kjeldoran_outpost.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kjeldoran Outpost -ManaCost:no cost -Types:Land -Text: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. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Token | Cost$ 1 W T | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 white Soldier creature token onto the battlefield. -SVar:NeedsToPlay:Plains.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_outpost.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kjeldoran_outrider.txt b/res/cardsfolder/kjeldoran_outrider.txt deleted file mode 100644 index fbecabcca41..00000000000 --- a/res/cardsfolder/kjeldoran_outrider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kjeldoran Outrider -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kjeldoran_outrider.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/12.jpg -End diff --git a/res/cardsfolder/kjeldoran_war_cry.txt b/res/cardsfolder/kjeldoran_war_cry.txt deleted file mode 100644 index efc5f9a4b72..00000000000 --- a/res/cardsfolder/kjeldoran_war_cry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kjeldoran War Cry -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | SpellDescription$ 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. -SVar:X:Count$NamedInAllYards.Kjeldoran War Cry/Plus.1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121148.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_captain_of_eos.txt b/res/cardsfolder/knight_captain_of_eos.txt deleted file mode 100644 index 055a9cec417..00000000000 --- a/res/cardsfolder/knight_captain_of_eos.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Knight-Captain of Eos -ManaCost:4 W -Types:Creature Human Knight -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 1/1 white Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -A:AB$ Fog | Cost$ W Sac<1/Soldier> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_captain_of_eos.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_errant.txt b/res/cardsfolder/knight_errant.txt deleted file mode 100644 index 9403b68e7a4..00000000000 --- a/res/cardsfolder/knight_errant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knight Errant -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card13099.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/19.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/182.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_exemplar.txt b/res/cardsfolder/knight_exemplar.txt deleted file mode 100644 index 80fc0744273..00000000000 --- a/res/cardsfolder/knight_exemplar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Knight Exemplar -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:stPumpAll:Creature.Knight+Other+YouCtrl:1/1/HIDDEN Indestructible:No Condition:Other Knight creatures you control get +1/+1 and are indestructible. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_exemplar.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_cliffhaven.txt b/res/cardsfolder/knight_of_cliffhaven.txt deleted file mode 100644 index ab69c753cdc..00000000000 --- a/res/cardsfolder/knight_of_cliffhaven.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Knight of Cliffhaven -ManaCost:1 W -Types:Creature Kor Knight -Text:no text -PT:2/2 -K:stSetPT:2:2:LevelGE1:2:3:LevelGE4:4:4:LEVEL 1-3 2/3 Flying LEVEL 4+ 4/4 Flying Vigilance -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/Flying:No Condition:no text -K:stPumpSelf:Creature.countersGE4LEVEL:0/0/Vigilance:No Condition:no text -K:Level up:3 -K:maxLevel:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_cliffhaven.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_dawn.txt b/res/cardsfolder/knight_of_dawn.txt deleted file mode 100644 index b723c44c8fe..00000000000 --- a/res/cardsfolder/knight_of_dawn.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Knight of Dawn -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -A:AB$ Pump | Cost$ W W | KW$ Protection from black | SpellDescription$ CARDNAME gains protection from black until end of turn. -A:AB$ Pump | Cost$ W W | KW$ Protection from blue | SpellDescription$ CARDNAME gains protection from blue until end of turn. -A:AB$ Pump | Cost$ W W | KW$ Protection from green | SpellDescription$ CARDNAME gains protection from green until end of turn. -A:AB$ Pump | Cost$ W W | KW$ Protection from red | SpellDescription$ CARDNAME gains protection from red until end of turn. -A:AB$ Pump | Cost$ W W | KW$ Protection from white | SpellDescription$ CARDNAME gains protection from white until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_dawn.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/238.jpg -End diff --git a/res/cardsfolder/knight_of_dusk.txt b/res/cardsfolder/knight_of_dusk.txt deleted file mode 100644 index 5a386230b99..00000000000 --- a/res/cardsfolder/knight_of_dusk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knight of Dusk -ManaCost:1 B B -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ B B | ValidTgts$ Creature.blockingSource | TgtPrompt$ Select target creature blocking Knight of Dusk | SpellDescription$ Destroy target creature blocking CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_dusk.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/34.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_meadowgrain.txt b/res/cardsfolder/knight_of_meadowgrain.txt deleted file mode 100644 index 262365bb4c2..00000000000 --- a/res/cardsfolder/knight_of_meadowgrain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knight of Meadowgrain -ManaCost:W W -Types:Creature Kithkin Knight -Text:no text -PT:2/2 -K:First Strike -K:Lifelink -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_meadowgrain.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_new_alara.txt b/res/cardsfolder/knight_of_new_alara.txt deleted file mode 100644 index 76f52f68ab2..00000000000 --- a/res/cardsfolder/knight_of_new_alara.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Knight of New Alara -ManaCost:2 W G -Types:Creature Human Knight -Text:Each other multicolored creature you control gets +1/+1 for each of its colors. -PT:2/2 -K:stPumpAll:Creature.MultiColor+Other+YouCtrl+White:1/1:no Condition:no text -K:stPumpAll:Creature.MultiColor+Other+YouCtrl+Blue:1/1:no Condition:no text -K:stPumpAll:Creature.MultiColor+Other+YouCtrl+Black:1/1:no Condition:no text -K:stPumpAll:Creature.MultiColor+Other+YouCtrl+Red:1/1:no Condition:no text -K:stPumpAll:Creature.MultiColor+Other+YouCtrl+Green:1/1:no Condition:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_new_alara.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_stromgald.txt b/res/cardsfolder/knight_of_stromgald.txt deleted file mode 100644 index 396edfd306f..00000000000 --- a/res/cardsfolder/knight_of_stromgald.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Knight of Stromgald -ManaCost:B B -Types:Creature Human Knight -Text:no text -PT:2/1 -K:Protection from white -A:AB$ Pump | Cost$ B | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ B B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_stromgald.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/33.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/26.jpg -End diff --git a/res/cardsfolder/knight_of_sursi.txt b/res/cardsfolder/knight_of_sursi.txt deleted file mode 100644 index a7b25eb0912..00000000000 --- a/res/cardsfolder/knight_of_sursi.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Knight of Sursi -ManaCost:3 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flying -K:Flanking -K:Suspend:3:W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_sursi.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_the_reliquary.txt b/res/cardsfolder/knight_of_the_reliquary.txt deleted file mode 100644 index 92f305de4b9..00000000000 --- a/res/cardsfolder/knight_of_the_reliquary.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Knight of the Reliquary -ManaCost:1 G W -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ T Sac<1/Forest;Plains> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | CostDesc$ T, Sacrifice a Forest or Plains: | SpellDescription$ Search your library for a land card, put it onto the battlefield, then shuffle your library. -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +1/+1 for each land card in your graveyard. -SVar:X:Count$TypeInYourYard.Land -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_the_reliquary.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_the_skyward_eye.txt b/res/cardsfolder/knight_of_the_skyward_eye.txt deleted file mode 100644 index 4abba4a574a..00000000000 --- a/res/cardsfolder/knight_of_the_skyward_eye.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Knight of the Skyward Eye -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 3 G | NumAtt$ +3 | NumDef$ +3 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_the_skyward_eye.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_the_white_orchid.txt b/res/cardsfolder/knight_of_the_white_orchid.txt deleted file mode 100644 index df2fb0e03ce..00000000000 --- a/res/cardsfolder/knight_of_the_white_orchid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Knight of the White Orchid -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | IsPresent$ Land.YouDontCtrl | PresentCompare$ GTX | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:X:Count$Valid Land.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_the_white_orchid.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knight_of_valor.txt b/res/cardsfolder/knight_of_valor.txt deleted file mode 100644 index 5e48adbedce..00000000000 --- a/res/cardsfolder/knight_of_valor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knight of Valor -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.withoutFlanking+blockingSource | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | ActivationLimit$ 1 | SpellDescription$ Each creature without flanking blocking CARDNAME gets -1/-1 until end of turn. Activate this ability only once each turn. -Var:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/knight_of_valor.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knighthood.txt b/res/cardsfolder/knighthood.txt deleted file mode 100644 index 7d8026acb7e..00000000000 --- a/res/cardsfolder/knighthood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knighthood -ManaCost:2 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/First Strike:No Condition:Creatures you control have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knighthood.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/12.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knotvine_mystic.txt b/res/cardsfolder/knotvine_mystic.txt deleted file mode 100644 index e962a54a923..00000000000 --- a/res/cardsfolder/knotvine_mystic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knotvine Mystic -ManaCost:W R G -Types:Creature Elf Druid -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ 1 T | Produced$ W R G | SpellDescription$ Add W R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/knotvine_mystic.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knotvine_paladin.txt b/res/cardsfolder/knotvine_paladin.txt deleted file mode 100644 index 1a5c23b8d02..00000000000 --- a/res/cardsfolder/knotvine_paladin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Knotvine Paladin -ManaCost:G W -Types:Creature Human Knight -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn for each untapped creature you control. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Creature.untapped+YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knotvine_paladin.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/knucklebone_witch.txt b/res/cardsfolder/knucklebone_witch.txt deleted file mode 100644 index 20ddb007b3d..00000000000 --- a/res/cardsfolder/knucklebone_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Knucklebone Witch -ManaCost:B -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Goblin.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a Goblin you control is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/knucklebone_witch.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kobold_drill_sergeant.txt b/res/cardsfolder/kobold_drill_sergeant.txt deleted file mode 100644 index a06f21ad98f..00000000000 --- a/res/cardsfolder/kobold_drill_sergeant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kobold Drill Sergeant -ManaCost:1 R -Types:Creature Kobold Soldier -Text:no text -PT:1/2 -K:stPumpAll:Creature.Kobold+Other+YouCtrl:0/1/Trample:No Condition:Other Kobold creatures you control get +0/+1 and have trample. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kobold_drill_sergeant.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kobold_overlord.txt b/res/cardsfolder/kobold_overlord.txt deleted file mode 100644 index af08bfd50e6..00000000000 --- a/res/cardsfolder/kobold_overlord.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kobold Overlord -ManaCost:1 R -Types:Creature Kobold -Text:no text -PT:1/2 -K:First Strike -K:stPumpAll:Creature.Kobold+Other+YouCtrl:0/0/First Strike:No Condiion:Other Kobold creatures you control have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kobold_overlord.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kobold_taskmaster.txt b/res/cardsfolder/kobold_taskmaster.txt deleted file mode 100644 index ad06f18204a..00000000000 --- a/res/cardsfolder/kobold_taskmaster.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kobold Taskmaster -ManaCost:1 R -Types:Creature Kobold -Text:no text -PT:1/2 -K:stPumpAll:Creature.Kobold+Other+YouCtrl:1/0:No Condiion:Other Kobold creatures you control get +1/+0. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kobold_taskmaster.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/65.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kobolds_of_kher_keep.txt b/res/cardsfolder/kobolds_of_kher_keep.txt deleted file mode 100644 index 85cb6ba07a2..00000000000 --- a/res/cardsfolder/kobolds_of_kher_keep.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kobolds of Kher Keep -ManaCost:0 -Types:Creature Kobold -Text:no text -PT:0/1 -K:CARDNAME is red. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kobolds_of_kher_keep.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kodama_of_the_center_tree.txt b/res/cardsfolder/kodama_of_the_center_tree.txt deleted file mode 100644 index c0533a28e7b..00000000000 --- a/res/cardsfolder/kodama_of_the_center_tree.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kodama of the Center Tree -ManaCost:4 G -Types:Legendary Creature Spirit -Text:no text -PT:*/* -K:stSetPT:Count$Valid Spirit.YouCtrl:Count$Valid Spirit.YouCtrl:CARDNAME's power and toughness are each equal to the number of Spirits you control. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ CARDNAME has soulshift X, where X is the number of Spirits you control. (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost X or less from your graveyard to your hand.) -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Spirit.YouCtrl+cmcLEX -SVar:X:Count$Valid Spirit.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kodama_of_the_center_tree.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kodama_of_the_north_tree.txt b/res/cardsfolder/kodama_of_the_north_tree.txt deleted file mode 100644 index 22577d0fb86..00000000000 --- a/res/cardsfolder/kodama_of_the_north_tree.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kodama of the North Tree -ManaCost:2 G G G -Types:Legendary Creature Spirit -Text:no text -PT:6/4 -K:Trample -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50488.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kodama_of_the_south_tree.txt b/res/cardsfolder/kodama_of_the_south_tree.txt deleted file mode 100644 index a16fa2f7460..00000000000 --- a/res/cardsfolder/kodama_of_the_south_tree.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kodama of the South Tree -ManaCost:2 G G -Types:Legendary Creature Spirit -Text:no text -PT:4/4 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, each other creature you control gets +1/+1 and gains trample until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl+Other | NumAtt$ +1 | NumDef$ +1 | KW$ Trample -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kodama_of_the_south_tree.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kodamas_reach.txt b/res/cardsfolder/kodamas_reach.txt deleted file mode 100644 index f8c1da51ea7..00000000000 --- a/res/cardsfolder/kodamas_reach.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kodama's Reach -ManaCost:2 G -Types:Sorcery Arcane -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SubAbility$ SVar=DBChangeZone | SpellDescription$ 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. -SVar:DBChangeZone:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50299.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kokusho_the_evening_star.txt b/res/cardsfolder/kokusho_the_evening_star.txt deleted file mode 100644 index a6cfa90cd19..00000000000 --- a/res/cardsfolder/kokusho_the_evening_star.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kokusho, the Evening Star -ManaCost:4 B B -Types:Legendary Creature Dragon Spirit -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each opponent loses 5 life. You gain life equal to the life lost this way. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 5 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50445.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/konda_lord_of_eiganjo.txt b/res/cardsfolder/konda_lord_of_eiganjo.txt deleted file mode 100644 index 2582db32421..00000000000 --- a/res/cardsfolder/konda_lord_of_eiganjo.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Konda, Lord of Eiganjo -ManaCost:5 W W -Types:Legendary Creature Human Samurai -Text:no text -PT:3/3 -K:Vigilance -K:Bushido 5 -K:Indestructible -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/konda_lord_of_eiganjo.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kondas_hatamoto.txt b/res/cardsfolder/kondas_hatamoto.txt deleted file mode 100644 index 25149c4f1a9..00000000000 --- a/res/cardsfolder/kondas_hatamoto.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Konda's Hatamoto -ManaCost:1 W -Types:Creature Human Samurai -Text:no text -PT:1/2 -K:Bushido 1 -K:stPumpSelf:Creature:1/2/Vigilance:isPresent Samurai.Legendary+YouCtrl: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.) -SVar:BuffedBy:Samurai.Legendary -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kondas_hatamoto.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kongming_sleeping_dragon.txt b/res/cardsfolder/kongming_sleeping_dragon.txt deleted file mode 100644 index 2184b7c68c3..00000000000 --- a/res/cardsfolder/kongming_sleeping_dragon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kongming, "Sleeping Dragon" -ManaCost:2 W W -Types:Legendary Creature Human Advisor -Text:no text -PT:2/2 -K:stPumpAll:Creature.Other+YouCtrl:1/1:no Condition:Other creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kongming_sleeping_dragon.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kookus.txt b/res/cardsfolder/kookus.txt deleted file mode 100644 index a22b835a46c..00000000000 --- a/res/cardsfolder/kookus.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kookus -ManaCost:3 R R -Types:Creature Djinn -Text:no text -PT:3/5 -K:Trample -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Creature.YouCtrl+namedKeeper of Kookus | PresentCompare$ EQ0 | Execute$ TrigNoKeeper | TriggerDescription$ At the beginning of your upkeep, if you don't control a creature named CARDNAME, CARDNAME deals 3 damage to you and attacks this turn if able. -SVar:TrigNoKeeper:DB$DealDamage | NumDmg$ 3 | Defined$ You | SubAbility$ SVar=DBMustAttack -SVar:DBMustAttack:DB$Pump | KW$ HIDDEN CARDNAME attacks each turn if able. | Defined$ Self | SpellDescription$ CARDNAME attacks this turn if able. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kookus.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_aeronaut.txt b/res/cardsfolder/kor_aeronaut.txt deleted file mode 100644 index c9e0ba6b3d6..00000000000 --- a/res/cardsfolder/kor_aeronaut.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kor Aeronaut -ManaCost:W W -Types:Creature Kor Soldier -Text:no text -PT:2/2 -K:Flying -K:Kicker:1 W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target creature gains flying until end of turn. -SVar:TrigKicker:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying -SVar:PlayMain1:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_Aeronaut.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_cartographer.txt b/res/cardsfolder/kor_cartographer.txt deleted file mode 100644 index 434fc141e8f..00000000000 --- a/res/cardsfolder/kor_cartographer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kor Cartographer -ManaCost:3 W -Types:Creature Kor Scout -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a plains card, put it onto the battlefield tapped, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Card.Plains | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_cartographer.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_duelist.txt b/res/cardsfolder/kor_duelist.txt deleted file mode 100644 index 87182beea1d..00000000000 --- a/res/cardsfolder/kor_duelist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kor Duelist -ManaCost:W -Types:Creature Kor Soldier -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/0/Double Strike:isEquipped:As long as Kor Duelist is equipped, it has double strike. (It deals both first-strike and regular combat damage.) -SVar:EquipMe:Once -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_duelist.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_firewalker.txt b/res/cardsfolder/kor_firewalker.txt deleted file mode 100644 index d9fa545f85e..00000000000 --- a/res/cardsfolder/kor_firewalker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kor Firewalker -ManaCost:W W -Types:Creature Kor Soldier -Text:no text -PT:2/2 -K:Protection from red -T:Mode$ SpellCast | ValidCard$ Card.Red | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a red spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_firewalker.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_haven.txt b/res/cardsfolder/kor_haven.txt deleted file mode 100644 index 55e935158a9..00000000000 --- a/res/cardsfolder/kor_haven.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kor Haven -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ 1 W T | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$True | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Prevent all combat damage that would be dealt by target attacking creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_haven.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_hookmaster.txt b/res/cardsfolder/kor_hookmaster.txt deleted file mode 100644 index a86de191fe8..00000000000 --- a/res/cardsfolder/kor_hookmaster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kor Hookmaster -ManaCost:2 W -Types:Creature Kor Soldier -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_hookmaster.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_line_slinger.txt b/res/cardsfolder/kor_line_slinger.txt deleted file mode 100644 index 2bac515316d..00000000000 --- a/res/cardsfolder/kor_line_slinger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kor Line-Slinger -ManaCost:1 W -Types:Creature Kor Scout -Text:no text -PT:0/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | SpellDescription$ Tap target creature with power 3 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_line_slinger.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/30.jpg -End diff --git a/res/cardsfolder/kor_sanctifiers.txt b/res/cardsfolder/kor_sanctifiers.txt deleted file mode 100644 index 2571ed8a568..00000000000 --- a/res/cardsfolder/kor_sanctifiers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kor Sanctifiers -ManaCost:2 W -Types:Creature Kor Cleric -Text:no text -PT:2/3 -K:Kicker:W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact or enchantment. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Kor_sanctifiers.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_skyfisher.txt b/res/cardsfolder/kor_skyfisher.txt deleted file mode 100644 index a9100b114ed..00000000000 --- a/res/cardsfolder/kor_skyfisher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kor Skyfisher -ManaCost:1 W -Types:Creature Kor Soldier -Text:no text -PT:2/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a permanent you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Permanent.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_skyfisher.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kor_spiritdancer.txt b/res/cardsfolder/kor_spiritdancer.txt deleted file mode 100644 index 8791de94ea1..00000000000 --- a/res/cardsfolder/kor_spiritdancer.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kor Spiritdancer -ManaCost:1 W -Types:Creature Kor Wizard -Text:no text -PT:0/2 -T:Mode$ SpellCast | ValidCard$ Card.Aura+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an Aura spell, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +2/+2 for each Aura attached to it. -SVar:X:Count$Valid Aura.Attached/Times.2 -SVar:EnchantMe:Multiple -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_spiritdancer.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/korlash_heir_to_blackblade.txt b/res/cardsfolder/korlash_heir_to_blackblade.txt deleted file mode 100644 index 5d651613305..00000000000 --- a/res/cardsfolder/korlash_heir_to_blackblade.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Korlash, Heir to Blackblade -ManaCost:2 B B -Types:Legendary Creature Zombie Warrior -Text:no text -PT:*/* -K:stSetPT:Count$TypeYouCtrl.Swamp:Count$TypeYouCtrl.Swamp:CARDNAME's power and toughness are each equal to the number of Swamps you control. -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -A:AB$ ChangeZone | Cost$ Discard<1/Card.namedKorlash, Heir to Blackblade> | Origin$ Library | Destination$ Battlefield | ChangeType$ Swamp | ChangeNum$ 2 | Tapped$ True | CostDesc$ Grandeur - Discard another card named Korlash, Heir to Blackblade: | SpellDescription$ Search your library for up to two Swamp cards, put them onto the battlefield tapped, then shuffle your library. -SVar:BuffedBy:Swamp -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136208.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kormus_bell.txt b/res/cardsfolder/kormus_bell.txt deleted file mode 100644 index 52cf668afef..00000000000 --- a/res/cardsfolder/kormus_bell.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Kormus Bell -ManaCost:4 -Types:Artifact -Text:no text -K:stAnimateAll:Swamp:1/1:Creature:Black,Overwrite:No Abilities:No Condition:All Swamps are 1/1 black creatures that are still lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kormus_bell.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/256.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/258.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/260.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/350.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/koskun_keep.txt b/res/cardsfolder/koskun_keep.txt deleted file mode 100644 index 4e42ac74222..00000000000 --- a/res/cardsfolder/koskun_keep.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Koskun Keep -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/koskun_keep.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/koth_of_the_hammer.txt b/res/cardsfolder/koth_of_the_hammer.txt deleted file mode 100644 index a5bdde05d88..00000000000 --- a/res/cardsfolder/koth_of_the_hammer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Koth of the Hammer -ManaCost:2 R R -Types:Planeswalker Koth -Text:no text -Loyalty:3 -SVar:PlayMain1:TRUE -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/koth_of_the_hammer.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/koths_courier.txt b/res/cardsfolder/koths_courier.txt deleted file mode 100644 index ec71cc86168..00000000000 --- a/res/cardsfolder/koths_courier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Koth's Courier -ManaCost:1 R R -Types:Creature Human Rogue -Text:no text -PT:2/3 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/koths_courier.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kozilek_butcher_of_truth.txt b/res/cardsfolder/kozilek_butcher_of_truth.txt deleted file mode 100644 index 64de993b5e5..00000000000 --- a/res/cardsfolder/kozilek_butcher_of_truth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kozilek, Butcher of Truth -ManaCost:10 -Types:Legendary Creature Eldrazi -Text:no text -PT:12/12 -K:Annihilator 4 -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and its owner shuffles his or her graveyard into his or her library. -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When you cast CARDNAME, draw four cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/kozilek_butcher_of_truth.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/6.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kozileks_predator.txt b/res/cardsfolder/kozileks_predator.txt deleted file mode 100644 index a6d1b6248df..00000000000 --- a/res/cardsfolder/kozileks_predator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kozilek's Predator -ManaCost:3 G -Types:Creature Eldrazi Drone -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME 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." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kozileks_predator.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kraken_hatchling.txt b/res/cardsfolder/kraken_hatchling.txt deleted file mode 100644 index 1c998f0dbbd..00000000000 --- a/res/cardsfolder/kraken_hatchling.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kraken Hatchling -ManaCost:U -Types:Creature Kraken -Text:no text -PT:0/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kraken_hatchling.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krakens_eye.txt b/res/cardsfolder/krakens_eye.txt deleted file mode 100644 index 6aaa9aa1492..00000000000 --- a/res/cardsfolder/krakens_eye.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kraken's Eye -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a blue spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krakens_eye.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/210.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/213.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/126.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/302.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krakilin.txt b/res/cardsfolder/krakilin.txt deleted file mode 100644 index 6addeebac1b..00000000000 --- a/res/cardsfolder/krakilin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krakilin -ManaCost:X G G -Types:Creature Beast -Text:no text -PT:0/0 -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krakilin.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kranioceros.txt b/res/cardsfolder/kranioceros.txt deleted file mode 100644 index ad777120a4a..00000000000 --- a/res/cardsfolder/kranioceros.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kranioceros -ManaCost:4 R -Types:Creature Beast -Text:no text -PT:5/2 -A:AB$ Pump | Cost$ 1 W | NumDef$ +3 | SpellDescription$ CARDNAME gets +0/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kranioceros.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/67.jpg -End diff --git a/res/cardsfolder/krark_clan_engineers.txt b/res/cardsfolder/krark_clan_engineers.txt deleted file mode 100644 index 82e653c326d..00000000000 --- a/res/cardsfolder/krark_clan_engineers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krark-Clan Engineers -ManaCost:3 R -Types:Creature Goblin Artificer -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ R Sac<2/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_engineers.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krark_clan_grunt.txt b/res/cardsfolder/krark_clan_grunt.txt deleted file mode 100644 index fbc17b52a3c..00000000000 --- a/res/cardsfolder/krark_clan_grunt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krark-Clan Grunt -ManaCost:2 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Artifact> | Defined$ Self | NumAtt$ 1 | KW$ First Strike | SpellDescription$ CARDNAME gets +1/+0 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_grunt.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krark_clan_ironworks.txt b/res/cardsfolder/krark_clan_ironworks.txt deleted file mode 100644 index 2e9516401d0..00000000000 --- a/res/cardsfolder/krark_clan_ironworks.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krark-Clan Ironworks -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ Sac<1/Artifact> | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_ironworks.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krark_clan_ogre.txt b/res/cardsfolder/krark_clan_ogre.txt deleted file mode 100644 index efaf6297478..00000000000 --- a/res/cardsfolder/krark_clan_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krark-Clan Ogre -ManaCost:3 R R -Types:Creature Ogre -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ R Sac<1/Artifact> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ CARDNAME can't block. | SpellDescription$ Target creature can't block this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_ogre.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krark_clan_shaman.txt b/res/cardsfolder/krark_clan_shaman.txt deleted file mode 100644 index af3259e4b39..00000000000 --- a/res/cardsfolder/krark_clan_shaman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krark-Clan Shaman -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -A:AB$ DamageAll | Cost$ Sac<1/Artifact> | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_shaman.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krark_clan_stoker.txt b/res/cardsfolder/krark_clan_stoker.txt deleted file mode 100644 index 75d0dda7875..00000000000 --- a/res/cardsfolder/krark_clan_stoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krark-Clan Stoker -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T Sac<1/Artifact> | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krark_clan_stoker.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kresh_the_bloodbraided.txt b/res/cardsfolder/kresh_the_bloodbraided.txt deleted file mode 100644 index 1bb35003148..00000000000 --- a/res/cardsfolder/kresh_the_bloodbraided.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kresh the Bloodbraided -ManaCost:2 B R G -Types:Legendary Creature Human Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put X +1/+1 counters on CARDNAME, where X is that creature's power. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ X -SVar:X:TriggeredCard$CardPower -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/kresh_the_bloodbraided.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kris_mage.txt b/res/cardsfolder/kris_mage.txt deleted file mode 100644 index 8d482d61985..00000000000 --- a/res/cardsfolder/kris_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kris Mage -ManaCost:R -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ R T Discard<1/Card> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kris_mage.jpg -SVar:RemAIDeck:True -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_archer.txt b/res/cardsfolder/krosan_archer.txt deleted file mode 100644 index aadf59bc1f2..00000000000 --- a/res/cardsfolder/krosan_archer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krosan Archer -ManaCost:3 G -Types:Creature Centaur Archer -Text:no text -PT:2/3 -K:Reach -A:AB$ Pump | Cost$ G Discard<1/Card> | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_archer.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_avenger.txt b/res/cardsfolder/krosan_avenger.txt deleted file mode 100644 index 8466db71d86..00000000000 --- a/res/cardsfolder/krosan_avenger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krosan Avenger -ManaCost:2 G -Types:Creature Human Druid -PT:3/1 -Text:no text -K:Trample -A:AB$ Regenerate | Cost$ 1 G | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ Regenerate CARDNAME. Activate this ability only if seven or more cards are in your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_avenger.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_beast.txt b/res/cardsfolder/krosan_beast.txt deleted file mode 100644 index 277c402be45..00000000000 --- a/res/cardsfolder/krosan_beast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krosan Beast -ManaCost:3 G -Types:Creature Squirrel Beast -Text:no text -PT:1/1 -K:stPumpSelf:Creature:7/7:Threshold:Threshold - Krosan Beast gets +7/+7 as long as seven or more cards are in your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_beast.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_cloudscraper.txt b/res/cardsfolder/krosan_cloudscraper.txt deleted file mode 100644 index 07a7b54d9d5..00000000000 --- a/res/cardsfolder/krosan_cloudscraper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krosan Cloudscraper -ManaCost:7 G G G -Types:Creature Beast Mutant -Text:no text -PT:13/13 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G G -K:Morph:7 G G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_cloudscraper.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/130.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_colossus.txt b/res/cardsfolder/krosan_colossus.txt deleted file mode 100644 index 26f1f3ac54b..00000000000 --- a/res/cardsfolder/krosan_colossus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krosan Colossus -ManaCost:6 G G G -Types:Creature Beast -Text:no text -PT:9/9 -K:Morph:6 G G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_colossus.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_constrictor.txt b/res/cardsfolder/krosan_constrictor.txt deleted file mode 100644 index ba83c981b9b..00000000000 --- a/res/cardsfolder/krosan_constrictor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krosan Constrictor -ManaCost:3 G -Types:Creature Snake -Text:no text -PT:2/2 -K:Swampwalk -A:AB$ Pump | Cost$ T | NumAtt$ -2 | IsCurse$ True | TgtPrompt$ Choose target Black creature | ValidTgts$ Creature.Black | SpellDescription$ Target black creature gets -2/-0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_constrictor.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_grip.txt b/res/cardsfolder/krosan_grip.txt deleted file mode 100644 index 49280f079a6..00000000000 --- a/res/cardsfolder/krosan_grip.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krosan Grip -ManaCost:2 G -Types:Instant -Text:no text -K:Split second -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_grip.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_groundshaker.txt b/res/cardsfolder/krosan_groundshaker.txt deleted file mode 100644 index df368288bb4..00000000000 --- a/res/cardsfolder/krosan_groundshaker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krosan Groundshaker -ManaCost:4 G G G -Types:Creature Beast -Text:no text -PT:6/6 -A:AB$ Pump | Cost$ G | ValidTgts$ Creature.beast | TgtPrompt$ Select target Beast creature | KW$ Trample | SpellDescription$ Target Beast creature gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_groundshaker.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_restorer.txt b/res/cardsfolder/krosan_restorer.txt deleted file mode 100644 index 78d9657fc75..00000000000 --- a/res/cardsfolder/krosan_restorer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krosan Restorer -ManaCost:2 G -Types:Creature Human Druid -Text:no text -PT:1/2 -A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Choose target land | SpellDescription$ Untap target land. -A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Choose target land | TargetMin$ 0 | TargetMax$ 3 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ Untap up to three target lands. Activate this ability only if seven or more cards are in your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_restorer.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_tusker.txt b/res/cardsfolder/krosan_tusker.txt deleted file mode 100644 index 6870158afcf..00000000000 --- a/res/cardsfolder/krosan_tusker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krosan Tusker -ManaCost:5 G G -Types:Creature Boar Beast -Text:no text -PT:6/5 -K:Cycling:2 G -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may search your library for a basic land card, reveal that card, put it into your hand, then shuffle your library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_tusker.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/272.jpg -End diff --git a/res/cardsfolder/krosan_verge.txt b/res/cardsfolder/krosan_verge.txt deleted file mode 100644 index e396371c724..00000000000 --- a/res/cardsfolder/krosan_verge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krosan Verge -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | Tapped$ True | ChangeNum$ 1 | SubAbility$ SVar=DBPlains | SpellDescription$ Search your library for a Forest card and a Plains card and put them onto the battlefield tapped. Then shuffle your library. -SVar:DBPlains:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains | Tapped$ True | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_verge.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_warchief.txt b/res/cardsfolder/krosan_warchief.txt deleted file mode 100644 index a9045da0f4a..00000000000 --- a/res/cardsfolder/krosan_warchief.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krosan Warchief -ManaCost:2 G -Types:Creature Beast -Text:Beast spells you cast cost 1 less to cast. -PT:2/2 -A:AB$ Regenerate | Cost$ 1 G | ValidTgts$ Beast | TgtPrompt$ Select target Beast | SpellDescription$ Regenerate target Beast. -K:CostChange:Player:Less:1:Spell:All:Beast:NoSpecial -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_warchief.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krosan_wayfarer.txt b/res/cardsfolder/krosan_wayfarer.txt deleted file mode 100644 index 5471b3ff72b..00000000000 --- a/res/cardsfolder/krosan_wayfarer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Krosan Wayfarer -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | OptionalDecider$ You | SpellDescription$ You may put a land card from your hand onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krosan_wayfarer.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_elementalist.txt b/res/cardsfolder/krovikan_elementalist.txt deleted file mode 100644 index 02f91c5351e..00000000000 --- a/res/cardsfolder/krovikan_elementalist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Krovikan Elementalist -ManaCost:B B -Types:Creature Human Wizard -PT:1/1 -Text:no text -A:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ U U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Flying & At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ Target creature you control gains flying until end of turn. Sacrifice it at the beginning of the next end step. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_elementalist.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_fetish.txt b/res/cardsfolder/krovikan_fetish.txt deleted file mode 100644 index b8cb542dfb9..00000000000 --- a/res/cardsfolder/krovikan_fetish.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Krovikan Fetish -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_fetish.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/34.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_horror.txt b/res/cardsfolder/krovikan_horror.txt deleted file mode 100644 index d0673527f04..00000000000 --- a/res/cardsfolder/krovikan_horror.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krovikan Horror -ManaCost:3 B -Types:Creature Horror Spirit -Text: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. -PT:2/2 -A:AB$ DealDamage | Cost$ 1 Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_horror.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_mist.txt b/res/cardsfolder/krovikan_mist.txt deleted file mode 100644 index 489deb31178..00000000000 --- a/res/cardsfolder/krovikan_mist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Krovikan Mist -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$Valid Illusion:Count$Valid Illusion:Krovikan Mist's power and toughness are each equal to the number of Illusions on the battlefield. -SVar:BuffedBy:Illusion -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_mist.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_rot.txt b/res/cardsfolder/krovikan_rot.txt deleted file mode 100644 index 63093c8b85d..00000000000 --- a/res/cardsfolder/krovikan_rot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Krovikan Rot -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less. | SpellDescription$ Destroy target creature with power 2 or less. -K:Recover:1 B B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/krovikan_rot.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/krovikan_scoundrel.txt b/res/cardsfolder/krovikan_scoundrel.txt deleted file mode 100644 index c5f16182b78..00000000000 --- a/res/cardsfolder/krovikan_scoundrel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Krovikan Scoundrel -ManaCost:1 B -Types:Creature Human Rogue -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121226.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kry_shield.txt b/res/cardsfolder/kry_shield.txt deleted file mode 100644 index 9c79b7b9373..00000000000 --- a/res/cardsfolder/kry_shield.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kry Shield -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | KW$ HIDDEN Prevent all damage that would be dealt by CARDNAME. | TgtPrompt$ Select target creature you control | ValidTgts$ Creature.YouCtrl | SubAbility$ SVar=DBPump | SpellDescription$ 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. -SVar:DBPump:DB$Pump | Defined$ Targeted | NumDef$ X -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kry_shield.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuldotha_flamefiend.txt b/res/cardsfolder/kuldotha_flamefiend.txt deleted file mode 100644 index 5bb352f801c..00000000000 --- a/res/cardsfolder/kuldotha_flamefiend.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Kuldotha Flamefiend -ManaCost:4 R R -Types:Creature Elemental -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, you may sacrifice an artifact. If you do, CARDNAME deals 4 damage divided as you choose among any number of target creatures and/or players. -SVar:TrigDealDamage:AB$ DealDamage | Cost$ Sac<1/Artifact> | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 -SVar:DBDamage2:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (3) | NumDmg$ 1 | SubAbility$ SVar=DBDamage4 -SVar:DBDamage4:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (4) | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_flamefiend.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuldotha_forgemaster.txt b/res/cardsfolder/kuldotha_forgemaster.txt deleted file mode 100644 index 5864dd38dc0..00000000000 --- a/res/cardsfolder/kuldotha_forgemaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kuldotha Forgemaster -ManaCost:5 -Types:Artifact Creature Construct -Text:no text -PT:3/5 -A:AB$ ChangeZone | Cost$ T Sac<3/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card and put it onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_forgemaster.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuldotha_phoenix.txt b/res/cardsfolder/kuldotha_phoenix.txt deleted file mode 100644 index 337ede9ae7a..00000000000 --- a/res/cardsfolder/kuldotha_phoenix.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kuldotha Phoenix -ManaCost:2 R R R -Types:Creature Phoenix -Text:no text -PT:4/4 -K:Flying -K:Haste -A:AB$ ChangeZone | Cost$ 4 | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | PrecostDesc$ Metalcraft - | ActivatingPhases$ Upkeep | PlayerTurn$ True | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | SpellDescription$ Return CARDNAME from your graveyard to the battlefield. Activate this ability only during your upkeep and only if you control three or more artifacts. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_phoenix.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuldotha_rebirth.txt b/res/cardsfolder/kuldotha_rebirth.txt deleted file mode 100644 index bf506f836dd..00000000000 --- a/res/cardsfolder/kuldotha_rebirth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Kuldotha Rebirth -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ R Sac<1/Artifact> | TokenAmount$ 3 | TokenOwner$ You | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put three 1/1 red Goblin creature tokens onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_rebirth.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuldotha_ringleader.txt b/res/cardsfolder/kuldotha_ringleader.txt deleted file mode 100644 index fc5ead56325..00000000000 --- a/res/cardsfolder/kuldotha_ringleader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kuldotha Ringleader -ManaCost:4 R -Types:Creature Giant Berserker -Text:no text -PT:4/4 -K:CARDNAME attacks each turn if able. -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuldotha_ringleader.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kulrath_knight.txt b/res/cardsfolder/kulrath_knight.txt deleted file mode 100644 index c8c06b6604a..00000000000 --- a/res/cardsfolder/kulrath_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kulrath Knight -ManaCost:3 BR BR -Types:Creature Elemental Knight -Text:Creatures your opponents control with counters on them can't attack or block. -PT:3/3 -K:Flying -K:Wither -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kulrath_knight.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kurgadon.txt b/res/cardsfolder/kurgadon.txt deleted file mode 100644 index ea5771713e5..00000000000 --- a/res/cardsfolder/kurgadon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kurgadon -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Creature.cmcGE6+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a creature spell with converted mana cost 6 or more, put three +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kurgadon.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuro_pitlord.txt b/res/cardsfolder/kuro_pitlord.txt deleted file mode 100644 index 1b55f2fca1e..00000000000 --- a/res/cardsfolder/kuro_pitlord.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Kuro, Pitlord -ManaCost:6 B B B -Types:Legendary Creature Demon Spirit -Text:no text -PT:9/9 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B B B B -A:AB$ Pump | Cost$ PayLife<1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuro_pitlord.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kuros_taken.txt b/res/cardsfolder/kuros_taken.txt deleted file mode 100644 index e177a9cec51..00000000000 --- a/res/cardsfolder/kuros_taken.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kuro's Taken -ManaCost:1 B -Types:Creature Rat Samurai -Text:no text -PT:1/1 -K:Bushido 1 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kuros_taken.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kyoki_sanitys_eclipse.txt b/res/cardsfolder/kyoki_sanitys_eclipse.txt deleted file mode 100644 index 7ada51ebc9c..00000000000 --- a/res/cardsfolder/kyoki_sanitys_eclipse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Kyoki, Sanity's Eclipse -ManaCost:4 B B -Types:Legendary Creature Demon Spirit -Text:no text -PT:6/4 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target opponent exiles a card from his or her hand. -#This needs Defined$ Opponent because ValidTgts$ Opponent lets Kyoki's controller select the card to be exiled -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Exile | ChangeType$ Card | Defined$ Opponent | TgtPrompt$ Select target opponent | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/kyoki_sanitys_eclipse.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kyren_glider.txt b/res/cardsfolder/kyren_glider.txt deleted file mode 100644 index daa51f493af..00000000000 --- a/res/cardsfolder/kyren_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kyren Glider -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Flying -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19604.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kyren_negotiations.txt b/res/cardsfolder/kyren_negotiations.txt deleted file mode 100644 index 3a509a71165..00000000000 --- a/res/cardsfolder/kyren_negotiations.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Kyren Negotiations -ManaCost:2 R R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ tapXType<1/Creature> | Tgt$ TgtP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_negotiations.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/kyren_sniper.txt b/res/cardsfolder/kyren_sniper.txt deleted file mode 100644 index dcfcc722a3c..00000000000 --- a/res/cardsfolder/kyren_sniper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Kyren Sniper -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | OptionalDecider$ You | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME deal 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/kyren_sniper.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lab_rats.txt b/res/cardsfolder/lab_rats.txt deleted file mode 100644 index 2a0348134c7..00000000000 --- a/res/cardsfolder/lab_rats.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lab Rats -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ B | TokenAmount$ 1 | TokenName$ Rat | TokenTypes$ Creature,Rat | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 black Rat creature token onto the battlefield. -SVar:Buyback:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lab_rats.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/labyrinth_minotaur.txt b/res/cardsfolder/labyrinth_minotaur.txt deleted file mode 100644 index f0adce871a7..00000000000 --- a/res/cardsfolder/labyrinth_minotaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Labyrinth Minotaur -ManaCost:3 U -Types:Creature Minotaur -Text:no text -PT:1/4 -T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Triggered | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/labyrinth_minotaur.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/97|2 -End diff --git a/res/cardsfolder/laccolith_grunt.txt b/res/cardsfolder/laccolith_grunt.txt deleted file mode 100644 index 727fd031551..00000000000 --- a/res/cardsfolder/laccolith_grunt.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Laccolith Grunt -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal damage equal to its power to target creature. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBNoCombatDamage -SVar:DBNoCombatDamage:DB$Pump | Defined$ Self | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/laccolith_grunt.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/laccolith_titan.txt b/res/cardsfolder/laccolith_titan.txt deleted file mode 100644 index 4066d870dc1..00000000000 --- a/res/cardsfolder/laccolith_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Laccolith Titan -ManaCost:5 R R -Types:Creature Beast -Text:no text -PT:6/6 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal damage equal to its power to target creature. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBNoCombatDamage -SVar:DBNoCombatDamage:DB$Pump | Defined$ Self | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/laccolith_titan.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/laccolith_warrior.txt b/res/cardsfolder/laccolith_warrior.txt deleted file mode 100644 index b02c85df84e..00000000000 --- a/res/cardsfolder/laccolith_warrior.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Laccolith Warrior -ManaCost:2 R R -Types:Creature Beast Warrior -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal damage equal to its power to target creature. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Self | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/laccolith_warrior.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/laccolith_whelp.txt b/res/cardsfolder/laccolith_whelp.txt deleted file mode 100644 index 71fa83df8ca..00000000000 --- a/res/cardsfolder/laccolith_whelp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Laccolith Whelp -ManaCost:R -Types:Creature Beast -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME becomes blocked, you may have it deal damage equal to its power to target creature. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Self | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/laccolith_whelp.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lace_with_moonglove.txt b/res/cardsfolder/lace_with_moonglove.txt deleted file mode 100644 index 295e7180aca..00000000000 --- a/res/cardsfolder/lace_with_moonglove.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lace with Moonglove -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | SpellDescription$ Target creature gains deathtouch until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lace_with_moonglove.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/225.jpg -End diff --git a/res/cardsfolder/lady_caleria.txt b/res/cardsfolder/lady_caleria.txt deleted file mode 100644 index 45fc19d2345..00000000000 --- a/res/cardsfolder/lady_caleria.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lady Caleria -ManaCost:3 G G W W -Types:Legendary Creature Human Archer -Text:no text -PT:3/6 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lady_caleria.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lady_evangela.txt b/res/cardsfolder/lady_evangela.txt deleted file mode 100644 index 19650bba7ff..00000000000 --- a/res/cardsfolder/lady_evangela.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lady Evangela -ManaCost:W U B -Types:Legendary Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ W B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$ True | SpellDescription$ Prevent all combat damage that would be dealt by target creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lady_evangela.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/280.jpg -End diff --git a/res/cardsfolder/lady_orca.txt b/res/cardsfolder/lady_orca.txt deleted file mode 100644 index 45d4c36dc29..00000000000 --- a/res/cardsfolder/lady_orca.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lady Orca -ManaCost:5 B R -Types:Legendary Creature Demon -Text:no text -PT:7/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1667.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lady_zhurong_warrior_queen.txt b/res/cardsfolder/lady_zhurong_warrior_queen.txt deleted file mode 100644 index 618c0fbd4e7..00000000000 --- a/res/cardsfolder/lady_zhurong_warrior_queen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lady Zhurong, Warrior Queen -ManaCost:4 G -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:4/3 -K:Horsemanship -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lady_zhurong_warrior_queen.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lagac_lizard.txt b/res/cardsfolder/lagac_lizard.txt deleted file mode 100644 index 43cb975697d..00000000000 --- a/res/cardsfolder/lagac_lizard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lagac Lizard -ManaCost:3 R -Types:Creature Lizard -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lagac_lizard.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lake_of_the_dead.txt b/res/cardsfolder/lake_of_the_dead.txt deleted file mode 100644 index 666834f4ea7..00000000000 --- a/res/cardsfolder/lake_of_the_dead.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lake of the Dead -ManaCost:no cost -Types:Land -Text:If CARDNAME would enter the battlefield, sacrifice a Swamp instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Swamp> | Produced$ B | Amount$ 4 | SpellDescription$ Add B B B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lake_of_the_dead.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lance.txt b/res/cardsfolder/lance.txt deleted file mode 100644 index fec22d4b3cf..00000000000 --- a/res/cardsfolder/lance.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lance -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lance.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/211.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/213.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/211.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/land_cap.txt b/res/cardsfolder/land_cap.txt deleted file mode 100644 index 5b6e805ea78..00000000000 --- a/res/cardsfolder/land_cap.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Land Cap -ManaCost:no cost -Types:Land -Text:no text -K:stPumpSelf:Permanent:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:isValid Permanent.countersGE1DEPLETION:CARDNAME doesn't untap during your untap step if it has a depletion counter on it. -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add W to your mana pool. Put a depletion counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add U to your mana pool. Put a depletion counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At the beginning of your upkeep, remove a depletion counter from CARDNAME. -SVar:TrigSubCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:AddCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/land_cap.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/338.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/land_equilibrium.txt b/res/cardsfolder/land_equilibrium.txt deleted file mode 100644 index 15c0a256157..00000000000 --- a/res/cardsfolder/land_equilibrium.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Land Equilibrium -ManaCost:2 U U -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/land_equilibrium.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/land_leeches.txt b/res/cardsfolder/land_leeches.txt deleted file mode 100644 index 4cb913479eb..00000000000 --- a/res/cardsfolder/land_leeches.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Land Leeches -ManaCost:1 G G -Types:Creature Leech -Text:no text -PT:2/2 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/land_leeches.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/42.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/land_tax.txt b/res/cardsfolder/land_tax.txt deleted file mode 100644 index 7292190587c..00000000000 --- a/res/cardsfolder/land_tax.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Land Tax -ManaCost:W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | IsPresent$ Land.YouDontCtrl | PresentCompare$ GTX | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 3 -SVar:X:Count$Valid Land.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/land_tax.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/284.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/landbind_ritual.txt b/res/cardsfolder/landbind_ritual.txt deleted file mode 100644 index 440b5b5f174..00000000000 --- a/res/cardsfolder/landbind_ritual.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Landbind Ritual -ManaCost:3 W W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 3 W W | LifeAmount$ X | SpellDescription$ You gain 2 life for each Plains you control. -SVar:X:Count$TypeYouCtrl.Plains/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/landbind_ritual.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/24.jpg -End diff --git a/res/cardsfolder/lantern_kami.txt b/res/cardsfolder/lantern_kami.txt deleted file mode 100644 index cbef9dba54b..00000000000 --- a/res/cardsfolder/lantern_kami.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lantern Kami -ManaCost:W -Types:Creature Spirit -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card75319.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lantern_lit_graveyard.txt b/res/cardsfolder/lantern_lit_graveyard.txt deleted file mode 100644 index c9e24ad0a29..00000000000 --- a/res/cardsfolder/lantern_lit_graveyard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lantern-Lit Graveyard -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add B to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add R to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lantern_lit_graveyard.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lapis_lazuli_talisman.txt b/res/cardsfolder/lapis_lazuli_talisman.txt deleted file mode 100644 index ff910e0dcd1..00000000000 --- a/res/cardsfolder/lapis_lazuli_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lapis Lazuli Talisman -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Blue | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a blue spell, you may pay 3. If you do, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lapis_lazuli_talisman.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lapse_of_certainty.txt b/res/cardsfolder/lapse_of_certainty.txt deleted file mode 100644 index 2522229635c..00000000000 --- a/res/cardsfolder/lapse_of_certainty.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lapse of Certainty -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 W | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ TopOfLibrary | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lapse_of_certainty.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/laquatuss_champion.txt b/res/cardsfolder/laquatuss_champion.txt deleted file mode 100644 index a6d6ba1085c..00000000000 --- a/res/cardsfolder/laquatuss_champion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Laquatus's Champion -ManaCost:4 B B -Types:Creature Nightmare Horror -Text:no text -PT:6/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, target player loses 6 life. -SVar:TrigLoseLife:DB$LoseLife | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 6 | RememberTargets$ True | ForgetOtherTargets$ True -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME leaves the battlefield, that player gains 6 life. -SVar:TrigGainLife:DB$GainLife | Defined$ Remembered | LifeAmount$ 6 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/laquatuss_champion.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/larceny.txt b/res/cardsfolder/larceny.txt deleted file mode 100755 index 82329c66bf1..00000000000 --- a/res/cardsfolder/larceny.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Larceny -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever a creature you control deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/larceny.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/143.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lash_out.txt b/res/cardsfolder/lash_out.txt deleted file mode 100644 index db717224622..00000000000 --- a/res/cardsfolder/lash_out.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lash Out -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtC | NumDmg$ 3 | SubAbility$ SVar=DBClash | SpellDescription$ CARDNAME deals 3 damage to target creature. Clash with an opponent. If you win, CARDNAME deals 3 damage ot that creature's controller. -SVar:DBClash:DB$Clash | WinSubAbility$ DBDamageController -SVar:DBDamageController:DB$DealDamage | Defined$ TargetedController | NumDmg$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lash_out.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lashknife_barrier.txt b/res/cardsfolder/lashknife_barrier.txt deleted file mode 100644 index 3133ef6222b..00000000000 --- a/res/cardsfolder/lashknife_barrier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lashknife Barrier -ManaCost:2 W -Types:Enchantment -Text:If a source would deal damage to a creature you control, it deals that much damage minus 1 to that creature instead. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lashknife_barrier.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lashwrithe.txt b/res/cardsfolder/lashwrithe.txt deleted file mode 100644 index 5712d380162..00000000000 --- a/res/cardsfolder/lashwrithe.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lashwrithe -ManaCost:4 -Types:Artifact Equipment -Text:no text -K:Living Weapon -K:eqPump PB PB:0/0 -K:stPumpEquipped:Creature:X/X:no Condition:Equipped creature gets +1/+1 for each Swamp you control. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lashwrithe.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/last_breath.txt b/res/cardsfolder/last_breath.txt deleted file mode 100644 index fc178ca7c6e..00000000000 --- a/res/cardsfolder/last_breath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Last Breath -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature with power 2 or less. Its controller gains 4 life. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_breath.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/27.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/last_caress.txt b/res/cardsfolder/last_caress.txt deleted file mode 100644 index 5105fdacb26..00000000000 --- a/res/cardsfolder/last_caress.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Last Caress -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 1 life and you gain 1 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 1 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_caress.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/41.jpg -End diff --git a/res/cardsfolder/last_gasp.txt b/res/cardsfolder/last_gasp.txt deleted file mode 100644 index ee162d801b4..00000000000 --- a/res/cardsfolder/last_gasp.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Last Gasp -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_gasp.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/93.jpg -End diff --git a/res/cardsfolder/last_kiss.txt b/res/cardsfolder/last_kiss.txt deleted file mode 100644 index ba2ef08b4a0..00000000000 --- a/res/cardsfolder/last_kiss.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Last Kiss -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 2 damage to target creature and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_kiss.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/116.jpg -End diff --git a/res/cardsfolder/last_laugh.txt b/res/cardsfolder/last_laugh.txt deleted file mode 100644 index e16ab686dc6..00000000000 --- a/res/cardsfolder/last_laugh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Last Laugh -ManaCost:2 B B -Types:Enchantment -Text:no text -K:When there are no creatures on the battlefield, sacrifice CARDNAME. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.Other | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ Whenever a permanent other than CARDNAME is put into a graveyard from the battlefield, CARDNAME deals 1 damage to each creature and each player. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 0 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_laugh.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/last_stand.txt b/res/cardsfolder/last_stand.txt deleted file mode 100644 index 080dcb4e04b..00000000000 --- a/res/cardsfolder/last_stand.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Last Stand -ManaCost:W U B R G -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ W U B R G | Defined$ Opponent | LifeAmount$ SwampsYouControl | SubAbility$ SVar=DBDamageMountain | SpellDescription$ Target opponent loses 2 life for each Swamp you control. CARDNAME 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. -SVar:DBDamageMountain:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ MountainsYouControl | SubAbility$ SVar=DBTokenForest -SVar:DBTokenForest:DB$Token | TokenAmount$ ForestsYouControl | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SVar=DBGainLifePlains -SVar:DBGainLifePlains:DB$GainLife | Defined$ You | LifeAmount$ PlainsYouControl | SubAbility$ SVar=DBDrawCardIsland -SVar:DBDrawCardIsland:DB$Draw | Defined$ You | NumCards$ IslandsYouControl | SubAbility$ SVar=DBDiscardJustAsMany -SVar:DBDiscardJustAsMany:DB$Discard | Defined$ You | NumCards$ IslandsYouControl | Mode$ TgtChoose -SVar:SwampsYouControl:Count$TypeYouCtrl.Swamp/Times.2 -SVar:MountainsYouControl:Count$TypeYouCtrl.Mountain -SVar:ForestsYouControl:Count$TypeYouCtrl.Forest -SVar:PlainsYouControl:Count$TypeYouCtrl.Plains/Times.2 -SVar:IslandsYouControl:Count$TypeYouCtrl.Island -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_stand.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/last_word.txt b/res/cardsfolder/last_word.txt deleted file mode 100644 index 2ff13a5820d..00000000000 --- a/res/cardsfolder/last_word.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Last Word -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -K:CARDNAME can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/last_word.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/latulla_keldon_overseer.txt b/res/cardsfolder/latulla_keldon_overseer.txt deleted file mode 100644 index d25f3775485..00000000000 --- a/res/cardsfolder/latulla_keldon_overseer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Latulla, Keldon Overseer -ManaCost:3 R R -Types:Legendary Creature Spellshaper -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ X R T Discard<2/Card>| Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/latulla_keldon_overseer.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/latullas_orders.txt b/res/cardsfolder/latullas_orders.txt deleted file mode 100644 index 606afe03a45..00000000000 --- a/res/cardsfolder/latullas_orders.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Latulla's Orders -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:0/0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals combat damage to defending player, you may destroy target artifact that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/latullas_orders.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/launch.txt b/res/cardsfolder/launch.txt deleted file mode 100644 index ec93e504285..00000000000 --- a/res/cardsfolder/launch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Launch -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/launch.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_axe.txt b/res/cardsfolder/lava_axe.txt deleted file mode 100644 index 7f9295b9817..00000000000 --- a/res/cardsfolder/lava_axe.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Lava Axe -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 R | Tgt$ TgtP | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_axe.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/197.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/107.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/199.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/142.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/200.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/215.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/147.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/145.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/111.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_dart.txt b/res/cardsfolder/lava_dart.txt deleted file mode 100644 index 6ae5aca90c0..00000000000 --- a/res/cardsfolder/lava_dart.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lava Dart -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -A:SP$ DealDamage | Cost$ Sac<1/Mountain> | Tgt$ TgtCP | NumDmg$ 1 | Flashback$ True | CostDesc$ Flashback - Sacrifice a Mountain | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_dart.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_flow.txt b/res/cardsfolder/lava_flow.txt deleted file mode 100644 index 55e3cbd597a..00000000000 --- a/res/cardsfolder/lava_flow.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lava Flow -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R R | ValidTgts$ Creature,Land | TgtPrompt$ Select target creature or land | SpellDescription$ Destroy target creature or land. -SVar:Rarity:Uncommon -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/lava_flow.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/143.jpg -End diff --git a/res/cardsfolder/lava_hounds.txt b/res/cardsfolder/lava_hounds.txt deleted file mode 100644 index a6dfde87bb6..00000000000 --- a/res/cardsfolder/lava_hounds.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lava Hounds -ManaCost:2 R R -Types:Creature Hound -Text:no text -PT:4/4 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 4 damage to you. -SVar:TrigDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_hounds.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/198.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_runner.txt b/res/cardsfolder/lava_runner.txt deleted file mode 100755 index 29edf3be200..00000000000 --- a/res/cardsfolder/lava_runner.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lava Runner -ManaCost:1 R R -Types:Creature Lizard -Text:no text -PT:2/2 -K:Haste -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacYou | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, that spell or ability's controller sacrifices a land. -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigSacOpp | Secondary$ True | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, that spell or ability's controller sacrifices a land. -SVar:TrigSacYou:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 | Defined$ You -SVar:TrigSacOpp:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 | Defined$ Opponent -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_runner.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_spike.txt b/res/cardsfolder/lava_spike.txt deleted file mode 100644 index 69eb8c84fc8..00000000000 --- a/res/cardsfolder/lava_spike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lava Spike -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79084.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/178.jpg -End diff --git a/res/cardsfolder/lava_storm.txt b/res/cardsfolder/lava_storm.txt deleted file mode 100644 index 5bb00692cb2..00000000000 --- a/res/cardsfolder/lava_storm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lava Storm -ManaCost:3 R R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 3 R R | ValidCards$ Creature.attacking | NumDmg$ 2 | ValidDescription$ each attacking creature | SpellDescription$ CARDNAME deals 2 damage to each attacking creature -A:SP$ DamageAll | Cost$ 3 R R | ValidCards$ Creature.blocking | NumDmg$ 2 | ValidDescription$ each blocking creature | SpellDescription$ or CARDNAME deals 2 damage to each blocking creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_storm.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_tubes.txt b/res/cardsfolder/lava_tubes.txt deleted file mode 100644 index 2fe6dcef0ee..00000000000 --- a/res/cardsfolder/lava_tubes.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lava Tubes -ManaCost:no cost -Types:Land -Text:no text -K:stPumpSelf:Permanent:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:isValid Permanent.countersGE1DEPLETION:CARDNAME doesn't untap during your untap step if it has a depletion counter on it. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add B to your mana pool. Put a depletion counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add R to your mana pool. Put a depletion counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At the beginning of your upkeep, remove a depletion counter from CARDNAME. -SVar:TrigSubCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:AddCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_tubes.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/339.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lava_zombie.txt b/res/cardsfolder/lava_zombie.txt deleted file mode 100644 index 264e95b19a6..00000000000 --- a/res/cardsfolder/lava_zombie.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lava Zombie -ManaCost:1 B R -Types:Creature Zombie -Text:no text -PT:4/3 -A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a black or red creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Red+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lava_zombie.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavaborn_muse.txt b/res/cardsfolder/lavaborn_muse.txt deleted file mode 100644 index e9e12bcfe29..00000000000 --- a/res/cardsfolder/lavaborn_muse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lavaborn Muse -ManaCost:3 R -Types:Creature Spirit -Text:no text -PT:3/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LT3 | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, CARDNAME deals 3 damage to him or her. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavaborn_muse.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/105.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavaclaw_reaches.txt b/res/cardsfolder/lavaclaw_reaches.txt deleted file mode 100644 index 4c12be478a4..00000000000 --- a/res/cardsfolder/lavaclaw_reaches.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lavaclaw Reaches -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Animate | Cost$ 1 B R | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Colors$ Black,Red | Abilities$ ABPump | SpellDescription$ Until end of turn, CARDNAME 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. -SVar:ABPump:AB$Pump | Cost$ X | Defined$ Self | NumAtt$ +X | SpellDescription$ This creature gets +X/+0 until end of turn. -SVar:X:Count$xPaid -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavaclaw_reaches.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavacore_elemental.txt b/res/cardsfolder/lavacore_elemental.txt deleted file mode 100644 index 612198ccc30..00000000000 --- a/res/cardsfolder/lavacore_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lavacore Elemental -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:5/3 -K:Vanishing:1 -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control deals combat damage to a player, put a time counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavacore_elemental.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavafume_invoker.txt b/res/cardsfolder/lavafume_invoker.txt deleted file mode 100644 index aa6e40e2409..00000000000 --- a/res/cardsfolder/lavafume_invoker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lavafume Invoker -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -A:AB$ PumpAll | Cost$ 8 | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | SpellDescription$ Creatures you control get +3/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavafume_invoker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavalanche.txt b/res/cardsfolder/lavalanche.txt deleted file mode 100644 index 8001c7333ce..00000000000 --- a/res/cardsfolder/lavalanche.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Lavalanche -ManaCost:X B R G -Types:Sorcery -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavalanche.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lavamancers_skill.txt b/res/cardsfolder/lavamancers_skill.txt deleted file mode 100644 index b89fbace5fa..00000000000 --- a/res/cardsfolder/lavamancers_skill.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lavamancer's Skill -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature." -K:stPumpEnchanted:Creature.Wizard:0/0/SVar=Damage2:No Condition:If enchanted creature is a Wizard, it has "tap: This creature deals 2 damage to target creature." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtC | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:Damage2:AB$DealDamage | Cost$ T | Tgt$ TgtC | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lavamancers_skill.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lawbringer.txt b/res/cardsfolder/lawbringer.txt deleted file mode 100644 index 6b11f91e046..00000000000 --- a/res/cardsfolder/lawbringer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lawbringer -ManaCost:2 W -Types:Creature Kor Rebel -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.Red | TgtPrompt$ Select target red Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target red creature. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lawbringer.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lay_bare.txt b/res/cardsfolder/lay_bare.txt deleted file mode 100644 index a7dbd95f93c..00000000000 --- a/res/cardsfolder/lay_bare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lay Bare -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBReveal | SpellDescription$ Counter target spell. Look at its controller's hand. -SVar:DBReveal:DB$RevealHand | Defined$ TargetedController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lay_bare.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lay_of_the_land.txt b/res/cardsfolder/lay_of_the_land.txt deleted file mode 100644 index e681780424d..00000000000 --- a/res/cardsfolder/lay_of_the_land.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lay of the Land -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lay_of_the_land.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lay_waste.txt b/res/cardsfolder/lay_waste.txt deleted file mode 100644 index 7d239c1e3b2..00000000000 --- a/res/cardsfolder/lay_waste.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lay Waste -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 R | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5817.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/201.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/216.jpg -End diff --git a/res/cardsfolder/lead_astray.txt b/res/cardsfolder/lead_astray.txt deleted file mode 100644 index a9d0dd39c51..00000000000 --- a/res/cardsfolder/lead_astray.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lead Astray -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 1 W | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SpellDescription$ Tap up to two target creatures. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lead_astray.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lead_belly_chimera.txt b/res/cardsfolder/lead_belly_chimera.txt deleted file mode 100644 index 5ad33e661fb..00000000000 --- a/res/cardsfolder/lead_belly_chimera.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lead-Belly Chimera -ManaCost:4 -Types:Artifact Creature Chimera -Text:no text -PT:2/2 -K:Trample -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) -SVar:DBPump:DB$Pump | KW$ Trample | Defined$ Targeted | Permanent$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/lead_belly_chimera.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lead_golem.txt b/res/cardsfolder/lead_golem.txt deleted file mode 100644 index 9bab2d9e6e6..00000000000 --- a/res/cardsfolder/lead_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lead Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/5 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | TriggerDescription$ Whenever CARDNAME attacks, it doesn't untap during its controller's next untap step. -SVar:StayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lead_golem.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/295.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lead_the_stampede.txt b/res/cardsfolder/lead_the_stampede.txt deleted file mode 100644 index 9013749b015..00000000000 --- a/res/cardsfolder/lead_the_stampede.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lead the Stampede -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 2 G | DigNum$ 5 | ChangeValid$ Creature | AnyNumber$ True | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lead_the_stampede.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaden_fists.txt b/res/cardsfolder/leaden_fists.txt deleted file mode 100644 index 6bdaddb6ee7..00000000000 --- a/res/cardsfolder/leaden_fists.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leaden Fists -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:+3/+3/HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature gets +3/+3 and doesn't untap during its controller's untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leaden_fists.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaden_myr.txt b/res/cardsfolder/leaden_myr.txt deleted file mode 100644 index 72c09052163..00000000000 --- a/res/cardsfolder/leaden_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leaden Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leaden_myr.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/191.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaf_arrow.txt b/res/cardsfolder/leaf_arrow.txt deleted file mode 100644 index 76e0fa5e8e4..00000000000 --- a/res/cardsfolder/leaf_arrow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leaf Arrow -ManaCost:G -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leaf_arrow.jpg -Setinfo:ROE|Common|http://magiccards.info/scans/en/roe/194.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaf_crowned_elder.txt b/res/cardsfolder/leaf_crowned_elder.txt deleted file mode 100644 index 1217f2fe374..00000000000 --- a/res/cardsfolder/leaf_crowned_elder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leaf-Crowned Elder -ManaCost:2 G G -Types:Creature Treefolk Shaman -Text: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. -PT:3/5 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leaf_crowned_elder.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaf_dancer.txt b/res/cardsfolder/leaf_dancer.txt deleted file mode 100644 index 8a1690ed3b9..00000000000 --- a/res/cardsfolder/leaf_dancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leaf Dancer -ManaCost:1 G G -Types:Creature Centaur -Text:no text -PT:2/2 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card29782.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaf_gilder.txt b/res/cardsfolder/leaf_gilder.txt deleted file mode 100644 index 5f6f79c924d..00000000000 --- a/res/cardsfolder/leaf_gilder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leaf Gilder -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:2/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139487.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leafdrake_roost.txt b/res/cardsfolder/leafdrake_roost.txt deleted file mode 100644 index a102050d29c..00000000000 --- a/res/cardsfolder/leafdrake_roost.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leafdrake Roost -ManaCost:3 G U -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpAll:Card.AttachedBy:0/0/SVar=Token:no Condition:Enchanted land has "G U, Tap: Put a 2/2 green and blue Drake creature token with flying onto the battlefield." -SVar:Token:AB$Token | Cost$ G U T | TokenAmount$ 1 | TokenName$ Drake | TokenTypes$ Creature,Drake | TokenColors$ Green,Blue | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenKeywords$ Flying | SpellDescription$ Put a 2/2 green and blue Drake creature token with flying onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leafdrake_roost.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leap.txt b/res/cardsfolder/leap.txt deleted file mode 100644 index 8bbfa04b22c..00000000000 --- a/res/cardsfolder/leap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leap -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leap.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/35.jpg -End diff --git a/res/cardsfolder/leap_of_flame.txt b/res/cardsfolder/leap_of_flame.txt deleted file mode 100644 index 6bd6efb1f01..00000000000 --- a/res/cardsfolder/leap_of_flame.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leap of Flame -ManaCost:U R -Types:Instant -Text:no text -K:Replicate U R -A:SP$ Pump | Cost$ U R | Tgt$ TgtC | NumAtt$ 1 | KW$ Flying & First Strike | SpellDescription$ Target creature gets +1/+0 and gains flying and first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leap_of_flame.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leaping_lizard.txt b/res/cardsfolder/leaping_lizard.txt deleted file mode 100644 index 550c0c56b62..00000000000 --- a/res/cardsfolder/leaping_lizard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leaping Lizard -ManaCost:1 G G -Types:Creature Lizard -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ 1 G | NumDef$ -1 | KW$ Flying | SpellDescription$ CARDNAME gains flying and gets -0/-1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leaping_lizard.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/63.jpg -End diff --git a/res/cardsfolder/leatherback_baloth.txt b/res/cardsfolder/leatherback_baloth.txt deleted file mode 100644 index e818cf74980..00000000000 --- a/res/cardsfolder/leatherback_baloth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Leatherback Baloth -ManaCost:G G G -Types:Creature Beast -Text:no text -PT:4/5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leatherback_baloth.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leeches.txt b/res/cardsfolder/leeches.txt deleted file mode 100644 index 780c1b1ee61..00000000000 --- a/res/cardsfolder/leeches.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Leeches -ManaCost:1 W W -Types:Sorcery -Text:Target player loses all poison counters. Leeches deals that much damage to that player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leeches.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leechridden_swamp.txt b/res/cardsfolder/leechridden_swamp.txt deleted file mode 100644 index 4d3504cf2b3..00000000000 --- a/res/cardsfolder/leechridden_swamp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leechridden Swamp -ManaCost:no cost -Types:Land Swamp -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ LoseLife | Cost$ B T | IsPresent$ Permanent.Black+YouCtrl | PresentCompare$ GE2 | Defined$ Opponent | LifeAmount$ 1 | SpellDescription$ Each opponent loses 1 life. Activate this ability only if you control two or more black permanents. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leechridden_swamp.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leering_emblem.txt b/res/cardsfolder/leering_emblem.txt deleted file mode 100644 index 973062577ee..00000000000 --- a/res/cardsfolder/leering_emblem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leering Emblem -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 2:+0/+0 -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a spell, equipped creature gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Equipped | NumAtt$ +2 | NumDef$ +2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leering_emblem.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/legacy_weapon.txt b/res/cardsfolder/legacy_weapon.txt deleted file mode 100644 index e4c883044ea..00000000000 --- a/res/cardsfolder/legacy_weapon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Legacy Weapon -ManaCost:7 -Types:Legendary Artifact -Text:no text -A:AB$ ChangeZone | Cost$ W U B R G | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent. -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/legacy_weapon.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/137.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/legacys_allure.txt b/res/cardsfolder/legacys_allure.txt deleted file mode 100644 index 2d086f3927a..00000000000 --- a/res/cardsfolder/legacys_allure.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Legacy's Allure -ManaCost:U U -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a treasure counter on CARDNAME. -A:AB$ GainControl | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to the number of treasure counters | SpellDescription$ Gain control of target creature with power less than or equal to the number of treasure counters on CARDNAME. (This effect lasts indefinitely.) -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TREASURE | CounterNum$ 1 -SVar:X:Count$CardCounters.TREASURE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/legacys_allure.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/legions_of_lim_dul.txt b/res/cardsfolder/legions_of_lim_dul.txt deleted file mode 100644 index 2fc0aabb6d7..00000000000 --- a/res/cardsfolder/legions_of_lim_dul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Legions of Lim-Dul -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/3 -K:Snow swampwalk -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/legions_of_lim_dul.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_abunas.txt b/res/cardsfolder/leonin_abunas.txt deleted file mode 100644 index 3208387f379..00000000000 --- a/res/cardsfolder/leonin_abunas.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Leonin Abunas -ManaCost:3 W -Types:Creature Cat Cleric -Text:Artifacts you control can't be the targets of spells or abilities your opponents control. -PT:2/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_abunas.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_armorguard.txt b/res/cardsfolder/leonin_armorguard.txt deleted file mode 100644 index bba72ac41e5..00000000000 --- a/res/cardsfolder/leonin_armorguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Leonin Armorguard -ManaCost:2 G W -Types:Creature Cat Soldier -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control get +1/+1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_armorguard.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/72.jpg -End diff --git a/res/cardsfolder/leonin_battlemage.txt b/res/cardsfolder/leonin_battlemage.txt deleted file mode 100644 index 95ebbebe086..00000000000 --- a/res/cardsfolder/leonin_battlemage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Leonin Battlemage -ManaCost:3 W -Types:Creature Cat Wizard -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a spell, you may untap CARDNAME. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_battlemage.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/5.jpg -End diff --git a/res/cardsfolder/leonin_den_guard.txt b/res/cardsfolder/leonin_den_guard.txt deleted file mode 100644 index 0d41233a86f..00000000000 --- a/res/cardsfolder/leonin_den_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leonin Den-Guard -ManaCost:1 W -Types:Creature Cat Soldier -Text:no text -PT:1/3 -K:stPumpSelf:Permanent.equipped:1/1/Vigilance:No Condition:As long as Leonin Den-Guard is equipped, it gets +1/+1 and has vigilance. -SVar:EquipMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_den_guard.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_elder.txt b/res/cardsfolder/leonin_elder.txt deleted file mode 100644 index ea2a642d1f5..00000000000 --- a/res/cardsfolder/leonin_elder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leonin Elder -ManaCost:W -Types:Creature Cat Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever an artifact enters the battlefield, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_elder.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_relic_warder.txt b/res/cardsfolder/leonin_relic_warder.txt deleted file mode 100644 index 0315f5c028a..00000000000 --- a/res/cardsfolder/leonin_relic_warder.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Leonin Relic-Warder -ManaCost:W W -Types:Creature Cat Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target artifact or enchantment. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | IsCurse$ True | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_relic_warder.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_scimitar.txt b/res/cardsfolder/leonin_scimitar.txt deleted file mode 100644 index 60de16d7826..00000000000 --- a/res/cardsfolder/leonin_scimitar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leonin Scimitar -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1. -K:eqPump 1:+1/+1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_scimitar.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/193.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/331.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_skyhunter.txt b/res/cardsfolder/leonin_skyhunter.txt deleted file mode 100644 index 58201479b91..00000000000 --- a/res/cardsfolder/leonin_skyhunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Leonin Skyhunter -ManaCost:W W -Types:Creature Cat Knight -Text:no text -PT:2/2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83416.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/11.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/25.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_squire.txt b/res/cardsfolder/leonin_squire.txt deleted file mode 100644 index 14e83986ca7..00000000000 --- a/res/cardsfolder/leonin_squire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leonin Squire -ManaCost:1 W -Types:Creature Cat Soldier -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target artifact card with converted mana cost 1 or less from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.cmcLE1+YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_squire.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leonin_sun_standard.txt b/res/cardsfolder/leonin_sun_standard.txt deleted file mode 100644 index 47da073d7ff..00000000000 --- a/res/cardsfolder/leonin_sun_standard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leonin Sun Standard -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leonin_sun_standard.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leshracs_rite.txt b/res/cardsfolder/leshracs_rite.txt deleted file mode 100644 index 1b9c7869393..00000000000 --- a/res/cardsfolder/leshracs_rite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Leshrac's Rite -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leshracs_rite.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/35.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/141.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/31.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leshracs_sigil.txt b/res/cardsfolder/leshracs_sigil.txt deleted file mode 100644 index 9f5ec46f5a6..00000000000 --- a/res/cardsfolder/leshracs_sigil.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Leshrac's Sigil -ManaCost:B B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ B B | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -T:Mode$ SpellCast | ValidCard$ Card.Green+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigDiscard:AB$Discard | Cost$ B B | Defined$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/leshracs_sigil.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lesser_gargadon.txt b/res/cardsfolder/lesser_gargadon.txt deleted file mode 100644 index 5b6e9857684..00000000000 --- a/res/cardsfolder/lesser_gargadon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lesser Gargadon -ManaCost:2 R R -Types:Creature Beast -Text:no text -PT:6/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice a land. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigSac | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice a land. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Land | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lesser_gargadon.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lethargy_trap.txt b/res/cardsfolder/lethargy_trap.txt deleted file mode 100644 index b6206260587..00000000000 --- a/res/cardsfolder/lethargy_trap.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lethargy Trap -ManaCost:3 U -Types:Instant Trap -Text:no text -A:SP$ PumpAll | Cost$ 3 U | ValidCards$ Creature.attacking | NumAtt$ -3 | IsPresent$ Creature.attacking | PresentCompare$ LE2 | SpellDescription$ If three or more creatures are attacking, you may pay U rather than pay CARDNAME mana cost. -A:SP$ PumpAll | Cost$ U | ValidCards$ Creature.attacking | NumAtt$ -3 | IsPresent$ Creature.attacking | PresentCompare$ GE3 | SpellDescription$ Attacking creatures get -3/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lethargy_trap.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leveler.txt b/res/cardsfolder/leveler.txt deleted file mode 100644 index 8a4b93c214b..00000000000 --- a/res/cardsfolder/leveler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Leveler -ManaCost:5 -Types:Artifact Creature Juggernaut -Text:no text -PT:10/10 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExileYourLibrary | TriggerDescription$ When CARDNAME enters the battlefield, exile all cards from your library. -SVar:TrigExileYourLibrary:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card.YouOwn | Origin$ Library | Destination$ Exile -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leveler.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/levitation.txt b/res/cardsfolder/levitation.txt deleted file mode 100644 index d91dd33c030..00000000000 --- a/res/cardsfolder/levitation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Levitation -ManaCost:2 U U -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Flying:No Condition:Creatures you control have flying. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/levitation.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/60.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/35.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/83.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ley_druid.txt b/res/cardsfolder/ley_druid.txt deleted file mode 100644 index ba989a5da0b..00000000000 --- a/res/cardsfolder/ley_druid.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Ley Druid -ManaCost:2 G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ley_druid.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/114.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/114.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/170.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/140.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/251.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/113.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_anticipation.txt b/res/cardsfolder/leyline_of_anticipation.txt deleted file mode 100644 index 2bca25ac753..00000000000 --- a/res/cardsfolder/leyline_of_anticipation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leyline of Anticipation -ManaCost:2 U U -Types:Enchantment -Text:If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. -K:stPumpAll:Card.nonLand+YouCtrl:0/0/HIDDEN Flash:No Condition:You may cast nonland cards as though they had flash. (You may cast them any time you could cast an instant.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_anticipation.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_lifeforce.txt b/res/cardsfolder/leyline_of_lifeforce.txt deleted file mode 100644 index 6261e51137e..00000000000 --- a/res/cardsfolder/leyline_of_lifeforce.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leyline of Lifeforce -ManaCost:2 G G -Types:Enchantment -Text:If CARDNAME is in your opening hand, you may begin the game with it on the battlefield. -K:stPumpAll:Creature:0/0/HIDDEN CARDNAME can't be countered.:No Condition:Creature spells can't be countered. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lifeforce.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_lightning.txt b/res/cardsfolder/leyline_of_lightning.txt deleted file mode 100644 index 4d1d3c24cb1..00000000000 --- a/res/cardsfolder/leyline_of_lightning.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leyline of Lightning -ManaCost:2 R R -Types:Enchantment -Text:If Leyline of Lightning is in your opening hand, you may begin the game with it on the battlefield. -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a spell, you may pay 1. If you do, CARDNAME deals 1 damage to target player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 1 | Tgt$ TgtP | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_lightning.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_punishment.txt b/res/cardsfolder/leyline_of_punishment.txt deleted file mode 100644 index b590e910ead..00000000000 --- a/res/cardsfolder/leyline_of_punishment.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Leyline of Punishment -ManaCost:2 R R -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_punishment.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_singularity.txt b/res/cardsfolder/leyline_of_singularity.txt deleted file mode 100644 index 12c3b6c64b8..00000000000 --- a/res/cardsfolder/leyline_of_singularity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leyline of Singularity -ManaCost:2 U U -Types:Enchantment -Text:If Leyline of Singularity is in your opening hand, you may begin the game with it on the battlefield. -K:stAnimateAll:Permanent.nonLand:no changes:Legendary:no colors:No Abilities:No Condition:All nonland permanents are legendary. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_singularity.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_the_meek.txt b/res/cardsfolder/leyline_of_the_meek.txt deleted file mode 100644 index b13c82dc42e..00000000000 --- a/res/cardsfolder/leyline_of_the_meek.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Leyline of the Meek -ManaCost:2 W W -Types:Enchantment -Text:If Leyline of the Meek is in your opening hand, you may begin the game with it on the battlefield. -K:stPumpAll:Creature.token:1/1:No Condition:Creature tokens get +1/+1. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_the_meek.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_the_void.txt b/res/cardsfolder/leyline_of_the_void.txt deleted file mode 100644 index e3d6938b657..00000000000 --- a/res/cardsfolder/leyline_of_the_void.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Leyline of the Void -ManaCost:2 B B -Types:Enchantment -Text:If Leyline of the Void is in your opening hand, you may begin the game with it on the battlefield.\r\nIf a card would be put into an opponent's graveyard from anywhere, exile it instead. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_the_void.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/52.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/leyline_of_vitality.txt b/res/cardsfolder/leyline_of_vitality.txt deleted file mode 100644 index f3dadc60045..00000000000 --- a/res/cardsfolder/leyline_of_vitality.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Leyline of Vitality -ManaCost:2 G G -Types:Enchantment -Text:If Leyline of Vitality is in your opening hand, you may begin the game with it on the battlefield. -K:stPumpAll:Creature.YouCtrl:0/1:No Condition:Creatures you control get +0/+1. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature enters the battlefield under your control, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/leyline_of_vitality.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lhurgoyf.txt b/res/cardsfolder/lhurgoyf.txt deleted file mode 100644 index bee90500554..00000000000 --- a/res/cardsfolder/lhurgoyf.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lhurgoyf -ManaCost:2 G G -Types:Creature Lhurgoyf -Text:no text -PT:*/1+* -K:stSetPT:Count$TypeInAllYards.Creature:Count$TypeInAllYards.Creature/Plus.1:CARDNAME's power is equal to the number of creature cards in all graveyards and its toughness is equal to that number plus 1. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lhurgoyf.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/259.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/171.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liability.txt b/res/cardsfolder/liability.txt deleted file mode 100755 index da148db2000..00000000000 --- a/res/cardsfolder/liability.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Liability -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.nonToken | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a nontoken permanent is put into a player's graveyard from the battlefield, that player loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardOwner | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/liability.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liberated_dwarf.txt b/res/cardsfolder/liberated_dwarf.txt deleted file mode 100644 index 3e6766754e8..00000000000 --- a/res/cardsfolder/liberated_dwarf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Liberated Dwarf -ManaCost:R -Types:Creature Dwarf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target green creature gets +1/+0 and gains first strike until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/liberated_dwarf.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/library_of_alexandria.txt b/res/cardsfolder/library_of_alexandria.txt deleted file mode 100644 index 63fc87509b9..00000000000 --- a/res/cardsfolder/library_of_alexandria.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Library of Alexandria -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Draw | Cost$ T | NumCards$ 1 | ActivatingCardsInHand$ 7 | SpellDescription$ Draw a card. Activate this ability only if you have exactly seven cards in hand. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/an/en-us/card990.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lich.txt b/res/cardsfolder/lich.txt deleted file mode 100644 index ad692d59353..00000000000 --- a/res/cardsfolder/lich.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lich -ManaCost:B B B B -Types:Enchantment -Text:As CARDNAME enters the battlefield, you lose life equal to your life total.\r\nYou don't lose the game for having 0 or less life.\r\nIf you would gain life, draw that many cards instead.\r\nWhenever you're dealt damage, sacrifice that many nontoken permanents. If you can't, you lose the game.\r\nWhen CARDNAME is put into a graveyard from the battlefield, you lose the game. -K:You don't lose the game for having 0 or less life. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lich.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/22.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/22.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lich_lord_of_unx.txt b/res/cardsfolder/lich_lord_of_unx.txt deleted file mode 100644 index 163085be8d5..00000000000 --- a/res/cardsfolder/lich_lord_of_unx.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lich Lord of Unx -ManaCost:1 U B -Types:Creature Zombie Wizard -Text:no text -PT:2/2 -A:AB$ Token | Cost$ U B T | TokenAmount$ 1 | TokenName$ Zombie Wizard | TokenTypes$ Creature,Zombie,Wizard | TokenOwner$ You | TokenColors$ Blue,Black | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 blue and black Zombie Wizard creature token onto the battlefield. -A:AB$ Mill | Cost$ U U B B | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ X | SubAbility$ SVar=DBLoseLife | SpellDescription$ 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. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ X | Defined$ Targeted -SVar:X:Count$Valid Zombie.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lich_lord_of_unx.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lichenthrope.txt b/res/cardsfolder/lichenthrope.txt deleted file mode 100644 index e3d02d1e65f..00000000000 --- a/res/cardsfolder/lichenthrope.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lichenthrope -ManaCost:3 G G -Types:Creature Plant Fungus -Text:If damage would be dealt to CARDNAME, put that many -1/-1 counters on it instead. -PT:5/5 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRem | TriggerDescription$ At the beginning of your upkeep, remove a -1/-1 counter from CARDNAME. -SVar:TrigRem:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lichenthrope.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liege_of_the_axe.txt b/res/cardsfolder/liege_of_the_axe.txt deleted file mode 100644 index d08b74f11ad..00000000000 --- a/res/cardsfolder/liege_of_the_axe.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Liege of the Axe -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/3 -K:Vigilance -K:Morph:1 W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME is turned face up, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_axe.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liege_of_the_pit.txt b/res/cardsfolder/liege_of_the_pit.txt deleted file mode 100644 index ff7a91e9203..00000000000 --- a/res/cardsfolder/liege_of_the_pit.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Liege of the Pit -ManaCost:5 B B B -Types:Creature Demon -Text: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. -PT:7/7 -K:Flying -K:Trample -K:Morph:B B B B -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_pit.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liege_of_the_tangle.txt b/res/cardsfolder/liege_of_the_tangle.txt deleted file mode 100644 index a524f794cfe..00000000000 --- a/res/cardsfolder/liege_of_the_tangle.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Liege of the Tangle -ManaCost:6 G G -Types:Creature Elemental -Text:no text -PT:8/8 -K:Trample -K:stAnimateAll:Land.countersGE1AWAKENING:8/8:Creature,Elemental:Green,Overwrite:No Abilities:No Condition:no text -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Land.YouCtrl | OptionalDecider$ You | TargetMax$ X | TgtPrompt$ Select lands you control | CounterType$ AWAKENING | CounterNum$ 1 | SubAbility$ SVar=DBEffect -SVar:X:Count$Valid Land.YouCtrl -SVar:DBEffect:DB$ Effect | Cost$ 0 | Name$ Awakening Effect | Keywords$ KWAnimateAll | Unique$ True | Duration$ Permanent -SVar:KWAnimateAll:stAnimateAll:Land.countersGE1AWAKENING:8/8:Creature,Elemental:Green,Overwrite:No Abilities:No Condition: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. -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/liege_of_the_tangle.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lieutenant_kirtar.txt b/res/cardsfolder/lieutenant_kirtar.txt deleted file mode 100644 index 5e512272f67..00000000000 --- a/res/cardsfolder/lieutenant_kirtar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lieutenant Kirtar -ManaCost:1 W W -Types:Legendary Creature Bird Soldier -Text:no text -PT:2/2 -K:Flying -A:AB$ ChangeZone | Cost$ 1 W Sac<1/CARDNAME> | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lieutenant_kirtar.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/life_and_limb.txt b/res/cardsfolder/life_and_limb.txt deleted file mode 100644 index 1a506368bd6..00000000000 --- a/res/cardsfolder/life_and_limb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Life and Limb -ManaCost:3 G -Types:Enchantment -Text:no text -K:stAnimateAll:Forest,Saproling:1/1:Land,Creature,Forest,Saproling:Green,Overwrite:No Abilities:No Condition:All Forests and all Saprolings are 1/1 green Saproling creatures and Forest lands in addition to their other types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/life_and_limb.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/life_burst.txt b/res/cardsfolder/life_burst.txt deleted file mode 100644 index 0d6a1da6020..00000000000 --- a/res/cardsfolder/life_burst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Life Burst -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 4 | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player gains 4 life, then gains 4 life for each card named CARDNAME in each graveyard. -SVar:DBGainLife:DB$GainLife | Defined$ Targeted | LifeAmount$ X -SVar:X:Count$NamedInAllYards.Life Burst/Times.4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card29704.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/life_chisel.txt b/res/cardsfolder/life_chisel.txt deleted file mode 100644 index f4ccb956ed5..00000000000 --- a/res/cardsfolder/life_chisel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Life Chisel -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ Sac<1/Creature> | LifeAmount$ X | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ You gain life equal to the sacrificed creature's toughness. Activate this ability only during your upkeep. -SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/life_chisel.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/life_from_the_loam.txt b/res/cardsfolder/life_from_the_loam.txt deleted file mode 100644 index b39789b7066..00000000000 --- a/res/cardsfolder/life_from_the_loam.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Life from the Loam -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target land card in your graveyard | ValidTgts$ Land.YouCtrl | SpellDescription$ Return up to three target land cards from your graveyard to your hand. -K:Dredge 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/life_from_the_loam.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifeblood.txt b/res/cardsfolder/lifeblood.txt deleted file mode 100644 index f3550b63ab3..00000000000 --- a/res/cardsfolder/lifeblood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lifeblood -ManaCost:2 W W -Types:Enchantment -Text:no text -T:Mode$ Taps | ValidCard$ Mountain.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a Mountain an opponent controls becomes tapped, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifeblood.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifeforce.txt b/res/cardsfolder/lifeforce.txt deleted file mode 100644 index ca8b91b8b82..00000000000 --- a/res/cardsfolder/lifeforce.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lifeforce -ManaCost:G G -Types:Enchantment -Text:no text -A:AB$ Counter | Cost$ G G | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card.Black | SpellDescription$ Counter target black spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifeforce.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/115.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/115.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/172.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/141.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/114.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifegift.txt b/res/cardsfolder/lifegift.txt deleted file mode 100644 index 6f9e88f274d..00000000000 --- a/res/cardsfolder/lifegift.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lifegift -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a land enters the battlefield, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifegift.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifelink.txt b/res/cardsfolder/lifelink.txt deleted file mode 100644 index 49b5c177731..00000000000 --- a/res/cardsfolder/lifelink.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lifelink -ManaCost:W -Types:Enchantment Aura -Text:Enchanted creature has lifelink. -K:Enchant creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifelink.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifes_finale.txt b/res/cardsfolder/lifes_finale.txt deleted file mode 100644 index 0beaa42ef47..00000000000 --- a/res/cardsfolder/lifes_finale.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Life's Finale -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 B B | ValidCards$ Creature | SubAbility$ SVar=DBSearch | SpellDescription$ 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. -SVar:DBSearch:DB$ChangeZone | Origin$ Library | Destination$ Graveyard | ValidTgts$ Opponent | ChangeType$ Creature | ChangeNum$ 3 | IsCurse$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifes_finale.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifesmith.txt b/res/cardsfolder/lifesmith.txt deleted file mode 100644 index be54bc44e90..00000000000 --- a/res/cardsfolder/lifesmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lifesmith -ManaCost:1 G -Types:Creature Human Artificer -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigGainLife | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may pay 1. If you do, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifesmith.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifespark_spellbomb.txt b/res/cardsfolder/lifespark_spellbomb.txt deleted file mode 100644 index f633e9b7833..00000000000 --- a/res/cardsfolder/lifespark_spellbomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lifespark Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature | SpellDescription$ Until end of turn, target land becomes a 3/3 creature that's still a land. -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifespark_spellbomb.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifespinner.txt b/res/cardsfolder/lifespinner.txt deleted file mode 100644 index ab3b3953448..00000000000 --- a/res/cardsfolder/lifespinner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lifespinner -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ T Sac<3/Spirit> | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Spirit+Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary Spirit permanent card and put it onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifespinner.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lifetap.txt b/res/cardsfolder/lifetap.txt deleted file mode 100644 index 1d62f7e3dd5..00000000000 --- a/res/cardsfolder/lifetap.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Lifetap -ManaCost:U U -Types:Enchantment -Text:no text -T:Mode$ Taps | ValidCard$ Forest.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a Forest an opponent controls becomes tapped, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/lifetap.jpg -SVar:Rarity:Uncommon -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/62.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/62.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/99.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/81.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/63.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/62.jpg -End diff --git a/res/cardsfolder/light_of_day.txt b/res/cardsfolder/light_of_day.txt deleted file mode 100644 index 2bb2ad1e2c4..00000000000 --- a/res/cardsfolder/light_of_day.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Light of Day -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Black:0/0/HIDDEN CARDNAME can't attack or block.:No Condition:Black creatures can't attack or block. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/light_of_day.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/239.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/light_of_sanction.txt b/res/cardsfolder/light_of_sanction.txt deleted file mode 100644 index b1cbc1ba3f6..00000000000 --- a/res/cardsfolder/light_of_sanction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Light of Sanction -ManaCost:1 W W -Types:Enchantment -Text:no text -K:stPreventDamage:Creature.YouCtrl:Card.YouCtrl:All:Prevent all damage that would be dealt to creatures you control by sources you control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/light_of_sanction.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightbringer.txt b/res/cardsfolder/lightbringer.txt deleted file mode 100644 index 12ced7f367a..00000000000 --- a/res/cardsfolder/lightbringer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lightbringer -ManaCost:2 W -Types:Creature Kor Rebel -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.Black | TgtPrompt$ Select target black Creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target black creature. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightbringer.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lighthouse_chronologist.txt b/res/cardsfolder/lighthouse_chronologist.txt deleted file mode 100644 index c1db0021d67..00000000000 --- a/res/cardsfolder/lighthouse_chronologist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lighthouse Chronologist -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/3 -K:stSetPT:1:3:LevelGE4:2:4:LevelGE7:3:5: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. -K:Level up:U -K:maxLevel:7 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/lighthouse_chronologist.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightkeeper_of_emeria.txt b/res/cardsfolder/lightkeeper_of_emeria.txt deleted file mode 100644 index b659b757f48..00000000000 --- a/res/cardsfolder/lightkeeper_of_emeria.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lightkeeper of Emeria -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/4 -K:Flying -K:Multikicker W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life for each time it was kicked. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ X -SVar:X:Count$TimesKicked/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightkeeper_of_emeria.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightmine_field.txt b/res/cardsfolder/lightmine_field.txt deleted file mode 100644 index c05f178aab0..00000000000 --- a/res/cardsfolder/lightmine_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lightmine Field -ManaCost:2 W W -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever one or more creatures attack, CARDNAME deals damage to each of those creatures equal to the number of attacking creatures. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredAttacker | NumDmg$ X -SVar:X:Count$Valid Creature.attacking -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightmine_field.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_angel.txt b/res/cardsfolder/lightning_angel.txt deleted file mode 100644 index c866685c578..00000000000 --- a/res/cardsfolder/lightning_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lightning Angel -ManaCost:1 R W U -Types:Creature Angel -Text:no text -PT:3/4 -K:Flying -K:Vigilance -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card109746.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/108.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_blast.txt b/res/cardsfolder/lightning_blast.txt deleted file mode 100644 index 8330457a1fb..00000000000 --- a/res/cardsfolder/lightning_blast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lightning Blast -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_blast.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/200.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/185.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/193.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/200.jpg -End diff --git a/res/cardsfolder/lightning_blow.txt b/res/cardsfolder/lightning_blow.txt deleted file mode 100644 index 8f429217095..00000000000 --- a/res/cardsfolder/lightning_blow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Blow -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_blow.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_bolt.txt b/res/cardsfolder/lightning_bolt.txt deleted file mode 100644 index 6806585a709..00000000000 --- a/res/cardsfolder/lightning_bolt.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lightning Bolt -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/bd/en-us/card27255.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/162.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/163.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/226.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/149.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/146.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/161.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_cloud.txt b/res/cardsfolder/lightning_cloud.txt deleted file mode 100644 index 13d0bb77826..00000000000 --- a/res/cardsfolder/lightning_cloud.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Cloud -ManaCost:3 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a player casts a red spell, you may pay R. If you do, CARDNAME deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_cloud.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_crafter.txt b/res/cardsfolder/lightning_crafter.txt deleted file mode 100644 index 963d7b1a286..00000000000 --- a/res/cardsfolder/lightning_crafter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Crafter -ManaCost:3 R -Types:Creature Goblin Shaman -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_crafter.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_dragon.txt b/res/cardsfolder/lightning_dragon.txt deleted file mode 100644 index 59e6eab6bbf..00000000000 --- a/res/cardsfolder/lightning_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lightning Dragon -ManaCost:2 R R -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -K:Echo:2 R R -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_dragon.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/202.jpg -End diff --git a/res/cardsfolder/lightning_elemental.txt b/res/cardsfolder/lightning_elemental.txt deleted file mode 100644 index 76fe1de76d4..00000000000 --- a/res/cardsfolder/lightning_elemental.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lightning Elemental -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:4/1 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83150.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/201.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/186.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/201.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/201.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/217.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_greaves.txt b/res/cardsfolder/lightning_greaves.txt deleted file mode 100644 index 35a47a5eaf5..00000000000 --- a/res/cardsfolder/lightning_greaves.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lightning Greaves -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature has haste and shroud. -K:eqPump 0:Haste & Shroud -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_greaves.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_helix.txt b/res/cardsfolder/lightning_helix.txt deleted file mode 100644 index ac5672d0c97..00000000000 --- a/res/cardsfolder/lightning_helix.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Helix -ManaCost:R W -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R W | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ Lightning Helix deals 3 damage to target creature or player and you gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_helix.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/213.jpg -End diff --git a/res/cardsfolder/lightning_hounds.txt b/res/cardsfolder/lightning_hounds.txt deleted file mode 100644 index e98e65d90bd..00000000000 --- a/res/cardsfolder/lightning_hounds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Hounds -ManaCost:2 R R -Types:Creature Hound -Text:no text -PT:3/2 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_hounds.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_reaver.txt b/res/cardsfolder/lightning_reaver.txt deleted file mode 100644 index 1b94b74e279..00000000000 --- a/res/cardsfolder/lightning_reaver.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Lightning Reaver -ManaCost:3 R B -Types:Creature Zombie Beast -Text:no text -PT:3/3 -K:Haste -K:Fear -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a charge counter on it. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals damage equal to the number of charge counters on it to each opponent. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$CardCounters.CHARGE -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_reaver.jpg -SVar:Rarity:Rare -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/42.jpg -End diff --git a/res/cardsfolder/lightning_rift.txt b/res/cardsfolder/lightning_rift.txt deleted file mode 100644 index 200a2ff0022..00000000000 --- a/res/cardsfolder/lightning_rift.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lightning Rift -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, you may pay 1. If you do, CARDNAME deals 2 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 1 | Tgt$ TgtCP | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_rift.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_serpent.txt b/res/cardsfolder/lightning_serpent.txt deleted file mode 100644 index 40b0f76985e..00000000000 --- a/res/cardsfolder/lightning_serpent.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lightning Serpent -ManaCost:X R -Types:Creature Elemental Serpent -Text:no text -PT:2/1 -K:Trample -K:Haste -K:etbCounter:P1P0:X -SVar:X:Count$xPaid -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_serpent.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_surge.txt b/res/cardsfolder/lightning_surge.txt deleted file mode 100644 index 9259bc4f262..00000000000 --- a/res/cardsfolder/lightning_surge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lightning Surge -ManaCost:3 R R -Types:Sorcery -Text:no text -K:Flashback:5 R R -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 6 | NoPrevention$ True | Threshold$ True | SpellDescription$ Threshold - If seven or more cards are in your graveyard, instead CARDNAME deals 6 damage to that creature or player and the damage can't be prevented. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_surge.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightning_talons.txt b/res/cardsfolder/lightning_talons.txt deleted file mode 100644 index fe0654a25a7..00000000000 --- a/res/cardsfolder/lightning_talons.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lightning Talons -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+0/First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightning_talons.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lightwielder_paladin.txt b/res/cardsfolder/lightwielder_paladin.txt deleted file mode 100644 index 6aef8f701c7..00000000000 --- a/res/cardsfolder/lightwielder_paladin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lightwielder Paladin -ManaCost:3 W W -Types:Creature Human Knight -Text:no text -PT:4/4 -K:First Strike -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may exile target black or red permanent that player controls. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent.Black+YouDontCtrl,Permanent.Red+YouDontCtrl | TgtPrompt$ Choose target black or red permanent. | Origin$ Battlefield | Destination$ Exile | IsCurse$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lightwielder_paladin.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lignify.txt b/res/cardsfolder/lignify.txt deleted file mode 100644 index 3f0d0812cbe..00000000000 --- a/res/cardsfolder/lignify.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lignify -ManaCost:1 G -Types:Tribal Enchantment Treefolk Aura -Text:no text -K:Enchant Creature Curse -K:stAnimateEnchanted:Creature:0/4/Overwrite:Creature,Treefolk,Overwrite:no colors:Overwrite:No condition:Enchanted creature is a 0/4 Treefolk with no abilities. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lignify.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liliana_vess.txt b/res/cardsfolder/liliana_vess.txt deleted file mode 100644 index ff721662635..00000000000 --- a/res/cardsfolder/liliana_vess.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Liliana Vess -ManaCost:3 B B -Types:Planeswalker Liliana -Text:no text -Loyalty:5 -A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, then shuffle your library and put that card on top of it. -A:AB$ ChangeZoneAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SpellDescription$ Put all creature cards in all graveyards onto the battlefield under your control. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card140212.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/102.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/102.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lilianas_caress.txt b/res/cardsfolder/lilianas_caress.txt deleted file mode 100644 index cc898286791..00000000000 --- a/res/cardsfolder/lilianas_caress.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Liliana's Caress -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$TrigLoseLife | TriggerDescription$ Whenever an opponent discards a card, that player loses 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_caress.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lilianas_specter.txt b/res/cardsfolder/lilianas_specter.txt deleted file mode 100644 index 78e6745f7a8..00000000000 --- a/res/cardsfolder/lilianas_specter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Liliana's Specter -ManaCost:1 B B -Types:Creature Specter -Text:no text -PT:2/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lilianas_specter.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lilting_refrain.txt b/res/cardsfolder/lilting_refrain.txt deleted file mode 100644 index bf6fc3963a1..00000000000 --- a/res/cardsfolder/lilting_refrain.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lilting Refrain -ManaCost:1 U -Types:Enchantment -Text:no text -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Sacrifice CARDNAME: Counter target spell unless its controller pays X, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lilting_refrain.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lim_dul_the_necromancer.txt b/res/cardsfolder/lim_dul_the_necromancer.txt deleted file mode 100644 index 497f341dc01..00000000000 --- a/res/cardsfolder/lim_dul_the_necromancer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lim-Dul the Necromancer -ManaCost:5 B B -Types:Legendary Creature Human Wizard -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls is put into a graveyard from the battlefield, 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. -SVar:TrigReturn:AB$ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard | SubAbility$ SVar=Animate -SVar:Animate:DB$Animate | Defined$ TriggeredCard | Types$ Zombie | Permanent$ True -A:AB$ Regenerate | ValidTgts$ Zombie | TgtPrompt$ Select target Zombie | Cost$ 1 B | SpellDescription$ Regenerate target Zombie. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lim_dul_the_necromancer.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/114.jpg -End diff --git a/res/cardsfolder/lim_duls_cohort.txt b/res/cardsfolder/lim_duls_cohort.txt deleted file mode 100644 index 46bc01a274a..00000000000 --- a/res/cardsfolder/lim_duls_cohort.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lim-Dul's Cohort -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/3 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | Execute$ TrigBlocks | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature can't be regenerated this turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigBlocked | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature can't be regenerated this turn. -SVar:TrigBlocks:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | KW$ HIDDEN CARDNAME can't be regenerated. -SVar:TrigBlocked:AB$Pump | Cost$ 0 | Defined$ TriggeredBlocker | KW$ HIDDEN CARDNAME can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lim_duls_cohort.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/33.jpg -End diff --git a/res/cardsfolder/lim_duls_high_guard.txt b/res/cardsfolder/lim_duls_high_guard.txt deleted file mode 100644 index b66c21fa39a..00000000000 --- a/res/cardsfolder/lim_duls_high_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lim-Dul's High Guard -ManaCost:1 B B -Types:Creature Skeleton -Text:no text -PT:2/1 -K:First Strike -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lim_duls_high_guard.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/17.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/limestone_golem.txt b/res/cardsfolder/limestone_golem.txt deleted file mode 100644 index 9b5cc95f66c..00000000000 --- a/res/cardsfolder/limestone_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Limestone Golem -ManaCost:6 -Types:Artifact Creature Golem -PT:3/4 -Text:no text -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player to draw a card | SpellDescription$ Target player draws a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/limestone_golem.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lin_sivvi_defiant_hero.txt b/res/cardsfolder/lin_sivvi_defiant_hero.txt deleted file mode 100644 index 5e636c4960e..00000000000 --- a/res/cardsfolder/lin_sivvi_defiant_hero.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lin Sivvi, Defiant Hero -ManaCost:1 W W -Types:Legendary Creature Human Rebel -Text:no text -PT:1/3 -A:AB$ ChangeZone | Cost$ X T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Rebel+cmcLEX | ChangeNum$ 1 | SpellDescription$ 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. -A:AB$ ChangeZone | Cost$ 3 | ValidTgts$ Rebel.YouCtrl | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | TgtPrompt$ Select target Rebel card in your graveyard | SpellDescription$ Put target Rebel card in your graveyard on the bottom of your library. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lin_sivvi_defiant_hero.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lingering_death.txt b/res/cardsfolder/lingering_death.txt deleted file mode 100644 index 156623dcae6..00000000000 --- a/res/cardsfolder/lingering_death.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lingering Death -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of the end step of enchanted creature's controller, that player sacrifices that creature. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | SacValid$ Card.AttachedBy | Defined$ TriggeredPlayer | SacMessage$ enchanted creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lingering_death.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lingering_mirage.txt b/res/cardsfolder/lingering_mirage.txt deleted file mode 100644 index f0cd47ac483..00000000000 --- a/res/cardsfolder/lingering_mirage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lingering Mirage -ManaCost:1 U -Types:Enchantment Aura -Text:no text -# -# Need to set the spell description in CardFactory_Auras for Lingering Mirage since it has cycling -# -K:Enchant land -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lingering_mirage.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lingering_tormentor.txt b/res/cardsfolder/lingering_tormentor.txt deleted file mode 100644 index 5bb5e4350cf..00000000000 --- a/res/cardsfolder/lingering_tormentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lingering Tormentor -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:2/2 -K:Fear -K:Persist -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lingering_tormentor.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/linvala_keeper_of_silence.txt b/res/cardsfolder/linvala_keeper_of_silence.txt deleted file mode 100644 index 04936d232eb..00000000000 --- a/res/cardsfolder/linvala_keeper_of_silence.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Linvala, Keeper of Silence -ManaCost:2 W W -Types:Legendary Creature Angel -Text:no text -PT:3/4 -K:Flying -K:stPumpAll:Creature.YouDontCtrl:0/0/HIDDEN CARDNAME's activated abilities can't be activated.:No Condition:Activated abilities of creatures your opponents control can't be activated. -SVar:PlayMain1:TRUE -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/linvala_keeper_of_silence.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lionheart_maverick.txt b/res/cardsfolder/lionheart_maverick.txt deleted file mode 100644 index f20787f7f73..00000000000 --- a/res/cardsfolder/lionheart_maverick.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lionheart Maverick -ManaCost:W -Types:Creature Human Knight -Text:no text -PT:1/1 -K:Vigilance -A:AB$ Pump | Cost$ 4 W | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ CARDNAME gets +1/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lionheart_maverick.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/11.jpg -End diff --git a/res/cardsfolder/liquify.txt b/res/cardsfolder/liquify.txt deleted file mode 100644 index e536d7b01be..00000000000 --- a/res/cardsfolder/liquify.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Liquify -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell with CMC 3 or less | ValidTgts$ Card.cmcLE3 | Destination$ Exile | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/liquify.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liquimetal_coating.txt b/res/cardsfolder/liquimetal_coating.txt deleted file mode 100644 index 31c9a0a49ca..00000000000 --- a/res/cardsfolder/liquimetal_coating.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Liquimetal Coating -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | SpellDescription$ Target permanent becomes an artifact in addition to its other types until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/liquimetal_coating.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lithatog.txt b/res/cardsfolder/lithatog.txt deleted file mode 100644 index 4579526e437..00000000000 --- a/res/cardsfolder/lithatog.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lithatog -ManaCost:1 R G -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Artifact> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Lithatog gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Lithatog gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lithatog.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/liu_bei_lord_of_shu.txt b/res/cardsfolder/liu_bei_lord_of_shu.txt deleted file mode 100644 index 5a6b7a963be..00000000000 --- a/res/cardsfolder/liu_bei_lord_of_shu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Liu Bei, Lord of Shu -ManaCost:3 W W -Types:Legendary Creature Human Soldier -Text: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. -PT:2/4 -K:Horsemanship -SVar:BuffedBy:Permanent.named -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/liu_bei_lord_of_shu.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_airship.txt b/res/cardsfolder/living_airship.txt deleted file mode 100644 index 35491edf275..00000000000 --- a/res/cardsfolder/living_airship.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Living Airship -ManaCost:3 U -Types:Creature Metathran -Text:no text -PT:2/3 -K:Flying -A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_airship.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_armor.txt b/res/cardsfolder/living_armor.txt deleted file mode 100644 index a7028b8f584..00000000000 --- a/res/cardsfolder/living_armor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Living Armor -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P0P1 | CounterNum$ X | SpellDescription$ Put X +0/+1 counters on target creature, where X is that creature's converted mana cost. -SVar:X:Targeted$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_armor.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_artifact.txt b/res/cardsfolder/living_artifact.txt deleted file mode 100644 index 9653377879c..00000000000 --- a/res/cardsfolder/living_artifact.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Living Artifact -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant Artifact -T:Mode$ DamageDone | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you're dealt damage, put that many vitality counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VITALITY | CounterNum$ X -SVar:X:TriggerCount$DamageAmount -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | IsPresent$ Card.Self+countersGE1VITALITY | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may remove a vitality counter from CARDNAME. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ SubCounter<1/VITALITY> | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_artifact.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/117.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/117.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/173.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/143.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/116.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_death.txt b/res/cardsfolder/living_death.txt deleted file mode 100644 index a34fb02eb55..00000000000 --- a/res/cardsfolder/living_death.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Living Death -ManaCost:3 B B -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_death.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_hive.txt b/res/cardsfolder/living_hive.txt deleted file mode 100644 index b2d4b5a754b..00000000000 --- a/res/cardsfolder/living_hive.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Living Hive -ManaCost:6 G G -Types:Creature Elemental Insect -Text:no text -PT:6/6 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigToken | ValidTarget$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put that many 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_hive.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_lands.txt b/res/cardsfolder/living_lands.txt deleted file mode 100644 index ff0a87a8ee2..00000000000 --- a/res/cardsfolder/living_lands.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Living Lands -ManaCost:3 G -Types:Enchantment -Text:no text -K:stAnimateAll:Forest:1/1:Creature:no colors:No Abilities:No Condition:All Forests are 1/1 creatures that are still lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_lands.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/118.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/118.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/174.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/144.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/238.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/117.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_plane.txt b/res/cardsfolder/living_plane.txt deleted file mode 100644 index 07c1cc6d5c2..00000000000 --- a/res/cardsfolder/living_plane.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Living Plane -ManaCost:2 G G -Types:World Enchantment -Text:no text -K:stAnimateAll:Land:1/1:Creature:no colors:No Abilities:No Condition:All lands are 1/1 creatures that are still lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_plane.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/living_wall.txt b/res/cardsfolder/living_wall.txt deleted file mode 100644 index a6a168f18d3..00000000000 --- a/res/cardsfolder/living_wall.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Living Wall -ManaCost:4 -Types:Artifact Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Regenerate | Cost$ 1 | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/living_wall.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/258.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/260.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/262.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/livonya_silone.txt b/res/cardsfolder/livonya_silone.txt deleted file mode 100644 index 5768c2a6576..00000000000 --- a/res/cardsfolder/livonya_silone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Livonya Silone -ManaCost:2 R R G G -Types:Legendary Creature Human Warrior -Text:no text -PT:4/4 -K:First Strike -K:Legendary landwalk -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/livonya_silone.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lizard_warrior.txt b/res/cardsfolder/lizard_warrior.txt deleted file mode 100644 index 97fea5130a5..00000000000 --- a/res/cardsfolder/lizard_warrior.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lizard Warrior -ManaCost:3 R -Types:Creature Lizard Warrior -Text:no text -PT:4/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4350.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_augur.txt b/res/cardsfolder/llanowar_augur.txt deleted file mode 100644 index 3888a99c301..00000000000 --- a/res/cardsfolder/llanowar_augur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Llanowar Augur -ManaCost:G -Types:Creature Elf Shaman -Text:no text -PT:0/3 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivatingPhases$ Upkeep | PlayerTurn$ True| SpellDescription$ Target creature gets +3/+3 and gains trample until end of turn. Activate this ability only during your upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_augur.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_behemoth.txt b/res/cardsfolder/llanowar_behemoth.txt deleted file mode 100644 index 012fa4244a7..00000000000 --- a/res/cardsfolder/llanowar_behemoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Llanowar Behemoth -ManaCost:3 G G -Types:Creature Elemental -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83152.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/261.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/74.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_cavalry.txt b/res/cardsfolder/llanowar_cavalry.txt deleted file mode 100644 index 16e986cc4ff..00000000000 --- a/res/cardsfolder/llanowar_cavalry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Llanowar Cavalry -ManaCost:2 G -Types:Creature Human Soldier -Text:no text -PT:1/4 -A:AB$ Pump | Cost$ W | KW$ Vigilance | SpellDescription$ CARDNAME gains vigilance until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_cavalry.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/195.jpg -End diff --git a/res/cardsfolder/llanowar_dead.txt b/res/cardsfolder/llanowar_dead.txt deleted file mode 100644 index 85920942c36..00000000000 --- a/res/cardsfolder/llanowar_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Llanowar Dead -ManaCost:B G -Types:Creature Zombie Elf -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card26759.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_druid.txt b/res/cardsfolder/llanowar_druid.txt deleted file mode 100644 index bcd5a4160b7..00000000000 --- a/res/cardsfolder/llanowar_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Llanowar Druid -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/2 -A:AB$ UntapAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Forest | SpellDescription$ Untap all Forests. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_druid.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_elite.txt b/res/cardsfolder/llanowar_elite.txt deleted file mode 100644 index e421a9c4a4f..00000000000 --- a/res/cardsfolder/llanowar_elite.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Llanowar Elite -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -K:Trample -K:Kicker:8 -K:etbCounter:P1P1:5:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with five +1/+1 counters on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_elite.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_elves.txt b/res/cardsfolder/llanowar_elves.txt deleted file mode 100644 index 03e8052e11f..00000000000 --- a/res/cardsfolder/llanowar_elves.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Llanowar Elves -ManaCost:G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83515.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/119.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/119.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/253.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/175.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/145.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/253.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/274.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/184.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/189.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/239.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/118.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_empath.txt b/res/cardsfolder/llanowar_empath.txt deleted file mode 100644 index 3b0e953542a..00000000000 --- a/res/cardsfolder/llanowar_empath.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Llanowar Empath -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigScry | TriggerDescription$ When CARDNAME 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.) -SVar:TrigScry:AB$Scry | Cost$ 0 | ScryNum$ 2 | SubAbility$ SVar=DBDig -SVar:DBDig:DB$Dig | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | LibraryPosition2$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_empath.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_knight.txt b/res/cardsfolder/llanowar_knight.txt deleted file mode 100644 index ebe57e35e51..00000000000 --- a/res/cardsfolder/llanowar_knight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Llanowar Knight -ManaCost:G W -Types:Creature Elf Knight -Text:no text -PT:2/2 -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_knight.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_mentor.txt b/res/cardsfolder/llanowar_mentor.txt deleted file mode 100644 index 05db44d6a7d..00000000000 --- a/res/cardsfolder/llanowar_mentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Llanowar Mentor -ManaCost:G -Types:Creature Elf Spellshaper -Text:no text -PT:1/1 -A:AB$ Token | Cost$ G T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Llanowar Elves | TokenTypes$ Creature,Elf,Druid | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenAbilities$ ABMana | SpellDescription$ Put a 1/1 green Elf Druid creature token named Llanowar Elves onto the battlefield. It has "Tap: Add G to your mana pool." -SVar:ABMana:AB$Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card126166.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/llanowar_sentinel.txt b/res/cardsfolder/llanowar_sentinel.txt deleted file mode 100644 index b7db9102d11..00000000000 --- a/res/cardsfolder/llanowar_sentinel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Llanowar Sentinel -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may pay 1 G. If you do, search your library for a card named CARDNAME and put that card onto the battlefield. Then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.namedLlanowar Sentinel | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_sentinel.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/76.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/275.jpg -End diff --git a/res/cardsfolder/llanowar_wastes.txt b/res/cardsfolder/llanowar_wastes.txt deleted file mode 100644 index 976dd2564ad..00000000000 --- a/res/cardsfolder/llanowar_wastes.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Llanowar Wastes -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/llanowar_wastes.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/141.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/322.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/355.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loam_dweller.txt b/res/cardsfolder/loam_dweller.txt deleted file mode 100644 index e7932213e53..00000000000 --- a/res/cardsfolder/loam_dweller.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Loam Dweller -ManaCost:1 G -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigLand | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may put a land card from your hand onto the battlefield tapped. -SVar:TrigLand:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | Tapped$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/loam_dweller.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loam_lion.txt b/res/cardsfolder/loam_lion.txt deleted file mode 100644 index 2fa1825d45a..00000000000 --- a/res/cardsfolder/loam_lion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Loam Lion -ManaCost:W -Types:Creature Cat -Text:no text -PT:1/1 -K:stPumpSelf:Creature:1/2:isPresent Forest.YouCtrl:CARDNAME gets +1/+2 as long as you control a Forest. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/loam_lion.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loamdragger_giant.txt b/res/cardsfolder/loamdragger_giant.txt deleted file mode 100644 index 0ebccbfb625..00000000000 --- a/res/cardsfolder/loamdragger_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Loamdragger Giant -ManaCost:4 RG RG RG -Types:Creature Giant Warrior -Text:no text -PT:7/6 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loamdragger_giant.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lobotomy.txt b/res/cardsfolder/lobotomy.txt deleted file mode 100644 index 2fb445f3a99..00000000000 --- a/res/cardsfolder/lobotomy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lobotomy -ManaCost:2 U B -Types:Sorcery -Text: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lobotomy.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/342.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loch_korrigan.txt b/res/cardsfolder/loch_korrigan.txt deleted file mode 100644 index 0a7098f09c4..00000000000 --- a/res/cardsfolder/loch_korrigan.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Loch Korrigan -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ UB | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loch_korrigan.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/71.jpg -End diff --git a/res/cardsfolder/lockjaw_snapper.txt b/res/cardsfolder/lockjaw_snapper.txt deleted file mode 100644 index 812c503a4e6..00000000000 --- a/res/cardsfolder/lockjaw_snapper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lockjaw Snapper -ManaCost:4 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/2 -K:Wither -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounters | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a -1/-1 counter on each creature with a -1/-1 counter on it. -SVar:TrigPutCounters:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.countersGE1M1M1 | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lockjaw_snapper.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/locust_miser.txt b/res/cardsfolder/locust_miser.txt deleted file mode 100644 index e1f3b74f47d..00000000000 --- a/res/cardsfolder/locust_miser.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Locust Miser -ManaCost:2 B B -Types:Creature Rat Shaman -Text:Each opponent's maximum hand size is reduced by two. -PT:2/2 -K:HandSize - 2 Opponent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/locust_miser.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/locust_swarm.txt b/res/cardsfolder/locust_swarm.txt deleted file mode 100644 index f081a4242d8..00000000000 --- a/res/cardsfolder/locust_swarm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Locust Swarm -ManaCost:3 G -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -A:AB$ Untap | Cost$ G | ActivationLimit$ 1 | SpellDescription$ Untap CARDNAME. Activate this ability only once each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/locust_swarm.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lodestone_bauble.txt b/res/cardsfolder/lodestone_bauble.txt deleted file mode 100644 index 7fa50c4e379..00000000000 --- a/res/cardsfolder/lodestone_bauble.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lodestone Bauble -ManaCost:0 -Types:Artifact -Text:no text -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lodestone_bauble.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lodestone_golem.txt b/res/cardsfolder/lodestone_golem.txt deleted file mode 100644 index ff366554080..00000000000 --- a/res/cardsfolder/lodestone_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lodestone Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:Nonartifact spells cost 1 more to cast. -PT:5/3 -K:CostChange:All:More:1:Spell:All:Artifact:NonType -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lodestone_golem.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lodestone_myr.txt b/res/cardsfolder/lodestone_myr.txt deleted file mode 100644 index dbc401f5cab..00000000000 --- a/res/cardsfolder/lodestone_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lodestone Myr -ManaCost:4 -Types:Artifact Creature Myr -Text:no text -PT:2/2 -K:Trample -A:AB$ Pump | Cost$ tapXType<1/Artifact> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lodestone_myr.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/200.jpg -End diff --git a/res/cardsfolder/lone_missionary.txt b/res/cardsfolder/lone_missionary.txt deleted file mode 100644 index f4b562eafe9..00000000000 --- a/res/cardsfolder/lone_missionary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lone Missionary -ManaCost:1 W -Types:Creature Kor Monk -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lone_missionary.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lonely_sandbar.txt b/res/cardsfolder/lonely_sandbar.txt deleted file mode 100644 index e4f3f5d5138..00000000000 --- a/res/cardsfolder/lonely_sandbar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lonely Sandbar -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:Cycling:U -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lonely_sandbar.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/long_forgotten_gohei.txt b/res/cardsfolder/long_forgotten_gohei.txt deleted file mode 100644 index 7015cd503e4..00000000000 --- a/res/cardsfolder/long_forgotten_gohei.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Long-Forgotten Gohei -ManaCost:3 -Types:Artifact -Text:Arcane spells you cast cost 1 less to cast. -K:stPumpAll:Creature.Spirit+YouCtrl:1/1:No Condition:Spirit creatures you control get +1/+1. -K:CostChange:Player:Less:1:Spell:All:Arcane:NoSpecial -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/long_forgotten_gohei.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/long_term_plans.txt b/res/cardsfolder/long_term_plans.txt deleted file mode 100644 index 4ab3d274879..00000000000 --- a/res/cardsfolder/long_term_plans.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Long-Term Plans -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Library | Destination$ Library | LibraryPosition$ 2 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, shuffle your library, then put that card third from the top. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/long_term_plans.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/longbow_archer.txt b/res/cardsfolder/longbow_archer.txt deleted file mode 100644 index cd6314b32bb..00000000000 --- a/res/cardsfolder/longbow_archer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Longbow Archer -ManaCost:W W -Types:Creature Human Soldier Archer -Text:no text -PT:2/2 -K:First Strike -K:Reach -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/longbow_archer.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/112.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/30.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/looming_hoverguard.txt b/res/cardsfolder/looming_hoverguard.txt deleted file mode 100644 index f80e992ed08..00000000000 --- a/res/cardsfolder/looming_hoverguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Looming Hoverguard -ManaCost:4 U U -Types:Creature Drone -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target artifact on top of its owner's library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/looming_hoverguard.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/looming_shade.txt b/res/cardsfolder/looming_shade.txt deleted file mode 100644 index 54505aa2b45..00000000000 --- a/res/cardsfolder/looming_shade.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Looming Shade -ManaCost:2 B -Types:Creature Shade -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/looming_shade.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/140.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/139.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/145.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/142.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/153.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/103.jpg -End diff --git a/res/cardsfolder/looter_il_kor.txt b/res/cardsfolder/looter_il_kor.txt deleted file mode 100644 index a3490efd3c4..00000000000 --- a/res/cardsfolder/looter_il_kor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Looter il-Kor -ManaCost:1 U -Types:Creature Kor Rogue -Text:no text -PT:1/1 -K:Shadow -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, draw a card, then discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/looter_il_kor.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_magnus.txt b/res/cardsfolder/lord_magnus.txt deleted file mode 100644 index aa95ac593f3..00000000000 --- a/res/cardsfolder/lord_magnus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lord Magnus -ManaCost:3 G W W -Types:Legendary Creature Human Druid -Text:Creatures with plainswalk can be blocked as though they didn't have plainswalk.\r\nCreatures with forestwalk can be blocked as though they didn't have forestwalk. -PT:4/3 -K:First Strike -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_magnus.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_atlantis.txt b/res/cardsfolder/lord_of_atlantis.txt deleted file mode 100644 index f395337f6b8..00000000000 --- a/res/cardsfolder/lord_of_atlantis.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Lord of Atlantis -ManaCost:U U -Types:Creature Merfolk -Text:no text -PT:2/2 -K:stPumpAll:Creature.Merfolk+Other:1/1/Islandwalk:No Condition:Other Merfolk creatures get +1/+1 and have islandwalk. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_atlantis.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/63.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/63.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/83.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/82.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/24.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/79.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/64.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/100.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_extinction.txt b/res/cardsfolder/lord_of_extinction.txt deleted file mode 100644 index de6bb935cdb..00000000000 --- a/res/cardsfolder/lord_of_extinction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lord of Extinction -ManaCost:3 B G -Types:Creature Elemental -Text:no text -PT:*/* -K:stSetPT:Count$InAllYards:Count$InAllYards:CARDNAME's power and toughness are each equal to the number of cards in all graveyards. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_extinction.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_shatterskull_pass.txt b/res/cardsfolder/lord_of_shatterskull_pass.txt deleted file mode 100644 index b9b6479dc0f..00000000000 --- a/res/cardsfolder/lord_of_shatterskull_pass.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lord of Shatterskull Pass -ManaCost:3 R -Types:Creature Minotaur Shaman -Text:no text -PT:3/3 -K:stSetPT:3:3:LevelGE1:6:6:LevelGE6:6:6:LEVEL 1-5 6/6 LEVEL 6+ 6/6 Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerZones$ Battlefield | Secondary$ True | IsPresent$ Card.Self+countersGE6LEVEL | TriggerDescription$ Whenever CARDNAME attacks, it deals 6 damage to each creature defending player controls. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.YouDontCtrl | NumDmg$ 6 -K:Level up:1 R -K:maxLevel:6 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_shatterskull_pass.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_the_pit.txt b/res/cardsfolder/lord_of_the_pit.txt deleted file mode 100644 index 160f3f1f74b..00000000000 --- a/res/cardsfolder/lord_of_the_pit.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Lord of the Pit -ManaCost:4 B B B -Types:Creature Demon -Text: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. -PT:7/7 -K:Flying -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_the_pit.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/23.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/23.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/36.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/28.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/154.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/24.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_the_undead.txt b/res/cardsfolder/lord_of_the_undead.txt deleted file mode 100644 index 91161ef5eb2..00000000000 --- a/res/cardsfolder/lord_of_the_undead.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Lord of the Undead -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/2 -K:stPumpAll:Creature.Zombie+Other:1/1:No Condition:Other Zombie creatures get +1/+1. -A:AB$ ChangeZone | Cost$ 1 B T | TgtPrompt$ Choose target Zombie card in your graveyard | ValidTgts$ Zombie.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target Zombie card from your graveyard to your hand. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_the_undead.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/141.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/44.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/143.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lord_of_tresserhorn.txt b/res/cardsfolder/lord_of_tresserhorn.txt deleted file mode 100644 index 0ea6d9c234c..00000000000 --- a/res/cardsfolder/lord_of_tresserhorn.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lord of Tresserhorn -ManaCost:1 U B R -Types:Legendary Creature Zombie -Text:no text -PT:10/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigLose | TriggerDescription$ When CARDNAME enters the battlefield, you lose 2 life, you sacrifice two creatures, and target opponent draws two cards. -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:TrigLose:DB$LoseLife | LifeAmount$ 2 | SubAbility$ SVar=DBSac -SVar:DBSac:DB$Sacrifice | Amount$ 2 | SacValid$ Creature | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | ValidTgts$ Opponent | NumCards$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lord_of_tresserhorn.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lore_broker.txt b/res/cardsfolder/lore_broker.txt deleted file mode 100644 index a74c6868994..00000000000 --- a/res/cardsfolder/lore_broker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lore Broker -ManaCost:1 U -Types:Creature Human Rogue -Text:no text -PT:1/2 -A:AB$ Draw | Cost$ T | Defined$ Each | SpellDescription$ Each player draws a card, then discards a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Each -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lore_broker.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lorescale_coatl.txt b/res/cardsfolder/lorescale_coatl.txt deleted file mode 100644 index e8f272192cf..00000000000 --- a/res/cardsfolder/lorescale_coatl.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lorescale Coatl -ManaCost:1 G U -Types:Creature Snake -Text:no text -PT:2/2 -T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw a card, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lorescale_coatl.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lorthos_the_tidemaker.txt b/res/cardsfolder/lorthos_the_tidemaker.txt deleted file mode 100644 index 54f89534e97..00000000000 --- a/res/cardsfolder/lorthos_the_tidemaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lorthos, the Tidemaker -ManaCost:5 U U U -Types:Legendary Creature Octopus -Text:no text -PT:8/8 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigTap:AB$ Tap | Cost$ 8 | ValidTgts$ Permanent | TargetMin$ 0 | TargetMax$ 8 | TgtPrompt$ Select target permanent | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/lorthos_the_tidemaker.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lose_hope.txt b/res/cardsfolder/lose_hope.txt deleted file mode 100644 index cf393be2076..00000000000 --- a/res/cardsfolder/lose_hope.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lose Hope -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lose_hope.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lost_auramancers.txt b/res/cardsfolder/lost_auramancers.txt deleted file mode 100644 index 552ba0962ea..00000000000 --- a/res/cardsfolder/lost_auramancers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lost Auramancers -ManaCost:2 W W -Types:Creature Human Wizard -Text:When Lost Auramancers is put into a graveyard from the battlefield, 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. -PT:3/3 -K:Vanishing:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lost_auramancers.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lost_hours.txt b/res/cardsfolder/lost_hours.txt deleted file mode 100644 index 783b91d6b6a..00000000000 --- a/res/cardsfolder/lost_hours.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lost Hours -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Hand | Destination$ Library | LibraryPosition$ 2 | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lost_hours.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lost_leonin.txt b/res/cardsfolder/lost_leonin.txt deleted file mode 100644 index 5c49ee0c1c0..00000000000 --- a/res/cardsfolder/lost_leonin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lost Leonin -ManaCost:1 W -Types:Creature Cat Soldier -Text:no text -PT:2/1 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lost_leonin.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lost_soul.txt b/res/cardsfolder/lost_soul.txt deleted file mode 100644 index 535523776a6..00000000000 --- a/res/cardsfolder/lost_soul.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lost Soul -ManaCost:1 B B -Types:Creature Spirit Minion -Text:no text -PT:2/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card20178.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/37.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/142.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/29.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_bloom.txt b/res/cardsfolder/lotus_bloom.txt deleted file mode 100644 index 9ccf7031f58..00000000000 --- a/res/cardsfolder/lotus_bloom.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lotus Bloom -ManaCost:no cost -Types:Artifact -Text:no text -K:Suspend:3:0 -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | Amount$ 3 | SpellDescription$ Add W W W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | Amount$ 3 | SpellDescription$ Add U U U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_bloom.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_blossom.txt b/res/cardsfolder/lotus_blossom.txt deleted file mode 100644 index 724d29cc4d4..00000000000 --- a/res/cardsfolder/lotus_blossom.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Lotus Blossom -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ During your upkeep, you may put a petal counter on CARDNAME. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | Amount$ X | SpellDescription$ Add X U to your mana pool -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | Amount$ X | SpellDescription$ Add X W to your mana pool -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | Amount$ X | SpellDescription$ Add X G to your mana pool -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ X | SpellDescription$ Add X R to your mana pool -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | Amount$ X | SpellDescription$ Add X B to your mana pool -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ PETAL | CounterNum$ 1 -SVar:X:Count$CardCounters.PETAL -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_blossom.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_cobra.txt b/res/cardsfolder/lotus_cobra.txt deleted file mode 100644 index b4a34600a39..00000000000 --- a/res/cardsfolder/lotus_cobra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lotus Cobra -ManaCost:1 G -Types:Creature Snake -Text:Landfall - Whenever a land enters the battlefield under your control, you may add one mana of any color to your mana pool. -PT:2/1 -K:Landfall -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_cobra.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_guardian.txt b/res/cardsfolder/lotus_guardian.txt deleted file mode 100644 index 94faa4b5085..00000000000 --- a/res/cardsfolder/lotus_guardian.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Lotus Guardian -ManaCost:7 -Types:Artifact Creature Dragon -Text:no text -PT:4/4 -K:Flying -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23233.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_petal.txt b/res/cardsfolder/lotus_petal.txt deleted file mode 100644 index f4d81b5f232..00000000000 --- a/res/cardsfolder/lotus_petal.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lotus Petal -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_petal.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lotus_vale.txt b/res/cardsfolder/lotus_vale.txt deleted file mode 100644 index 24e82784d53..00000000000 --- a/res/cardsfolder/lotus_vale.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lotus Vale -ManaCost:no cost -Types:Land -Text: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. -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 3 | SpellDescription$ Add W W W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ 3 | SpellDescription$ Add U U U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lotus_vale.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lovisa_coldeyes.txt b/res/cardsfolder/lovisa_coldeyes.txt deleted file mode 100644 index 7f43d3349fa..00000000000 --- a/res/cardsfolder/lovisa_coldeyes.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lovisa Coldeyes -ManaCost:3 R R -Types:Legendary Creature Human Barbarian -Text:no text -PT:3/3 -K:stPumpAll:Creature.Warrior,Creature.Berserker,Creature.Barbarian+Other:2/2/Haste:No Condition:Warrior, Berserker, and/or other Barbarian creatures get +2/+2 and have haste. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lovisa_coldeyes.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lowland_giant.txt b/res/cardsfolder/lowland_giant.txt deleted file mode 100644 index 8388edf0203..00000000000 --- a/res/cardsfolder/lowland_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Lowland Giant -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4829.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_anchorite.txt b/res/cardsfolder/loxodon_anchorite.txt deleted file mode 100644 index 7e310f5dcad..00000000000 --- a/res/cardsfolder/loxodon_anchorite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Loxodon Anchorite -ManaCost:2 W W -Types:Creature Elephant Cleric -Text:no text -PT:2/3 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_anchorite.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_convert.txt b/res/cardsfolder/loxodon_convert.txt deleted file mode 100644 index 83ee522f801..00000000000 --- a/res/cardsfolder/loxodon_convert.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Loxodon Convert -ManaCost:3 W -Types:Creature Elephant Soldier -Text:no text -PT:4/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_convert.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_gatekeeper.txt b/res/cardsfolder/loxodon_gatekeeper.txt deleted file mode 100644 index fcf1df3c851..00000000000 --- a/res/cardsfolder/loxodon_gatekeeper.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Loxodon Gatekeeper -ManaCost:2 W W -Types:Creature Elephant Soldier -Text:Artifacts, creatures, and lands your opponents control enter the battlefield tapped. -PT:2/3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_gatekeeper.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_hierarch.txt b/res/cardsfolder/loxodon_hierarch.txt deleted file mode 100644 index 2b5398a263d..00000000000 --- a/res/cardsfolder/loxodon_hierarch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Loxodon Hierarch -ManaCost:2 G W -Types:Creature Elephant Cleric -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -A:AB$RegenerateAll | Cost$ G W Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | SpellDescription$ Regenerate each creature you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_hierarch.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_mender.txt b/res/cardsfolder/loxodon_mender.txt deleted file mode 100644 index e7de12ab1c0..00000000000 --- a/res/cardsfolder/loxodon_mender.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Loxodon Mender -ManaCost:5 W -Types:Creature Elephant Cleric -Text:no text -PT:3/3 -A:AB$ Regenerate | Cost$ W T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Regenerate target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_mender.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_mystic.txt b/res/cardsfolder/loxodon_mystic.txt deleted file mode 100644 index 5af41b3dc85..00000000000 --- a/res/cardsfolder/loxodon_mystic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Loxodon Mystic -ManaCost:3 W W -Types:Creature Elephant Cleric -Text:no text -PT:3/3 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_mystic.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/7.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/26.jpg -End diff --git a/res/cardsfolder/loxodon_partisan.txt b/res/cardsfolder/loxodon_partisan.txt deleted file mode 100644 index f43f2fb2b62..00000000000 --- a/res/cardsfolder/loxodon_partisan.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Loxodon Partisan -ManaCost:4 W -Types:Creature Elephant Soldier -Text:no text -PT:3/4 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_partisan.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_punisher.txt b/res/cardsfolder/loxodon_punisher.txt deleted file mode 100644 index 95a45d48543..00000000000 --- a/res/cardsfolder/loxodon_punisher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Loxodon Punisher -ManaCost:3 W -Types:Creature Elephant Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Permanent:X/X:No Condition:CARDNAME gets +2/+2 for each Equipment attached to it. -SVar:X:Count$Valid Equipment.Attached/Times.2 -SVar:EquipMe:Multiple -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_punisher.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_stalwart.txt b/res/cardsfolder/loxodon_stalwart.txt deleted file mode 100644 index f8842a960fa..00000000000 --- a/res/cardsfolder/loxodon_stalwart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Loxodon Stalwart -ManaCost:3 W W -Types:Creature Elephant Soldier -Text:no text -PT:3/3 -K:Vigilance -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_stalwart.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/11.jpg -End diff --git a/res/cardsfolder/loxodon_warhammer.txt b/res/cardsfolder/loxodon_warhammer.txt deleted file mode 100644 index 46b08306c96..00000000000 --- a/res/cardsfolder/loxodon_warhammer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Loxodon Warhammer -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +3/+0 and has lifelink and trample. -K:eqPump 3:+3/+0/Trample & Lifelink -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_warhammer.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/201.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/303.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/332.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loxodon_wayfarer.txt b/res/cardsfolder/loxodon_wayfarer.txt deleted file mode 100644 index aea355e62c3..00000000000 --- a/res/cardsfolder/loxodon_wayfarer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Loxodon Wayfarer -ManaCost:2 W -Types:Creature Elephant Monk -Text:no text -PT:1/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/loxodon_wayfarer.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loyal_retainers.txt b/res/cardsfolder/loyal_retainers.txt deleted file mode 100644 index 38d61480ea1..00000000000 --- a/res/cardsfolder/loyal_retainers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Loyal Retainers -ManaCost:2 W -Types:Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select a target legendary creature card from your graveyard | ChangeNum$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/loyal_retainers.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/loyal_sentry.txt b/res/cardsfolder/loyal_sentry.txt deleted file mode 100644 index 345d294d76e..00000000000 --- a/res/cardsfolder/loyal_sentry.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Loyal Sentry -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidAttacker$ Creature | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME blocks a creature, destroy that creature and CARDNAME. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker | SubAbility$ SVar=DestroySelf -SVar:DestroySelf:DB$Destroy | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/loyal_sentry.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/20.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lu_bu_master_at_arms.txt b/res/cardsfolder/lu_bu_master_at_arms.txt deleted file mode 100644 index 8d2a91b2626..00000000000 --- a/res/cardsfolder/lu_bu_master_at_arms.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lu Bu, Master-at-Arms -ManaCost:5 R -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:4/3 -K:Haste -K:Horsemanship -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lu_bu_master_at_arms.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lu_meng_wu_general.txt b/res/cardsfolder/lu_meng_wu_general.txt deleted file mode 100644 index be1e780013c..00000000000 --- a/res/cardsfolder/lu_meng_wu_general.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lu Meng, Wu General -ManaCost:3 U U -Types:Legendary Creature Human Soldier -Text:no text -PT:4/4 -K:Horsemanship -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lu_meng_wu_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lu_su_wu_advisor.txt b/res/cardsfolder/lu_su_wu_advisor.txt deleted file mode 100644 index 165808bead7..00000000000 --- a/res/cardsfolder/lu_su_wu_advisor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lu Su, Wu Advisor -ManaCost:3 U U -Types:Legendary Creature Human Advisor -Text:no text -PT:1/2 -A:AB$ Draw | Cost$ T | NumCards$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Draw a card. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lu_su_wu_advisor.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lu_xun_scholar_general.txt b/res/cardsfolder/lu_xun_scholar_general.txt deleted file mode 100644 index f2842dc2e59..00000000000 --- a/res/cardsfolder/lu_xun_scholar_general.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lu Xun, Scholar General -ManaCost:2 U U -Types:Legendary Creature Human Soldier -Text:no text -PT:1/3 -K:Horsemanship -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lu_xun_scholar_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lucent_liminid.txt b/res/cardsfolder/lucent_liminid.txt deleted file mode 100644 index 127024e4658..00000000000 --- a/res/cardsfolder/lucent_liminid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lucent Liminid -ManaCost:3 W W -Types:Enchantment Creature Elemental -Text:no text -PT:3/3 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130691.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lull.txt b/res/cardsfolder/lull.txt deleted file mode 100644 index b28387bc469..00000000000 --- a/res/cardsfolder/lull.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Lull -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 G | SpellDescription$ Prevent all combat damage that would be dealt this turn. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lull.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/267.jpg -End - - - - - diff --git a/res/cardsfolder/lumbering_satyr.txt b/res/cardsfolder/lumbering_satyr.txt deleted file mode 100644 index 7510ec2a7be..00000000000 --- a/res/cardsfolder/lumbering_satyr.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lumbering Satyr -ManaCost:2 G G -Types:Creature Satyr Beast -Text:no text -PT:5/4 -K:stPumpAll:Creature:0/0/Forestwalk:No Condition:All creatures have forestwalk. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lumbering_satyr.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lumengrid_drake.txt b/res/cardsfolder/lumengrid_drake.txt deleted file mode 100644 index e273e8b67b8..00000000000 --- a/res/cardsfolder/lumengrid_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Lumengrid Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBounce | Metalcraft$ True | TriggerDescription$ Metalcraft - When CARDNAME enters the battlefield, if you control three or more artifacts, return target creature to its owner's hand. -SVar:TrigBounce:DB$ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lumengrid_drake.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lumengrid_gargoyle.txt b/res/cardsfolder/lumengrid_gargoyle.txt deleted file mode 100644 index d2059846fbf..00000000000 --- a/res/cardsfolder/lumengrid_gargoyle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lumengrid Gargoyle -ManaCost:6 -Types:Artifact Creature Gargoyle -Text:no text -PT:4/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lumengrid_gargoyle.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lumengrid_warden.txt b/res/cardsfolder/lumengrid_warden.txt deleted file mode 100644 index b2c10d7dd73..00000000000 --- a/res/cardsfolder/lumengrid_warden.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lumengrid Warden -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82968.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/41.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/84.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/luminous_angel.txt b/res/cardsfolder/luminous_angel.txt deleted file mode 100644 index e9cdcb16599..00000000000 --- a/res/cardsfolder/luminous_angel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Luminous Angel -ManaCost:4 W W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may put a 1/1 white Spirit creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ W 1 1 Spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/luminous_angel.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/luminous_wake.txt b/res/cardsfolder/luminous_wake.txt deleted file mode 100644 index cd67efb71f2..00000000000 --- a/res/cardsfolder/luminous_wake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Luminous Wake -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant Creature -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever enchanted creature attacks or blocks, you gain 4 life. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigGainLife | Secondary$ True | TriggerDescription$ Whenever enchanted creature attacks or blocks, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 | Defined$ You -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/luminous_wake.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lunar_avenger.txt b/res/cardsfolder/lunar_avenger.txt deleted file mode 100644 index e93055e7f4f..00000000000 --- a/res/cardsfolder/lunar_avenger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lunar Avenger -ManaCost:7 -Types:Artifact Creature Golem -Text:no text -PT:2/2 -K:Sunburst -A:AB$ Pump | Cost$ SubCounter<1/P1P1> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ SubCounter<1/P1P1> | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ SubCounter<1/P1P1> | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lunar_avenger.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lunge.txt b/res/cardsfolder/lunge.txt deleted file mode 100644 index 16b92bb5a67..00000000000 --- a/res/cardsfolder/lunge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lunge -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ SVar=DB1 | SpellDescription$ CARDNAME deals 2 damage to target creature and 2 damage to target player. -SVar:DB1:DB$DealDamage | NumDmg$ 2 | Tgt$ P -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lunge.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lunk_errant.txt b/res/cardsfolder/lunk_errant.txt deleted file mode 100644 index 198ea670024..00000000000 --- a/res/cardsfolder/lunk_errant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lunk Errant -ManaCost:5 R -Types:Creature Giant Warrior -Text:no text -PT:4/4 -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, it gets +1/+1 and gains trample until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | KW$ Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lunk_errant.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lure.txt b/res/cardsfolder/lure.txt deleted file mode 100644 index afbadebe601..00000000000 --- a/res/cardsfolder/lure.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Lure -ManaCost:1 G G -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:enPump:HIDDEN All creatures able to block CARDNAME do so.:All creatures able to block enchanted creature do so. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lure.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/263.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/120.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/120.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/255.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/146.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/226.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/258.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/141.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/276.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/240.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/119.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/176.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lurking_informant.txt b/res/cardsfolder/lurking_informant.txt deleted file mode 100644 index 3d639ea125e..00000000000 --- a/res/cardsfolder/lurking_informant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lurking Informant -ManaCost:1 UB -Types:Creature Human Rogue -Text:no text -PT:1/2 -A:AB$ Dig | Cost$ 2 T | DigNum$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | AnyNumber$ True | DestinationZone$ Graveyard | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of target player's library. You may put that card into that player's graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_informant.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lurking_nightstalker.txt b/res/cardsfolder/lurking_nightstalker.txt deleted file mode 100644 index 170997668ef..00000000000 --- a/res/cardsfolder/lurking_nightstalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lurking Nightstalker -ManaCost:B B -Types:Creature Nightstalker -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/lurking_nightstalker.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lurking_predators.txt b/res/cardsfolder/lurking_predators.txt deleted file mode 100644 index 2655d32cbdb..00000000000 --- a/res/cardsfolder/lurking_predators.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Lurking Predators -ManaCost:4 G G -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_predators.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lurking_skirge.txt b/res/cardsfolder/lurking_skirge.txt deleted file mode 100644 index 30e216d928e..00000000000 --- a/res/cardsfolder/lurking_skirge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lurking Skirge -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.YouDontOwn | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is an enchantment, CARDNAME becomes a 3/2 Imp creature with flying. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Imp | Keywords$ Flying | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_skirge.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lush_growth.txt b/res/cardsfolder/lush_growth.txt deleted file mode 100644 index d24d2994845..00000000000 --- a/res/cardsfolder/lush_growth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lush Growth -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:no change/no change/Overwrite:Land,Mountain,Forest,Plains,RemoveSubTypes:no colors:Overwrite:No Condition:Enchanted land is a Mountain, Forest, and Plains. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lush_growth.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lust_for_war.txt b/res/cardsfolder/lust_for_war.txt deleted file mode 100644 index 9695e33e1da..00000000000 --- a/res/cardsfolder/lust_for_war.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lust for War -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:enPumpCurse:HIDDEN CARDNAME attacks each turn if able.:Enchanted creature attacks each turn if able. -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 3 damage to that creature's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/lust_for_war.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lux_cannon.txt b/res/cardsfolder/lux_cannon.txt deleted file mode 100644 index 97027050afa..00000000000 --- a/res/cardsfolder/lux_cannon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lux Cannon -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Destroy | Cost$ T SubCounter<3/CHARGE> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Destroy target permanent. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/lux_cannon.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/173.jpg -End diff --git a/res/cardsfolder/lymph_sliver.txt b/res/cardsfolder/lymph_sliver.txt deleted file mode 100644 index f2a6507b1e8..00000000000 --- a/res/cardsfolder/lymph_sliver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Lymph Sliver -ManaCost:4 W -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Creature.Sliver:0/0/Absorb 1:no Condition:All Sliver creatures have absorb 1. (If a source would deal damage to a Sliver, prevent 1 of that damage.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lymph_sliver.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lynx.txt b/res/cardsfolder/lynx.txt deleted file mode 100644 index 760d23088b0..00000000000 --- a/res/cardsfolder/lynx.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lynx -ManaCost:1 G -Types:Creature Cat -Text:no text -PT:2/1 -K:Forestwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21053.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/72.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lys_alana_bowmaster.txt b/res/cardsfolder/lys_alana_bowmaster.txt deleted file mode 100644 index cb2cd716038..00000000000 --- a/res/cardsfolder/lys_alana_bowmaster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Lys Alana Bowmaster -ManaCost:2 G -Types:Creature Elf Archer -Text:no text -PT:2/2 -K:Reach -T:Mode$ SpellCast | ValidCard$ Elf | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an Elf spell, you may have CARDNAME deal 2 damage to target creature with flying. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 2 -SVar:BuffedBy:Elf -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lys_alana_bowmaster.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lys_alana_huntmaster.txt b/res/cardsfolder/lys_alana_huntmaster.txt deleted file mode 100644 index e83d437bbeb..00000000000 --- a/res/cardsfolder/lys_alana_huntmaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Lys Alana Huntmaster -ManaCost:2 G G -Types:Creature Elf Warrior -Text:no text -PT:3/3 -T:Mode$ SpellCast | ValidCard$ Elf.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever you cast an Elf spell, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ G 1 1 Elf Warrior | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/lys_alana_huntmaster.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/lyzolda_the_blood_witch.txt b/res/cardsfolder/lyzolda_the_blood_witch.txt deleted file mode 100644 index 448a8bae084..00000000000 --- a/res/cardsfolder/lyzolda_the_blood_witch.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Lyzolda, the Blood Witch -ManaCost:1 B R -Types:Legendary Creature Human Cleric -Text:no text -PT:3/1 -A:AB$DealDamage | Cost$ 2 Sac<1/Creature> | Tgt$TgtCP | NumDmg$ X | SubAbility$ SVar=DBDraw | SpellDescription$ CARDNAME deals 2 damage to target creature or player if the sacrificed creature was red. Draw a card if the sacrificed creature was black. -SVar:DBDraw:DB$Draw | NumCards$ Y | Defined$ You -SVar:X:Sacrificed$Valid Creature.Red/Times.2 -SVar:Y:Sacrificed$Valid Creature.Black -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/lyzolda_the_blood_witch.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ma_chao_western_warrior.txt b/res/cardsfolder/ma_chao_western_warrior.txt deleted file mode 100644 index 6c511771236..00000000000 --- a/res/cardsfolder/ma_chao_western_warrior.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ma Chao, Western Warrior -ManaCost:3 R R -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:3/3 -K:Horsemanship -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, it's unblockable this combat. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Unblockable -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ma_chao_western_warrior.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/macabre_waltz.txt b/res/cardsfolder/macabre_waltz.txt deleted file mode 100644 index b89f912a8af..00000000000 --- a/res/cardsfolder/macabre_waltz.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Macabre Waltz -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return up to two target creature cards from your graveyard to your hand, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/macabre_waltz.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/macetail_hystrodon.txt b/res/cardsfolder/macetail_hystrodon.txt deleted file mode 100644 index d11539f339d..00000000000 --- a/res/cardsfolder/macetail_hystrodon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Macetail Hystrodon -ManaCost:6 R -Types:Creature Beast -Text:no text -PT:4/4 -K:First Strike -K:Haste -K:Cycling:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/macetail_hystrodon.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/machinate.txt b/res/cardsfolder/machinate.txt deleted file mode 100644 index 8dcd3ed0319..00000000000 --- a/res/cardsfolder/machinate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Machinate -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Dig | Cost$ 1 U U | DigNum$ X | SpellDescription$ 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. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/machinate.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mad_auntie.txt b/res/cardsfolder/mad_auntie.txt deleted file mode 100644 index e58fc2779e3..00000000000 --- a/res/cardsfolder/mad_auntie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mad Auntie -ManaCost:2 B -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -K:stPumpAll:Creature.Goblin+Other+YouCtrl:1/1:No Condition:Other Goblin creatures you control get +1/+1. -A:AB$ Regenerate | ValidTgts$ Creature.Goblin+Other | TgtPrompt$ Select another target Goblin | Cost$ T | SpellDescription$ Regenerate another target Goblin. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mad_auntie.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maddening_wind.txt b/res/cardsfolder/maddening_wind.txt deleted file mode 100644 index 424badca3a2..00000000000 --- a/res/cardsfolder/maddening_wind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Maddening Wind -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -K:Cumulative upkeep:G -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 2 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/maddening_wind.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/madrush_cyclops.txt b/res/cardsfolder/madrush_cyclops.txt deleted file mode 100644 index 8b3739483fe..00000000000 --- a/res/cardsfolder/madrush_cyclops.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Madrush Cyclops -ManaCost:1 B R G -Types:Creature Cyclops Warrior -Text:no text -PT:3/4 -K:stPumpAll:Creature.YouCtrl:0/0/Haste:No Condition:Creatures you control have haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/madrush_cyclops.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maelstrom_nexus.txt b/res/cardsfolder/maelstrom_nexus.txt deleted file mode 100644 index be57785f75d..00000000000 --- a/res/cardsfolder/maelstrom_nexus.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Maelstrom Nexus -ManaCost:W U B R G -Types:Enchantment -Text:The first spell you cast each turn has cascade. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/maelstrom_nexus.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maelstrom_pulse.txt b/res/cardsfolder/maelstrom_pulse.txt deleted file mode 100644 index 79a885b2fb4..00000000000 --- a/res/cardsfolder/maelstrom_pulse.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Maelstrom Pulse -ManaCost:1 B G -Types:Sorcery -Text:Destroy target nonland permanent and all other permanents with the same name as that permanent. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/maelstrom_pulse.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maga_traitor_to_mortals.txt b/res/cardsfolder/maga_traitor_to_mortals.txt deleted file mode 100644 index d22e6d00e4b..00000000000 --- a/res/cardsfolder/maga_traitor_to_mortals.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Maga, Traitor to Mortals -ManaCost:X B B B -Types:Legendary Creature Human Wizard -Text:no text -PT:0/0 -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDrain | TriggerDescription$ When CARDNAME enters the battlefield, target player loses life equal to the number of +1/+1 counters on it. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ Y -SVar:Y:Count$CardCounters.P1P1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/maga_traitor_to_mortals.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mage_il_vec.txt b/res/cardsfolder/mage_il_vec.txt deleted file mode 100644 index dc23ca8cee9..00000000000 --- a/res/cardsfolder/mage_il_vec.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mage il-Vec -ManaCost:2 R -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ T Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_il_vec.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mage_slayer.txt b/res/cardsfolder/mage_slayer.txt deleted file mode 100644 index 912c84dd989..00000000000 --- a/res/cardsfolder/mage_slayer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mage Slayer -ManaCost:1 R G -Types:Artifact Equipment -Text:no text -K:eqPump 3:0/0 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigDamage | TriggerDescription$ Whenever equipped creature attacks, it deals damage equal to its power to defending player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Opponent,Planeswalker.YouDontCtrl | DamageSource$ Equipped | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ X -SVar:X:TriggeredAttacker$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mage_slayer.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/pch/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magefire_wings.txt b/res/cardsfolder/magefire_wings.txt deleted file mode 100644 index 9418acabe40..00000000000 --- a/res/cardsfolder/magefire_wings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magefire Wings -ManaCost:U R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+0/Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/magefire_wings.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mages_guile.txt b/res/cardsfolder/mages_guile.txt deleted file mode 100644 index 0d34d286b7b..00000000000 --- a/res/cardsfolder/mages_guile.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mage's Guile -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature | KW$ Shroud | SpellDescription$ Target creature gains shroud until end of turn. | TgtPrompt$ Select target creature. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mages_guile.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mageta_the_lion.txt b/res/cardsfolder/mageta_the_lion.txt deleted file mode 100644 index 6837275db6a..00000000000 --- a/res/cardsfolder/mageta_the_lion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mageta the Lion -ManaCost:3 W W -Types:Legendary Creature Human Spellshaper -Text:no text -PT:3/3 -A:AB$ DestroyAll | Cost$ 2 W W T Discard<2/Card> | ValidCards$ Creature.Other | NoRegen$ True | SpellDescription$ Destroy all creatures except for Mageta the Lion. Those creatures can't be regenerated. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mageta_the_lion.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magetas_boon.txt b/res/cardsfolder/magetas_boon.txt deleted file mode 100644 index 7f151ed0d5b..00000000000 --- a/res/cardsfolder/magetas_boon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mageta's Boon -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/magetas_boon.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maggot_carrier.txt b/res/cardsfolder/maggot_carrier.txt deleted file mode 100644 index 3b7945bf3ac..00000000000 --- a/res/cardsfolder/maggot_carrier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Maggot Carrier -ManaCost:B -Types:Creature Zombie -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, each player loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Each | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/maggot_carrier.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/142.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maggot_therapy.txt b/res/cardsfolder/maggot_therapy.txt deleted file mode 100644 index 4157816cb24..00000000000 --- a/res/cardsfolder/maggot_therapy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Maggot Therapy -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+2/-2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/maggot_therapy.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magister_sphinx.txt b/res/cardsfolder/magister_sphinx.txt deleted file mode 100644 index bc11ac20c8a..00000000000 --- a/res/cardsfolder/magister_sphinx.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magister Sphinx -ManaCost:4 W U B -Types:Artifact Creature Sphinx -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigLife | TriggerDescription$ When CARDNAME enters the battlefield, target player's life total becomes 10. -SVar:TrigLife:AB$SetLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 10 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magister_sphinx.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magistrates_scepter.txt b/res/cardsfolder/magistrates_scepter.txt deleted file mode 100644 index 2161e05e44a..00000000000 --- a/res/cardsfolder/magistrates_scepter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magistrate's Scepter -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 4 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ AddTurn | Cost$ T SubCounter<3/CHARGE> | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magistrates_scepter.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magistrates_veto.txt b/res/cardsfolder/magistrates_veto.txt deleted file mode 100644 index c7f524a981f..00000000000 --- a/res/cardsfolder/magistrates_veto.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magistrate's Veto -ManaCost:2 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White,Creature.Blue:0/0/HIDDEN CARDNAME can't block.:No Condition:White creatures and blue creatures can't block. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/magistrates_veto.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_giant.txt b/res/cardsfolder/magma_giant.txt deleted file mode 100644 index 583cfd9ba11..00000000000 --- a/res/cardsfolder/magma_giant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Magma Giant -ManaCost:5 R R -Types:Creature Giant -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME enters the battlefield, it deals 2 damage to each creature and each player. -SVar:TrigDamageAll:DB$DamageAll | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 2 | ValidDescription$ each creature and each player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_giant.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/108.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_jet.txt b/res/cardsfolder/magma_jet.txt deleted file mode 100644 index 56b343b641b..00000000000 --- a/res/cardsfolder/magma_jet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magma Jet -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBScry | SpellDescription$ CARDNAME 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_jet.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_mine.txt b/res/cardsfolder/magma_mine.txt deleted file mode 100644 index 28904f81dce..00000000000 --- a/res/cardsfolder/magma_mine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magma Mine -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 4 | CounterType$ PRESSURE | CounterNum$ 1 | SpellDescription$ Put a pressure counter on CARDNAME. -A:AB$ DealDamage | Cost$ T Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of pressure counters on it to target creature or player. -SVar:X:Count$CardCounters.PRESSURE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_mine.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_phoenix.txt b/res/cardsfolder/magma_phoenix.txt deleted file mode 100644 index 352bb1ac655..00000000000 --- a/res/cardsfolder/magma_phoenix.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Magma Phoenix -ManaCost:3 R R -Types:Creature Phoenix -Text:no text -PT:3/3 -K:Flying -A:AB$ ChangeZone | Cost$ 3 R R | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to the hand. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals 3 damage to each creature and each player. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 3 | ValidDescription$ each creature and each player. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_phoenix.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/150.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_rift.txt b/res/cardsfolder/magma_rift.txt deleted file mode 100644 index 61aa549eafe..00000000000 --- a/res/cardsfolder/magma_rift.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Magma Rift -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_rift.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_sliver.txt b/res/cardsfolder/magma_sliver.txt deleted file mode 100644 index af041f33c17..00000000000 --- a/res/cardsfolder/magma_sliver.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Magma Sliver -ManaCost:3 R -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Sliver:0/0/SVar=Pump & SVar=SliversOnBattlefield:no Condition:All Slivers have "T: Target Sliver creature gets +X/+0 until end of turn, where X is the number of Slivers on the battlefield." -SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature.Sliver | NumAtt$ +SliversOnBattlefield | SpellDescription$ Target Sliver creature gets +X/+0 until end of turn, where X is the number of Slivers on the battlefield. -SVar:SliversOnBattlefield:Count$TypeOnBattlefield.Sliver -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_sliver.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_spray.txt b/res/cardsfolder/magma_spray.txt deleted file mode 100644 index a871e49dd88..00000000000 --- a/res/cardsfolder/magma_spray.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magma Spray -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 2 damage to target creature. If that creature would be put into a graveyard this turn, exile it instead. -SVar:DB:DB$Pump | KW$ HIDDEN If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_spray.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magma_vein.txt b/res/cardsfolder/magma_vein.txt deleted file mode 100644 index 7c8ae97d4d3..00000000000 --- a/res/cardsfolder/magma_vein.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magma Vein -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ DamageAll | Cost$ R Sac<1/Land> | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/magma_vein.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magmaw.txt b/res/cardsfolder/magmaw.txt deleted file mode 100644 index c5efff99a87..00000000000 --- a/res/cardsfolder/magmaw.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magmaw -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:4/4 -A:AB$ DealDamage | Cost$ 1 Sac<1/Permanent.nonLand> | Tgt$ TgtCP | NumDmg$ 1 | CostDesc$ 1, Sacrifice a nonland permanent: | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magmaw.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magnetic_flux.txt b/res/cardsfolder/magnetic_flux.txt deleted file mode 100644 index faa31ec4109..00000000000 --- a/res/cardsfolder/magnetic_flux.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magnetic Flux -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 U | ValidCards$ Creature.Artifact+YouCtrl | KW$ Flying | SpellDescription$ Artifact creatures you control gain flying until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_flux.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magnetic_mine.txt b/res/cardsfolder/magnetic_mine.txt deleted file mode 100644 index 57785af04f2..00000000000 --- a/res/cardsfolder/magnetic_mine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magnetic Mine -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Other | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever another artifact is put into a graveyard from the battlefield, CARDNAME deals 2 damage to that artifact's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magnetic_mine.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magnify.txt b/res/cardsfolder/magnify.txt deleted file mode 100644 index 1090336f8b6..00000000000 --- a/res/cardsfolder/magnify.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magnify -ManaCost:G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ G | ValidCards$ Creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ All creatures get +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card15819.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magnigoth_treefolk.txt b/res/cardsfolder/magnigoth_treefolk.txt deleted file mode 100644 index 4fb4b6902fb..00000000000 --- a/res/cardsfolder/magnigoth_treefolk.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Magnigoth Treefolk -ManaCost:4 G -Types:Creature Treefolk -Text:no text -PT:2/6 -K:stPumpSelf:Permanent:0/0/Plainswalk:isPresent Plains.YouCtrl:Domain - For each basic land type among lands you control, Magnigoth Treefolk has landwalk of that type. -K:stPumpSelf:Permanent:0/0/Islandwalk:isPresent Island.YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Swampwalk:isPresent Swamp.YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Mountainwalk:isPresent Mountain.YouCtrl:no text -K:stPumpSelf:Permanent:0/0/Forestwalk:isPresent Forest.YouCtrl:no text -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magnigoth_treefolk.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magnivore.txt b/res/cardsfolder/magnivore.txt deleted file mode 100644 index 1b6e6cd55db..00000000000 --- a/res/cardsfolder/magnivore.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Magnivore -ManaCost:2 R R -Types:Creature Lhurgoyf -Text:no text -PT:*/* -K:Haste -K:stSetPT:Count$TypeInAllYards.Sorcery:Count$TypeInAllYards.Sorcery:CARDNAME's power and toughness are each equal to the number of sorcery cards in all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magnivore.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/204.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magosi_the_waterveil.txt b/res/cardsfolder/magosi_the_waterveil.txt deleted file mode 100644 index 41d125fc93b..00000000000 --- a/res/cardsfolder/magosi_the_waterveil.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Magosi, the Waterveil -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ PutCounter | Cost$ U T | Defined$ Self | CounterType$ EON | CounterNum$ 1 | SubAbility$ SVar=DBSkipTurn | SpellDescription$ Put an eon counter on CARDNAME. Skip your next turn. -A:AB$ AddTurn | Cost$ T SubCounter<1/EON> | NumTurns$ 1 | Defined$ You | SubAbility$ SVar=DBBounce | SpellDescription$ Take an extra turn after this one. -SVar:DBSkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent -SVar:DBBounce:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magosi_the_waterveil.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_abyss.txt b/res/cardsfolder/magus_of_the_abyss.txt deleted file mode 100644 index d1096c7d902..00000000000 --- a/res/cardsfolder/magus_of_the_abyss.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Magus of the Abyss -ManaCost:3 B -Types:Creature Human Wizard -Text: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. -PT:4/3 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_abyss.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_bazaar.txt b/res/cardsfolder/magus_of_the_bazaar.txt deleted file mode 100644 index 52358dc16ec..00000000000 --- a/res/cardsfolder/magus_of_the_bazaar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magus of the Bazaar -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:0/1 -A:AB$ Draw | Cost$ T | NumCards$ 2 | SpellDescription$ Draw two cards, then discard three cards. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_bazaar.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_candelabra.txt b/res/cardsfolder/magus_of_the_candelabra.txt deleted file mode 100644 index db744dd94eb..00000000000 --- a/res/cardsfolder/magus_of_the_candelabra.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Magus of the Candelabra -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ Untap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target Land | SpellDescription$ Untap X target lands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_candelabra.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_coffers.txt b/res/cardsfolder/magus_of_the_coffers.txt deleted file mode 100644 index e24b80e3670..00000000000 --- a/res/cardsfolder/magus_of_the_coffers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magus of the Coffers -ManaCost:4 B -Types:Creature Human Wizard -Text:no text -PT:4/4 -A:AB$ Mana | Cost$ 2 T | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each Swamp you control. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_coffers.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_disk.txt b/res/cardsfolder/magus_of_the_disk.txt deleted file mode 100644 index ab8fb468303..00000000000 --- a/res/cardsfolder/magus_of_the_disk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magus of the Disk -ManaCost:2 W W -Types:Creature Human Wizard -Text:no text -PT:2/4 -K:CARDNAME enters the battlefield tapped. -A:AB$ DestroyAll | Cost$ 1 T | ValidCards$ Artifact,Creature,Enchantment | SpellDescription$ Destroy all artifacts, creatures, and enchantments. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card126298.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_library.txt b/res/cardsfolder/magus_of_the_library.txt deleted file mode 100644 index 0e5347136c0..00000000000 --- a/res/cardsfolder/magus_of_the_library.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magus of the Library -ManaCost:G G -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Draw | Cost$ T | NumCards$ 1 | ActivatingCardsInHand$ 7 | SpellDescription$ Draw a card. Activate this ability only if you have exactly seven cards in hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card134741.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_moat.txt b/res/cardsfolder/magus_of_the_moat.txt deleted file mode 100644 index 00aac882dbc..00000000000 --- a/res/cardsfolder/magus_of_the_moat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magus of the Moat -ManaCost:2 W W -Types:Creature Human Wizard -Text:no text -PT:0/3 -K:stPumpAll:Creature.withoutFlying:0/0/HIDDEN CARDNAME can't attack.:No Condition:Creatures without flying can't attack. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_moat.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_moon.txt b/res/cardsfolder/magus_of_the_moon.txt deleted file mode 100644 index 9446ecd45ae..00000000000 --- a/res/cardsfolder/magus_of_the_moon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magus of the Moon -ManaCost:2 R -Types:Creature Human Wizard -Text:no text -PT:2/2 -K:stAnimateAll:Land.nonBasic:no change/no change/Overwrite:Land,Mountain,RemoveSubTypes:no colors:Overwrite:No Condition:Nonbasic lands are Mountains. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_moon.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_tabernacle.txt b/res/cardsfolder/magus_of_the_tabernacle.txt deleted file mode 100644 index 29630b6fb0e..00000000000 --- a/res/cardsfolder/magus_of_the_tabernacle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magus of the Tabernacle -ManaCost:3 W -Types:Creature Human Wizard -Text:no text -PT:2/6 -K:stPumpAll:Creature:0/0/At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1:No Condition:All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1." -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_tabernacle.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_unseen.txt b/res/cardsfolder/magus_of_the_unseen.txt deleted file mode 100644 index f285144f591..00000000000 --- a/res/cardsfolder/magus_of_the_unseen.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Magus of the Unseen -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ GainControl | Cost$ 1 U T | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact opponent controls | LoseControl$ EOT | AddKWs$ Haste | Untap$ True | TapOnLose$ True | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_unseen.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/102.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/magus_of_the_vineyard.txt b/res/cardsfolder/magus_of_the_vineyard.txt deleted file mode 100644 index 72156e7f4f3..00000000000 --- a/res/cardsfolder/magus_of_the_vineyard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Magus of the Vineyard -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Main1 | ValidPlayer$ Each | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's precombat main phase, add G G to that player's mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 2 | Defined$ TriggeredPlayer -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_vineyard.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mahamoti_djinn.txt b/res/cardsfolder/mahamoti_djinn.txt deleted file mode 100644 index aa71fb0ce39..00000000000 --- a/res/cardsfolder/mahamoti_djinn.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Mahamoti Djinn -ManaCost:4 U U -Types:Creature Djinn -Text:no text -PT:5/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83158.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/88.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/65.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/65.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/84.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/84.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/85.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/90.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/66.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/major_teroh.txt b/res/cardsfolder/major_teroh.txt deleted file mode 100644 index 7ece76269af..00000000000 --- a/res/cardsfolder/major_teroh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Major Teroh -ManaCost:3 W -Types:Legendary Creature Bird Soldier -Text:no text -PT:2/3 -K:Flying -A:AB$ ChangeZoneAll | Cost$ 3 W W Sac<1/CARDNAME> | ChangeType$ Creature.Black | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile all black creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/major_teroh.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/makindi_griffin.txt b/res/cardsfolder/makindi_griffin.txt deleted file mode 100644 index bae5b442579..00000000000 --- a/res/cardsfolder/makindi_griffin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Makindi Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/4 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/makindi_griffin.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/makindi_shieldmate.txt b/res/cardsfolder/makindi_shieldmate.txt deleted file mode 100644 index 9a376e57083..00000000000 --- a/res/cardsfolder/makindi_shieldmate.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Makindi Shieldmate -ManaCost:2 W -Types:Creature Kor Soldier Ally -Text:no text -PT:0/3 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/makindi_shieldmate.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malach_of_the_dawn.txt b/res/cardsfolder/malach_of_the_dawn.txt deleted file mode 100644 index a216d90dea8..00000000000 --- a/res/cardsfolder/malach_of_the_dawn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Malach of the Dawn -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:2/4 -K:Flying -A:AB$ Regenerate | Cost$ W W W | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122481.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malachite_golem.txt b/res/cardsfolder/malachite_golem.txt deleted file mode 100644 index 975b361742a..00000000000 --- a/res/cardsfolder/malachite_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Malachite Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:5/3 -A:AB$ Pump | Cost$ 1 G | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/malachite_golem.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/202.jpg -End diff --git a/res/cardsfolder/malachite_talisman.txt b/res/cardsfolder/malachite_talisman.txt deleted file mode 100644 index 2fa4a5239ee..00000000000 --- a/res/cardsfolder/malachite_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Malachite Talisman -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a green spell, you may pay 3. If you do, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/malachite_talisman.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/303.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malakir_bloodwitch.txt b/res/cardsfolder/malakir_bloodwitch.txt deleted file mode 100644 index 336771e5655..00000000000 --- a/res/cardsfolder/malakir_bloodwitch.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Malakir Bloodwitch -ManaCost:3 B B -Types:Creature Vampire Shaman -Text:no text -PT:4/4 -K:Flying -K:Protection from white -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME 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. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ X | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Vampire.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/malakir_bloodwitch.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malevolent_awakening.txt b/res/cardsfolder/malevolent_awakening.txt deleted file mode 100644 index 9cac9e33442..00000000000 --- a/res/cardsfolder/malevolent_awakening.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Malevolent Awakening -ManaCost:1 B B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 B B Sac<1/Creature> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/malevolent_awakening.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malicious_advice.txt b/res/cardsfolder/malicious_advice.txt deleted file mode 100644 index 303d321a2e2..00000000000 --- a/res/cardsfolder/malicious_advice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Malicious Advice -ManaCost:X U B -Types:Instant -Text:no text -A:SP$ Tap | Cost$ X U B | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ Tap X target artifacts, creatures, and/or lands. You lose X life. | SubAbility$ SVar=Drain -SVar:Drain:DB$LoseLife | LifeAmount$ X -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Artifact,Creature,Land -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/malicious_advice.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/malignant_growth.txt b/res/cardsfolder/malignant_growth.txt deleted file mode 100644 index 34998a6cc3d..00000000000 --- a/res/cardsfolder/malignant_growth.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Malignant Growth -ManaCost:3 G U -Types:Enchantment -Text:no text -K:Cumulative upkeep:1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, put a growth counter on CARDNAME. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Each | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's draw step, that player draws an additional card for each growth counter on CARDNAME, then CARDNAME deals damage to the player equal to the number of cards he or she drew this way. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ GROWTH | CounterNum$ 1 -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ X | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$DealDamage | Defined$ TriggeredPlayer | NumDmg$ X -SVar:X:Count$CardCounters.GROWTH -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/malignant_growth.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/332.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mammoth_umbra.txt b/res/cardsfolder/mammoth_umbra.txt deleted file mode 100644 index 6c319a16923..00000000000 --- a/res/cardsfolder/mammoth_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mammoth Umbra -ManaCost:4 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+3/+3/Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mammoth_umbra.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/man_o_war.txt b/res/cardsfolder/man_o_war.txt deleted file mode 100644 index 94eee59362c..00000000000 --- a/res/cardsfolder/man_o_war.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Man-o'-War -ManaCost:2 U -Types:Creature Jellyfish -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target creature to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4266.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/37.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/41.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_breach.txt b/res/cardsfolder/mana_breach.txt deleted file mode 100644 index c11ba51089f..00000000000 --- a/res/cardsfolder/mana_breach.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mana Breach -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigBounceYou | TriggerDescription$ Whenever a player casts a spell, that player returns a land he or she controls to its owner's hand. -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigBounceOpp | Secondary$ True | TriggerDescription$ Whenever a player casts a spell, that player returns a land he or she controls to its owner's hand. -SVar:TrigBounceYou:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeNum$ 1 | ChangeType$ Land.YouCtrl | Mandatory$ True | Defined$ You | Hidden$ True -SVar:TrigBounceOpp:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeNum$ 1 | ChangeType$ Land.YouDontCtrl | Mandatory$ True | Defined$ Opponent | Hidden$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_breach.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/38.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_crypt.txt b/res/cardsfolder/mana_crypt.txt deleted file mode 100644 index a5d3fc034f1..00000000000 --- a/res/cardsfolder/mana_crypt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mana Crypt -ManaCost:0 -Types:Artifact -Text:At the beginning of your upkeep, flip a coin. If you lose the flip, CARDNAME deals 3 damage to you. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_crypt.jpg -SetInfo:MBP|Special|http://magiccards.info/scans/en/mbp/5.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_cylix.txt b/res/cardsfolder/mana_cylix.txt deleted file mode 100644 index 40476c91cdb..00000000000 --- a/res/cardsfolder/mana_cylix.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mana Cylix -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_cylix.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/132.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_drain.txt b/res/cardsfolder/mana_drain.txt deleted file mode 100644 index 294943c5511..00000000000 --- a/res/cardsfolder/mana_drain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mana Drain -ManaCost:U U -Types:Instant -Text:no text -A:SP$Counter | Cost$ U U | TargetType$ Spell | RememberTargets$ True | ForgetOtherTargets$ True | ValidTgts$ Card | SubAbility$ SVar=DBDelTrig | SpellDescription$ 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. -SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Main1,Main2 | ValidPlayer$ You | Execute$ AddMana | TriggerDescription$ CARDNAME - At the beginning of your next main phase, add X to your mana pool, where X is the countered spell's converted mana cost. -SVar:AddMana:DB$ Mana | Cost$ 0 | Produced$ 1 | Amount$ X -SVar:X:Remembered$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_drain.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_geyser.txt b/res/cardsfolder/mana_geyser.txt deleted file mode 100644 index 3301667013c..00000000000 --- a/res/cardsfolder/mana_geyser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mana Geyser -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ Mana | Cost$ 3 R R | Produced$ R | Amount$ X | SpellDescription$ Add R to your mana pool for each tapped land your opponents control. -SVar:X:Count$Valid Land.tapped+YouDontCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_geyser.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_leak.txt b/res/cardsfolder/mana_leak.txt deleted file mode 100644 index 397a64d40ce..00000000000 --- a/res/cardsfolder/mana_leak.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mana Leak -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | SpellDescription$ Counter target spell unless its controller pays 3. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_leak.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/62.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/89.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/36.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_matrix.txt b/res/cardsfolder/mana_matrix.txt deleted file mode 100644 index 5433f0489f1..00000000000 --- a/res/cardsfolder/mana_matrix.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mana Matrix -ManaCost:6 -Types:Artifact -Text:Instant and enchantment spells you cast cost up to 2 less to cast. -K:CostChange:Player:Less:2:Spell:All:Instant:NoSpecial -K:CostChange:Player:Less:2:Spell:All:Enchantment:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_matrix.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_prism.txt b/res/cardsfolder/mana_prism.txt deleted file mode 100644 index e3cbf62a2c0..00000000000 --- a/res/cardsfolder/mana_prism.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Mana Prism -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_prism.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/296.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_severance.txt b/res/cardsfolder/mana_severance.txt deleted file mode 100644 index a9e51df99f8..00000000000 --- a/res/cardsfolder/mana_severance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mana Severance -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Land | ChangeNum$ XFetch | SpellDescription$ Search your library for any number of land cards and exile them. Then shuffle your library. -SVar:XFetch:Count$TypeInYourLibrary.Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_severance.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_short.txt b/res/cardsfolder/mana_short.txt deleted file mode 100644 index 036a902cac6..00000000000 --- a/res/cardsfolder/mana_short.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mana Short -ManaCost:2 U -Types:Instant -Text:Tap all lands target player controls and empty his or her mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_short.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/66.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/66.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/86.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/85.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/80.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/67.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_tithe.txt b/res/cardsfolder/mana_tithe.txt deleted file mode 100644 index 64696bf05f1..00000000000 --- a/res/cardsfolder/mana_tithe.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mana Tithe -ManaCost:W -Types:Instant -Text:no text -A:SP$ Counter | Cost$ W | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_tithe.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_vault.txt b/res/cardsfolder/mana_vault.txt deleted file mode 100644 index fa782eab24c..00000000000 --- a/res/cardsfolder/mana_vault.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Mana Vault -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -K:CARDNAME doesn't untap during your untap step. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ At the beginning of your upkeep, you may pay 4. If you do, untap CARDNAME. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | IsPresent$ Card.Self+tapped | Execute$ TrigDamage | TriggerDescription$ At the beginning of your draw step, if CARDNAME is tapped, it deals 1 damage to you. -SVar:TrigUntap:AB$Untap | Cost$ 4 | Defined$ Self -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vault.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/259.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/261.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/388.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/352.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/263.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mana_vortex.txt b/res/cardsfolder/mana_vortex.txt deleted file mode 100644 index cbf07657fb1..00000000000 --- a/res/cardsfolder/mana_vortex.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mana Vortex -ManaCost:1 U U -Types:Enchantment -Text:When you cast Mana Vortex, counter it unless you sacrifice a land.\r\nAt the beginning of each player's upkeep, that player sacrifices a land.\r\nWhen there are no lands on the battlefield, sacrifice Mana Vortex. -K:When there are no lands on the battlefield, sacrifice CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_vortex.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manabarbs.txt b/res/cardsfolder/manabarbs.txt deleted file mode 100644 index e0ccf2ed5b0..00000000000 --- a/res/cardsfolder/manabarbs.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Manabarbs -ManaCost:3 R -Types:Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player taps a land for mana, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredPlayer | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/manabarbs.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/164.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/165.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/250.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/230.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/218.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/149.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/194.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/164.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manabond.txt b/res/cardsfolder/manabond.txt deleted file mode 100644 index f0cb5638082..00000000000 --- a/res/cardsfolder/manabond.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Manabond -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChangeAll | TriggerDescription$ 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. -SVar:TrigChangeAll:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Land.YouCtrl | Origin$ Hand | Destination$ Battlefield | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Mode$ Hand -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/manabond.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manacles_of_decay.txt b/res/cardsfolder/manacles_of_decay.txt deleted file mode 100644 index 7ce8f495e4f..00000000000 --- a/res/cardsfolder/manacles_of_decay.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Manacles of Decay -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack.:Enchanted creature can't attack. -A:AB$ Pump | Cost$ B | Defined$ Enchanted | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Enchanted creature gets -1/-1 until end of turn. -A:AB$ Pump | Cost$ R | Defined$ Enchanted | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Enchanted creature can't block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/manacles_of_decay.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manaforce_mace.txt b/res/cardsfolder/manaforce_mace.txt deleted file mode 100644 index 11b81ad08cf..00000000000 --- a/res/cardsfolder/manaforce_mace.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Manaforce Mace -ManaCost:4 -Types:Artifact Equipment -Text:Domain - Equipped creature gets +1/+1 for each basic land type among lands you control. -K:eqPump 3:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:no text -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/manaforce_mace.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manakin.txt b/res/cardsfolder/manakin.txt deleted file mode 100644 index 9b1f3445a7b..00000000000 --- a/res/cardsfolder/manakin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Manakin -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/manakin.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manaplasm.txt b/res/cardsfolder/manaplasm.txt deleted file mode 100644 index 49d0dab17d3..00000000000 --- a/res/cardsfolder/manaplasm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Manaplasm -ManaCost:2 G -Types:Creature Ooze -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a spell, CARDNAME gets +X/+X until end of turn, where X is that spell's converted mana cost. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ +X | NumDef$ +X -SVar:X:TriggeredCard$CardManaCost -SVar:BuffedBy:Card -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/manaplasm.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/138.jpg -End diff --git a/res/cardsfolder/mangara_of_corondor.txt b/res/cardsfolder/mangara_of_corondor.txt deleted file mode 100644 index da3f05894ed..00000000000 --- a/res/cardsfolder/mangara_of_corondor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mangara of Corondor -ManaCost:1 W W -Types:Legendary Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent | SubAbility$ SVar=DBChange | SpellDescription$ Exile CARDNAME and target permanent. -SVar:DBChange:DB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mangara_of_corondor.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/28.jpg -End diff --git a/res/cardsfolder/maniacal_rage.txt b/res/cardsfolder/maniacal_rage.txt deleted file mode 100644 index f4e39767e75..00000000000 --- a/res/cardsfolder/maniacal_rage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Maniacal Rage -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/HIDDEN CARDNAME can't block.:Enchanted creature gets +2/+2 and can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/maniacal_rage.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/87.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/155.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manic_vandal.txt b/res/cardsfolder/manic_vandal.txt deleted file mode 100644 index 75e9d9de976..00000000000 --- a/res/cardsfolder/manic_vandal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Manic Vandal -ManaCost:2 R -Types:Creature Human Warrior -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/manic_vandal.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manipulate_fate.txt b/res/cardsfolder/manipulate_fate.txt deleted file mode 100644 index 5ae3da482c7..00000000000 --- a/res/cardsfolder/manipulate_fate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Manipulate Fate -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Exile | ChangeType$ Card | ChangeNum$ 3 | Mandatory$ True | SpellDescription$ Search your library for three cards, exile them, then shuffle your library. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/manipulate_fate.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mannichi_the_fevered_dream.txt b/res/cardsfolder/mannichi_the_fevered_dream.txt deleted file mode 100644 index c7bf6719283..00000000000 --- a/res/cardsfolder/mannichi_the_fevered_dream.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mannichi, the Fevered Dream -ManaCost:2 R -Types:Legendary Creature Spirit -Text:no text -PT:1/2 -A:AB$ PumpAll | Cost$ 1 R | ValidCards$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch each creature's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mannichi_the_fevered_dream.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manta_ray.txt b/res/cardsfolder/manta_ray.txt deleted file mode 100644 index e248d0f5817..00000000000 --- a/res/cardsfolder/manta_ray.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Manta Ray -ManaCost:1 U U -Types:Creature Fish -Text:CARDNAME can't be blocked except by blue creatures. -PT:3/3 -K:CARDNAME can't attack unless defending player controls an Island. -K:CantBeBlockedBy Creature.nonBlue -K:When you control no Islands, sacrifice CARDNAME. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/manta_ray.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/manta_riders.txt b/res/cardsfolder/manta_riders.txt deleted file mode 100644 index 872c6b77d78..00000000000 --- a/res/cardsfolder/manta_riders.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Manta Riders -ManaCost:U -Types:Creature Merfolk -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/manta_riders.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/74.jpg -End diff --git a/res/cardsfolder/mantis_engine.txt b/res/cardsfolder/mantis_engine.txt deleted file mode 100644 index efdaa1f4db3..00000000000 --- a/res/cardsfolder/mantis_engine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mantis Engine -ManaCost:5 -Types:Artifact Creature Insect -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ 2 | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mantis_engine.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/133.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/333.jpg -End diff --git a/res/cardsfolder/mantle_of_leadership.txt b/res/cardsfolder/mantle_of_leadership.txt deleted file mode 100644 index 308b9abdff1..00000000000 --- a/res/cardsfolder/mantle_of_leadership.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mantle of Leadership -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature enters the battlefield, enchanted creature gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Enchanted | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mantle_of_leadership.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marauding_knight.txt b/res/cardsfolder/marauding_knight.txt deleted file mode 100644 index 64de2870b44..00000000000 --- a/res/cardsfolder/marauding_knight.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Marauding Knight -ManaCost:2 B B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -K:Protection from white -K:stPumpSelf:Creature:X/X:no Condition:Marauding Knight gets +1/+1 for each Plains your opponents control. -SVar:X:Count$Valid Plains.YouDontCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marauding_knight.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maraxus_of_keld.txt b/res/cardsfolder/maraxus_of_keld.txt deleted file mode 100644 index 0208335d9cb..00000000000 --- a/res/cardsfolder/maraxus_of_keld.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Maraxus of Keld -ManaCost:4 R R -Types:Legendary Creature Human Warrior -Text:no text -PT:*/* -K:stSetPT:Count$Valid Artifact.untapped+YouCtrl,Creature.untapped+YouCtrl,Land.untapped+YouCtrl:Count$Valid Artifact.untapped+YouCtrl,Creature.untapped+YouCtrl,Land.untapped+YouCtrl:CARDNAME's power and toughness are each equal to the number of untapped artifacts, creatures, and lands you control. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/maraxus_of_keld.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marble_chalice.txt b/res/cardsfolder/marble_chalice.txt deleted file mode 100644 index 06def1e374f..00000000000 --- a/res/cardsfolder/marble_chalice.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Marble Chalice -ManaCost:2 W -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marble_chalice.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marble_diamond.txt b/res/cardsfolder/marble_diamond.txt deleted file mode 100644 index 3a1ee0fe9c1..00000000000 --- a/res/cardsfolder/marble_diamond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Marble Diamond -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marble_diamond.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/297.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/275.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marble_titan.txt b/res/cardsfolder/marble_titan.txt deleted file mode 100644 index 9e3cd615e08..00000000000 --- a/res/cardsfolder/marble_titan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Marble Titan -ManaCost:3 W -Types:Creature Giant -Text:Creatures with power 3 or greater don't untap during their controllers' untap steps. -PT:3/3 -K:Permanents don't untap during their controllers' untap steps:Creature.powerGE3 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84533.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/240.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/march_of_souls.txt b/res/cardsfolder/march_of_souls.txt deleted file mode 100644 index a1feab99680..00000000000 --- a/res/cardsfolder/march_of_souls.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:March of Souls -ManaCost:4 W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W | ValidCards$ Creature.YouCtrl | RememberDestroyed$ True | NoRegen$ True | SubAbility$ SVar=DBTokenYou | SpellDescription$ 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. -SVar:DBTokenYou:DB$Token | TokenAmount$ X | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ SVar=DBDestroyOpp -SVar:DBDestroyOpp:DB$DestroyAll | ValidCards$ Creature.YouDontCtrl | RememberDestroyed$ True | NoRegen$ True | SubAbility$ SVar=DBTokenOpp -SVar:DBTokenOpp:DB$Token | TokenAmount$ Y | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ Opponent | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:X:Remembered$Amount -SVar:Y:Remembered$Amount -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/march_of_souls.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/march_of_the_machines.txt b/res/cardsfolder/march_of_the_machines.txt deleted file mode 100644 index 999ddcfe142..00000000000 --- a/res/cardsfolder/march_of_the_machines.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:March of the Machines -ManaCost:3 U -Types:Enchantment -Text:no text -K:stAnimateAll:Artifact.nonCreature:Count$CardManaCost/Count$CardManaCost:Creature:no colors:No Abilities:No Condition: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.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/march_of_the_machines.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/42.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marhault_elsdragon.txt b/res/cardsfolder/marhault_elsdragon.txt deleted file mode 100644 index 2fb0ae45a37..00000000000 --- a/res/cardsfolder/marhault_elsdragon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marhault Elsdragon -ManaCost:3 G R R -Types:Legendary Creature Elf Warrior -Text:no text -PT:4/6 -K:Rampage 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marhault_elsdragon.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marisis_twinclaws.txt b/res/cardsfolder/marisis_twinclaws.txt deleted file mode 100644 index 1d6dc6f2beb..00000000000 --- a/res/cardsfolder/marisis_twinclaws.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marisi's Twinclaws -ManaCost:2 RW G -Types:Creature Cat Warrior -Text:no text -PT:2/4 -K:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marisis_twinclaws.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maritime_guard.txt b/res/cardsfolder/maritime_guard.txt deleted file mode 100644 index ccf8fad4670..00000000000 --- a/res/cardsfolder/maritime_guard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Maritime Guard -ManaCost:1 U -Types:Creature Merfolk Soldier -Text:no text -PT:1/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/maritime_guard.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marjhan.txt b/res/cardsfolder/marjhan.txt deleted file mode 100644 index 241f082e4d2..00000000000 --- a/res/cardsfolder/marjhan.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Marjhan -ManaCost:5 U U -Types:Creature Leviathan -Text:no text -PT:8/8 -K:CARDNAME doesn't untap during your untap step. -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -A:AB$ Untap | Cost$ U U Sac<1/Creature> | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Untap CARDNAME. Activate this ability only during your upkeep. -A:AB$ DealDamage | Cost$ U U | NumDmg$ 1 | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | SubAbility$ SVar=DBPump | SpellDescription$ CARDNAME gets -1/-0 until end of turn and deals 1 damage to target attacking creature without flying. -SVar:DBPump:DB$Pump | NumAtt$ -1| Defined$ Self -SVar:NeedsToPlay:Island.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marjhan.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mark_of_asylum.txt b/res/cardsfolder/mark_of_asylum.txt deleted file mode 100644 index d24a8bcd5cb..00000000000 --- a/res/cardsfolder/mark_of_asylum.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Mark of Asylum -ManaCost:1 W -Types:Enchantment -Text:Prevent all noncombat damage that would be dealt to creatures you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_of_asylum.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mark_of_fury.txt b/res/cardsfolder/mark_of_fury.txt deleted file mode 100644 index 37613197e84..00000000000 --- a/res/cardsfolder/mark_of_fury.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mark of Fury -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Haste -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, return CARDNAME to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_of_fury.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mark_of_mutiny.txt b/res/cardsfolder/mark_of_mutiny.txt deleted file mode 100644 index 7798c5aa6b2..00000000000 --- a/res/cardsfolder/mark_of_mutiny.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mark of Mutiny -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ SVar=DBPutCounter | SpellDescription$ 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. -SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_of_mutiny.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mark_of_the_oni.txt b/res/cardsfolder/mark_of_the_oni.txt deleted file mode 100644 index a1dd55660d6..00000000000 --- a/res/cardsfolder/mark_of_the_oni.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mark of the Oni -ManaCost:2 B -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Demon.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no Demons, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | ConditionPresent$ Demon.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:NeedsToPlay:Demon.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mark_of_the_oni.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marker_beetles.txt b/res/cardsfolder/marker_beetles.txt deleted file mode 100644 index edfba32ea85..00000000000 --- a/res/cardsfolder/marker_beetles.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Marker Beetles -ManaCost:1 G G -Types:Creature Insect -Text:no text -PT:2/3 -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPump | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target creature gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marker_beetles.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maro.txt b/res/cardsfolder/maro.txt deleted file mode 100644 index c90f15f27f2..00000000000 --- a/res/cardsfolder/maro.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Maro -ManaCost:2 G G -Types:Creature Elemental -Text:no text -PT:*/* -K:stSetPT:Count$InYourHand:Count$InYourHand:CARDNAME's power and toughness are each equal to the number of cards in your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/maro.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/264.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/241.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/126.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/254.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marrow_gnawer.txt b/res/cardsfolder/marrow_gnawer.txt deleted file mode 100644 index b3573d5b7d7..00000000000 --- a/res/cardsfolder/marrow_gnawer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Marrow-Gnawer -ManaCost:3 B B -Types:Legendary Creature Rat Rogue -Text:no text -PT:2/3 -K:stPumpAll:Creature.Rat:0/0/Fear:No Condition:Rat creatures have fear. (They can't be blocked except by artifact creatures and/or black creatures.) -A:AB$ Token | Cost$ T Sac<1/Rat> | TokenAmount$ X | TokenName$ Rat | TokenTypes$ Creature,Rat | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put X 1/1 black Rat creature tokens onto the battlefield, where X is the number of Rats you control. -SVar:X:Count$TypeYouCtrl.Rat -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marrow_gnawer.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marrow_shards.txt b/res/cardsfolder/marrow_shards.txt deleted file mode 100644 index d366c1f141f..00000000000 --- a/res/cardsfolder/marrow_shards.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Marrow Shards -ManaCost:PW -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ PW | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to each attacking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marrow_shards.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_boa.txt b/res/cardsfolder/marsh_boa.txt deleted file mode 100644 index 44be1e279b1..00000000000 --- a/res/cardsfolder/marsh_boa.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marsh Boa -ManaCost:G -Types:Creature Snake -Text:no text -PT:1/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24664.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_crocodile.txt b/res/cardsfolder/marsh_crocodile.txt deleted file mode 100644 index 328178b4cb7..00000000000 --- a/res/cardsfolder/marsh_crocodile.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Marsh Crocodile -ManaCost:2 U B -Types:Creature Crocodile -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a blue or black creature you control to its owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each player discards a card. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Blue+YouCtrl -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_crocodile.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_flats.txt b/res/cardsfolder/marsh_flats.txt deleted file mode 100644 index 5c0ad27644f..00000000000 --- a/res/cardsfolder/marsh_flats.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Marsh Flats -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Swamp | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains or Swamp card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_flats.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_gas.txt b/res/cardsfolder/marsh_gas.txt deleted file mode 100644 index 5f49bfb89bd..00000000000 --- a/res/cardsfolder/marsh_gas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marsh Gas -ManaCost:B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ B | ValidCards$ Creature | IsCurse$ True | NumAtt$ -2 | SpellDescription$ All creatures get -2/-0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_gas.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/10.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_goblins.txt b/res/cardsfolder/marsh_goblins.txt deleted file mode 100644 index 1a9baed864c..00000000000 --- a/res/cardsfolder/marsh_goblins.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marsh Goblins -ManaCost:B R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dk/en-us/card1821.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_lurker.txt b/res/cardsfolder/marsh_lurker.txt deleted file mode 100644 index c67b41bff57..00000000000 --- a/res/cardsfolder/marsh_lurker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Marsh Lurker -ManaCost:3 B -Types:Creature Beast -Text:no text -PT:3/2 -A:AB$ Pump | Cost$ Sac<1/Swamp> | KW$ Fear | SpellDescription$ Marsh Lurker gains fear until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_lurker.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/38.jpg -End diff --git a/res/cardsfolder/marsh_threader.txt b/res/cardsfolder/marsh_threader.txt deleted file mode 100644 index c7a7b485814..00000000000 --- a/res/cardsfolder/marsh_threader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Marsh Threader -ManaCost:1 W -Types:Creature Kor Scout -Text:no text -PT:2/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_threader.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marsh_viper.txt b/res/cardsfolder/marsh_viper.txt deleted file mode 100644 index 995d9bba15e..00000000000 --- a/res/cardsfolder/marsh_viper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Marsh Viper -ManaCost:3 G -Types:Creature Snake -Text:no text -PT:1/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that player gets two poison counters. (A player with ten or more poison counters loses the game.) -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ Opponent | Num$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marsh_viper.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/177.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/44.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marshaling_cry.txt b/res/cardsfolder/marshaling_cry.txt deleted file mode 100644 index 1260f60aa1a..00000000000 --- a/res/cardsfolder/marshaling_cry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Marshaling Cry -ManaCost:1 W W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance | SpellDescription$ Creatures you control get +1/+1 and gain vigilance until end of turn. -A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Vigilance | Flashback$ True | CostDesc$ Flashback 3 W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/marshaling_cry.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marshals_anthem.txt b/res/cardsfolder/marshals_anthem.txt deleted file mode 100644 index fdca42b93c9..00000000000 --- a/res/cardsfolder/marshals_anthem.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Marshal's Anthem -ManaCost:2 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:1/1:No Condition:Creatures you control get +1/+1. -K:Multikicker 1 W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return up to X target creature cards from your graveyard to the battlefield, where X is the number of times CARDNAME was kicked. -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature card from your graveyard. -SVar:X:Count$TimesKicked -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marshals_anthem.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marshdrinker_giant.txt b/res/cardsfolder/marshdrinker_giant.txt deleted file mode 100644 index 1b86bd0a1c4..00000000000 --- a/res/cardsfolder/marshdrinker_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Marshdrinker Giant -ManaCost:3 G G -Types:Creature Giant Warrior -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target Island or Swamp an opponent controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land.Island+YouDontCtrl,Land.Swamp+YouDontCtrl | TgtPrompt$ Select target Island or Swamp an opponent controls -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/marshdrinker_giant.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/martial_coup.txt b/res/cardsfolder/martial_coup.txt deleted file mode 100644 index 112ec8ab5b3..00000000000 --- a/res/cardsfolder/martial_coup.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Martial Coup -ManaCost:X W W -Types:Sorcery -Text:Put X 1/1 white Soldier creature tokens onto the battlefield. If X is 5 or more, destroy all other creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/martial_coup.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/marton_stromgald.txt b/res/cardsfolder/marton_stromgald.txt deleted file mode 100644 index 651aecf4db0..00000000000 --- a/res/cardsfolder/marton_stromgald.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Marton Stromgald -ManaCost:2 R R -Types:Legendary Creature Human Knight -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPumpAttack | TriggerDescription$ Whenever CARDNAME attacks, other attacking creatures get +1/+1 until end of turn for each attacking creature other than CARDNAME. -SVar:TrigPumpAttack:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Creature.attacking+Other -T:Mode$ Blocks | ValidCard$ Card.Self | Triggerzone$ Battlefield | Execute$ TrigPumpBlock | TriggerDescription$ Whenever CARDNAME blocks, other blocking creatures get +1/+1 until end of turn for each blocking creature other than CARDNAME. -SVar:TrigPumpBlock:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.blocking+Other | NumAtt$ Y | NumDef$ Y -SVar:Y:Count$Valid Creature.blocking+Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/marton_stromgald.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/martyred_rusalka.txt b/res/cardsfolder/martyred_rusalka.txt deleted file mode 100644 index 198b3ea2c7f..00000000000 --- a/res/cardsfolder/martyred_rusalka.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Martyred Rusalka -ManaCost:W -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ W Sac<1/Creature> | Tgt$ TgtC | KW$ HIDDEN CARDNAME can't attack. | SpellDescription$ Target creature can't attack this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/martyred_rusalka.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/martyrs_tomb.txt b/res/cardsfolder/martyrs_tomb.txt deleted file mode 100644 index 1d1f01ad457..00000000000 --- a/res/cardsfolder/martyrs_tomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Martyrs' Tomb -ManaCost:2 W B -Types:Enchantment -Text:no text -A:AB$ PreventDamage | Cost$ PayLife<2> | ValidTgts$ Creature | Amount$ 1 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/martyrs_tomb.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masako_the_humorless.txt b/res/cardsfolder/masako_the_humorless.txt deleted file mode 100644 index 86109a0b94c..00000000000 --- a/res/cardsfolder/masako_the_humorless.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Masako the Humorless -ManaCost:2 W -Types:Legendary Creature Human Advisor -Text:Tapped creatures you control can block as though they were untapped. -PT:2/1 -K:Flash -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/masako_the_humorless.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mask_of_intolerance.txt b/res/cardsfolder/mask_of_intolerance.txt deleted file mode 100644 index b05372d1ed9..00000000000 --- a/res/cardsfolder/mask_of_intolerance.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mask of Intolerance -ManaCost:2 -Types:Artifact -Text:no text -#This is not correct -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Land.Basic+YouCtrl | PresentCompare$ GE4 | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, CARDNAME deals 3 damage to him or her. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Land.Basic+YouDontCtrl | PresentCompare$ GE4 | Execute$ TrigDamageOpp | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, if there are four or more basic land types among lands that player controls, CARDNAME deals 3 damage to him or her. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 3 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 3 -SVar:RemRandomDeck:True -SVar:Rarity:None -SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_intolerance.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mask_of_law_and_grace.txt b/res/cardsfolder/mask_of_law_and_grace.txt deleted file mode 100644 index 9334c68e789..00000000000 --- a/res/cardsfolder/mask_of_law_and_grace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mask of Law and Grace -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from black & Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_law_and_grace.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mask_of_memory.txt b/res/cardsfolder/mask_of_memory.txt deleted file mode 100644 index df1f9bd22dc..00000000000 --- a/res/cardsfolder/mask_of_memory.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mask of Memory -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 1:+0/+0 -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw two cards. If you do, discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 2 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_memory.jpg -SVar:Rarity:Uncommon -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/203.jpg -End diff --git a/res/cardsfolder/mask_of_riddles.txt b/res/cardsfolder/mask_of_riddles.txt deleted file mode 100644 index 256e5b3c571..00000000000 --- a/res/cardsfolder/mask_of_riddles.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mask of Riddles -ManaCost:U B -Types:Artifact Equipment -Text:Equipped creature has fear. -K:eqPump 2:Fear -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever equipped creature deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mask_of_riddles.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masked_admirers.txt b/res/cardsfolder/masked_admirers.txt deleted file mode 100644 index 4b278ee1e01..00000000000 --- a/res/cardsfolder/masked_admirers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Masked Admirers -ManaCost:2 G G -Types:Creature Elf Shaman -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a creature spell, you may pay G G. If you do, return CARDNAME from your graveyard to your hand. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:TrigReturn:AB$ChangeZone | Cost$ G G | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/masked_admirers.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masked_gorgon.txt b/res/cardsfolder/masked_gorgon.txt deleted file mode 100644 index 7cc26ed822f..00000000000 --- a/res/cardsfolder/masked_gorgon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Masked Gorgon -ManaCost:4 B -Types:Creature Gorgon -Text:no text -PT:5/5 -K:stPumpAll:Creature.Green,Creature.White:0/0/Protection from Gorgons:No Condition:Green creatures and white creatures have protection from Gorgons. -K:stPumpSelf:Creature:0/0/Protection from green & Protection from white:Threshold:Threshold - Masked Gorgon has protection from green and from white as long as seven or more cards are in your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/masked_gorgon.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mass_calcify.txt b/res/cardsfolder/mass_calcify.txt deleted file mode 100644 index cd8d256014a..00000000000 --- a/res/cardsfolder/mass_calcify.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mass Calcify -ManaCost:5 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 5 W W | ValidCards$ Creature.nonWhite | SpellDescription$ Destroy all nonwhite creatures. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_calcify.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/12.jpg -End diff --git a/res/cardsfolder/mass_hysteria.txt b/res/cardsfolder/mass_hysteria.txt deleted file mode 100644 index 1993a5754bf..00000000000 --- a/res/cardsfolder/mass_hysteria.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mass Hysteria -ManaCost:R -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/Haste:No Condition:All creatures have haste. -SVar:RemRandomDeck:True -SVar:BuffedBy:Creature -SVar:AntiBuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mass_hysteria.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mass_of_ghouls.txt b/res/cardsfolder/mass_of_ghouls.txt deleted file mode 100644 index e99c8353beb..00000000000 --- a/res/cardsfolder/mass_of_ghouls.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mass of Ghouls -ManaCost:3 B B -Types:Creature Zombie Warrior -Text:no text -PT:5/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card126158.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/88.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/massacre_wurm.txt b/res/cardsfolder/massacre_wurm.txt deleted file mode 100644 index 753891aa2a3..00000000000 --- a/res/cardsfolder/massacre_wurm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Massacre Wurm -ManaCost:3 B B B -Types:Creature Wurm -Text:no text -PT:6/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMassacre | TriggerDescription$ When CARDNAME enters the battlefield, creatures your opponents control get -2/-2 until end of turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature an opponent controls is put into a graveyard from the battlefield, that player loses 2 life. -SVar:TrigMassacre:AB$PumpAll | Cost$ 0 | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature.YouDontCtrl | IsCurse$ True -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | LifeAmount$ 2 | Defined$ Opponent -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/massacre_wurm.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/master_decoy.txt b/res/cardsfolder/master_decoy.txt deleted file mode 100644 index 531ff10bca2..00000000000 --- a/res/cardsfolder/master_decoy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Master Decoy -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_decoy.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/29.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/241.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/27.jpg -End diff --git a/res/cardsfolder/master_healer.txt b/res/cardsfolder/master_healer.txt deleted file mode 100644 index 556303d7e87..00000000000 --- a/res/cardsfolder/master_healer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Master Healer -ManaCost:4 W -Types:Creature Human Cleric -Text:no text -PT:1/4 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 4 | SpellDescription$ Prevent the next 4 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_healer.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/30.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/12.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/28.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/master_of_etherium.txt b/res/cardsfolder/master_of_etherium.txt deleted file mode 100644 index c81377f1cda..00000000000 --- a/res/cardsfolder/master_of_etherium.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Master of Etherium -ManaCost:2 U -Types:Artifact Creature Vedalken Wizard -Text:no text -PT:*/* -K:stPumpAll:Creature.Artifact+Other+YouCtrl:1/1:No Condition:Other artifact creatures you control get +1/+1. -K:stSetPT:Count$NumTypeYouCtrl.Artifact:Count$NumTypeYouCtrl.Artifact:Master of Etherium's power and toughness are each equal to the number of artifacts you control. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_of_etherium.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/master_of_the_wild_hunt.txt b/res/cardsfolder/master_of_the_wild_hunt.txt deleted file mode 100644 index f958a82cbf8..00000000000 --- a/res/cardsfolder/master_of_the_wild_hunt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Master of the Wild Hunt -ManaCost:2 G G -Types:Creature Human Shaman -Text:no text -PT:3/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, put a 2/2 green Wolf creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_of_the_wild_hunt.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/master_splicer.txt b/res/cardsfolder/master_splicer.txt deleted file mode 100644 index d5d636c4e02..00000000000 --- a/res/cardsfolder/master_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Master Splicer -ManaCost:3 W -Types:Creature Human Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -K:stPumpAll:Creature.Golem+YouCtrl:1/1:No Condition:Golem creatures you control get +1/+1. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_splicer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/master_transmuter.txt b/res/cardsfolder/master_transmuter.txt deleted file mode 100644 index 81787ecd854..00000000000 --- a/res/cardsfolder/master_transmuter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Master Transmuter -ManaCost:3 U -Types:Artifact Creature Human Artificer -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ U T Return<1/Artifact> | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ You may put an artifact card from your hand onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/master_transmuter.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masters_call.txt b/res/cardsfolder/masters_call.txt deleted file mode 100644 index 73c6bb589e7..00000000000 --- a/res/cardsfolder/masters_call.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Master's Call -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 W | TokenAmount$ 2 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 colorless Myr artifact creature tokens onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/masters_call.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masticore.txt b/res/cardsfolder/masticore.txt deleted file mode 100644 index 5c8b1eac6e1..00000000000 --- a/res/cardsfolder/masticore.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Masticore -ManaCost:4 -Types:Artifact Creature Masticore -Text:Choose and discard a card during your upkeep, or sacrifice Masticore. -PT:4/4 -A:AB$ Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. -A:AB$ DealDamage | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/masticore.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/masumaro_first_to_live.txt b/res/cardsfolder/masumaro_first_to_live.txt deleted file mode 100644 index 01acf9f0df4..00000000000 --- a/res/cardsfolder/masumaro_first_to_live.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Masumaro, First to Live -ManaCost:3 G G G -Types:Legendary Creature Spirit -Text:no text -PT:*/* -K:stSetPT:Count$InYourHand/Times.2:Count$InYourHand/Times.2:CARDNAME's power and toughness are each equal to twice the number of cards in your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/masumaro_first_to_live.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/matca_rioters.txt b/res/cardsfolder/matca_rioters.txt deleted file mode 100644 index 1aab02cbcdc..00000000000 --- a/res/cardsfolder/matca_rioters.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Matca Rioters -ManaCost:2 G -Types:Creature Human Warrior -Text:no text -PT:*/* -K:stSetPT:Count$Domain:Count$Domain:Domain - CARDNAME's power and toughness are each equal to the number of basic land types among lands you control. -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/matca_rioters.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/matsu_tribe_birdstalker.txt b/res/cardsfolder/matsu_tribe_birdstalker.txt deleted file mode 100644 index 8356539fca5..00000000000 --- a/res/cardsfolder/matsu_tribe_birdstalker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Matsu-Tribe Birdstalker -ManaCost:2 G G -Types:Creature Snake Warrior Archer -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -A:AB$ Pump | Cost$ G | KW$ Reach | SpellDescription$ CARDNAME gains reach until end of turn. (It can block creatures with flying.) -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/matsu_tribe_birdstalker.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/matsu_tribe_sniper.txt b/res/cardsfolder/matsu_tribe_sniper.txt deleted file mode 100644 index b03daa238c1..00000000000 --- a/res/cardsfolder/matsu_tribe_sniper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Matsu-Tribe Sniper -ManaCost:1 G -Types:Creature Snake Warrior Archer -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature with flying. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/matsu_tribe_sniper.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maul_splicer.txt b/res/cardsfolder/maul_splicer.txt deleted file mode 100644 index d5655a0d456..00000000000 --- a/res/cardsfolder/maul_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Maul Splicer -ManaCost:6 G -Types:Creature Human Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 3/3 colorless Golem artifact creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -K:stPumpAll:Creature.Golem+YouCtrl:0/0/Trample:No Condition:Golem creatures you control have trample. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/maul_splicer.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mawcor.txt b/res/cardsfolder/mawcor.txt deleted file mode 100644 index 05e83bf09c7..00000000000 --- a/res/cardsfolder/mawcor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mawcor -ManaCost:3 U U -Types:Creature Beast -Text:no text -PT:3/3 -K:Flying -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4712.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/75.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mayael_the_anima.txt b/res/cardsfolder/mayael_the_anima.txt deleted file mode 100644 index d4b678cf692..00000000000 --- a/res/cardsfolder/mayael_the_anima.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mayael the Anima -ManaCost:R G W -Types:Legendary Creature Elf Shaman -Text:no text -PT:2/3 -A:AB$ Dig | Cost$ 3 R G W T | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature.powerGE5 | DestinationZone$ Battlefield | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/mayael_the_anima.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mayaels_aria.txt b/res/cardsfolder/mayaels_aria.txt deleted file mode 100644 index c760adf3f8a..00000000000 --- a/res/cardsfolder/mayaels_aria.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mayael's Aria -ManaCost:R G W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ 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. -SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Creature.YouCtrl+powerGE5 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$ GainLife | LifeAmount$ 10 | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE10 | SubAbility$ SVar=DBWinGame -SVar:DBWinGame:DB$ WinsGame | Defined$ You | ConditionPresent$ Creature.YouCtrl+powerGE20 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mayaels_aria.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/maze_of_ith.txt b/res/cardsfolder/maze_of_ith.txt deleted file mode 100644 index d70ab3c5ed8..00000000000 --- a/res/cardsfolder/maze_of_ith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Maze of Ith -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Untap | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SubAbility$ SVar=DBPump | SpellDescription$ Untap target attacking creature. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -SVar:DBPump:DB$Pump | Cost$ 0 | Defined$ Targeted | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/maze_of_ith.jpg -SetInfo:DRK|Uncommon|http://magiccards.info/scans/en/dk/114.jpg -End diff --git a/res/cardsfolder/maze_of_shadows.txt b/res/cardsfolder/maze_of_shadows.txt deleted file mode 100644 index 0415039a1f1..00000000000 --- a/res/cardsfolder/maze_of_shadows.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Maze of Shadows -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.attacking+withShadow | TgtPrompt$ Select target attacking creature with shadow | KW$ HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SubAbility$ SVar=DBUntap | SpellDescription$ Untap target attacking creature with shadow. Prevent all combat damage that would be dealt to and dealt by that creature this turn. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/maze_of_shadows.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meadowboon.txt b/res/cardsfolder/meadowboon.txt deleted file mode 100644 index 0b8a35474dd..00000000000 --- a/res/cardsfolder/meadowboon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Meadowboon -ManaCost:2 W W -Types:Creature Elemental -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME leaves the battlefield, put a +1/+1 counter on each creature target player controls. -K:Evoke:3 W -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | ValidCards$ Creature | CounterType$ P1P1 | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/meadowboon.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meddling_mage.txt b/res/cardsfolder/meddling_mage.txt deleted file mode 100644 index c059120ffab..00000000000 --- a/res/cardsfolder/meddling_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Meddling Mage -ManaCost:U W -Types:Creature Human Wizard -Text:As Meddling Mage enters the battlefield, name a nonland card.\r\nThe named card can't be cast. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meddling_mage.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/8.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/medicine_bag.txt b/res/cardsfolder/medicine_bag.txt deleted file mode 100644 index d9703d57d08..00000000000 --- a/res/cardsfolder/medicine_bag.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Medicine Bag -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ 1 T Discard<1/Card> | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/medicine_bag.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meditate.txt b/res/cardsfolder/meditate.txt deleted file mode 100644 index 5817f91894b..00000000000 --- a/res/cardsfolder/meditate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Meditate -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 4 | Defined$ You | SpellDescription$ Draw four cards. You skip your next turn. | SubAbility$ SVar=DBSkip -SVar:DBSkip:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meditate.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meekstone.txt b/res/cardsfolder/meekstone.txt deleted file mode 100644 index 650dd2a5fbd..00000000000 --- a/res/cardsfolder/meekstone.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Meekstone -ManaCost:1 -Types:Artifact -Text:Creatures with power 3 or greater don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Creature.powerGE3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meekstone.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/260.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/262.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/307.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/389.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/353.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/298.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/264.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/megatog.txt b/res/cardsfolder/megatog.txt deleted file mode 100644 index a51414b87f9..00000000000 --- a/res/cardsfolder/megatog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Megatog -ManaCost:4 R R -Types:Creature Atog -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ Sac<1/Artifact> | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ CARDNAME gets +3/+3 and gains trample until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/megatog.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/100.jpg -End diff --git a/res/cardsfolder/meglonoth.txt b/res/cardsfolder/meglonoth.txt deleted file mode 100644 index 9bf29d04df0..00000000000 --- a/res/cardsfolder/meglonoth.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Meglonoth -ManaCost:3 R G W -Types:Creature Beast -Text:no text -PT:6/6 -K:Vigilance -K:Trample -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever CARDNAME blocks a creature, CARDNAME deals damage to that creature's controller equal to CARDNAME's power. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredAttackerController | NumDmg$ X -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meglonoth.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/megrim.txt b/res/cardsfolder/megrim.txt deleted file mode 100644 index 25e98ddcae2..00000000000 --- a/res/cardsfolder/megrim.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Megrim -ManaCost:2 B -Types:Enchantment -Text:no text -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever an opponent discards a card, CARDNAME deals 2 damage to that player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/megrim.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/143.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/146.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/12.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/144.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/157.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meishin_the_mind_cage.txt b/res/cardsfolder/meishin_the_mind_cage.txt deleted file mode 100644 index 8ed722aafaf..00000000000 --- a/res/cardsfolder/meishin_the_mind_cage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Meishin, the Mind Cage -ManaCost:4 U U U -Types:Legendary Enchantment -Text:All creatures get -X/-0, where X is the number of cards in your hand. -K:stPumpAll:Creature:X/0:no Condition:no text -SVar:X:Count$InYourHand/Negative -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meishin_the_mind_cage.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/melancholy.txt b/res/cardsfolder/melancholy.txt deleted file mode 100644 index 308ba428cc0..00000000000 --- a/res/cardsfolder/melancholy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Melancholy -ManaCost:2 B -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Enchant creature -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B -K:When CARDNAME enters the battlefield, tap enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/melancholy.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/melesse_spirit.txt b/res/cardsfolder/melesse_spirit.txt deleted file mode 100644 index 500531ad7c7..00000000000 --- a/res/cardsfolder/melesse_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Melesse Spirit -ManaCost:3 W W -Types:Creature Angel Spirit -Text:no text -PT:3/3 -K:Flying -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/melesse_spirit.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meliras_keepers.txt b/res/cardsfolder/meliras_keepers.txt deleted file mode 100644 index 747a94fb614..00000000000 --- a/res/cardsfolder/meliras_keepers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Melira's Keepers -ManaCost:4 G -Types:Creature Human Warrior -Text:no text -PT:4/4 -K:CARDNAME can't have counters placed on it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/meliras_keepers.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meloku_the_clouded_mirror.txt b/res/cardsfolder/meloku_the_clouded_mirror.txt deleted file mode 100644 index 765e0e9be7d..00000000000 --- a/res/cardsfolder/meloku_the_clouded_mirror.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Meloku the Clouded Mirror -ManaCost:4 U -Types:Legendary Creature Moonfolk Wizard -Text:no text -PT:2/4 -K:Flying -A:AB$ Token | Cost$ 1 Return<1/Land> | TokenAmount$ 1 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put a 1/1 blue Illusion creature token with flying onto the battlefield. -SVar:Rarity:Rare -SVar:RemAIDeck:True -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card75268.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/melt_terrain.txt b/res/cardsfolder/melt_terrain.txt deleted file mode 100644 index 72326a91ef5..00000000000 --- a/res/cardsfolder/melt_terrain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Melt Terrain -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy target land. CARDNAME deals 2 damage to that land's controller. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ 2 | Defined$ TargetedController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/melt_terrain.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/97.jpg -End diff --git a/res/cardsfolder/meltdown.txt b/res/cardsfolder/meltdown.txt deleted file mode 100644 index 8a48a17dee2..00000000000 --- a/res/cardsfolder/meltdown.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Meltdown -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ X R | ValidCards$ Artifact.cmcLEX | SpellDescription$ Destroy each artifact with converted mana cost X or less. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/meltdown.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/memnarch.txt b/res/cardsfolder/memnarch.txt deleted file mode 100644 index 4a877220333..00000000000 --- a/res/cardsfolder/memnarch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Memnarch -ManaCost:7 -Types:Legendary Artifact Creature Wizard -Text:no text -PT:4/5 -A:AB$ GainControl | Cost$ 3 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Gain control of target artifact. (This effect lasts indefinitely.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card51054.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/memnite.txt b/res/cardsfolder/memnite.txt deleted file mode 100644 index 13707db6947..00000000000 --- a/res/cardsfolder/memnite.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Memnite -ManaCost:0 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/memnite.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/memory_erosion.txt b/res/cardsfolder/memory_erosion.txt deleted file mode 100644 index e056ba77042..00000000000 --- a/res/cardsfolder/memory_erosion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Memory Erosion -ManaCost:1 U U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever an opponent casts a spell, that player puts the top two cards of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/memory_erosion.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/memory_lapse.txt b/res/cardsfolder/memory_lapse.txt deleted file mode 100644 index 9c0fbbfe98e..00000000000 --- a/res/cardsfolder/memory_lapse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Memory Lapse -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ TopOfLibrary | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/memory_lapse.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/40.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/103.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/81.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/74.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mending_hands.txt b/res/cardsfolder/mending_hands.txt deleted file mode 100644 index 9f84181272e..00000000000 --- a/res/cardsfolder/mending_hands.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mending Hands -ManaCost:W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ W | Tgt$ TgtCP | Amount$ 4 | SpellDescription$ Prevent the next 4 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mending_hands.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/15.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meng_huo_barbarian_king.txt b/res/cardsfolder/meng_huo_barbarian_king.txt deleted file mode 100644 index 743a16ab943..00000000000 --- a/res/cardsfolder/meng_huo_barbarian_king.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Meng Huo, Barbarian King -ManaCost:3 G G -Types:Legendary Creature Human Barbarian Soldier -Text:no text -PT:4/4 -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meng_huo_barbarian_king.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meng_huos_horde.txt b/res/cardsfolder/meng_huos_horde.txt deleted file mode 100644 index a2b78d3a30c..00000000000 --- a/res/cardsfolder/meng_huos_horde.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Meng Huo's Horde -ManaCost:4 G -Types:Creature Human Soldier -Text:no text -PT:4/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10503.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mental_discipline.txt b/res/cardsfolder/mental_discipline.txt deleted file mode 100644 index 5b1ead6296b..00000000000 --- a/res/cardsfolder/mental_discipline.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mental Discipline -ManaCost:1 U U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 1 U Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mental_discipline.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mental_misstep.txt b/res/cardsfolder/mental_misstep.txt deleted file mode 100644 index c601609e06b..00000000000 --- a/res/cardsfolder/mental_misstep.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mental Misstep -ManaCost:PU -Types:Instant -Text:no text -A:SP$ Counter | Cost$ PU | TargetType$ Spell | TgtPrompt$ Select target spell with CMC 1 | ValidTgts$ Card.cmcEQ1 | SpellDescription$ Counter target spell with converted mana cost 1. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mental_misstep.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mental_note.txt b/res/cardsfolder/mental_note.txt deleted file mode 100644 index afe81b9f31e..00000000000 --- a/res/cardsfolder/mental_note.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mental Note -ManaCost:U -Types:Instant -Text:no text -A:SP$ Mill | Cost$ U | NumCards$ 2 | Defined$ You | SubAbility$ SVar=DBDraw | SpellDescription$ Put the top two cards of your library into your graveyard. Draw a card. -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mental_note.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mephidross_vampire.txt b/res/cardsfolder/mephidross_vampire.txt deleted file mode 100644 index 8b2b219a988..00000000000 --- a/res/cardsfolder/mephidross_vampire.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mephidross Vampire -ManaCost:4 B B -Types:Creature Vampire -Text:no text -PT:3/4 -K:Flying -K:stPumpAll:Creature.YouCtrl:0/0/Types=Vampire:No Condition:Each creature you control is a Vampire in addition to its other types and has "Whenever this creature deals damage to a creature, put a +1/+1 counter on this creature." -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever this creature deals damage to a creature, put a +1/+1 counter on this creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredSource | CounterType$ P1P1 | CounterNum$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mephidross_vampire.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mephitic_ooze.txt b/res/cardsfolder/mephitic_ooze.txt deleted file mode 100644 index 90bf73cbf39..00000000000 --- a/res/cardsfolder/mephitic_ooze.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mephitic Ooze -ManaCost:4 B -Types:Creature Ooze -Text:no text -PT:0/5 -K:stPumpSelf:Creature:X/0:no Condition:CARDNAME gets +1/+0 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget | NoRegen$ True -SVar:BuffedBy:Artifact -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mephitic_ooze.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mercenary_informer.txt b/res/cardsfolder/mercenary_informer.txt deleted file mode 100644 index 02b2177f680..00000000000 --- a/res/cardsfolder/mercenary_informer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mercenary Informer -ManaCost:2 W -Types:Creature Human Rebel Mercenary -Text:no text -PT:2/1 -K:CARDNAME can't be the target of black spells or abilities from black sources. -A:AB$ ChangeZone | Cost$ 2 W | ValidTgts$ Mercenary | IsCurse$ True | TgtPrompt$ Select target Mercenary | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target Mercenary on the bottom of its owner's library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mercenary_informer.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merchant_of_secrets.txt b/res/cardsfolder/merchant_of_secrets.txt deleted file mode 100644 index 9c32dc281f4..00000000000 --- a/res/cardsfolder/merchant_of_secrets.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Merchant of Secrets -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merchant_of_secrets.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/90.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merchant_scroll.txt b/res/cardsfolder/merchant_scroll.txt deleted file mode 100644 index 8c2b89b2497..00000000000 --- a/res/cardsfolder/merchant_scroll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merchant Scroll -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Hand | ChangeType$ Instant.Blue | ChangeNum$ 1 | SpellDescription$ Search your library for a blue instant card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merchant_scroll.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/42.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merchant_ship.txt b/res/cardsfolder/merchant_ship.txt deleted file mode 100644 index f92b8915f25..00000000000 --- a/res/cardsfolder/merchant_ship.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Merchant Ship -ManaCost:U -Types:Creature Human -Text:no text -PT:0/2 -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merchant_ship.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mercurial_kite.txt b/res/cardsfolder/mercurial_kite.txt deleted file mode 100644 index 1e1708144e8..00000000000 --- a/res/cardsfolder/mercurial_kite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mercurial Kite -ManaCost:3 U -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mercurial_kite.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_assassin.txt b/res/cardsfolder/merfolk_assassin.txt deleted file mode 100644 index dc2c0464d17..00000000000 --- a/res/cardsfolder/merfolk_assassin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merfolk Assassin -ManaCost:U U -Types:Creature Merfolk Assassin -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.withIslandwalk | TgtPrompt$ Select target creature with islandwalk | SpellDescription$ Destroy target creature with islandwalk. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_assassin.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/31.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/25.jpg -End diff --git a/res/cardsfolder/merfolk_looter.txt b/res/cardsfolder/merfolk_looter.txt deleted file mode 100644 index ad2c7309d92..00000000000 --- a/res/cardsfolder/merfolk_looter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Merfolk Looter -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_looter.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/39.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/89.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_observer.txt b/res/cardsfolder/merfolk_observer.txt deleted file mode 100644 index a00f1831cf3..00000000000 --- a/res/cardsfolder/merfolk_observer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Merfolk Observer -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at the top card of target player's library. -SVar:TrigPeek:AB$ RearrangeTopOfLibrary | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 1 | SpellDescription$ Look at the top card of target player's library. -SVar:RemAI:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_observer.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_of_the_pearl_trident.txt b/res/cardsfolder/merfolk_of_the_pearl_trident.txt deleted file mode 100644 index 18c996fd8f8..00000000000 --- a/res/cardsfolder/merfolk_of_the_pearl_trident.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Merfolk of the Pearl Trident -ManaCost:U -Types:Creature Merfolk -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card10810.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/67.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/67.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/90.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/86.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/61.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/82.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/68.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/104.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_seastalkers.txt b/res/cardsfolder/merfolk_seastalkers.txt deleted file mode 100644 index 6c31afe1e59..00000000000 --- a/res/cardsfolder/merfolk_seastalkers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merfolk Seastalkers -ManaCost:3 U -Types:Creature Merfolk Scout -Text:no text -PT:2/3 -K:Islandwalk -A:AB$ Tap | Cost$ 2 U | ValidTgts$ Creature.withoutFlying | TgtPrompt$ Select target creature without flying | SpellDescription$ Tap target creature without flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_seastalkers.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/55.jpg -End diff --git a/res/cardsfolder/merfolk_seer.txt b/res/cardsfolder/merfolk_seer.txt deleted file mode 100644 index c51d89243ee..00000000000 --- a/res/cardsfolder/merfolk_seer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merfolk Seer -ManaCost:2 U -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay 1 U. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 1 U | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_seer.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_skyscout.txt b/res/cardsfolder/merfolk_skyscout.txt deleted file mode 100644 index 76cc406f392..00000000000 --- a/res/cardsfolder/merfolk_skyscout.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Merfolk Skyscout -ManaCost:2 U U -Types:Creature Merfolk Scout -Text:no text -PT:2/3 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME attacks or blocks, untap target permanent. -T:Mode$ Blocks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigUntap | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_skyscout.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_sovereign.txt b/res/cardsfolder/merfolk_sovereign.txt deleted file mode 100644 index f93e7762f47..00000000000 --- a/res/cardsfolder/merfolk_sovereign.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Merfolk Sovereign -ManaCost:1 U U -Types:Creature Merfolk -Text:no text -PT:2/2 -K:stPumpAll:Creature.Merfolk+Other+YouCtrl:1/1:No Condition:Other Merfolk creatures you control get +1/+1. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Merfolk | TgtPrompt$ Select target Merfolk creature | KW$ HIDDEN Unblockable | SpellDescription$ Target Merfolk creature is unblockable this turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_sovereign.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/65.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_thaumaturgist.txt b/res/cardsfolder/merfolk_thaumaturgist.txt deleted file mode 100644 index 146251d78fe..00000000000 --- a/res/cardsfolder/merfolk_thaumaturgist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merfolk Thaumaturgist -ManaCost:2 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | KW$ HIDDEN CARDNAME's power and toughness are switched | TgtPrompt$ Select target creature. | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_thaumaturgist.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merfolk_traders.txt b/res/cardsfolder/merfolk_traders.txt deleted file mode 100644 index 57dcfae59ae..00000000000 --- a/res/cardsfolder/merfolk_traders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Merfolk Traders -ManaCost:1 U -Types:Creature Merfolk -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card, then discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merfolk_traders.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merieke_ri_berit.txt b/res/cardsfolder/merieke_ri_berit.txt deleted file mode 100644 index a91268bb31d..00000000000 --- a/res/cardsfolder/merieke_ri_berit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Merieke Ri Berit -ManaCost:W U B -Types:Legendary Creature Human -Text:no text -PT:1/1 -K:CARDNAME doesn't untap during your untap step. -A:AB$ GainControl | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay,LoseControl | DestroyTgt$ LeavesPlay,LoseControl,Untap | NoRegen$ True | SpellDescription$ Gain control of target creature for as long as you control CARDNAME. When CARDNAME leaves the battlefield or becomes untapped, destroy that creature. It can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/merieke_ri_berit.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/95.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/375.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merrow_commerce.txt b/res/cardsfolder/merrow_commerce.txt deleted file mode 100644 index 3df2b0d9150..00000000000 --- a/res/cardsfolder/merrow_commerce.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merrow Commerce -ManaCost:1 U -Types:Tribal Enchantment Merfolk -Text:no text -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ UntapMerfolk | TriggerDescription$ At the beginning of your end step, untap all Merfolk you control. -SVar:UntapMerfolk:AB$UntapAll | Cost$ 0 | ValidCards$ Merfolk.YouCtrl | SpellDescription$ Untap all Merfolk you control. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_commerce.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merrow_grimeblotter.txt b/res/cardsfolder/merrow_grimeblotter.txt deleted file mode 100644 index d2430960437..00000000000 --- a/res/cardsfolder/merrow_grimeblotter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merrow Grimeblotter -ManaCost:3 UB -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 UB Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_grimeblotter.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/171.jpg -End diff --git a/res/cardsfolder/merrow_harbinger.txt b/res/cardsfolder/merrow_harbinger.txt deleted file mode 100644 index 23bfc93aa82..00000000000 --- a/res/cardsfolder/merrow_harbinger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Merrow Harbinger -ManaCost:3 U -Types:Creature Merfolk Wizard -Text:no text -PT:2/3 -K:Islandwalk -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Merfolk | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merrow_levitator.txt b/res/cardsfolder/merrow_levitator.txt deleted file mode 100644 index 59b3ce6787b..00000000000 --- a/res/cardsfolder/merrow_levitator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Merrow Levitator -ManaCost:3 U -Types:Creature Merfolk Wizard -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a blue spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_levitator.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/26.jpg -End diff --git a/res/cardsfolder/merrow_reejerey.txt b/res/cardsfolder/merrow_reejerey.txt deleted file mode 100644 index fdc216efe7d..00000000000 --- a/res/cardsfolder/merrow_reejerey.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Merrow Reejerey -ManaCost:2 U -Types:Creature Merfolk Soldier -Text:no text -PT:2/2 -K:stPumpAll:Creature.Merfolk+Other+YouCtrl:1/1:No Condition:Other Merfolk creatures you control get +1/+1. -T:Mode$ SpellCast | ValidCard$ Card.Merfolk+YouCtrl | Execute$ TrigTapOrUntap | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a Merfolk spell, you may tap or untap target permanent. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_reejerey.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/merrow_wavebreakers.txt b/res/cardsfolder/merrow_wavebreakers.txt deleted file mode 100644 index c3fd0fc5cb9..00000000000 --- a/res/cardsfolder/merrow_wavebreakers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merrow Wavebreakers -ManaCost:4 U -Types:Creature Merfolk Soldier -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 U Untap | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_wavebreakers.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/44.jpg -End diff --git a/res/cardsfolder/merrow_witsniper.txt b/res/cardsfolder/merrow_witsniper.txt deleted file mode 100644 index dcdd0da0c5e..00000000000 --- a/res/cardsfolder/merrow_witsniper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Merrow Witsniper -ManaCost:U -Types:Creature Merfolk Rogue -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, target player puts the top card of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/merrow_witsniper.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mesa_enchantress.txt b/res/cardsfolder/mesa_enchantress.txt deleted file mode 100644 index 4c793572d5e..00000000000 --- a/res/cardsfolder/mesa_enchantress.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mesa Enchantress -ManaCost:1 W W -Types:Creature Human Druid -Text:no text -PT:0/2 -T:Mode$ SpellCast | ValidCard$ Card.Enchantment+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mesa_enchantress.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/20.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mesa_falcon.txt b/res/cardsfolder/mesa_falcon.txt deleted file mode 100644 index 4179746162f..00000000000 --- a/res/cardsfolder/mesa_falcon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mesa Falcon -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ 1 W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mesa_falcon.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/112.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/322.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/31.jpg -End diff --git a/res/cardsfolder/mesmeric_orb.txt b/res/cardsfolder/mesmeric_orb.txt deleted file mode 100644 index e5ac0980e7b..00000000000 --- a/res/cardsfolder/mesmeric_orb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mesmeric Orb -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Untaps | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever a permanent becomes untapped, that permanent's controller puts the top card of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mesmeric_orb.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mesmeric_trance.txt b/res/cardsfolder/mesmeric_trance.txt deleted file mode 100644 index 62d6810f3c4..00000000000 --- a/res/cardsfolder/mesmeric_trance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mesmeric Trance -ManaCost:1 U U -Types:Enchantment -Text:no text -K:Cumulative upkeep:1 -A:AB$ Draw | Cost$ U Discard<1/Card> | NumCards $ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mesmeric_trance.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/messenger_falcons.txt b/res/cardsfolder/messenger_falcons.txt deleted file mode 100644 index 9fdcdd029aa..00000000000 --- a/res/cardsfolder/messenger_falcons.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Messenger Falcons -ManaCost:2 GU W -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/messenger_falcons.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metal_fatigue.txt b/res/cardsfolder/metal_fatigue.txt deleted file mode 100644 index cb0540fc8ad..00000000000 --- a/res/cardsfolder/metal_fatigue.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metal Fatigue -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ 2 W | ValidCards$ Artifact | SpellDescription$ Tap all artifacts. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/metal_fatigue.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/8.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metallic_mastery.txt b/res/cardsfolder/metallic_mastery.txt deleted file mode 100644 index 45a53ad3546..00000000000 --- a/res/cardsfolder/metallic_mastery.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metallic Mastery -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target artifact until end of turn. Untap that artifact. It gains haste until end of turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/metallic_mastery.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metallic_sliver.txt b/res/cardsfolder/metallic_sliver.txt deleted file mode 100644 index f67e180097b..00000000000 --- a/res/cardsfolder/metallic_sliver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metallic Sliver -ManaCost:1 -Types:Artifact Creature Sliver -Text:no text -PT:1/1 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4617.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metallurgeon.txt b/res/cardsfolder/metallurgeon.txt deleted file mode 100644 index 2679ed2ec90..00000000000 --- a/res/cardsfolder/metallurgeon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metallurgeon -ManaCost:1 W -Types:Artifact Creature Human Artificer -Text:no text -PT:1/2 -A:AB$ Regenerate | Cost$ W T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Regenerate target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/metallurgeon.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metalworker.txt b/res/cardsfolder/metalworker.txt deleted file mode 100644 index 50056a73696..00000000000 --- a/res/cardsfolder/metalworker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metalworker -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:1/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/metalworker.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metamorphic_wurm.txt b/res/cardsfolder/metamorphic_wurm.txt deleted file mode 100644 index 82d3e1461c8..00000000000 --- a/res/cardsfolder/metamorphic_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metamorphic Wurm -ManaCost:3 G G -Types:Creature Elephant Wurm -Text:no text -PT:3/3 -K:stPumpSelf:Creature:4/4:Threshold:Threshold - Metamorphic Wurm gets +4/+4 as long as seven or more cards are in your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/metamorphic_wurm.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metathran_elite.txt b/res/cardsfolder/metathran_elite.txt deleted file mode 100644 index d7e9617505d..00000000000 --- a/res/cardsfolder/metathran_elite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Metathran Elite -ManaCost:1 U U -Types:Creature Metathran Soldier -Text:no text -PT:2/3 -K:stPumpSelf:Creature:0/0/Unblockable:isEnchanted:Metathran Elite is unblockable as long as it's enchanted. -SVar:EnchantMe:Once -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_elite.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metathran_soldier.txt b/res/cardsfolder/metathran_soldier.txt deleted file mode 100644 index 1e3a603b0da..00000000000 --- a/res/cardsfolder/metathran_soldier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metathran Soldier -ManaCost:1 U -Types:Creature Metathran Soldier -Text:no text -PT:1/1 -K:Unblockable -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card19096.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metathran_transport.txt b/res/cardsfolder/metathran_transport.txt deleted file mode 100644 index c34c4cd3b1f..00000000000 --- a/res/cardsfolder/metathran_transport.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Metathran Transport -ManaCost:1 U U -Types:Creature Metathran -Text:no text -PT:1/3 -K:Flying -K:CARDNAME can't be blocked by blue creatures. -A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_transport.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/metathran_zombie.txt b/res/cardsfolder/metathran_zombie.txt deleted file mode 100644 index 3d11ad6e260..00000000000 --- a/res/cardsfolder/metathran_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Metathran Zombie -ManaCost:1 U -Types:Creature Metathran Zombie -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_zombie.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meteor_crater.txt b/res/cardsfolder/meteor_crater.txt deleted file mode 100644 index b145d34cd95..00000000000 --- a/res/cardsfolder/meteor_crater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Meteor Crater -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Permanent.YouCtrl | ReflectProperty$ Is | SpellDescription$ Choose a color of a permanent you control. Add one mana of that color to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_crater.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/meteor_storm.txt b/res/cardsfolder/meteor_storm.txt deleted file mode 100644 index 022a841980d..00000000000 --- a/res/cardsfolder/meteor_storm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Meteor Storm -ManaCost:R G -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 2 R G Discard<2/Random> | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/meteor_storm.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/midnight_banshee.txt b/res/cardsfolder/midnight_banshee.txt deleted file mode 100644 index e74289bb610..00000000000 --- a/res/cardsfolder/midnight_banshee.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Midnight Banshee -ManaCost:3 B B B -Types:Creature Spirit -Text:no text -PT:5/5 -K:Wither -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | TriggerDescription$ At the beginning of your upkeep, put a -1/-1 counter on each nonblack creature. -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.nonBlack | CounterType$ M1M1 | IsCurse$ True | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/midnight_banshee.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/midnight_covenant.txt b/res/cardsfolder/midnight_covenant.txt deleted file mode 100644 index fff09542839..00000000000 --- a/res/cardsfolder/midnight_covenant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Midnight Covenant -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Pump:No Condition:Enchanted creature has "B: This creature gets +1/+1 until end of turn." -SVar:Pump:AB$Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/midnight_covenant.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/midsummer_revel.txt b/res/cardsfolder/midsummer_revel.txt deleted file mode 100644 index c9531cafe1a..00000000000 --- a/res/cardsfolder/midsummer_revel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Midsummer Revel -ManaCost:3 G G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -A:AB$ Token | Cost$ G Sac<1/CARDNAME> | TokenImage$ G 3 3 Beast | TokenAmount$ X | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put X 3/3 green Beast creature tokens onto the battlefield. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/midsummer_revel.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/might_of_alara.txt b/res/cardsfolder/might_of_alara.txt deleted file mode 100644 index c3cd98e9c35..00000000000 --- a/res/cardsfolder/might_of_alara.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Might of Alara -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Domain - Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_alara.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/85.jpg -End diff --git a/res/cardsfolder/might_of_oaks.txt b/res/cardsfolder/might_of_oaks.txt deleted file mode 100644 index 587cdd67833..00000000000 --- a/res/cardsfolder/might_of_oaks.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Might of Oaks -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +7 | NumDef$ +7 | SpellDescription$ Target creature gets +7/+7 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gu/en-us/card8822.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/265.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/257.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/255.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/277.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/192.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/106.jpg -End diff --git a/res/cardsfolder/might_of_the_masses.txt b/res/cardsfolder/might_of_the_masses.txt deleted file mode 100644 index bdb7e1a9048..00000000000 --- a/res/cardsfolder/might_of_the_masses.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Might of the Masses -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +1/+1 until end of turn for each creature you control. -SVar:X:Count$TypeYouCtrl.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/might_of_the_masses.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/196.jpg -End diff --git a/res/cardsfolder/might_sliver.txt b/res/cardsfolder/might_sliver.txt deleted file mode 100644 index 88ba3d87b77..00000000000 --- a/res/cardsfolder/might_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Might Sliver -ManaCost:4 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:2/2:no Condition:All Sliver creatures get +2/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/might_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/might_weaver.txt b/res/cardsfolder/might_weaver.txt deleted file mode 100644 index 434313caa38..00000000000 --- a/res/cardsfolder/might_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Might Weaver -ManaCost:1 G -Types:Creature Human Wizard -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Red,Creature.White | KW$ Trample | SpellDescription$ Target red or white creature gains trample until end of turn. | TgtPrompt$ Select target red or white creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/might_weaver.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/198.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mightstone.txt b/res/cardsfolder/mightstone.txt deleted file mode 100644 index 7563ed9b37e..00000000000 --- a/res/cardsfolder/mightstone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mightstone -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature.attacking:1/0:No Condition:Attacking creatures get +1/+0. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mightstone.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mighty_emergence.txt b/res/cardsfolder/mighty_emergence.txt deleted file mode 100644 index a9c0f1279fe..00000000000 --- a/res/cardsfolder/mighty_emergence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mighty Emergence -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature with power 5 or greater enters the battlefield under your control, you may put two +1/+1 counters on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredCard | CounterType$ P1P1 | CounterNum$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mighty_emergence.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mighty_leap.txt b/res/cardsfolder/mighty_leap.txt deleted file mode 100644 index d17d96d3d8e..00000000000 --- a/res/cardsfolder/mighty_leap.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mighty Leap -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Flying | SpellDescription$ Target creature gets +2/+2 and gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mighty_leap.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/22.jpg -End diff --git a/res/cardsfolder/mijae_djinn.txt b/res/cardsfolder/mijae_djinn.txt deleted file mode 100644 index 6abb1d0fa23..00000000000 --- a/res/cardsfolder/mijae_djinn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mijae Djinn -ManaCost:R R R -Types:Creature Djinn -Text:Whenever CARDNAME attacks, flip a coin. If you lose the flip, remove CARDNAME from combat and tap it. -PT:6/3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mijae_djinn.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/165.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mikokoro_center_of_the_sea.txt b/res/cardsfolder/mikokoro_center_of_the_sea.txt deleted file mode 100644 index c12ab58ae11..00000000000 --- a/res/cardsfolder/mikokoro_center_of_the_sea.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mikokoro, Center of the Sea -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Draw | Cost$ 2 T | NumCards$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Each player draws a card. -SVar:DBDraw:DB$Draw | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mikokoro_center_of_the_sea.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/162.jpg -End diff --git a/res/cardsfolder/militant_monk.txt b/res/cardsfolder/militant_monk.txt deleted file mode 100644 index 6d2a4699910..00000000000 --- a/res/cardsfolder/militant_monk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Militant Monk -ManaCost:1 W W -Types:Creature Human Monk Cleric -Text:no text -PT:2/1 -K:Vigilance -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/militant_monk.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/millikin.txt b/res/cardsfolder/millikin.txt deleted file mode 100644 index b1cdc9a5051..00000000000 --- a/res/cardsfolder/millikin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Millikin -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:0/1 -A:AB$ Mill | Cost$ T | NumCards$ 1 | Defined$ You | SubAbility$ SVar=DBMana | CostDesc$ Tap, | SpellDescription$ Put the top card of your library into your graveyard: -SVar:DBMana:DB$Mana | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/millikin.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/millstone.txt b/res/cardsfolder/millstone.txt deleted file mode 100644 index 30f22a0869e..00000000000 --- a/res/cardsfolder/millstone.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Millstone -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ 2 T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/millstone.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/307.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/308.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/390.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/354.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/304.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/334.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/299.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/265.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minamo_school_at_waters_edge.txt b/res/cardsfolder/minamo_school_at_waters_edge.txt deleted file mode 100644 index f2a729a5a7d..00000000000 --- a/res/cardsfolder/minamo_school_at_waters_edge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Minamo, School at Water's Edge -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Untap | Cost$ U T | ValidTgts$ Permanent.Legendary | TgtPrompt$ Select target legendary permanent | SpellDescription$ Untap target legendary permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/minamo_school_at_waters_edge.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minamo_scrollkeeper.txt b/res/cardsfolder/minamo_scrollkeeper.txt deleted file mode 100644 index 583fc4dcc65..00000000000 --- a/res/cardsfolder/minamo_scrollkeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Minamo Scrollkeeper -ManaCost:1 U -Types:Creature Human Wizard -Text:Your maximum hand size is increased by one. -PT:2/3 -K:HandSize + 1 Self -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/minamo_scrollkeeper.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minamo_sightbender.txt b/res/cardsfolder/minamo_sightbender.txt deleted file mode 100644 index 625a6421def..00000000000 --- a/res/cardsfolder/minamo_sightbender.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Minamo Sightbender -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ X T | KW$ HIDDEN Unblockable | TgtPrompt$ Select target creature | ValidTgts$ Creature | SpellDescription$ Target creature with power X or less is unblockable this turn. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/minamo_sightbender.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_burst.txt b/res/cardsfolder/mind_burst.txt deleted file mode 100644 index dea65750f06..00000000000 --- a/res/cardsfolder/mind_burst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mind Burst -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | SpellDescription$ Target player discards X cards, where X is one plus the number of cards named Mind Burst in all graveyards. -SVar:X:Count$NamedInAllYards.Mind Burst/Plus.1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_burst.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_control.txt b/res/cardsfolder/mind_control.txt deleted file mode 100644 index 49b18c5c9df..00000000000 --- a/res/cardsfolder/mind_control.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Control -ManaCost:3 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_control.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/67.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_funeral.txt b/res/cardsfolder/mind_funeral.txt deleted file mode 100644 index 3b08b755758..00000000000 --- a/res/cardsfolder/mind_funeral.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Mind Funeral -ManaCost:1 U B -Types:Sorcery -Text: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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_funeral.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_games.txt b/res/cardsfolder/mind_games.txt deleted file mode 100644 index e4847e0fba6..00000000000 --- a/res/cardsfolder/mind_games.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Games -ManaCost:U -Types:Instant -Text:no text -A:SP$ Tap | Cost$ U | TgtPrompt$ Choose target artifact, creature or land | ValidTgts$ Artifact,Creature,Land | SpellDescription$ Tap target artifact, creature or land. -SVar:Buyback:2 U -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_games.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_harness.txt b/res/cardsfolder/mind_harness.txt deleted file mode 100644 index eeda1453ed2..00000000000 --- a/res/cardsfolder/mind_harness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Harness -ManaCost:U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant red or green creature -K:Cumulative upkeep:1 -K:enControlCreature::Option=red or green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_harness.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_knives.txt b/res/cardsfolder/mind_knives.txt deleted file mode 100644 index ad261cc3c78..00000000000 --- a/res/cardsfolder/mind_knives.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mind Knives -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 1 B | ValidTgts$ Opponent | NumCards$ 1 | Mode$ Random | SpellDescription$ Target opponent discards a card at random. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_knives.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_over_matter.txt b/res/cardsfolder/mind_over_matter.txt deleted file mode 100644 index 67ec399bd71..00000000000 --- a/res/cardsfolder/mind_over_matter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Over Matter -ManaCost:2 U U U U -Types:Enchantment -Text:no text -A:AB$ TapOrUntap | Cost$ Discard<1/Card> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_over_matter.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/40.jpg -End diff --git a/res/cardsfolder/mind_peel.txt b/res/cardsfolder/mind_peel.txt deleted file mode 100644 index 63c6839fd80..00000000000 --- a/res/cardsfolder/mind_peel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mind Peel -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -SVar:Buyback:2 B B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_peel.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_ravel.txt b/res/cardsfolder/mind_ravel.txt deleted file mode 100644 index 2a85ae54e29..00000000000 --- a/res/cardsfolder/mind_ravel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Ravel -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ SVar=DBDraw | SpellDescription$ Target player discards a card. Draw a card at the beginning of the next turn's upkeep. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_ravel.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/38.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_rot.txt b/res/cardsfolder/mind_rot.txt deleted file mode 100644 index 434152a5aa8..00000000000 --- a/res/cardsfolder/mind_rot.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Mind Rot -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_rot.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/144.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/18.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/147.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/24.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/145.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/159.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/105.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/105.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_shatter.txt b/res/cardsfolder/mind_shatter.txt deleted file mode 100644 index c4e1a31a6fe..00000000000 --- a/res/cardsfolder/mind_shatter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mind Shatter -ManaCost:X B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ X B B | ValidTgts$ Player | NumCards$ X | Mode$ Random | SpellDescription$ Target player discards X cards at random. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_shatter.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/66.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_slash.txt b/res/cardsfolder/mind_slash.txt deleted file mode 100644 index aed37104154..00000000000 --- a/res/cardsfolder/mind_slash.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Slash -ManaCost:1 B B -Types:Enchantment -Text:no text -A:AB$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_slash.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/145.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_sludge.txt b/res/cardsfolder/mind_sludge.txt deleted file mode 100644 index c39f8ecefe8..00000000000 --- a/res/cardsfolder/mind_sludge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mind Sludge -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 4 B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | SpellDescription$ Target player discards a card for each Swamp you control. -SVar:X:Count$TypeYouCtrl.Swamp -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_sludge.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/146.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/70.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_spring.txt b/res/cardsfolder/mind_spring.txt deleted file mode 100644 index a863447bff3..00000000000 --- a/res/cardsfolder/mind_spring.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mind Spring -ManaCost:X U U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ X U U | NumCards$ X | SpellDescription$ Draw X cards. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_spring.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/41.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/64.jpg -End diff --git a/res/cardsfolder/mind_stone.txt b/res/cardsfolder/mind_stone.txt deleted file mode 100644 index 03d75bcf486..00000000000 --- a/res/cardsfolder/mind_stone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mind Stone -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Draw | Cost$ 1 T Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_stone.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/153.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/335.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_swords.txt b/res/cardsfolder/mind_swords.txt deleted file mode 100644 index bbfe015bc9c..00000000000 --- a/res/cardsfolder/mind_swords.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mind Swords -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | SubAbility$ SVar=DBExileOpp | SpellDescription$ Each player exiles two cards from his or her hand. -A:SP$ ChangeZone | Cost$ Sac<1/Creature> | IsPresent$ Swamp.YouCtrl | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Hidden$ True | Mandatory$ True | SubAbility$ SVar=DBExileOpp | CostDesc$ If you control a Swamp, you may sacrifice a creature | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:DBExileOpp:DB$ChangeZone | Defined$ Opponent | Origin$ Hand | Destination$ Exile | ChangeType$ Card | ChangeNum$ 2 | Mandatory$ True | Hidden$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_swords.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_twist.txt b/res/cardsfolder/mind_twist.txt deleted file mode 100644 index 3b97e8ffbd3..00000000000 --- a/res/cardsfolder/mind_twist.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mind Twist -ManaCost:X B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ X B | ValidTgts$ Player | NumCards$ X | Mode$ Random | SpellDescription$ Target player discards X cards at random. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_twist.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/24.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/24.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/25.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/31.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mind_warp.txt b/res/cardsfolder/mind_warp.txt deleted file mode 100644 index 47b9873ad98..00000000000 --- a/res/cardsfolder/mind_warp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mind Warp -ManaCost:X 3 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ X 3 B | ValidTgts$ Player | Mode$ RevealYouChoose | NumCards$ X | SpellDescription$ Target player reveals his or her hand. You choose X cards from it. That player discards those cards. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_warp.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/39.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/143.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindcrank.txt b/res/cardsfolder/mindcrank.txt deleted file mode 100644 index 3c07dabbdfc..00000000000 --- a/res/cardsfolder/mindcrank.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mindcrank -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ LifeLost | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ 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.) -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ X -SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindcrank.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindculling.txt b/res/cardsfolder/mindculling.txt deleted file mode 100644 index 39bcde6a9e7..00000000000 --- a/res/cardsfolder/mindculling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mindculling -ManaCost:5 U -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 5 U | ValidTgts$ Opponent | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ SVar=DBDraw | SpellDescription$ You draw two cards and target opponent discards two cards. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindculling.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindlash_sliver.txt b/res/cardsfolder/mindlash_sliver.txt deleted file mode 100644 index 2b796c0c8dd..00000000000 --- a/res/cardsfolder/mindlash_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mindlash Sliver -ManaCost:B -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=Discard:no Condition:All Slivers have "1, Sacrifice this permanent: Each player discards a card." -SVar:Discard:AB$Discard | Cost$ 1 Sac<1/CARDNAME> | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Each player discards a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindlash_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindless_automaton.txt b/res/cardsfolder/mindless_automaton.txt deleted file mode 100644 index 41f8f433c99..00000000000 --- a/res/cardsfolder/mindless_automaton.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mindless Automaton -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 1 Discard<1/Card> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on Mindless Automaton. -A:AB$ Draw | Cost$ SubCounter<2/P1P1> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindless_automaton.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/135.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/111.jpg -End diff --git a/res/cardsfolder/minds_desire.txt b/res/cardsfolder/minds_desire.txt deleted file mode 100644 index 1415c77cd17..00000000000 --- a/res/cardsfolder/minds_desire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mind's Desire -ManaCost:4 U U -Types:Sorcery -Text: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.) -K:Storm -K:Shroud -K:Indestructible -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/minds_desire.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minds_eye.txt b/res/cardsfolder/minds_eye.txt deleted file mode 100644 index aa2581dfb74..00000000000 --- a/res/cardsfolder/minds_eye.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mind's Eye -ManaCost:5 -Types:Artifact -Text:no text -T:Mode$ Drawn | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent draws a card, you may pay 1. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 1 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/minds_eye.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindslicer.txt b/res/cardsfolder/mindslicer.txt deleted file mode 100644 index 163950ea999..00000000000 --- a/res/cardsfolder/mindslicer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mindslicer -ManaCost:2 B B -Types:Creature Horror -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player discards his or her hand. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ You | Mode$ Hand | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Opponent | Mode$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindslicer.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/149.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindstab.txt b/res/cardsfolder/mindstab.txt deleted file mode 100644 index aae908681dc..00000000000 --- a/res/cardsfolder/mindstab.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mindstab -ManaCost:5 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 5 B | ValidTgts$ Player | NumCards$ 3 | Mode$ TgtChoose | SpellDescription$ Target player discards three cards. -K:Suspend:4:B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindstab.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindstab_thrull.txt b/res/cardsfolder/mindstab_thrull.txt deleted file mode 100644 index cc9fbf6a571..00000000000 --- a/res/cardsfolder/mindstab_thrull.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mindstab Thrull -ManaCost:1 B B -Types:Creature Thrull -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, defending player discards three cards. -SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ Opponent | NumCards$ 3 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindstab_thrull.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/40.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/19.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/mindwarper.txt b/res/cardsfolder/mindwarper.txt deleted file mode 100644 index daea960ca54..00000000000 --- a/res/cardsfolder/mindwarper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mindwarper -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:0/0 -K:etbCounter:P1P1:3 -A:AB$ Discard | Cost$ 2 B SubCounter<1/P1P1> | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindwarper.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindwhip_sliver.txt b/res/cardsfolder/mindwhip_sliver.txt deleted file mode 100644 index 900d008d49a..00000000000 --- a/res/cardsfolder/mindwhip_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mindwhip Sliver -ManaCost:2 B -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Discard:no Condition: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." -SVar:Discard:AB$Discard | Cost$ 2 Sac<1/CARDNAME> | Tgt$ TgtP | NumCards$ 1 | Mode$ Random | SpellDescription$ Target player discards a card at random. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindwhip_sliver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mindwrack_liege.txt b/res/cardsfolder/mindwrack_liege.txt deleted file mode 100644 index 49ca6094dff..00000000000 --- a/res/cardsfolder/mindwrack_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mindwrack Liege -ManaCost:3 UR UR UR -Types:Creature Horror -Text:no text -PT:4/4 -K:stPumpAll:Creature.Blue+Other+YouCtrl:1/1:No Condition:Other blue creatures you control get +1/+1. -K:stPumpAll:Creature.Red+Other+YouCtrl:1/1:No Condition:Other red creatures you control get +1/+1. -A:AB$ ChangeZone | Cost$ UR UR UR UR | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Blue,Creature.Red | ChangeNum$ 1 | SpellDescription$ You may put a blue or red creature card from your hand onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mindwrack_liege.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mine_bearer.txt b/res/cardsfolder/mine_bearer.txt deleted file mode 100644 index e414ff50e46..00000000000 --- a/res/cardsfolder/mine_bearer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mine Bearer -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | SpellDescription$ Destroy target attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mine_bearer.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minion_of_tevesh_szat.txt b/res/cardsfolder/minion_of_tevesh_szat.txt deleted file mode 100644 index 5325cc7116d..00000000000 --- a/res/cardsfolder/minion_of_tevesh_szat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Minion of Tevesh Szat -ManaCost:4 B B B -Types:Creature Demon Minion -Text:no text -PT:4/4 -K:At the beginning of your upkeep, CARDNAME deals 2 damage to you unless you pay B B -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ -2 | SpellDescription$ Target creature gets +3/-2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/minion_of_tevesh_szat.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minions_murmurs.txt b/res/cardsfolder/minions_murmurs.txt deleted file mode 100644 index bee98e22e2c..00000000000 --- a/res/cardsfolder/minions_murmurs.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Minions' Murmurs -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 B B | NumCards$ X | SpellDescription$ You draw X cards and you lose X life, where X is the number of creatures you control. | SubAbility$ SVar=DB1 -SVar:DB1:DB$LoseLife | LifeAmount$ X -SVar:X:Count$TypeYouCtrl.Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130316.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minister_of_impediments.txt b/res/cardsfolder/minister_of_impediments.txt deleted file mode 100644 index 9758bf66248..00000000000 --- a/res/cardsfolder/minister_of_impediments.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Minister of Impediments -ManaCost:2 WU -Types:Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/minister_of_impediments.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minotaur_explorer.txt b/res/cardsfolder/minotaur_explorer.txt deleted file mode 100644 index 389967cca6f..00000000000 --- a/res/cardsfolder/minotaur_explorer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Minotaur Explorer -ManaCost:1 R -Types:Creature Minotaur -Text:When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -PT:3/3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card31786.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minotaur_illusionist.txt b/res/cardsfolder/minotaur_illusionist.txt deleted file mode 100644 index 40ebf1feeaf..00000000000 --- a/res/cardsfolder/minotaur_illusionist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Minotaur Illusionist -ManaCost:3 U R -Types:Creature Minotaur Wizard -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ 1 U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/minotaur_illusionist.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/111.jpg -End diff --git a/res/cardsfolder/minotaur_tactician.txt b/res/cardsfolder/minotaur_tactician.txt deleted file mode 100644 index 946c19a339d..00000000000 --- a/res/cardsfolder/minotaur_tactician.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Minotaur Tactician -ManaCost:3 R -Types:Creature Minotaur -Text:no text -PT:1/1 -K:Haste -K:stPumpSelf:Creature:1/1:isPresent Creature.White+YouCtrl:Minotaur Tactician gets +1/+1 as long as you control a white creature. -K:stPumpSelf:Creature:1/1:isPresent Creature.Blue+YouCtrl:Minotaur Tactician gets +1/+1 as long as you control a blue creature. -SVar:RemAIDeck:True -SVar:BuffedBy:Creature.White,Creature.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/minotaur_tactician.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/minotaur_warrior.txt b/res/cardsfolder/minotaur_warrior.txt deleted file mode 100644 index b68be9c0acb..00000000000 --- a/res/cardsfolder/minotaur_warrior.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Minotaur Warrior -ManaCost:2 R -Types:Creature Minotaur Warrior -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4351.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/miraculous_recovery.txt b/res/cardsfolder/miraculous_recovery.txt deleted file mode 100644 index 80283fe038d..00000000000 --- a/res/cardsfolder/miraculous_recovery.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Miraculous Recovery -ManaCost:4 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 4 W | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SubAbility$ SVar=DBPutCounter| SpellDescription$ Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. -SVar:DBPutCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/miraculous_recovery.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirari.txt b/res/cardsfolder/mirari.txt deleted file mode 100644 index af8067ce012..00000000000 --- a/res/cardsfolder/mirari.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirari -ManaCost:5 -Types:Legendary Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopy | TriggerDescription$ 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. -SVar:TrigCopy:AB$CopySpell | Cost$ 3 | Defined$ TriggeredSpellAbility -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirari.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/303.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/miraris_wake.txt b/res/cardsfolder/miraris_wake.txt deleted file mode 100644 index 6ad3689af46..00000000000 --- a/res/cardsfolder/miraris_wake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirari's Wake -ManaCost:3 G W -Types:Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Land.YouCtrl | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. -SVar:TrigMana:AB$ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer -K:stPumpAll:Creature.YouCtrl:1/1:No Condition:Creatures you control get +1/+1. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/miraris_wake.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mire_blight.txt b/res/cardsfolder/mire_blight.txt deleted file mode 100644 index 1b1a3bdfc4c..00000000000 --- a/res/cardsfolder/mire_blight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mire Blight -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN When CARDNAME is dealt damage, destroy it.:When enchanted creature is dealt damage, destroy it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_blight.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mire_boa.txt b/res/cardsfolder/mire_boa.txt deleted file mode 100644 index f595b3007ff..00000000000 --- a/res/cardsfolder/mire_boa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mire Boa -ManaCost:1 G -Types:Creature Snake -Text:no text -PT:2/1 -K:Swampwalk -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_boa.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mire_kavu.txt b/res/cardsfolder/mire_kavu.txt deleted file mode 100644 index b80c0911ae9..00000000000 --- a/res/cardsfolder/mire_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mire Kavu -ManaCost:3 R -Types:Creature Kavu -Text:no text -PT:3/2 -K:stPumpSelf:Creature:1/1:isPresent Swamp.YouCtrl:Mire Kavu gets +1/+1 as long as you control a Swamp. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_kavu.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mire_shade.txt b/res/cardsfolder/mire_shade.txt deleted file mode 100644 index 97059e32ed2..00000000000 --- a/res/cardsfolder/mire_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mire Shade -ManaCost:1 B -Types:Creature Shade -Text:no text -PT:1/1 -A:AB$ PutCounter | Cost$ B Sac<1/Swamp> | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on CARDNAME. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mire_shade.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/miren_the_moaning_well.txt b/res/cardsfolder/miren_the_moaning_well.txt deleted file mode 100644 index 319d4fecd8a..00000000000 --- a/res/cardsfolder/miren_the_moaning_well.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Miren, the Moaning Well -ManaCost:no cost -Types:Legendary Land -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ GainLife | Cost$ 3 T Sac<1/Creature> | LifeAmount$ X | SpellDescription$ You gain life equal to the sacrificed creature's toughness. -SVar:X:Sacrificed$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/miren_the_moaning_well.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirozel.txt b/res/cardsfolder/mirozel.txt deleted file mode 100644 index b176def02aa..00000000000 --- a/res/cardsfolder/mirozel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mirozel -ManaCost:3 U -Types:Creature Illusion -Text:no text -PT:2/3 -K:Flying -K:When CARDNAME becomes the target of a spell or ability, return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirozel.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirran_crusader.txt b/res/cardsfolder/mirran_crusader.txt deleted file mode 100644 index 29ae9bd4595..00000000000 --- a/res/cardsfolder/mirran_crusader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mirran Crusader -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Double Strike -K:Protection from black -K:Protection from green -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirran_crusader.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirran_mettle.txt b/res/cardsfolder/mirran_mettle.txt deleted file mode 100644 index 742eb32c2b3..00000000000 --- a/res/cardsfolder/mirran_mettle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mirran Mettle -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ 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. -SVar:X:Count$Metalcraft.4.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirran_mettle.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirran_spy.txt b/res/cardsfolder/mirran_spy.txt deleted file mode 100644 index bcdb4e86295..00000000000 --- a/res/cardsfolder/mirran_spy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mirran Spy -ManaCost:2 U -Types:Creature Drone -Text:no text -PT:1/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Artifact | ValidControllingPlayer$ You | Execute$ TrigUntap | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may untap target creature. -SVar:TrigUntap:AB$Untap | Cost$ 0 | ValidTgts$ Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirran_spy.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirri_cat_warrior.txt b/res/cardsfolder/mirri_cat_warrior.txt deleted file mode 100644 index 27cdddb339b..00000000000 --- a/res/cardsfolder/mirri_cat_warrior.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mirri, Cat Warrior -ManaCost:1 G G -Types:Legendary Creature Cat Warrior -Text:no text -PT:2/3 -K:First Strike -K:Forestwalk -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirri_cat_warrior.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/114.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirri_the_cursed.txt b/res/cardsfolder/mirri_the_cursed.txt deleted file mode 100644 index dc1b4b3b4dc..00000000000 --- a/res/cardsfolder/mirri_the_cursed.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mirri the Cursed -ManaCost:2 B B -Types:Legendary Creature Vampire Cat -Text:no text -PT:3/2 -K:First Strike -K:Flying -K:Haste -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirri_the_cursed.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirris_guile.txt b/res/cardsfolder/mirris_guile.txt deleted file mode 100644 index 3fbb1babdf1..00000000000 --- a/res/cardsfolder/mirris_guile.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirri's Guile -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigRearrange | TriggerDescription$ At the beginning of your upkeep, you may look at the top three cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirris_guile.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirrodins_core.txt b/res/cardsfolder/mirrodins_core.txt deleted file mode 100644 index 1d4a6429b35..00000000000 --- a/res/cardsfolder/mirrodins_core.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mirrodin's Core -ManaCost:no cost -Types:Land -Text:no text -A:AB$Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$PutCounter | Cost$ T | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirrodins_core.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirror_entity.txt b/res/cardsfolder/mirror_entity.txt deleted file mode 100644 index 6c9c3b0f8db..00000000000 --- a/res/cardsfolder/mirror_entity.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mirror Entity -ManaCost:2 W -Types:Creature Shapeshifter -Text:no text -PT:1/1 -K:Changeling -A:AB$ AnimateAll | Cost$ X | Power$ X | Toughness$ X | Keywords$ Changeling | ValidCards$ Creature.YouCtrl | SpellDescription$ Creatures you control become X/X and gain all creature types until end of turn. -SVar:X:Count$xPaid -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_entity.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirror_gallery.txt b/res/cardsfolder/mirror_gallery.txt deleted file mode 100644 index a41abd458a5..00000000000 --- a/res/cardsfolder/mirror_gallery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mirror Gallery -ManaCost:5 -Types:Artifact -Text:The "legend rule" doesn't apply. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_gallery.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirror_sigil_sergeant.txt b/res/cardsfolder/mirror_sigil_sergeant.txt deleted file mode 100644 index cb23e5b08ea..00000000000 --- a/res/cardsfolder/mirror_sigil_sergeant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirror-Sigil Sergeant -ManaCost:5 W -Types:Creature Rhino Soldier -Text: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. -PT:4/4 -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_sigil_sergeant.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirror_universe.txt b/res/cardsfolder/mirror_universe.txt deleted file mode 100644 index 1f8f71dd3f9..00000000000 --- a/res/cardsfolder/mirror_universe.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Mirror Universe -ManaCost:6 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_universe.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirror_wall.txt b/res/cardsfolder/mirror_wall.txt deleted file mode 100644 index a9cb56dce6c..00000000000 --- a/res/cardsfolder/mirror_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirror Wall -ManaCost:3 U -Types:Creature Wall -Text:no text -PT:3/4 -K:Defender -A:AB$ Pump | Cost$ W | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | SpellDescription$ CARDNAME can attack this turn as though it didn't have defender. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirror_wall.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mirrorworks.txt b/res/cardsfolder/mirrorworks.txt deleted file mode 100644 index f415708b32d..00000000000 --- a/res/cardsfolder/mirrorworks.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mirrorworks -ManaCost:5 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | ValidCard$ Artifact.nonToken+Other+YouCtrl | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigCopy:AB$CopyPermanent | Cost$ 2 | Defined$ TriggeredCard -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mirrorworks.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/miscalculation.txt b/res/cardsfolder/miscalculation.txt deleted file mode 100644 index 57016ce92dc..00000000000 --- a/res/cardsfolder/miscalculation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Miscalculation -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays 2. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/miscalculation.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mischievous_poltergeist.txt b/res/cardsfolder/mischievous_poltergeist.txt deleted file mode 100755 index 7ada52904c3..00000000000 --- a/res/cardsfolder/mischievous_poltergeist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mischievous Poltergeist -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:1/1 -K:Flying -A:AB$ Regenerate | Cost$ PayLife<1> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mischievous_poltergeist.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/144.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misers_cage.txt b/res/cardsfolder/misers_cage.txt deleted file mode 100644 index b4d938e9acd..00000000000 --- a/res/cardsfolder/misers_cage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Misers' Cage -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ GE5 | Execute$ TrigDamageOpp | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has five or more cards in hand, CARDNAME deals 2 damage to him or her. -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/misers_cage.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misery_charm.txt b/res/cardsfolder/misery_charm.txt deleted file mode 100644 index 9e8cc173ae5..00000000000 --- a/res/cardsfolder/misery_charm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Misery Charm -ManaCost:B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.cleric | TgtPrompt$ Select target cleric. | SpellDescription$ Choose one - Destroy target Cleric; -A:SP$ ChangeZone | Cost$ B | ValidTgts$ Creature.cleric | Origin$ Graveyard | Destination$ Hand | SpellDescription$ or return target Cleric card from your graveyard to your hand; -A:SP$ LoseLife | Cost$ B | ValidTgts$ Player | TgtPrompt$ Select a player to lose 2 life | LifeAmount$ 2 | SpellDescription$ or target player loses 2 life. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/misery_charm.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misfortunes_gain.txt b/res/cardsfolder/misfortunes_gain.txt deleted file mode 100644 index 2d2d1e0b201..00000000000 --- a/res/cardsfolder/misfortunes_gain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Misfortune's Gain -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target creature. Its owner gains 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/misfortunes_gain.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misguided_rage.txt b/res/cardsfolder/misguided_rage.txt deleted file mode 100644 index 4f4b9ecb6d5..00000000000 --- a/res/cardsfolder/misguided_rage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Misguided Rage -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 2 R | ValidTgts$ Player | SacValid$ Permanent | SacMessage$ Permanent | SpellDescription$ Target player sacrifices a permanent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/misguided_rage.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mishra_artificer_prodigy.txt b/res/cardsfolder/mishra_artificer_prodigy.txt deleted file mode 100644 index b5c69733fa1..00000000000 --- a/res/cardsfolder/mishra_artificer_prodigy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mishra, Artificer Prodigy -ManaCost:1 U B R -Types:Legendary Creature Human Artificer -Text:no text -PT:4/4 -T:Mode$ SpellCast | ValidCard$ Card.Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChangeZone | TriggerDescription$ 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. -SVar:TrigChangeZone:DB$ ChangeZone | Defined$ You | Hidden$ True | Origin$ Graveyard,Hand,Library | OriginChoice$ True | OriginAlternative$ Graveyard,Hand | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ChangeType$ Triggered.sameName -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mishra_artificer_prodigy.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mishras_factory.txt b/res/cardsfolder/mishras_factory.txt deleted file mode 100644 index defa9f799de..00000000000 --- a/res/cardsfolder/mishras_factory.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mishra's Factory -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 1 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Artifact,Creature,Assembly-Worker | SpellDescription$ CARDNAME becomes a 2/2 Assembly-Worker artifact creature until end of turn. It's still a land. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Assembly-Worker | TgtPrompt$ Select target Assembly-Worker creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target Assembly-Worker creature gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/aq/en-us/card1074.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/181.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/66.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/mishras_groundbreaker.txt b/res/cardsfolder/mishras_groundbreaker.txt deleted file mode 100644 index c6d613f52c7..00000000000 --- a/res/cardsfolder/mishras_groundbreaker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mishra's Groundbreaker -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Artifact,Creature | Permanent$ True | SpellDescription$ Target land becomes a 3/3 artifact creature that's still a land. (This effect lasts indefinitely.) -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_groundbreaker.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mishras_helix.txt b/res/cardsfolder/mishras_helix.txt deleted file mode 100644 index c1c4cd2472f..00000000000 --- a/res/cardsfolder/mishras_helix.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mishra's Helix -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target Land | SpellDescription$ Tap X target lands. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_helix.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misinformation.txt b/res/cardsfolder/misinformation.txt deleted file mode 100644 index 725d5b6eea9..00000000000 --- a/res/cardsfolder/misinformation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Misinformation -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target card in opponent's graveyard | ValidTgts$ Card.YouDontCtrl | TargetMin$ 0 | TargetMax$ 3 | SpellDescription$ Put up to three target cards from an opponent's graveyard on top of his or her library in any order. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/misinformation.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misshapen_fiend.txt b/res/cardsfolder/misshapen_fiend.txt deleted file mode 100644 index 91bfce571a6..00000000000 --- a/res/cardsfolder/misshapen_fiend.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Misshapen Fiend -ManaCost:1 B -Types:Creature Horror Mercenary -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19581.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mist_leopard.txt b/res/cardsfolder/mist_leopard.txt deleted file mode 100644 index f419a027eeb..00000000000 --- a/res/cardsfolder/mist_leopard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mist Leopard -ManaCost:3 G -Types:Creature Cat -Text:no text -PT:3/2 -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mist_leopard.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistbind_clique.txt b/res/cardsfolder/mistbind_clique.txt deleted file mode 100644 index 3694b88efc8..00000000000 --- a/res/cardsfolder/mistbind_clique.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mistbind Clique -ManaCost:3 U -Types:Creature Faerie Wizard -Text:\r\n\r\nWhen a Faerie is championed with CARDNAME, tap all lands target player controls. -PT:4/4 -K:Flash -K:Flying -K:Champion:Faerie -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistbind_clique.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistblade_shinobi.txt b/res/cardsfolder/mistblade_shinobi.txt deleted file mode 100644 index e8ab44e11ea..00000000000 --- a/res/cardsfolder/mistblade_shinobi.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mistblade Shinobi -ManaCost:2 U -Types:Creature Human Ninja -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu U | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (U, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigBounce | OptionalDecider$ You | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may return target creature that player controls to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature your opponent controls. | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistblade_shinobi.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistfolk.txt b/res/cardsfolder/mistfolk.txt deleted file mode 100644 index 8114e17bb39..00000000000 --- a/res/cardsfolder/mistfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mistfolk -ManaCost:U U -Types:Creature Illusion -Text:no text -PT:1/2 -A:AB$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Card.Self | SpellDescription$ Counter target spell that targets CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistfolk.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_dreamer.txt b/res/cardsfolder/mistform_dreamer.txt deleted file mode 100644 index e2666deed2e..00000000000 --- a/res/cardsfolder/mistform_dreamer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mistform Dreamer -ManaCost:2 U -Types:Creature Illusion -Text:no text -PT:2/1 -K:Flying -A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ SVar=DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | Types$ ChosenType | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_dreamer.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_mutant.txt b/res/cardsfolder/mistform_mutant.txt deleted file mode 100644 index ab7b5169d08..00000000000 --- a/res/cardsfolder/mistform_mutant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mistform Mutant -ManaCost:4 U U -Types:Creature Illusion Mutant -Text:no text -PT:3/4 -A:AB$ ChooseType | Cost$ 1 U | Defined$ You | Type$ Creature | InvalidTypes$ Wall | SubAbility$ SVar=DBAnimate | SpellDescription$ Choose a creature type other than Wall. Target creature becomes that type until end of turn. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ ChosenType | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_mutant.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_shrieker.txt b/res/cardsfolder/mistform_shrieker.txt deleted file mode 100644 index aa1f8c79d8d..00000000000 --- a/res/cardsfolder/mistform_shrieker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mistform Shrieker -ManaCost:3 U U -Types:Creature Illusion -Text:no text -PT:3/3 -K:Flying -A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ SVar=DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | Defined$ Self | Types$ ChosenType | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -K:Morph:3 U U -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_shrieker.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_skyreaver.txt b/res/cardsfolder/mistform_skyreaver.txt deleted file mode 100644 index 998a2a0885f..00000000000 --- a/res/cardsfolder/mistform_skyreaver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mistform Skyreaver -ManaCost:5 U U -Types:Creature Illusion -Text:no text -PT:6/6 -K:Flying -A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ SVar=DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | Types$ ChosenType | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_skyreaver.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_stalker.txt b/res/cardsfolder/mistform_stalker.txt deleted file mode 100644 index b6b8080c509..00000000000 --- a/res/cardsfolder/mistform_stalker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mistform Stalker -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:3/3 -K:Flying -A:AB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ SVar=DBAnimate | SpellDescription$ CARDNAME becomes the creature type of your choice until end of turn. -SVar:DBAnimate:DB$ Animate | Defined$ Self | Types$ ChosenType | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -A:AB$ Pump | Cost$ 2 U U | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | KW$ Flying | SpellDescription$ CARDNAME gets +2/+2 and gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_stalker.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistform_ultimus.txt b/res/cardsfolder/mistform_ultimus.txt deleted file mode 100644 index 4dc292b5cf5..00000000000 --- a/res/cardsfolder/mistform_ultimus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mistform Ultimus -ManaCost:3 U -Types:Legendary Creature Illusion -Text:no text -PT:3/3 -K:Changeling -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistform_ultimus.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/47.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistmeadow_skulk.txt b/res/cardsfolder/mistmeadow_skulk.txt deleted file mode 100644 index 6fa9718df64..00000000000 --- a/res/cardsfolder/mistmeadow_skulk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mistmeadow Skulk -ManaCost:1 W -Types:Creature Kithkin Rogue -Text:no text -PT:1/1 -K:Lifelink -K:Protection:Card.cmcGE3:protection from converted mana cost 3 or greater -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistmeadow_skulk.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/27.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistral_charger.txt b/res/cardsfolder/mistral_charger.txt deleted file mode 100644 index 62fcf5c2448..00000000000 --- a/res/cardsfolder/mistral_charger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mistral Charger -ManaCost:1 W -Types:Creature Pegasus -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card107260.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistveil_plains.txt b/res/cardsfolder/mistveil_plains.txt deleted file mode 100644 index 67d3ced2df3..00000000000 --- a/res/cardsfolder/mistveil_plains.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mistveil Plains -ManaCost:no cost -Types:Land Plains -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ W T | IsPresent$ Permanent.White+YouCtrl | PresentCompare$ GE2 | ValidTgts$ Card.YouCtrl | TgtPrompt$ Select target card in your graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | ChangeNum $ 1 | SpellDescription$ Put target card from your graveyard on the bottom of your library. Activate this ability only if you control two or more white permanents. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistveil_plains.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mistvein_borderpost.txt b/res/cardsfolder/mistvein_borderpost.txt deleted file mode 100644 index 9747073bb97..00000000000 --- a/res/cardsfolder/mistvein_borderpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mistvein Borderpost -ManaCost:1 U B -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:AltCost:1 Return<1/Land.Basic>$You may pay 1 and return a basic land you control to its owner's hand rather than pay Mistvein Borderpost's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mistvein_borderpost.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/misty_rainforest.txt b/res/cardsfolder/misty_rainforest.txt deleted file mode 100644 index 3ca2a929c4c..00000000000 --- a/res/cardsfolder/misty_rainforest.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Misty Rainforest -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest,Island | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest or Island card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/misty_rainforest.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mitotic_manipulation.txt b/res/cardsfolder/mitotic_manipulation.txt deleted file mode 100644 index 8fc2b3c0903..00000000000 --- a/res/cardsfolder/mitotic_manipulation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mitotic Manipulation -ManaCost:1 U U -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 1 U U | DigNum$ 7 | ChangeValid$ Permanent | ChangeNum$ 1 | Optional$ True | Mitosis$ True | DestinationZone$ Battlefield | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mitotic_manipulation.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mitotic_slime.txt b/res/cardsfolder/mitotic_slime.txt deleted file mode 100644 index cf3ac8b638e..00000000000 --- a/res/cardsfolder/mitotic_slime.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mitotic Slime -ManaCost:4 G -Types:Creature Ooze -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTokenSenior | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put two 2/2 green Ooze creature tokens onto the battlefield. They have "When this creature is put into a graveyard, put two 1/1 green Ooze creature tokens onto the battlefield." -SVar:TrigTokenSenior:AB$Token | Cost$ 0 | TokenImage$ g 2 2 ooze | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenColors$ Green | TokenOwner$ You | TokenPower$ 2 | TokenToughness$ 2 | TokenAmount$ 2 | TokenTriggers$ TriggerJunior | TokenSVars$ TrigTokenJunior -SVar:TriggerJunior:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTokenJunior | TriggerDescription$ When this creature is put into a graveyard, put two 1/1 green Ooze creature tokens onto the battlefield. -SVar:TrigTokenJunior:AB$Token | Cost$ 0 | TokenImage$ g 1 1 ooze | TokenName$ Ooze | TokenTypes$ Creature,Ooze | TokenColors$ Green | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mitotic_slime.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mnemonic_nexus.txt b/res/cardsfolder/mnemonic_nexus.txt deleted file mode 100644 index e51a8f733d5..00000000000 --- a/res/cardsfolder/mnemonic_nexus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mnemonic Nexus -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U | Defined$ Each | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Each player shuffles his or her graveyard into his or her library. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/mnemonic_nexus.jpg -SVar:Rarity:Uncommon -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/59.jpg -End diff --git a/res/cardsfolder/mnemonic_sliver.txt b/res/cardsfolder/mnemonic_sliver.txt deleted file mode 100644 index a68efeb036d..00000000000 --- a/res/cardsfolder/mnemonic_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mnemonic Sliver -ManaCost:2 U -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Draw:no Condition:All Slivers have "2, Sacrifice this permanent: Draw a card." -SVar:Draw:AB$Draw | Cost$ 2 Sac<1/CARDNAME> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mnemonic_sliver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mnemonic_wall.txt b/res/cardsfolder/mnemonic_wall.txt deleted file mode 100644 index 17d3cc8af89..00000000000 --- a/res/cardsfolder/mnemonic_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mnemonic Wall -ManaCost:4 U -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target instant or sorcery card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mnemonic_wall.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moaning_spirit.txt b/res/cardsfolder/moaning_spirit.txt deleted file mode 100644 index 55bf7e86605..00000000000 --- a/res/cardsfolder/moaning_spirit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moaning Spirit -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6554.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moat.txt b/res/cardsfolder/moat.txt deleted file mode 100644 index ef042a5b84e..00000000000 --- a/res/cardsfolder/moat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moat -ManaCost:2 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.withoutFlying:0/0/HIDDEN CARDNAME can't attack.:No Condition:Creatures without flying can't attack. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/moat.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mob_justice.txt b/res/cardsfolder/mob_justice.txt deleted file mode 100644 index ea1aae04e3b..00000000000 --- a/res/cardsfolder/mob_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mob Justice -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target player equal to the number of creatures you control. -SVar:X:Count$TypeYouCtrl.Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mob_justice.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/90.jpg -End diff --git a/res/cardsfolder/mobile_fort.txt b/res/cardsfolder/mobile_fort.txt deleted file mode 100644 index 152b8d61ba9..00000000000 --- a/res/cardsfolder/mobile_fort.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mobile Fort -ManaCost:4 -Types:Artifact Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Pump | Cost$ 3 | NumAtt$ +3 | NumDef$ -1 | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | ActivationLimit$ 1 | SpellDescription$ CARDNAME get +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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mobile_fort.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/303.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mobilization.txt b/res/cardsfolder/mobilization.txt deleted file mode 100644 index 48b8e2011da..00000000000 --- a/res/cardsfolder/mobilization.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mobilization -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 2 W | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 white Soldier creature token onto the battlefield. -K:stPumpAll:Creature.Soldier:0/0/Vigilance:No Condition:Soldier creatures have vigilance. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mobilization.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/44.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mobilize.txt b/res/cardsfolder/mobilize.txt deleted file mode 100644 index 6fd641fcf82..00000000000 --- a/res/cardsfolder/mobilize.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mobilize -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ UntapAll | Cost$ G | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mobilize.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_alarm.txt b/res/cardsfolder/mogg_alarm.txt deleted file mode 100755 index c3bd0c162d3..00000000000 --- a/res/cardsfolder/mogg_alarm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mogg Alarm -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 1 R R | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 red Goblin creature tokens onto the battlefield. -A:SP$ Token | Cost$ Sac<2/Mountain> | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 | CostDesc$ You may sacrifice two Mountains | SpellDescription$ rather than pay CARDNAME's mana cost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_alarm.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_fanatic.txt b/res/cardsfolder/mogg_fanatic.txt deleted file mode 100644 index 8c3d92e748d..00000000000 --- a/res/cardsfolder/mogg_fanatic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mogg Fanatic -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_fanatic.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/190.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_hollows.txt b/res/cardsfolder/mogg_hollows.txt deleted file mode 100644 index a262dbc2606..00000000000 --- a/res/cardsfolder/mogg_hollows.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mogg Hollows -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://magiccards.info/scans/en/br/45.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_jailer.txt b/res/cardsfolder/mogg_jailer.txt deleted file mode 100644 index 1bdb2f2fb41..00000000000 --- a/res/cardsfolder/mogg_jailer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mogg Jailer -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:CARDNAME can't attack if defending player controls an untapped creature with power 2 or less. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_jailer.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_maniac.txt b/res/cardsfolder/mogg_maniac.txt deleted file mode 100644 index 21c766f8b53..00000000000 --- a/res/cardsfolder/mogg_maniac.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mogg Maniac -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to target opponent. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_maniac.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_raider.txt b/res/cardsfolder/mogg_raider.txt deleted file mode 100644 index f9c835764e1..00000000000 --- a/res/cardsfolder/mogg_raider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mogg Raider -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/Goblin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_raider.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/191.jpg -End diff --git a/res/cardsfolder/mogg_sentry.txt b/res/cardsfolder/mogg_sentry.txt deleted file mode 100644 index 9b005eb4927..00000000000 --- a/res/cardsfolder/mogg_sentry.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mogg Sentry -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever an opponent casts a spell, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_sentry.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/203.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/69.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_squad.txt b/res/cardsfolder/mogg_squad.txt deleted file mode 100644 index 8e7dfba1c30..00000000000 --- a/res/cardsfolder/mogg_squad.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mogg Squad -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:3/3 -K:stPumpSelf:Creature:X/X:no Condition:Mogg Squad gets -1/-1 for each other creature on the battlefield. -SVar:X:Count$Valid Creature.Other/Negative -SVar:AntiBuffedBy:Creature -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_squad.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mogg_war_marshal.txt b/res/cardsfolder/mogg_war_marshal.txt deleted file mode 100644 index 956110f73be..00000000000 --- a/res/cardsfolder/mogg_war_marshal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mogg War Marshal -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Echo:1 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, put a 1/1 red Goblin creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or is put into a graveyard from the battlefield, put a 1/1 red Goblin creature token onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ TriggeredCardController | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mogg_war_marshal.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moggcatcher.txt b/res/cardsfolder/moggcatcher.txt deleted file mode 100644 index 4f222c476a2..00000000000 --- a/res/cardsfolder/moggcatcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moggcatcher -ManaCost:2 R R -Types:Creature Human Mercenary -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Goblin | ChangeNum$ 1 | SpellDescription$ Search your library for a Goblin permanent card and put it onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/moggcatcher.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mold_adder.txt b/res/cardsfolder/mold_adder.txt deleted file mode 100644 index 107fc9d385b..00000000000 --- a/res/cardsfolder/mold_adder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mold Adder -ManaCost:G -Types:Creature Fungus Snake -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Blue+YouDontCtrl,Card.Black+YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts a blue or black spell, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mold_adder.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mold_shambler.txt b/res/cardsfolder/mold_shambler.txt deleted file mode 100644 index 0ce71f67778..00000000000 --- a/res/cardsfolder/mold_shambler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mold Shambler -ManaCost:3 G -Types:Creature Fungus Beast -Text:no text -PT:3/3 -K:Kicker:1 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target noncreature permanent. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mold_shambler.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molder_beast.txt b/res/cardsfolder/molder_beast.txt deleted file mode 100644 index 7b19a5ac755..00000000000 --- a/res/cardsfolder/molder_beast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Molder Beast -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:5/3 -K:Trample -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, CARDNAME gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/molder_beast.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molder_slug.txt b/res/cardsfolder/molder_slug.txt deleted file mode 100644 index 893a00e45db..00000000000 --- a/res/cardsfolder/molder_slug.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Molder Slug -ManaCost:3 G G -Types:Creature Slug Beast -Text:no text -PT:4/6 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each player's upkeep, that player sacrifices an artifact. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Artifact | Defined$ TriggeredPlayer | SpellDescription$ Sacrifice an artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/molder_slug.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moldervine_cloak.txt b/res/cardsfolder/moldervine_cloak.txt deleted file mode 100644 index 1c4e2a7de36..00000000000 --- a/res/cardsfolder/moldervine_cloak.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moldervine Cloak -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3 -K:Dredge 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/moldervine_cloak.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molimo_maro_sorcerer.txt b/res/cardsfolder/molimo_maro_sorcerer.txt deleted file mode 100644 index 78f20f44f88..00000000000 --- a/res/cardsfolder/molimo_maro_sorcerer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Molimo, Maro-Sorcerer -ManaCost:4 G G G -Types:Legendary Creature Elemental -Text:no text -PT:*/* -K:Trample -K:stSetPT:Count$NumTypeYouCtrl.Land:Count$NumTypeYouCtrl.Land:Molimo, Maro-Sorcerer's power and toughness are each equal to the number of lands you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/molimo_maro_sorcerer.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/199.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molten_frame.txt b/res/cardsfolder/molten_frame.txt deleted file mode 100644 index dd0be35fdd2..00000000000 --- a/res/cardsfolder/molten_frame.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Molten Frame -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | SpellDescription$ Destroy target artifact creature. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_frame.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/69.jpg -End diff --git a/res/cardsfolder/molten_hydra.txt b/res/cardsfolder/molten_hydra.txt deleted file mode 100644 index 241b6853685..00000000000 --- a/res/cardsfolder/molten_hydra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Molten Hydra -ManaCost:1 R -Types:Creature Hydra -Text:no text -PT:1/1 -A:AB$ PutCounter | Cost$ 1 R R | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_hydra.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molten_psyche.txt b/res/cardsfolder/molten_psyche.txt deleted file mode 100644 index 6cae4edcb05..00000000000 --- a/res/cardsfolder/molten_psyche.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Molten Psyche -ManaCost:1 R R -Types:Sorcery -Text:Each player shuffles the cards from his or her hand into his or her library, then draws that many cards.\r\nMetalcraft - If you control three or more artifacts, CARDNAME deals damage to each opponent equal to the number of cards that player has drawn this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_psyche.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molten_rain.txt b/res/cardsfolder/molten_rain.txt deleted file mode 100644 index 2fd96db2d58..00000000000 --- a/res/cardsfolder/molten_rain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Molten Rain -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 R R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target land. If that land is nonbasic, Molten Rain deals 2 damage to the land's controller. -SVar:DBDamage:DB$ DealDamage | Defined$ TargetedController | NumDmg$ 2 | ConditionDefined$ Targeted | ConditionPresent$ Land.Basic | ConditionCompare$ EQ0 | ConditionDescription$ If that land is nonbasic, -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card46000.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molten_ravager.txt b/res/cardsfolder/molten_ravager.txt deleted file mode 100644 index bf156f84df2..00000000000 --- a/res/cardsfolder/molten_ravager.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Molten Ravager -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:0/4 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_ravager.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/138.jpg -End diff --git a/res/cardsfolder/molten_slagheap.txt b/res/cardsfolder/molten_slagheap.txt deleted file mode 100644 index e20ff0d43c6..00000000000 --- a/res/cardsfolder/molten_slagheap.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Molten Slagheap -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_slagheap.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moltensteel_dragon.txt b/res/cardsfolder/moltensteel_dragon.txt deleted file mode 100644 index 8f865f6282c..00000000000 --- a/res/cardsfolder/moltensteel_dragon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moltensteel Dragon -ManaCost:4 PR PR -Types:Artifact Creature Dragon -Text:no text -PT:4/4 -K:Flying -A:AB$ Pump | Cost$ PR | Defined$ Self | NumAtt$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/moltensteel_dragon.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molting_harpy.txt b/res/cardsfolder/molting_harpy.txt deleted file mode 100644 index f92cf6a32ba..00000000000 --- a/res/cardsfolder/molting_harpy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Molting Harpy -ManaCost:B -Types:Creature Harpy Mercenary -Text:no text -PT:2/1 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/molting_harpy.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/molting_skin.txt b/res/cardsfolder/molting_skin.txt deleted file mode 100644 index 4f0aa2cd862..00000000000 --- a/res/cardsfolder/molting_skin.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Molting Skin -ManaCost:2 G -Types:Enchantment -Text:no text -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ Return<1/CARDNAME> | SpellDescription$ Regenerate target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/molting_skin.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/momentary_blink.txt b/res/cardsfolder/momentary_blink.txt deleted file mode 100644 index 72fa43bba30..00000000000 --- a/res/cardsfolder/momentary_blink.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Momentary Blink -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ChangeZone | Cost$ 1 W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.YouCtrl | RememberTargets$ True | ForgetOtherTargets$ True | TgtPrompt$ Select target creature you control. | SubAbility$ SVar=DBReturn | SpellDescription$ Exile target creature you control, then return it to the battlefield under its owner's control. -A:SP$ChangeZone | Cost$ 3 U | Flashback$ True | CostDesc$ Flashback 3 U | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.YouCtrl | RememberTargets$ True | ForgetOtherTargets$ True | TgtPrompt$ Select target creature you control. | SubAbility$ SVar=DBReturn | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:DBReturn:DB$ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/momentary_blink.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/momentous_fall.txt b/res/cardsfolder/momentous_fall.txt deleted file mode 100644 index 43e81df018a..00000000000 --- a/res/cardsfolder/momentous_fall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Momentous Fall -ManaCost:2 G G -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 G G Sac<1/Creature> | NumCards$ XPower | SubAbility$ SVar=DBGainLife | SpellDescription$ You draw cards equal to the sacrificed creature's power, then you gain life equal to its toughness. -SVar:DBGainLife:DB$GainLife | LifeAmount$ XToughness -SVar:XPower:Sacrificed$CardPower -SVar:XToughness:Sacrificed$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/momentous_fall.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moments_peace.txt b/res/cardsfolder/moments_peace.txt deleted file mode 100644 index 354fe792d94..00000000000 --- a/res/cardsfolder/moments_peace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moment's Peace -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 G | SpellDescription$ Prevent all combat damage that would be dealt this turn. -A:SP$ Fog | Cost$ 2 G | Flashback$ True | CostDesc$ Flashback 2 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moments_peace.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/momentum.txt b/res/cardsfolder/momentum.txt deleted file mode 100644 index 43a9bca61a4..00000000000 --- a/res/cardsfolder/momentum.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Momentum -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:stPumpEnchanted:Creature:X/X:no Condition:Enchanted creature gets +1/+1 for each growth counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a growth counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ GROWTH | CounterNum$ 1 -SVar:X:Count$CardCounters.GROWTH -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/momentum.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/momir_vig_simic_visionary.txt b/res/cardsfolder/momir_vig_simic_visionary.txt deleted file mode 100644 index 79df061f1a8..00000000000 --- a/res/cardsfolder/momir_vig_simic_visionary.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Momir Vig, Simic Visionary -ManaCost:3 G U -Types:Legendary Creature Elf Wizard -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Creature.Green | ValidActivatingPlayer$ You | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature | ChangeNum$ 1 -T:Mode$ SpellCast | ValidCard$ Creature.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | LibraryPosition2$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/corpse_connoisseur.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mongrel_pack.txt b/res/cardsfolder/mongrel_pack.txt deleted file mode 100644 index 485f9f4793f..00000000000 --- a/res/cardsfolder/mongrel_pack.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mongrel Pack -ManaCost:3 G -Types:Creature Hound -Text:no text -PT:4/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerPhases$ BeginCombat->EndCombat | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield during combat, put four 1/1 green Hound creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | ActivatingPhases$ BeginCombat->EndCombat | TokenAmount$ 4 | TokenName$ Hound | TokenTypes$ Creature,Hound | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mongrel_pack.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monk_idealist.txt b/res/cardsfolder/monk_idealist.txt deleted file mode 100644 index 13a53daa86b..00000000000 --- a/res/cardsfolder/monk_idealist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Monk Idealist -ManaCost:2 W -Types:Creature Human Monk Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target enchantment card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Enchantment.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/monk_idealist.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monk_realist.txt b/res/cardsfolder/monk_realist.txt deleted file mode 100644 index fd55600ef70..00000000000 --- a/res/cardsfolder/monk_realist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Monk Realist -ManaCost:1 W -Types:Creature Human Monk Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/monk_realist.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monss_goblin_raiders.txt b/res/cardsfolder/monss_goblin_raiders.txt deleted file mode 100644 index 22cb25f07d8..00000000000 --- a/res/cardsfolder/monss_goblin_raiders.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mons's Goblin Raiders -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p4/en-us/card25491.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/165.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/166.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/251.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/231.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/166.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monstrify.txt b/res/cardsfolder/monstrify.txt deleted file mode 100644 index 12edebf8ec8..00000000000 --- a/res/cardsfolder/monstrify.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Monstrify -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. | TgtPrompt$ Select target creature. -A:SP$ Pump | Cost$ 3 G Discard<1/Land> | ActivatingZone$ Graveyard | PrecostDesc$ Retrace - | ValidTgts$ Creature | TgtPrompt$ Select target creature. | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. You may play this card from your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrify.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monstrous_carabid.txt b/res/cardsfolder/monstrous_carabid.txt deleted file mode 100644 index e3fa26b9e3b..00000000000 --- a/res/cardsfolder/monstrous_carabid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Monstrous Carabid -ManaCost:3 B R -Types:Creature Insect -Text:no text -PT:4/4 -K:CARDNAME attacks each turn if able. -K:Cycling:BR -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_carabid.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monstrous_growth.txt b/res/cardsfolder/monstrous_growth.txt deleted file mode 100644 index 9f342a4baec..00000000000 --- a/res/cardsfolder/monstrous_growth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Monstrous Growth -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_growth.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/266.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/73.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/132.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/98.jpg|2 -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/monstrous_hound.txt b/res/cardsfolder/monstrous_hound.txt deleted file mode 100644 index 6f1beeda617..00000000000 --- a/res/cardsfolder/monstrous_hound.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Monstrous Hound -ManaCost:3 R -Types:Creature Hound -Text:no text -PT:4/4 -K:stPumpSelf:Creature:0/0/CARDNAME can't attack. & CARDNAME can't block.:OppCtrlMoreLands:CARDNAME can't attack unless you control more lands than defending player. CARDNAME can't block unless you control more lands than attacking player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/monstrous_hound.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moon_sprite.txt b/res/cardsfolder/moon_sprite.txt deleted file mode 100644 index d7615aa0d62..00000000000 --- a/res/cardsfolder/moon_sprite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moon Sprite -ManaCost:1 G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20229.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/133.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moonglove_changeling.txt b/res/cardsfolder/moonglove_changeling.txt deleted file mode 100644 index 991fa19f45e..00000000000 --- a/res/cardsfolder/moonglove_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moonglove Changeling -ManaCost:2 B -Types:Creature Shapeshifter -Text:no text -PT:2/2 -K:Changeling -A:AB$ Pump | Cost$ B | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonglove_changeling.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/67.jpg -End diff --git a/res/cardsfolder/moonglove_extract.txt b/res/cardsfolder/moonglove_extract.txt deleted file mode 100644 index d4635c03e2c..00000000000 --- a/res/cardsfolder/moonglove_extract.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Moonglove Extract -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonglove_extract.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moonglove_winnower.txt b/res/cardsfolder/moonglove_winnower.txt deleted file mode 100644 index 24470ee9ebc..00000000000 --- a/res/cardsfolder/moonglove_winnower.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moonglove Winnower -ManaCost:3 B -Types:Creature Elf Rogue -Text:no text -PT:2/3 -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonglove_winnower.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moonlit_strider.txt b/res/cardsfolder/moonlit_strider.txt deleted file mode 100644 index 296582ac110..00000000000 --- a/res/cardsfolder/moonlit_strider.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Moonlit Strider -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:1/4 -K:Soulshift:3 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from white | SpellDescription$ Target creature you control gains protection from white until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from blue | SpellDescription$ Target creature you control gains protection from blue until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from black | SpellDescription$ Target creature you control gains protection from black until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from red | SpellDescription$ Target creature you control gains protection from red until end of turn. -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Protection from green | SpellDescription$ Target creature you control gains protection from green until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlit_strider.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moonlit_wake.txt b/res/cardsfolder/moonlit_wake.txt deleted file mode 100644 index 4d63d93cb8d..00000000000 --- a/res/cardsfolder/moonlit_wake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moonlit Wake -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigGain | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, you gain 1 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlit_wake.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moonwing_moth.txt b/res/cardsfolder/moonwing_moth.txt deleted file mode 100644 index 118b8de040d..00000000000 --- a/res/cardsfolder/moonwing_moth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moonwing Moth -ManaCost:1 W W -Types:Creature Insect -Text:no text -PT:2/1 -K:Flying -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moonwing_moth.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/20.jpg -End diff --git a/res/cardsfolder/moor_fiend.txt b/res/cardsfolder/moor_fiend.txt deleted file mode 100644 index 4933c16a4f4..00000000000 --- a/res/cardsfolder/moor_fiend.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moor Fiend -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2477.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moorish_cavalry.txt b/res/cardsfolder/moorish_cavalry.txt deleted file mode 100644 index 1178398e91d..00000000000 --- a/res/cardsfolder/moorish_cavalry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moorish Cavalry -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108849.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/11.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/62.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/morale.txt b/res/cardsfolder/morale.txt deleted file mode 100644 index 19fad1dd0f9..00000000000 --- a/res/cardsfolder/morale.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Morale -ManaCost:1 W W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.attacking | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Attacking creatures get +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morale.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/87.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morbid_bloom.txt b/res/cardsfolder/morbid_bloom.txt deleted file mode 100644 index f74940585af..00000000000 --- a/res/cardsfolder/morbid_bloom.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Morbid Bloom -ManaCost:4 B G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 B G | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature | SubAbility$ SVar=DBToken | SpellDescription$ 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. -SVar:DBToken:DB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Targeted$CardToughness -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/morbid_bloom.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morbid_hunger.txt b/res/cardsfolder/morbid_hunger.txt deleted file mode 100644 index 39bd4a8434a..00000000000 --- a/res/cardsfolder/morbid_hunger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Morbid Hunger -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 B B | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 3 damage to target creature or player. You gain 3 life. -A:SP$ DealDamage | Cost$ 7 B B | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DB | Flashback$ True | CostDesc$ Flashback 7 B B | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:DB:DB$GainLife | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morbid_hunger.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morbid_plunder.txt b/res/cardsfolder/morbid_plunder.txt deleted file mode 100644 index 831c99b1ac0..00000000000 --- a/res/cardsfolder/morbid_plunder.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Morbid Plunder -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SpellDescription$ Return up to two target creature cards from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morbid_plunder.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mordant_dragon.txt b/res/cardsfolder/mordant_dragon.txt deleted file mode 100644 index 0f0ae85ed81..00000000000 --- a/res/cardsfolder/mordant_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mordant Dragon -ManaCost:3 R R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have it deal that much damage to target creature that player controls. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.YouDontCtrl | NumDmg$ X | TgtPrompt$ Select target creature. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mordant_dragon.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morgue_theft.txt b/res/cardsfolder/morgue_theft.txt deleted file mode 100644 index 66eb2b41b45..00000000000 --- a/res/cardsfolder/morgue_theft.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Morgue Theft -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature.YouCtrl | Flashback$ True | CostDesc$ Flashback 4 B | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morgue_theft.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morgue_thrull.txt b/res/cardsfolder/morgue_thrull.txt deleted file mode 100644 index ba1a3ea7d80..00000000000 --- a/res/cardsfolder/morgue_thrull.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Morgue Thrull -ManaCost:2 B -Types:Creature Thrull -Text:no text -PT:2/2 -A:AB$ Mill | Cost$ Sac<1/CARDNAME> | Defined$ You | NumCards$ 3 | SpellDescription$ Put the top three cards of your library into your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morgue_thrull.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morgue_toad.txt b/res/cardsfolder/morgue_toad.txt deleted file mode 100644 index 538780cccfb..00000000000 --- a/res/cardsfolder/morgue_toad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Morgue Toad -ManaCost:2 B -Types:Creature Frog -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ U R | SpellDescription$ Add U R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morgue_toad.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moriok_reaver.txt b/res/cardsfolder/moriok_reaver.txt deleted file mode 100644 index f33a3003f94..00000000000 --- a/res/cardsfolder/moriok_reaver.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Moriok Reaver -ManaCost:2 B -Types:Creature Human Warrior -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moriok_reaver.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moriok_replica.txt b/res/cardsfolder/moriok_replica.txt deleted file mode 100644 index def9edf3248..00000000000 --- a/res/cardsfolder/moriok_replica.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Moriok Replica -ManaCost:3 -Types:Artifact Creature Warrior -Text:no text -PT:2/2 -A:AB$ Draw | Cost$ 1 B Sac<1/CARDNAME> | NumCards$ 2 | SubAbility$ SVar=DBLoseLife | SpellDescription$ You draw two cards and lose 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moriok_replica.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moriok_rigger.txt b/res/cardsfolder/moriok_rigger.txt deleted file mode 100644 index 5d24355fb76..00000000000 --- a/res/cardsfolder/moriok_rigger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moriok Rigger -ManaCost:2 B -Types:Creature Human Rogue Rigger -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/moriok_rigger.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moriok_scavenger.txt b/res/cardsfolder/moriok_scavenger.txt deleted file mode 100644 index c2e0d8211ec..00000000000 --- a/res/cardsfolder/moriok_scavenger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Moriok Scavenger -ManaCost:3 B -Types:Creature Human Rogue -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target artifact creature card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Creature+YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/moriok_scavenger.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morningtide.txt b/res/cardsfolder/morningtide.txt deleted file mode 100644 index 3d3c9e54c81..00000000000 --- a/res/cardsfolder/morningtide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Morningtide -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 1 W | ChangeType$ Card | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all cards from all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/morningtide.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moroii.txt b/res/cardsfolder/moroii.txt deleted file mode 100644 index 4f8eee620ac..00000000000 --- a/res/cardsfolder/moroii.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Moroii -ManaCost:2 U B -Types:Creature Vampire -Text:no text -PT:4/4 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/moroii.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/morphling.txt b/res/cardsfolder/morphling.txt deleted file mode 100644 index da893b52355..00000000000 --- a/res/cardsfolder/morphling.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Morphling -ManaCost:3 U U -Types:Creature Shapeshifter -Text:no text -PT:3/3 -A:AB$ Untap | Cost$ U | SpellDescription$ Untap CARDNAME. -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ Morphling gains flying until end of turn. -A:AB$ Pump | Cost$ U | KW$ Shroud | SpellDescription$ Morphling gains shroud until end of turn. -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ Morphling gets +1/-1 until end of turn. -A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ Morphling gets -1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/morphling.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/85.jpg -End diff --git a/res/cardsfolder/morsel_theft.txt b/res/cardsfolder/morsel_theft.txt deleted file mode 100644 index 158543d1724..00000000000 --- a/res/cardsfolder/morsel_theft.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Morsel Theft -ManaCost:2 B B -Types:Tribal Sorcery Rogue -Text:(NOTE: "Prowl" is not implemented.) -A:SP$ LoseLife | Cost$ 2 B B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 3 life and you gain 3 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morsel_theft.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/68.jpg -End diff --git a/res/cardsfolder/morselhoarder.txt b/res/cardsfolder/morselhoarder.txt deleted file mode 100644 index 9deb0a82832..00000000000 --- a/res/cardsfolder/morselhoarder.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Morselhoarder -ManaCost:4 RG RG -Types:Creature Elemental -Text:Remove a -1/-1 counter from Morselhoarder: Add one mana of any color to your mana pool. -PT:6/4 -K:etbCounter:M1M1:2 -A:AB$ Mana | Cost$ SubCounter<1/M1M1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/M1M1> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/M1M1> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/M1M1> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/M1M1> | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/morselhoarder.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortal_combat.txt b/res/cardsfolder/mortal_combat.txt deleted file mode 100644 index 945492d22ca..00000000000 --- a/res/cardsfolder/mortal_combat.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mortal Combat -ManaCost:2 B B -Types:Enchantment -Text:At the beginning of your upkeep, if twenty or more creature cards are in your graveyard, you win the game. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortal_combat.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/71.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortal_wound.txt b/res/cardsfolder/mortal_wound.txt deleted file mode 100644 index 4d756ffb857..00000000000 --- a/res/cardsfolder/mortal_wound.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mortal Wound -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN When CARDNAME is dealt damage, destroy it.:When enchanted creature is dealt damage, destroy it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortal_wound.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortarpod.txt b/res/cardsfolder/mortarpod.txt deleted file mode 100644 index 97a97a4e4bc..00000000000 --- a/res/cardsfolder/mortarpod.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mortarpod -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 2:0/1 -K:stPumpEquipped:Creature:0/0/SVar=Damage:no condition:Equipped creature gets +0/+1 and has "Sacrifice this creature: This creature deals 1 damage to target creature or player." -K:Living Weapon -SVar:Damage:AB$DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortarpod.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortician_beetle.txt b/res/cardsfolder/mortician_beetle.txt deleted file mode 100644 index a101c9bf602..00000000000 --- a/res/cardsfolder/mortician_beetle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mortician Beetle -ManaCost:B -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ Sacrificed | ValidCard$ Creature | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player sacrifices a creature, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortician_beetle.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortify.txt b/res/cardsfolder/mortify.txt deleted file mode 100644 index 3b36b2974f0..00000000000 --- a/res/cardsfolder/mortify.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mortify -ManaCost:1 W B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W B | ValidTgts$ Creature,Enchantment | TgtPrompt$ Select target creature or enchantment | SpellDescription$ Destroy target creature or enchantment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortify.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/122.jpg -End diff --git a/res/cardsfolder/mortipede.txt b/res/cardsfolder/mortipede.txt deleted file mode 100644 index 1626c4795c2..00000000000 --- a/res/cardsfolder/mortipede.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mortipede -ManaCost:3 B -Types:Creature Insect -Text:no text -PT:4/1 -A:AB$ Pump | Cost$ 2 G | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block CARDNAME this turn do so. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortipede.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortiphobia.txt b/res/cardsfolder/mortiphobia.txt deleted file mode 100644 index efac4b17c43..00000000000 --- a/res/cardsfolder/mortiphobia.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mortiphobia -ManaCost:1 B B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 B Discard<1/Card> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -A:AB$ ChangeZone | Cost$ 1 B Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Mortiphobia.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortis_dogs.txt b/res/cardsfolder/mortis_dogs.txt deleted file mode 100644 index 24ac695e055..00000000000 --- a/res/cardsfolder/mortis_dogs.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mortis Dogs -ManaCost:3 B -Types:Creature Hound -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target player loses life equal to its power. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortis_dogs.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortivore.txt b/res/cardsfolder/mortivore.txt deleted file mode 100644 index 679a65705d9..00000000000 --- a/res/cardsfolder/mortivore.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mortivore -ManaCost:2 B B -Types:Creature Lhurgoyf -Text:no text -PT:*/* -K:stSetPT:Count$TypeInAllYards.Creature:Count$TypeInAllYards.Creature:CARDNAME's power and toughness are each equal to the number of creature cards in all graveyards. -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortivore.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/152.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/147.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mortuary.txt b/res/cardsfolder/mortuary.txt deleted file mode 100644 index 9527fca7428..00000000000 --- a/res/cardsfolder/mortuary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mortuary -ManaCost:3 B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouOwn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a creature is put into your graveyard from the battlefield, put that card on top of your library. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | LibraryPosition$ 0 | Destination$ Library -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mortuary.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mosquito_guard.txt b/res/cardsfolder/mosquito_guard.txt deleted file mode 100644 index 56268ce33c2..00000000000 --- a/res/cardsfolder/mosquito_guard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mosquito Guard -ManaCost:W -Types:Creature Kithkin Soldier -Text:no text -K:First Strike -A:AB$ PutCounter | Cost$ 1 W Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | ActivatingZone$ Hand | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -PT:1/1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mosquito_guard.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moss_diamond.txt b/res/cardsfolder/moss_diamond.txt deleted file mode 100644 index ea7bc9cf4f9..00000000000 --- a/res/cardsfolder/moss_diamond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Moss Diamond -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/moss_diamond.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/300.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/277.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/309.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moss_kami.txt b/res/cardsfolder/moss_kami.txt deleted file mode 100644 index 10e76b633e2..00000000000 --- a/res/cardsfolder/moss_kami.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moss Kami -ManaCost:5 G -Types:Creature Spirit -Text:no text -PT:5/5 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card76641.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/moss_monster.txt b/res/cardsfolder/moss_monster.txt deleted file mode 100644 index 56d3f9385ae..00000000000 --- a/res/cardsfolder/moss_monster.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Moss Monster -ManaCost:3 G G -Types:Creature Elemental -Text:no text -PT:3/6 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45411.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/267.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mossdog.txt b/res/cardsfolder/mossdog.txt deleted file mode 100644 index 8e1355ed351..00000000000 --- a/res/cardsfolder/mossdog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mossdog -ManaCost:G -Types:Creature Plant Hound -Text:no text -PT:1/1 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability an opponent controls, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterNum$ 1 | CounterType$ P1P1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mossdog.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mossfire_egg.txt b/res/cardsfolder/mossfire_egg.txt deleted file mode 100644 index 07365eb41a6..00000000000 --- a/res/cardsfolder/mossfire_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mossfire Egg -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ R G | SubAbility$ SVar=DBDraw | SpellDescription$ Add R G to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mossfire_egg.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mossfire_valley.txt b/res/cardsfolder/mossfire_valley.txt deleted file mode 100644 index 07c6e909790..00000000000 --- a/res/cardsfolder/mossfire_valley.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mossfire Valley -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ R G | SpellDescription$ Add R G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mossfire_valley.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mosstodon.txt b/res/cardsfolder/mosstodon.txt deleted file mode 100644 index faca6b6d87b..00000000000 --- a/res/cardsfolder/mosstodon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mosstodon -ManaCost:4 G -Types:Creature Plant Elephant -Text:no text -PT:5/3 -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ Trample | SpellDescription$ Target creature with power 5 or greater gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mosstodon.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/139.jpg -End diff --git a/res/cardsfolder/mother_of_runes.txt b/res/cardsfolder/mother_of_runes.txt deleted file mode 100644 index 7a423dc7cdb..00000000000 --- a/res/cardsfolder/mother_of_runes.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mother of Runes -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature you control gains protection from white until end of turn. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from black | SpellDescription$ Target creature you control gains protection from black until end of turn. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from blue | SpellDescription$ Target creature you control gains protection from blue until end of turn. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from red | SpellDescription$ Target creature you control gains protection from red until end of turn. -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from green | SpellDescription$ Target creature you control gains protection from green until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mother_of_runes.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/14.jpg -End diff --git a/res/cardsfolder/mothrider_samurai.txt b/res/cardsfolder/mothrider_samurai.txt deleted file mode 100644 index d95d505b454..00000000000 --- a/res/cardsfolder/mothrider_samurai.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mothrider Samurai -ManaCost:3 W -Types:Creature Human Samurai -Text:no text -PT:2/2 -K:Flying -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mothrider_samurai.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mountain.txt b/res/cardsfolder/mountain.txt deleted file mode 100644 index 897a3925e24..00000000000 --- a/res/cardsfolder/mountain.txt +++ /dev/null @@ -1,45 +0,0 @@ -Name:Mountain -ManaCost:no cost -Types:Basic Land Mountain -Text:no text -SVar:PicCount:4 -SVar:Rarity:Land -SVar:Picture:http://resources.wizards.com/magic/cards/unh/en-us/card73958.jpg\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159286\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159285\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159284 -SetInfo:USG|Land|http://magiccards.info/scans/en/us/343.jpg|4 -SetInfo:TMP|Land|http://magiccards.info/scans/en/tp/319.jpg|4 -SetInfo:ZEN|Land|http://magiccards.info/scans/en/zen/242.jpg|4 -SetInfo:4ED|Land|http://magiccards.info/scans/en/4e/182.jpg|3 -SetInfo:3ED|Land|http://magiccards.info/scans/en/rv/290.jpg|3 -SetInfo:SOM|Land|http://magiccards.info/scans/en/som/242.jpg|4 -SetInfo:TSP|Land|http://magiccards.info/scans/en/ts/294.jpg|4 -SetInfo:ODY|Land|http://magiccards.info/scans/en/od/343.jpg|4 -SetInfo:MIR|Land|http://magiccards.info/scans/en/mr/301.jpg|4 -SetInfo:PTK|Land|http://magiccards.info/scans/en/p3k/175.jpg|3 -SetInfo:7ED|Land|http://magiccards.info/scans/en/7e/337.jpg|4 -SetInfo:POR|Land|http://magiccards.info/scans/en/po/211.jpg|4 -SetInfo:ROE|Land|http://magiccards.info/scans/en/roe/241.jpg|4 -SetInfo:10E|Land|http://magiccards.info/scans/en/10e/376.jpg|4 -SetInfo:RAV|Land|http://magiccards.info/scans/en/rav/299.jpg|4 -SetInfo:6ED|Land|http://magiccards.info/scans/en/6e/343.jpg|4 -SetInfo:5ED|Land|http://magiccards.info/scans/en/5e/430.jpg|4 -SetInfo:ONS|Land|http://magiccards.info/scans/en/on/343.jpg|4 -SetInfo:S99|Land|http://magiccards.info/scans/en/st/166.jpg|4 -SetInfo:MBS|Land|http://magiccards.info/scans/en/mbs/152.jpg|2 -SetInfo:8ED|Land|http://magiccards.info/scans/en/8e/343.jpg|4 -SetInfo:CHK|Land|http://magiccards.info/scans/en/chk/299.jpg|4 -SetInfo:PO2|Land|http://magiccards.info/scans/en/po2/157.jpg|3 -SetInfo:9ED|Land|http://magiccards.info/scans/en/9e/343.jpg|4 -SetInfo:ICE|Land|http://magiccards.info/scans/en/ia/340.jpg|3 -SetInfo:MRD|Land|http://magiccards.info/scans/en/mi/299.jpg|4 -SetInfo:SHM|Land|http://magiccards.info/scans/en/shm/294.jpg|4 -SetInfo:LEA|Land|http://magiccards.info/scans/en/al/283.jpg|2 -SetInfo:LEB|Land|http://magiccards.info/scans/en/be/286.jpg|3 -SetInfo:INV|Land|http://magiccards.info/scans/en/in/343.jpg|4 -SetInfo:MMQ|Land|http://magiccards.info/scans/en/mm/343.jpg|4 -SetInfo:ALA|Land|http://magiccards.info/scans/en/ala/242.jpg|4 -SetInfo:M11|Land|http://magiccards.info/scans/en/m11/242.jpg|4 -SetInfo:M10|Land|http://magiccards.info/scans/en/m10/242.jpg|4 -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/91.jpg -SetInfo:LRW|Land|http://magiccards.info/scans/en/lw/294.jpg|4 -SetInfo:2ED|Land|http://magiccards.info/scans/en/un/286.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/mountain_bandit.txt b/res/cardsfolder/mountain_bandit.txt deleted file mode 100644 index f4744aed205..00000000000 --- a/res/cardsfolder/mountain_bandit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mountain Bandit -ManaCost:R -Types:Creature Human Soldier Rogue -Text:no text -PT:1/1 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Three_Kingdoms/mountain_bandit.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mountain_goat.txt b/res/cardsfolder/mountain_goat.txt deleted file mode 100644 index 802086bb0aa..00000000000 --- a/res/cardsfolder/mountain_goat.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mountain Goat -ManaCost:R -Types:Creature Goat -Text:no text -PT:1/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card16442.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/252.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/195.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/146.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mountain_valley.txt b/res/cardsfolder/mountain_valley.txt deleted file mode 100644 index e8a4ab69de7..00000000000 --- a/res/cardsfolder/mountain_valley.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mountain Valley -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Mountain,Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Mountain or Forest card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mountain_valley.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mountain_yeti.txt b/res/cardsfolder/mountain_yeti.txt deleted file mode 100644 index a284ca005d5..00000000000 --- a/res/cardsfolder/mountain_yeti.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mountain Yeti -ManaCost:2 R R -Types:Creature Yeti -Text:no text -PT:3/3 -K:Mountainwalk -K:Protection from white -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mountain_yeti.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mournful_zombie.txt b/res/cardsfolder/mournful_zombie.txt deleted file mode 100644 index 008a892dc4f..00000000000 --- a/res/cardsfolder/mournful_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mournful Zombie -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/1 -A:AB$ GainLife | Cost$ W T | LifeAmount$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player to gain 1 life | SpellDescription$ Target player gains 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mournful_zombie.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/43.jpg -End diff --git a/res/cardsfolder/mourning.txt b/res/cardsfolder/mourning.txt deleted file mode 100644 index b2c27a708c9..00000000000 --- a/res/cardsfolder/mourning.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mourning -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-2/-0 -A:AB$ ChangeZone | Cost$ B | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mourning.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mourning_thrull.txt b/res/cardsfolder/mourning_thrull.txt deleted file mode 100644 index cd40971b681..00000000000 --- a/res/cardsfolder/mourning_thrull.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mourning Thrull -ManaCost:1 WB -Types:Creature Thrull -Text:no text -PT:1/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mourning_thrull.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mournwhelk.txt b/res/cardsfolder/mournwhelk.txt deleted file mode 100644 index a6cdc2ef724..00000000000 --- a/res/cardsfolder/mournwhelk.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mournwhelk -ManaCost:6 B -Types:Creature Elemental -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ TgtChoose -K:Evoke:3 B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mournwhelk.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mouth_of_ronom.txt b/res/cardsfolder/mouth_of_ronom.txt deleted file mode 100644 index 3a17d4f64ad..00000000000 --- a/res/cardsfolder/mouth_of_ronom.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mouth of Ronom -ManaCost:no cost -Types:Snow Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ DealDamage | Cost$ 4 S T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mouth_of_ronom.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_diamond.txt b/res/cardsfolder/mox_diamond.txt deleted file mode 100644 index 7d1a639d67f..00000000000 --- a/res/cardsfolder/mox_diamond.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mox Diamond -ManaCost:0 -Types:Artifact -Text:If CARDNAME would enter the battlefield, you may discard a land card instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mox_diamond.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_emerald.txt b/res/cardsfolder/mox_emerald.txt deleted file mode 100644 index a9a963807ba..00000000000 --- a/res/cardsfolder/mox_emerald.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mox Emerald -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card629.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/261.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/263.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_jet.txt b/res/cardsfolder/mox_jet.txt deleted file mode 100644 index 5b8c3176953..00000000000 --- a/res/cardsfolder/mox_jet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mox Jet -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card630.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/262.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/264.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_opal.txt b/res/cardsfolder/mox_opal.txt deleted file mode 100644 index ddf2eeb7a2c..00000000000 --- a/res/cardsfolder/mox_opal.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mox Opal -ManaCost:0 -Types:Legendary Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Add W to your mana pool. Activate this ability only if you control three or more artifacts. -A:AB$ Mana | Cost$ T | Produced$ U | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Add U to your mana pool. Activate this ability only if you control three or more artifacts. -A:AB$ Mana | Cost$ T | Produced$ B | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Add B to your mana pool. Activate this ability only if you control three or more artifacts. -A:AB$ Mana | Cost$ T | Produced$ R | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Add R to your mana pool. Activate this ability only if you control three or more artifacts. -A:AB$ Mana | Cost$ T | Produced$ G | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Add G to your mana pool. Activate this ability only if you control three or more artifacts. -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/mox_opal.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_pearl.txt b/res/cardsfolder/mox_pearl.txt deleted file mode 100644 index 5118f3d26ef..00000000000 --- a/res/cardsfolder/mox_pearl.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mox Pearl -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card631.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/263.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/265.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_ruby.txt b/res/cardsfolder/mox_ruby.txt deleted file mode 100644 index d777d6c3519..00000000000 --- a/res/cardsfolder/mox_ruby.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mox Ruby -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card632.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/264.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/266.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mox_sapphire.txt b/res/cardsfolder/mox_sapphire.txt deleted file mode 100644 index 443b5cebebf..00000000000 --- a/res/cardsfolder/mox_sapphire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mox Sapphire -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/2u/en-us/card633.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/265.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/267.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mtenda_griffin.txt b/res/cardsfolder/mtenda_griffin.txt deleted file mode 100644 index 503e0ee4f6f..00000000000 --- a/res/cardsfolder/mtenda_griffin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mtenda Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -A:AB$ ChangeZone | Cost$ W T | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBBounce | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME to its owner's hand and return target Griffin card from your graveyard to your hand. Activate this ability only during your upkeep. -SVar:DBBounce:DB$ChangeZone | ValidTgts$ Griffin.YouCtrl | TgtPrompt$ Select target Griffin from your graveyard | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mtenda_griffin.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mtenda_herder.txt b/res/cardsfolder/mtenda_herder.txt deleted file mode 100644 index 4ba9bf59144..00000000000 --- a/res/cardsfolder/mtenda_herder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mtenda Herder -ManaCost:W -Types:Creature Human Scout -Text:no text -PT:1/1 -K:Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mtenda_herder.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/muck_rats.txt b/res/cardsfolder/muck_rats.txt deleted file mode 100644 index c8c6fd94901..00000000000 --- a/res/cardsfolder/muck_rats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Muck Rats -ManaCost:B -Types:Creature Rat -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20375.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/20.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/84.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mudbrawler_cohort.txt b/res/cardsfolder/mudbrawler_cohort.txt deleted file mode 100644 index 241c391749c..00000000000 --- a/res/cardsfolder/mudbrawler_cohort.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mudbrawler Cohort -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Haste -K:stPumpSelf:Creature:1/1:isPresent Creature.Red+Other+YouCtrl:CARDNAME gets +1/+1 as long as you control another red creature. -SVar:BuffedBy:Creature.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbrawler_cohort.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mudbrawler_raiders.txt b/res/cardsfolder/mudbrawler_raiders.txt deleted file mode 100644 index 221041b3c75..00000000000 --- a/res/cardsfolder/mudbrawler_raiders.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mudbrawler Raiders -ManaCost:2 RG RG -Types:Creature Goblin Warrior -Text:CARDNAME can't be blocked by blue creatures. -PT:3/3 -K:CantBeBlockedBy Creature.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbrawler_raiders.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mudbutton_clanger.txt b/res/cardsfolder/mudbutton_clanger.txt deleted file mode 100644 index 559169ce592..00000000000 --- a/res/cardsfolder/mudbutton_clanger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mudbutton Clanger -ManaCost:R -Types:Creature Goblin Warrior -Text: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. -PT:1/1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbutton_clanger.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mudbutton_torchrunner.txt b/res/cardsfolder/mudbutton_torchrunner.txt deleted file mode 100644 index 32ea8db1828..00000000000 --- a/res/cardsfolder/mudbutton_torchrunner.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mudbutton Torchrunner -ManaCost:2 R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals 3 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbutton_torchrunner.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/muddle_the_mixture.txt b/res/cardsfolder/muddle_the_mixture.txt deleted file mode 100644 index c26b536aa6d..00000000000 --- a/res/cardsfolder/muddle_the_mixture.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Muddle the Mixture -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target Instant or Sorcery spell | ValidTgts$ Instant,Sorcery | SpellDescription$ Counter target instant or sorcery spell. -K:Transmute:1 U U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/muddle_the_mixture.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mul_daya_channelers.txt b/res/cardsfolder/mul_daya_channelers.txt deleted file mode 100644 index 0fb9168a828..00000000000 --- a/res/cardsfolder/mul_daya_channelers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mul Daya Channelers -ManaCost:1 G G -Types:Creature Elf Druid Shaman -Text:As long as the top card of your library is a creature card, Mul Daya Channelers gets +3/+3.\r\nAs long as the top card of your library is a land card, Mul Daya Channelers has "tap: Add two mana of any one color to your mana pool." -PT:2/2 -K:Play with the top card of your library revealed. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mul_daya_channelers.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mulch.txt b/res/cardsfolder/mulch.txt deleted file mode 100644 index e9748bba2ea..00000000000 --- a/res/cardsfolder/mulch.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mulch -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 1 G | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top four cards of your library. Put all land cards revealed this way into your hand and the rest into your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mulch.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mulldrifter.txt b/res/cardsfolder/mulldrifter.txt deleted file mode 100644 index 34efc2de9cf..00000000000 --- a/res/cardsfolder/mulldrifter.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Mulldrifter -ManaCost:4 U -Types:Creature Elemental -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw two cards. -K:Evoke:2 U -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mulldrifter.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/multani_maro_sorcerer.txt b/res/cardsfolder/multani_maro_sorcerer.txt deleted file mode 100644 index 05949f7d978..00000000000 --- a/res/cardsfolder/multani_maro_sorcerer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Multani, Maro-Sorcerer -ManaCost:4 G G -Types:Legendary Creature Elemental -Text:no text -PT:*/* -K:Shroud -K:stSetPT:Count$NumInAllHands:Count$NumInAllHands:CARDNAME's power and toughness are each equal to the total number of cards in all players' hands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/multani_maro_sorcerer.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/multanis_acolyte.txt b/res/cardsfolder/multanis_acolyte.txt deleted file mode 100644 index da28d3dec81..00000000000 --- a/res/cardsfolder/multanis_acolyte.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Multani's Acolyte -ManaCost:G G -Types:Creature Elf -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:Echo:G G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/multanis_acolyte.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/multanis_decree.txt b/res/cardsfolder/multanis_decree.txt deleted file mode 100644 index b09ca44b0af..00000000000 --- a/res/cardsfolder/multanis_decree.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Multani's Decree -ManaCost:3 G -Types:Sorcery -A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Enchantment | RememberDestroyed$ True | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy all enchantments. You gain 2 life for each enchantment destroyed this way. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Remembered$Amount.Twice -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/multanis_decree.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mungha_wurm.txt b/res/cardsfolder/mungha_wurm.txt deleted file mode 100644 index c0ed1e95191..00000000000 --- a/res/cardsfolder/mungha_wurm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mungha Wurm -ManaCost:2 G G -Types:Creature Wurm -Text:You can't untap more than one land during your untap step. -PT:6/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mungha_wurm.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/muraganda_petroglyphs.txt b/res/cardsfolder/muraganda_petroglyphs.txt deleted file mode 100644 index 2dc0ea9c4b6..00000000000 --- a/res/cardsfolder/muraganda_petroglyphs.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Muraganda Petroglyphs -ManaCost:3 G -Types:Enchantment -Text:Creatures with no abilities get +2/+2. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/muraganda_petroglyphs.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/murasa_pyromancer.txt b/res/cardsfolder/murasa_pyromancer.txt deleted file mode 100644 index 79c48b4ed1e..00000000000 --- a/res/cardsfolder/murasa_pyromancer.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Murasa Pyromancer -ManaCost:4 R R -Types:Creature Human Shaman Ally -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have CARDNAME deal damage to target creature equal to the number of Allies you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have CARDNAME deal damage to target creature equal to the number of Allies you control. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ NumAllies -SVar:NumAllies:Count$Valid Ally.YouCtrl -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/murasa_pyromancer.jpg -SVar:Rarity:Uncommon -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/murderous_redcap.txt b/res/cardsfolder/murderous_redcap.txt deleted file mode 100644 index 9f34e4222aa..00000000000 --- a/res/cardsfolder/murderous_redcap.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Murderous Redcap -ManaCost:2 BR BR -Types:Creature Goblin Assassin -Text:no text -PT:2/2 -K:Persist -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to its power to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X -SVar:X:Count$CardPower -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/murderous_redcap.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/murk_dwellers.txt b/res/cardsfolder/murk_dwellers.txt deleted file mode 100644 index 5c13e28a5da..00000000000 --- a/res/cardsfolder/murk_dwellers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Murk Dwellers -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, it gets +2/+0 until end of combat. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ +2 | UntilEndOfCombat$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/murk_dwellers.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/42.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/11.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/murkfiend_liege.txt b/res/cardsfolder/murkfiend_liege.txt deleted file mode 100644 index 0bb765382db..00000000000 --- a/res/cardsfolder/murkfiend_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Murkfiend Liege -ManaCost:2 GU GU GU -Types:Creature Horror -Text:Untap all green and/or blue creatures you control during each other player's untap step. -PT:4/4 -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -K:stPumpAll:Creature.Blue+Other+YouCtrl:1/1:No Condition:Other blue creatures you control get +1/+1. -K:stPumpAll:Creature.Green+YouCtrl,Creature.Blue+YouCtrl:0/0/HIDDEN CARDNAME untaps during each other player's untap step.:No Condition:Untap all green and/or blue creatures you control during each other player's untap step. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/murkfiend_liege.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/murmuring_bosk.txt b/res/cardsfolder/murmuring_bosk.txt deleted file mode 100644 index 9579d1b6367..00000000000 --- a/res/cardsfolder/murmuring_bosk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Murmuring Bosk -ManaCost:no cost -Types:Land Forest -Text:As CARDNAME enters the battlefield, you may reveal a Treefolk card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/murmuring_bosk.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/muscle_burst.txt b/res/cardsfolder/muscle_burst.txt deleted file mode 100644 index ff040c05ffc..00000000000 --- a/res/cardsfolder/muscle_burst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Muscle Burst -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is 3 plus the number of cards named CARDNAME in all graveyards. -SVar:X:Count$NamedInAllYards.Muscle Burst/Plus.Y -SVar:Y:Count$NamedInAllYards.Diligent Farmhand/Plus.3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/muscle_burst.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/252.jpg -End diff --git a/res/cardsfolder/muscle_sliver.txt b/res/cardsfolder/muscle_sliver.txt deleted file mode 100644 index 7b01fc5417e..00000000000 --- a/res/cardsfolder/muscle_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Muscle Sliver -ManaCost:1 G -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:1/1:No Condition:All Sliver creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/muscle_sliver.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mutagenic_growth.txt b/res/cardsfolder/mutagenic_growth.txt deleted file mode 100644 index 07aafa3924f..00000000000 --- a/res/cardsfolder/mutagenic_growth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Mutagenic Growth -ManaCost:PG -Types:Instant -Text:no text -A:SP$ Pump | Cost$ PG | Tgt$ TgtC | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mutagenic_growth.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mutavault.txt b/res/cardsfolder/mutavault.txt deleted file mode 100644 index be757facafb..00000000000 --- a/res/cardsfolder/mutavault.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mutavault -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 1 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature | Keywords$ Changeling | SpellDescription$ CARDNAME becomes a 2/2 creature with all creature types until end of turn. It's still a land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mutavault.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mutilate.txt b/res/cardsfolder/mutilate.txt deleted file mode 100644 index fbce9362eb1..00000000000 --- a/res/cardsfolder/mutilate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mutilate -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 B B | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ All creatures get -1/-1 until end of turn for each Swamp you control. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mutilate.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/muzzle.txt b/res/cardsfolder/muzzle.txt deleted file mode 100644 index 5df1d443bdf..00000000000 --- a/res/cardsfolder/muzzle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Muzzle -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN Prevent all damage that would be dealt by CARDNAME.:Prevent all damage that would be dealt by enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/muzzle.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mwonvuli_acid_moss.txt b/res/cardsfolder/mwonvuli_acid_moss.txt deleted file mode 100644 index 2a54c614262..00000000000 --- a/res/cardsfolder/mwonvuli_acid_moss.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mwonvuli Acid-Moss -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBSearch | SpellDescription$ Destroy target land. Search your library for a Forest card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:DBSearch:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 1 | Tapped$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mwonvuli_acid_moss.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mwonvuli_ooze.txt b/res/cardsfolder/mwonvuli_ooze.txt deleted file mode 100644 index f28198757db..00000000000 --- a/res/cardsfolder/mwonvuli_ooze.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mwonvuli Ooze -ManaCost:G -Types:Creature Ooze -Text:no text -PT:1/1 -K:Cumulative upkeep:2 -K:stPumpSelf:Creature:X/X:No Condition:CARDNAME's power and toughness are each equal to 1 plus twice the number of age counters on it. -SVar:X:Count$CardCounters.AGE/Times.2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mwonvuli_ooze.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycoid_shepherd.txt b/res/cardsfolder/mycoid_shepherd.txt deleted file mode 100644 index 6faf9a31c12..00000000000 --- a/res/cardsfolder/mycoid_shepherd.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mycoid Shepherd -ManaCost:1 G G W -Types:Creature Fungus -Text:no text -PT:5/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME or another creature you control with power 5 or greater is put into a graveyard from the battlefield, you may gain 5 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+powerGE5+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | Secondary$ True | TriggerDescription$ When CARDNAME or another creature you control with power 5 or greater is put into a graveyard from the battlefield, you may gain 5 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycoid_shepherd.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycologist.txt b/res/cardsfolder/mycologist.txt deleted file mode 100644 index b017ce08bce..00000000000 --- a/res/cardsfolder/mycologist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mycologist -ManaCost:1 W -Types:Creature Human Druid -Text:no text -PT:0/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ GainLife | Cost$ Sac<1/Saproling> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycologist.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycoloth.txt b/res/cardsfolder/mycoloth.txt deleted file mode 100644 index ea5a91667c5..00000000000 --- a/res/cardsfolder/mycoloth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mycoloth -ManaCost:3 G G -Types:Creature Fungus -Text:no text -PT:4/4 -K:Devour:2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, put a 1/1 green Saproling creature token onto the battlefield for each +1/+1 counter on CARDNAME. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenColors$ Green -SVar:X:Count$NumCounters.P1P1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycoloth.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycosynth_fiend.txt b/res/cardsfolder/mycosynth_fiend.txt deleted file mode 100644 index f6158e448a3..00000000000 --- a/res/cardsfolder/mycosynth_fiend.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mycosynth Fiend -ManaCost:2 G -Types:Creature Horror -Text:no text -PT:2/2 -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +1/+1 for each poison counter your opponents have. -SVar:X:Count$OppPoisonCounters -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_fiend.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycosynth_golem.txt b/res/cardsfolder/mycosynth_golem.txt deleted file mode 100644 index 34d83b51ba5..00000000000 --- a/res/cardsfolder/mycosynth_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mycosynth Golem -ManaCost:11 -Types:Artifact Creature Golem -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.)\r\nArtifact creature spells you cast have affinity for artifacts. (They cost 1 less to cast for each artifact you control.) -PT:4/5 -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -K:CostChange:Player:Less:1:Spell:All:Artifact/Creature:Affinity/Artifact/All Conditions -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_golem.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mycosynth_wellspring.txt b/res/cardsfolder/mycosynth_wellspring.txt deleted file mode 100644 index 77d7930b6e1..00000000000 --- a/res/cardsfolder/mycosynth_wellspring.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mycosynth Wellspring -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:SacMe:5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mycosynth_wellspring.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_adapter.txt b/res/cardsfolder/myr_adapter.txt deleted file mode 100644 index 37f9ef13559..00000000000 --- a/res/cardsfolder/myr_adapter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Myr Adapter -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -K:stPumpSelf:Creature:X/X:no Condition:Myr Adapter gets +1/+1 for each Equipment attached to it. -SVar:X:Count$Valid Equipment.Attached -SVar:EquipMe:Multiple -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_adapter.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_enforcer.txt b/res/cardsfolder/myr_enforcer.txt deleted file mode 100644 index 19fbb706f18..00000000000 --- a/res/cardsfolder/myr_enforcer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Myr Enforcer -ManaCost:7 -Types:Artifact Creature Myr -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:4/4 -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_enforcer.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_galvanizer.txt b/res/cardsfolder/myr_galvanizer.txt deleted file mode 100644 index a5d7973aeba..00000000000 --- a/res/cardsfolder/myr_galvanizer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Myr Galvanizer -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:2/2 -K:stPumpAll:Creature.Myr+Other+YouCtrl:1/1:No Condition:Other Myr creatures you control get +1/+1. -A:AB$ UntapAll | Cost$ 1 T | ValidCards$ Myr.Other+YouCtrl | SpellDescription$ Untap each other Myr you control. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_galvanizer.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_landshaper.txt b/res/cardsfolder/myr_landshaper.txt deleted file mode 100644 index d9155bf625a..00000000000 --- a/res/cardsfolder/myr_landshaper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Myr Landshaper -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Artifact | SpellDescription$ Target land becomes an artifact in addition to its other types until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_landshaper.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_matrix.txt b/res/cardsfolder/myr_matrix.txt deleted file mode 100644 index d12b1f3186c..00000000000 --- a/res/cardsfolder/myr_matrix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Myr Matrix -ManaCost:5 -Types:Artifact -Text:no text -K:Indestructible -K:stPumpAll:Creature.Myr:1/1:No Condition:Myr creatures get +1/+1. -A:AB$ Token | Cost$ 5 | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 colorless Myr artifact creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_matrix.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_moonvessel.txt b/res/cardsfolder/myr_moonvessel.txt deleted file mode 100644 index b54ed82b4f3..00000000000 --- a/res/cardsfolder/myr_moonvessel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Myr Moonvessel -ManaCost:1 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigAddMana | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, add 1 to your mana pool. -SVar:TrigAddMana:AB$Mana | Cost$ 0 | Produced$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_moonvessel.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_propagator.txt b/res/cardsfolder/myr_propagator.txt deleted file mode 100644 index 8cb9e2c12f4..00000000000 --- a/res/cardsfolder/myr_propagator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Myr Propagator -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$CopyPermanent | Cost$ 3 T | Defined$ Self | SpellDescription$ Put a token that's a copy of CARDNAME onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_propagator.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_quadropod.txt b/res/cardsfolder/myr_quadropod.txt deleted file mode 100644 index 11b4d3887c5..00000000000 --- a/res/cardsfolder/myr_quadropod.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Myr Quadropod -ManaCost:4 -Types:Artifact Creature Myr -Text:no text -PT:1/4 -A:AB$ Pump | Cost$ 3 | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_quadropod.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_retriever.txt b/res/cardsfolder/myr_retriever.txt deleted file mode 100644 index 73da2aa8c9c..00000000000 --- a/res/cardsfolder/myr_retriever.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Myr Retriever -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return another target artifact card from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.Other+YouCtrl | Cost$ 0 -SVar:SacMe:1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_retriever.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_sire.txt b/res/cardsfolder/myr_sire.txt deleted file mode 100644 index d6d90de3403..00000000000 --- a/res/cardsfolder/myr_sire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Myr Sire -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 1/1 colorless Myr artifact creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_sire.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myr_turbine.txt b/res/cardsfolder/myr_turbine.txt deleted file mode 100644 index d966c0996a7..00000000000 --- a/res/cardsfolder/myr_turbine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Myr Turbine -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ T | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 colorless Myr artifact creature token onto the battlefield. -A:AB$ ChangeZone | Cost$ T tapXType<5/Myr> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Myr | ChangeNum$ 1 | SpellDescription$ Search your library for a Myr creature card, put it onto the battlefield, then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_turbine.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/myrsmith.txt b/res/cardsfolder/myrsmith.txt deleted file mode 100644 index 1c3b354daf4..00000000000 --- a/res/cardsfolder/myrsmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Myrsmith -ManaCost:1 W -Types:Creature Human Artificer -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 1 | TokenImage$ C 1 1 Myr | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/myrsmith.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_crusader.txt b/res/cardsfolder/mystic_crusader.txt deleted file mode 100644 index 025007c853b..00000000000 --- a/res/cardsfolder/mystic_crusader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mystic Crusader -ManaCost:1 W W -Types:Creature Human Nomad Mystic -Text:no text -PT:2/1 -K:Protection from black -K:Protection from red -K:stPumpSelf:Creature:1/1/Flying:Threshold:Threshold - As long as seven or more cards are in your graveyard, Mystic Crusader gets +1/+1 and has flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_crusader.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_denial.txt b/res/cardsfolder/mystic_denial.txt deleted file mode 100644 index eaae171c5b1..00000000000 --- a/res/cardsfolder/mystic_denial.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystic Denial -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target Creatire or Sorcery spell | ValidTgts$ Creature,Sorcery | SpellDescription$ Counter target creature or sorcery spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_denial.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/41.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/49.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_enforcer.txt b/res/cardsfolder/mystic_enforcer.txt deleted file mode 100644 index ba830ba3341..00000000000 --- a/res/cardsfolder/mystic_enforcer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Mystic Enforcer -ManaCost:2 G W -Types:Creature Human Nomad Mystic -Text:no text -PT:3/3 -K:Protection from black -K:stPumpSelf:Creature:3/3/Flying:Threshold:Threshold - As long as seven or more cards are in your graveyard, Mystic Enforcer gets +3/+3 and has flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_enforcer.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/290.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_familiar.txt b/res/cardsfolder/mystic_familiar.txt deleted file mode 100644 index 8250d39410f..00000000000 --- a/res/cardsfolder/mystic_familiar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystic Familiar -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -K:stPumpSelf:Creature:1/1/Protection from black:Threshold:Threshold - As long as seven or more cards are in your graveyard, Mystic Familiar gets +1/+1 and has protection from black. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_familiar.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_gate.txt b/res/cardsfolder/mystic_gate.txt deleted file mode 100644 index 5112f7b514c..00000000000 --- a/res/cardsfolder/mystic_gate.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Mystic Gate -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ WU T | Produced$ W | Amount$2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ WU T | Produced$ W U | SpellDescription$ Add W U to your mana pool. -A:AB$ Mana | Cost$ WU T | Produced$ U | Amount$2 | SpellDescription$ Add U U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_gate.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_melting.txt b/res/cardsfolder/mystic_melting.txt deleted file mode 100644 index d3bf3ab5250..00000000000 --- a/res/cardsfolder/mystic_melting.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mystic Melting -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_melting.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_penitent.txt b/res/cardsfolder/mystic_penitent.txt deleted file mode 100644 index 761a1028eef..00000000000 --- a/res/cardsfolder/mystic_penitent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystic Penitent -ManaCost:W -Types:Creature Human Nomad Mystic -Text:no text -PT:1/1 -K:Vigilance -K:stPumpSelf:Creature:1/1/Flying:Threshold:Threshold - As long as seven or more cards are in your graveyard, Mystic Penitent gets +1/+1 and has flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_penitent.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_restraints.txt b/res/cardsfolder/mystic_restraints.txt deleted file mode 100644 index 69ad020d6d1..00000000000 --- a/res/cardsfolder/mystic_restraints.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystic Restraints -ManaCost:2 U U -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Flash -K:Enchant creature -K:When CARDNAME enters the battlefield, tap enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_restraints.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_snake.txt b/res/cardsfolder/mystic_snake.txt deleted file mode 100644 index 408afcc899b..00000000000 --- a/res/cardsfolder/mystic_snake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Mystic Snake -ManaCost:1 G U U -Types:Creature Snake -Text:no text -PT:2/2 -K:Flash -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When CARDNAME enters the battlefield, counter target spell. -SVar:TrigCounter:AB$Counter | Cost$ 0 | TargetType$ Spell | ValidTgts$ Card | TgtPrompt$ Select target spell -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_snake.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/112.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_speculation.txt b/res/cardsfolder/mystic_speculation.txt deleted file mode 100644 index 75a77a4ee4e..00000000000 --- a/res/cardsfolder/mystic_speculation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystic Speculation -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Scry | Cost$ U | ScryNum$ 3 | SpellDescription$ 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.) -SVar:Buyback:2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_speculation.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_visionary.txt b/res/cardsfolder/mystic_visionary.txt deleted file mode 100644 index 15c41ab52d0..00000000000 --- a/res/cardsfolder/mystic_visionary.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mystic Visionary -ManaCost:1 W -Types:Creature Human Nomad Mystic -Text:no text -PT:2/1 -K:stPumpSelf:Creature:0/0/Flying:Threshold:Threshold - Mystic Visionary has flying as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_visionary.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystic_zealot.txt b/res/cardsfolder/mystic_zealot.txt deleted file mode 100644 index d3ce30ebe41..00000000000 --- a/res/cardsfolder/mystic_zealot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mystic Zealot -ManaCost:3 W -Types:Creature Human Nomad Mystic -Text:no text -PT:2/4 -K:stPumpSelf:Creature:1/1/Flying:Threshold:Threshold - As long as seven or more cards are in your graveyard, Mystic Zealot gets +1/+1 and has flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystic_zealot.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mystical_tutor.txt b/res/cardsfolder/mystical_tutor.txt deleted file mode 100644 index 81925e7bc38..00000000000 --- a/res/cardsfolder/mystical_tutor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Mystical Tutor -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Instant,Sorcery | ChangeNum$ 1 | SpellDescription$ Search your library for an instant or sorcery card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/mystical_tutor.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/83.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/mythic_proportions.txt b/res/cardsfolder/mythic_proportions.txt deleted file mode 100644 index 757f2c16e9c..00000000000 --- a/res/cardsfolder/mythic_proportions.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Mythic Proportions -ManaCost:4 G G G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+8/+8/Trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/mythic_proportions.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nacatl_outlander.txt b/res/cardsfolder/nacatl_outlander.txt deleted file mode 100644 index b317cb26975..00000000000 --- a/res/cardsfolder/nacatl_outlander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nacatl Outlander -ManaCost:R G -Types:Creature Cat Scout -Text:no text -PT:2/2 -K:Protection from blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nacatl_outlander.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nacatl_savage.txt b/res/cardsfolder/nacatl_savage.txt deleted file mode 100644 index aab80d7fd26..00000000000 --- a/res/cardsfolder/nacatl_savage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nacatl Savage -ManaCost:1 G -Types:Creature Cat Warrior -Text:no text -PT:2/1 -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nacatl_savage.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nacre_talisman.txt b/res/cardsfolder/nacre_talisman.txt deleted file mode 100644 index dd3e6261f84..00000000000 --- a/res/cardsfolder/nacre_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nacre Talisman -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a white spell, you may pay 3. If you do, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nacre_talisman.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nagao_bound_by_honor.txt b/res/cardsfolder/nagao_bound_by_honor.txt deleted file mode 100644 index dc1a126fa13..00000000000 --- a/res/cardsfolder/nagao_bound_by_honor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nagao, Bound by Honor -ManaCost:3 W -Types:Legendary Creature Human Samurai -Text:no text -PT:3/3 -K:Bushido 1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, Samurai creatures you control get +1/+1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Samurai+YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nagao_bound_by_honor.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nameless_inversion.txt b/res/cardsfolder/nameless_inversion.txt deleted file mode 100644 index 7fbe4614b00..00000000000 --- a/res/cardsfolder/nameless_inversion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nameless Inversion -ManaCost:1 B -Types:Tribal Instant Shapeshifter -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets +3/-3 and loses all creature types until end of turn. -K:Changeling -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nameless_inversion.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/128.jpg -End diff --git a/res/cardsfolder/nameless_one.txt b/res/cardsfolder/nameless_one.txt deleted file mode 100644 index d062aeaf937..00000000000 --- a/res/cardsfolder/nameless_one.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nameless One -ManaCost:3 U -Types:Creature Wizard Avatar -Text:no text -PT:*/* -K:stSetPT:Count$Valid Wizard:Count$Valid Wizard:Nameless One's power and toughness are each equal to the number of Wizards on the battlefield. -K:Morph:2 U -SVar:BuffedBy:Wizard -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nameless_one.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nameless_race.txt b/res/cardsfolder/nameless_race.txt deleted file mode 100644 index 345cd84fb03..00000000000 --- a/res/cardsfolder/nameless_race.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nameless Race -ManaCost:3 B -Types:Creature -Text: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.\r\nNameless Race's power and toughness are each equal to the life paid as it entered the battlefield. -PT:1/1 -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nameless_race.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_blightcutter.txt b/res/cardsfolder/nantuko_blightcutter.txt deleted file mode 100644 index 9658af0c7bb..00000000000 --- a/res/cardsfolder/nantuko_blightcutter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nantuko Blightcutter -ManaCost:2 G -Types:Creature Insect Druid -Text:no text -PT:2/2 -K:Protection from black -K:stPumpSelf:Creature:X/X:Threshold:Threshold - Nantuko Blightcutter gets +1/+1 for each black permanent your opponents control as long as seven or more cards are in your graveyard. -SVar:X:Count$Valid Permanent.Black+YouDontCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_blightcutter.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_calmer.txt b/res/cardsfolder/nantuko_calmer.txt deleted file mode 100644 index d0d2ce51c9b..00000000000 --- a/res/cardsfolder/nantuko_calmer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nantuko Calmer -ManaCost:2 G G -Types:Creature Insect Druid -Text:no text -PT:2/3 -A:AB$ Destroy | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -K:stPumpSelf:Creature:1/1:Threshold:Threshold - Nantuko Calmer gets +1/+1 as long as seven or more cards are in your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_calmer.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/132.jpg -End diff --git a/res/cardsfolder/nantuko_disciple.txt b/res/cardsfolder/nantuko_disciple.txt deleted file mode 100644 index abfa955fb6e..00000000000 --- a/res/cardsfolder/nantuko_disciple.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nantuko Disciple -ManaCost:3 G -Types:Creature Insect Druid -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_disciple.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/268.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/253.jpg -End diff --git a/res/cardsfolder/nantuko_elder.txt b/res/cardsfolder/nantuko_elder.txt deleted file mode 100644 index 2785ce8fbc0..00000000000 --- a/res/cardsfolder/nantuko_elder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nantuko Elder -ManaCost:2 G -Types:Creature Insect Druid -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T | Produced$ 1 G | SpellDescription$ Add 1 G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_elder.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_husk.txt b/res/cardsfolder/nantuko_husk.txt deleted file mode 100644 index 3ed38ebb245..00000000000 --- a/res/cardsfolder/nantuko_husk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nantuko Husk -ManaCost:2 B -Types:Creature Zombie Insect -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_husk.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/159.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/148.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_monastery.txt b/res/cardsfolder/nantuko_monastery.txt deleted file mode 100644 index 2b9287d0599..00000000000 --- a/res/cardsfolder/nantuko_monastery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nantuko Monastery -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ G W | Threshold$ True | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Insect,Monk | Colors$ Green,White | Keywords$ First Strike | SpellDescription$ Threshold - CARDNAME 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_monastery.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_shade.txt b/res/cardsfolder/nantuko_shade.txt deleted file mode 100644 index 706c864a7bc..00000000000 --- a/res/cardsfolder/nantuko_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nantuko Shade -ManaCost:B B -Types:Creature Insect Shade -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tor/en-us/card35053.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/106.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/74.jpg -End diff --git a/res/cardsfolder/nantuko_tracer.txt b/res/cardsfolder/nantuko_tracer.txt deleted file mode 100644 index 8e7ce2c5845..00000000000 --- a/res/cardsfolder/nantuko_tracer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nantuko Tracer -ManaCost:1 G -Types:Creature Insect Druid -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target card from a graveyard on the bottom of its owner's library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_tracer.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nantuko_vigilante.txt b/res/cardsfolder/nantuko_vigilante.txt deleted file mode 100644 index be1db47c749..00000000000 --- a/res/cardsfolder/nantuko_vigilante.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nantuko Vigilante -ManaCost:3 G -Types:Creature Insect Druid Mutant -Text:no text -PT:3/2 -K:Morph:1 G -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is turned face up, destroy target artifact or enchantment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nantuko_vigilante.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/narcissism.txt b/res/cardsfolder/narcissism.txt deleted file mode 100644 index 00b270c72b7..00000000000 --- a/res/cardsfolder/narcissism.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Narcissism -ManaCost:2 G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ G Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -A:AB$ Pump | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/narcissism.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/134.jpg -End diff --git a/res/cardsfolder/narcolepsy.txt b/res/cardsfolder/narcolepsy.txt deleted file mode 100644 index 780a38aa064..00000000000 --- a/res/cardsfolder/narcolepsy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Narcolepsy -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Each | IsPresent$ Creature.AttachedBy+untapped | PresentCompare$ EQ1 | IsCurse$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ At the beginning of each upkeep, if enchanted creature is untapped, tap it. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ Enchanted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/narcolepsy.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/narcomoeba.txt b/res/cardsfolder/narcomoeba.txt deleted file mode 100644 index 6cddab761f0..00000000000 --- a/res/cardsfolder/narcomoeba.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Narcomoeba -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Library | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into your graveyard from your library, you may put it onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/narcomoeba.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/narrow_escape.txt b/res/cardsfolder/narrow_escape.txt deleted file mode 100644 index 436a6317e64..00000000000 --- a/res/cardsfolder/narrow_escape.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Narrow Escape -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouCtrl | SubAbility$ SVar=DBGainLife | Defined$ TargetedController | TgtPrompt$ Select target permanent you control | SpellDescription$ Return target permanent you control to its owner's hand. You gain 4 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Narrow_Escape.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/narwhal.txt b/res/cardsfolder/narwhal.txt deleted file mode 100644 index e84c2a57693..00000000000 --- a/res/cardsfolder/narwhal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Narwhal -ManaCost:2 U U -Types:Creature Whale -Text:no text -PT:2/2 -K:First Strike -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/narwhal.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nath_of_the_gilt_leaf.txt b/res/cardsfolder/nath_of_the_gilt_leaf.txt deleted file mode 100644 index e84e5d58f0b..00000000000 --- a/res/cardsfolder/nath_of_the_gilt_leaf.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nath of the Gilt-Leaf -ManaCost:3 B G -Types:Legendary Creature Elf Warrior -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may have target opponent discard a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumCards$ 1 | Mode$ Random -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever an opponent discards a card, you may put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nath_of_the_gilt_leaf.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/naths_buffoon.txt b/res/cardsfolder/naths_buffoon.txt deleted file mode 100644 index 0e175df9b7d..00000000000 --- a/res/cardsfolder/naths_buffoon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nath's Buffoon -ManaCost:1 B -Types:Creature Goblin Rogue -Text:no text -PT:1/1 -K:Protection:Elf:Protection from Elves -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naths_buffoon.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/naths_elite.txt b/res/cardsfolder/naths_elite.txt deleted file mode 100644 index 57e4aef3f3f..00000000000 --- a/res/cardsfolder/naths_elite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nath's Elite -ManaCost:4 G -Types:Creature Elf Warrior -Text:no text -PT:4/2 -K:All creatures able to block CARDNAME do so. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on CARDNAME. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naths_elite.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natural_affinity.txt b/res/cardsfolder/natural_affinity.txt deleted file mode 100644 index 4ca1183fc07..00000000000 --- a/res/cardsfolder/natural_affinity.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Natural Affinity -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ AnimateAll | Cost$ 2 G | ValidCards$ Land | Types$ Creature | Power$ 2 | Toughness$ 2 | SpellDescription$ All lands become 2/2 creatures until end of turn. They're still lands. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_affinity.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/269.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/260.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natural_order.txt b/res/cardsfolder/natural_order.txt deleted file mode 100644 index f3020fda5af..00000000000 --- a/res/cardsfolder/natural_order.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Natural Order -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G G Sac<1/Creature.Green> | CostDesc$ As an additional cost to cast Natural Order, sacrifice a green creature. | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Green | ChangeNum$ 1 | SpellDescription$ Search your library for a green creature card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_order.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/64.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natural_selection.txt b/res/cardsfolder/natural_selection.txt deleted file mode 100644 index 3d9f52d6cf2..00000000000 --- a/res/cardsfolder/natural_selection.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Natural Selection -ManaCost:G -Types:Instant -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ G | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SpellDescription$ Look at the top 3 cards of target player's library and put them back in any order. You may have that player shuffle his or her library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_selection.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/121.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/121.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natural_spring.txt b/res/cardsfolder/natural_spring.txt deleted file mode 100644 index b37bc7e7edd..00000000000 --- a/res/cardsfolder/natural_spring.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Natural Spring -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 3 G G | LifeAmount$ 8 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 8 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/natural_spring.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/133.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/102.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/257.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/281.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/74.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/naturalize.txt b/res/cardsfolder/naturalize.txt deleted file mode 100644 index e6230c6ff28..00000000000 --- a/res/cardsfolder/naturalize.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Naturalize -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naturalize.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/270.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/258.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/199.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/141.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/186.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/195.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/275.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/282.jpg -End diff --git a/res/cardsfolder/natures_chosen.txt b/res/cardsfolder/natures_chosen.txt deleted file mode 100644 index 48b9115615b..00000000000 --- a/res/cardsfolder/natures_chosen.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nature's Chosen -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Untap | Cost$ 0 | Defined$ Enchanted | ActivationLimit$ 1 | PlayerTurn$ True | SpellDescription$ Untap enchanted creature. Activate this ability only during your turn and only once each turn. -A:AB$ Untap | Cost$ tapXType<1/Creature.AttachedBy+White+untapped> | CostDesc$ Tap enchanted white creature: | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | ActivationLimit$ 1 | SpellDescription$ Untap target artifact, creature, or land. Activate this ability only if enchanted creature is white and is untapped and only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_chosen.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natures_claim.txt b/res/cardsfolder/natures_claim.txt deleted file mode 100644 index c6e6d26e253..00000000000 --- a/res/cardsfolder/natures_claim.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nature's Claim -ManaCost:G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target artifact or enchantment. Its controller gains 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_claim.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/108.jpg -End diff --git a/res/cardsfolder/natures_cloak.txt b/res/cardsfolder/natures_cloak.txt deleted file mode 100644 index debadd83a81..00000000000 --- a/res/cardsfolder/natures_cloak.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nature's Cloak -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.Green+YouCtrl | KW$ Forestwalk | SpellDescription$ Green creatures you control gain forestwalk until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/natures_cloak.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/135.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/103.jpg -End - - - diff --git a/res/cardsfolder/natures_lore.txt b/res/cardsfolder/natures_lore.txt deleted file mode 100644 index b60df0a74e6..00000000000 --- a/res/cardsfolder/natures_lore.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nature's Lore -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_lore.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/75.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/136.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/104.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/143.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natures_resurgence.txt b/res/cardsfolder/natures_resurgence.txt deleted file mode 100644 index d26bbf1e3ab..00000000000 --- a/res/cardsfolder/natures_resurgence.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nature's Resurgence -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 G G | Defined$ You | NumCards$ X | SubAbility$ SVar=DBDrawOpp | SpellDescription$ Each player draws a card for each creature card in his or her graveyard. -SVar:DBDrawOpp:DB$Draw | Defined$ Opponent | NumCards$ Y -SVar:X:Count$TypeInYourYard.Creature -SVar:Y:Count$TypeInOppYard.Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_resurgence.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/79.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/242.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natures_revolt.txt b/res/cardsfolder/natures_revolt.txt deleted file mode 100644 index 33b1dc39c12..00000000000 --- a/res/cardsfolder/natures_revolt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nature's Revolt -ManaCost:3 G G -Types:Enchantment -Text:no text -K:stAnimateAll:Land:2/2:Creature:no colors:No Abilities:No Condition:All lands are 2/2 creatures that are still lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_revolt.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/134.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natures_ruin.txt b/res/cardsfolder/natures_ruin.txt deleted file mode 100644 index 4dc6012a1b3..00000000000 --- a/res/cardsfolder/natures_ruin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nature's Ruin -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.Green | SpellDescription$ Destroy all green creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/natures_ruin.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/26.jpg -End diff --git a/res/cardsfolder/natures_spiral.txt b/res/cardsfolder/natures_spiral.txt deleted file mode 100644 index d79d291ca44..00000000000 --- a/res/cardsfolder/natures_spiral.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nature's Spiral -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target permanent card in your graveyard | ValidTgts$ Permanent.YouCtrl | SpellDescription$ Return target permanent card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_spiral.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/187.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/natures_wrath.txt b/res/cardsfolder/natures_wrath.txt deleted file mode 100644 index a6aa3caf0ae..00000000000 --- a/res/cardsfolder/natures_wrath.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nature's Wrath -ManaCost:4 G G -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G -T:Mode$ ChangesZone | ValidCard$ Island,Card.Blue | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlue | TriggerDescription$ Whenever a player puts an Island or blue permanent onto the battlefield, he or she sacrifices an Island or blue permanent. -SVar:TrigSacrificeBlue:AB$Sacrifice | Cost$ 0 | Defined$ TriggeredCardController | SacValid$ Island,Card.Blue | SacMessage$ Island or a blue permanent -T:Mode$ ChangesZone | ValidCard$ Swamp,Card.Black | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSacrificeBlack | TriggerDescription$ Whenever a player puts an Swamp or black permanent onto the battlefield, he or she sacrifices an Swamp or black permanent. -SVar:TrigSacrificeBlack:AB$Sacrifice | Cost$ 0 | Defined$ TriggeredCardController | SacValid$ Swamp,Card.Black | SacMessage$ Swamp or a black permanent -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_wrath.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nausea.txt b/res/cardsfolder/nausea.txt deleted file mode 100644 index 488cdf8464e..00000000000 --- a/res/cardsfolder/nausea.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nausea -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 B | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nausea.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/148.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/148.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/67.jpg -End diff --git a/res/cardsfolder/naya_battlemage.txt b/res/cardsfolder/naya_battlemage.txt deleted file mode 100644 index b81e7867614..00000000000 --- a/res/cardsfolder/naya_battlemage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Naya Battlemage -ManaCost:2 G -Types:Creature Human Shaman -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | SpellDescription$ Target creature gets +2/+0 until end of turn. -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_battlemage.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/142.jpg -End diff --git a/res/cardsfolder/naya_hushblade.txt b/res/cardsfolder/naya_hushblade.txt deleted file mode 100644 index 94469edca96..00000000000 --- a/res/cardsfolder/naya_hushblade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Naya Hushblade -ManaCost:RW G -Types:Creature Elf Rogue -Text:no text -PT:2/1 -K:stPumpSelf:Creature:1/1/Shroud:isPresent Permanent.MultiColor+Other+YouCtrl: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.) -SVar:BuffedBy:Permanent.MultiColor -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_hushblade.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/naya_panorama.txt b/res/cardsfolder/naya_panorama.txt deleted file mode 100644 index 64863d634c7..00000000000 --- a/res/cardsfolder/naya_panorama.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Naya Panorama -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Mountain+Basic,Land.Forest+Basic,Land.Plains+Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic Mountain, Forest, or Plains card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_panorama.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/naya_sojourners.txt b/res/cardsfolder/naya_sojourners.txt deleted file mode 100644 index a9229b280db..00000000000 --- a/res/cardsfolder/naya_sojourners.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Naya Sojourners -ManaCost:2 G W R -Types:Creature Elf Shaman -Text:no text -PT:5/3 -K:Cycling:2 G -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may put a +1/+1 counter on target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPutCounter | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it's put into a graveyard from the battlefield, you may put a +1/+1 counter on target creature. -SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_sojourners.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/near_death_experience.txt b/res/cardsfolder/near_death_experience.txt deleted file mode 100644 index 643bbc89c42..00000000000 --- a/res/cardsfolder/near_death_experience.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Near-Death Experience -ManaCost:2 W W W -Types:Enchantment -Text:At the beginning of your upkeep, if you have exactly 1 life, you win the game. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/near_death_experience.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nebuchadnezzar.txt b/res/cardsfolder/nebuchadnezzar.txt deleted file mode 100644 index 0a82a6e768c..00000000000 --- a/res/cardsfolder/nebuchadnezzar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nebuchadnezzar -ManaCost:3 U B -Types:Legendary Creature Human Wizard -Text:no text -PT:3/3 -#This is necessary for cost payment, but not used. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nebuchadnezzar.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neck_snap.txt b/res/cardsfolder/neck_snap.txt deleted file mode 100644 index 360601315e8..00000000000 --- a/res/cardsfolder/neck_snap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Neck Snap -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | SpellDescription$ Destroy target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neck_snap.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/32.jpg -End diff --git a/res/cardsfolder/necra_disciple.txt b/res/cardsfolder/necra_disciple.txt deleted file mode 100644 index fd2a89aca4c..00000000000 --- a/res/cardsfolder/necra_disciple.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Necra Disciple -ManaCost:B -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ W T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -A:AB$ Mana | Cost$ G T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ G T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/necra_disciple.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necratog.txt b/res/cardsfolder/necratog.txt deleted file mode 100644 index e7fc90a6aa2..00000000000 --- a/res/cardsfolder/necratog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Necratog -ManaCost:1 B B -Types:Creature Atog -Text:no text -PT:1/2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necratog.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrite.txt b/res/cardsfolder/necrite.txt deleted file mode 100644 index c4aef2d1435..00000000000 --- a/res/cardsfolder/necrite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Necrite -ManaCost:1 B B -Types:Creature Thrull -Text:no text -PT:2/2 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, destroy target creature defending player controls. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature defending player controls | NoRegen$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrite.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/43.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/22.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/necrogen_censer.txt b/res/cardsfolder/necrogen_censer.txt deleted file mode 100644 index c4afe45555e..00000000000 --- a/res/cardsfolder/necrogen_censer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Necrogen Censer -ManaCost:3 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:2 -A:AB$ LoseLife | Cost$ T SubCounter<1/CHARGE> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SpellDescription$ Target player loses 2 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_censer.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/184.jpg -End diff --git a/res/cardsfolder/necrogen_mists.txt b/res/cardsfolder/necrogen_mists.txt deleted file mode 100644 index c2ccd501612..00000000000 --- a/res/cardsfolder/necrogen_mists.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Necrogen Mists -ManaCost:2 B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of each player's upkeep, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_mists.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrogen_scudder.txt b/res/cardsfolder/necrogen_scudder.txt deleted file mode 100644 index 4bf5adfea8f..00000000000 --- a/res/cardsfolder/necrogen_scudder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Necrogen Scudder -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 3 life. -SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_scudder.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrogen_spellbomb.txt b/res/cardsfolder/necrogen_spellbomb.txt deleted file mode 100644 index 41810bdee3e..00000000000 --- a/res/cardsfolder/necrogen_spellbomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Necrogen Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogen_spellbomb.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrogenesis.txt b/res/cardsfolder/necrogenesis.txt deleted file mode 100644 index 74c755b2644..00000000000 --- a/res/cardsfolder/necrogenesis.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Necrogenesis -ManaCost:B G -Types:Enchantment -Text:no text -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrogenesis.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necromantic_thirst.txt b/res/cardsfolder/necromantic_thirst.txt deleted file mode 100644 index 57e7407ef3f..00000000000 --- a/res/cardsfolder/necromantic_thirst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Necromantic Thirst -ManaCost:2 B B -Types:Enchantment Aura -Text:no text -K:Enchant Creature -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReturn | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, you may return target creature card from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/necromantic_thirst.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necropede.txt b/res/cardsfolder/necropede.txt deleted file mode 100644 index 3e0a6816034..00000000000 --- a/res/cardsfolder/necropede.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Necropede -ManaCost:2 -Types:Artifact Creature Insect -Text:no text -PT:1/1 -K:Infect -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may put a -1/-1 counter on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | IsCurse$ True | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necropede.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necroplasm.txt b/res/cardsfolder/necroplasm.txt deleted file mode 100644 index 8b11c6ac11f..00000000000 --- a/res/cardsfolder/necroplasm.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Necroplasm -ManaCost:1 B B -Types:Creature Ooze -Text:no text -PT:1/1 -K:Dredge 2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on CARDNAME. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your end step, destroy each creature with converted mana cost equal to the number of +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:TrigDestroy:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.cmcEQX -SVar:X:Count$CardCounters.P1P1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/necroplasm.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necropolis.txt b/res/cardsfolder/necropolis.txt deleted file mode 100644 index e724c6fbda6..00000000000 --- a/res/cardsfolder/necropolis.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Necropolis -ManaCost:5 -Types:Artifact Creature Wall -Text:no text -PT:0/1 -K:Defender -A:AB$ PutCounter | Cost$ ExileFromGrave<1/Creature> | CounterType$ P0P1 | CounterNum$ X | SpellDescription$ Put X +0/+1 counters on CARDNAME, where X is the exiled card's converted mana cost. -SVar:X:Exiled$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necropolis.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necropotence.txt b/res/cardsfolder/necropotence.txt deleted file mode 100644 index e1594850ee4..00000000000 --- a/res/cardsfolder/necropotence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Necropotence -ManaCost:B B B -Types:Enchantment -Text:Skip your draw step.\r\nWhenever you discard a card, exile that card from your graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/necropotence.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/44.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necropouncer.txt b/res/cardsfolder/necropouncer.txt deleted file mode 100644 index d5276625bc4..00000000000 --- a/res/cardsfolder/necropouncer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Necropouncer -ManaCost:6 -Types:Artifact Equipment -Text:Equipped creature gets +3/+1 and has haste. -K:eqPump 2:+3/+1/Haste -K:Living Weapon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/necropouncer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrosavant.txt b/res/cardsfolder/necrosavant.txt deleted file mode 100644 index 972ee612118..00000000000 --- a/res/cardsfolder/necrosavant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Necrosavant -ManaCost:3 B B B -Types:Creature Zombie Giant -Text:no text -PT:5/5 -A:AB$ ChangeZone | Cost$3 B B Sac<1/Creature> | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Return Necrosavant from your graveyard to the battlefield. Activate this ability only during your upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrosavant.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/15.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necroskitter.txt b/res/cardsfolder/necroskitter.txt deleted file mode 100644 index 6954dd5dd82..00000000000 --- a/res/cardsfolder/necroskitter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Necroskitter -ManaCost:1 B B -Types:Creature Elemental -Text:no text -PT:1/4 -K:Wither -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl+countersGE1M1M1 | TriggerZones$ Battlefield | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls with a -1/-1 counter on it is put into a graveyard, you may return that card to the battlefield under your control. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/necroskitter.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/necrotic_sliver.txt b/res/cardsfolder/necrotic_sliver.txt deleted file mode 100644 index 7d2810790ae..00000000000 --- a/res/cardsfolder/necrotic_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Necrotic Sliver -ManaCost:1 W B -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Destroy:no Condition:All Slivers have "3, Sacrifice this permanent: Destroy target permanent." -SVar:Destroy:AB$Destroy | Cost$ 3 Sac<1/CARDNAME> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Destroy target permanent. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Picture:http://www.wizards.com/global/images/magic/general/necrotic_sliver.jpg -SVar:Rarity:Uncommon -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/need_for_speed.txt b/res/cardsfolder/need_for_speed.txt deleted file mode 100644 index eb919bf9ad6..00000000000 --- a/res/cardsfolder/need_for_speed.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Need for Speed -ManaCost:R -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/need_for_speed.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/209.jpg -End diff --git a/res/cardsfolder/needle_specter.txt b/res/cardsfolder/needle_specter.txt deleted file mode 100644 index 1452f88671e..00000000000 --- a/res/cardsfolder/needle_specter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Needle Specter -ManaCost:1 B B -Types:Creature Specter -Text:no text -PT:1/1 -K:Flying -K:Wither -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards that many cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ X | Mode$ TgtChoose -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/needle_specter.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/needle_storm.txt b/res/cardsfolder/needle_storm.txt deleted file mode 100644 index f1d7d3227c3..00000000000 --- a/res/cardsfolder/needle_storm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Needle Storm -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 G | NumDmg$ 4 | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 4 damage to each creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4311.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/135.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/105.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/needlebug.txt b/res/cardsfolder/needlebug.txt deleted file mode 100644 index 990313fc5fc..00000000000 --- a/res/cardsfolder/needlebug.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Needlebug -ManaCost:4 -Types:Artifact Creature Insect -Text:no text -PT:2/2 -K:Flash -K:Protection from artifacts -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/needlebug.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/needlepeak_spider.txt b/res/cardsfolder/needlepeak_spider.txt deleted file mode 100644 index 1e55d9ca4c0..00000000000 --- a/res/cardsfolder/needlepeak_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Needlepeak Spider -ManaCost:3 R -Types:Creature Spider -Text:no text -PT:4/2 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122268.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/needleshot_gourna.txt b/res/cardsfolder/needleshot_gourna.txt deleted file mode 100644 index 7a077a79d03..00000000000 --- a/res/cardsfolder/needleshot_gourna.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Needleshot Gourna -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:3/6 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card42039.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nefashu.txt b/res/cardsfolder/nefashu.txt deleted file mode 100644 index e18143253a7..00000000000 --- a/res/cardsfolder/nefashu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nefashu -ManaCost:4 B B -Types:Creature Zombie Mutant -Text:no text -PT:5/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigShrink | TriggerDescription$ Whenever CARDNAME attacks, up to five target creatures each get -1/-1 until end of turn. -SVar:TrigShrink:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 5 | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nefashu.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/negate.txt b/res/cardsfolder/negate.txt deleted file mode 100644 index 8262d6f8ecd..00000000000 --- a/res/cardsfolder/negate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Negate -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target nonCreature Spell | ValidTgts$ Card.nonCreature | SpellDescription$ Counter target noncreature spell. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/negate.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/68.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/43.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nekrataal.txt b/res/cardsfolder/nekrataal.txt deleted file mode 100644 index 94eeb7a6231..00000000000 --- a/res/cardsfolder/nekrataal.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nekrataal -ManaCost:2 B B -Types:Creature Human Assassin -Text:no text -PT:2/1 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonartifact, nonblack creature. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.nonArtifact+nonBlack | NoRegen$ True | TgtPrompt$ Select target nonartifact, nonblack creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nekrataal.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/149.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/16.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/149.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nema_siltlurker.txt b/res/cardsfolder/nema_siltlurker.txt deleted file mode 100644 index e4695462068..00000000000 --- a/res/cardsfolder/nema_siltlurker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nema Siltlurker -ManaCost:4 G -Types:Creature Lizard -Text:no text -PT:3/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nema_siltlurker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nemata_grove_guardian.txt b/res/cardsfolder/nemata_grove_guardian.txt deleted file mode 100644 index 0d4a3e8619a..00000000000 --- a/res/cardsfolder/nemata_grove_guardian.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nemata, Grove Guardian -ManaCost:4 G G -Types:Legendary Creature Treefolk -Text:no text -PT:4/5 -A:AB$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ PumpAll | Cost$ Sac<1/Saproling> | ValidCards$ Creature.Saproling | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Saproling creatures get +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nemata_grove_guardian.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nemesis_mask.txt b/res/cardsfolder/nemesis_mask.txt deleted file mode 100644 index 47bccc5d5e7..00000000000 --- a/res/cardsfolder/nemesis_mask.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nemesis Mask -ManaCost:3 -Types:Artifact Equipment -Text:All creatures able to block equipped creature do so. -K:eqPump 3:HIDDEN All creatures able to block CARDNAME do so. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nemesis_mask.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nemesis_of_reason.txt b/res/cardsfolder/nemesis_of_reason.txt deleted file mode 100644 index 6fd4c2c9d8c..00000000000 --- a/res/cardsfolder/nemesis_of_reason.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nemesis of Reason -ManaCost:3 U B -Types:Creature Leviathan Horror -Text:no text -PT:3/7 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ Whenever CARDNAME attacks, defending player puts the top ten cards of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ 10 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nemesis_of_reason.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nessian_courser.txt b/res/cardsfolder/nessian_courser.txt deleted file mode 100644 index 66743ad3998..00000000000 --- a/res/cardsfolder/nessian_courser.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nessian Courser -ManaCost:2 G -Types:Creature Centaur Warrior -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136138.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nest_invader.txt b/res/cardsfolder/nest_invader.txt deleted file mode 100644 index ebc05e92ac3..00000000000 --- a/res/cardsfolder/nest_invader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nest Invader -ManaCost:1 G -Types:Creature Eldrazi Drone -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add 1 to your mana pool." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nest_invader.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nested_ghoul.txt b/res/cardsfolder/nested_ghoul.txt deleted file mode 100644 index 36a30ab59b9..00000000000 --- a/res/cardsfolder/nested_ghoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nested Ghoul -ManaCost:3 B B -Types:Creature Zombie Warrior -Text:no text -PT:4/2 -T:Mode$ DamageDone | ValidTarget$ Creature.Self | Execute$ TrigZombie | TriggerDescription$ Whenever a source deals damage to CARDNAME, put a 2/2 black Zombie creature token onto the battlefield. -SVar:TrigZombie:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nested_ghoul.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nesting_wurm.txt b/res/cardsfolder/nesting_wurm.txt deleted file mode 100644 index e3374c74e7b..00000000000 --- a/res/cardsfolder/nesting_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nesting Wurm -ManaCost:4 G G -Types:Creature Wurm -Text:no text -PT:4/3 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for up to three cards named CARDNAME, reveal them, and put them into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedNesting Wurm | ChangeNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nesting_wurm.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nether_horror.txt b/res/cardsfolder/nether_horror.txt deleted file mode 100644 index 7dd7b39a9c8..00000000000 --- a/res/cardsfolder/nether_horror.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nether Horror -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:4/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nether_horror.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nether_spirit.txt b/res/cardsfolder/nether_spirit.txt deleted file mode 100644 index 41f5df361cd..00000000000 --- a/res/cardsfolder/nether_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nether Spirit -ManaCost:1 B B -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | IsPresent$ Creature.YouOwn | PresentZone$ Graveyard | PresentCompare$ EQ1 | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is the only creature card in your graveyard, you may return CARDNAME to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nether_spirit.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nether_traitor.txt b/res/cardsfolder/nether_traitor.txt deleted file mode 100644 index 98959be51ef..00000000000 --- a/res/cardsfolder/nether_traitor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nether Traitor -ManaCost:B B -Types:Creature Spirit -Text:no text -PT:1/1 -K:Haste -K:Shadow -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+Other | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever another creature is put into your graveyard from the battlefield, you may pay B. If you do, return CARDNAME from your graveyard to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ B | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nether_traitor.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nether_void.txt b/res/cardsfolder/nether_void.txt deleted file mode 100644 index 335c4663860..00000000000 --- a/res/cardsfolder/nether_void.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nether Void -ManaCost:3 B -Types:World Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Each | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever a player casts a spell, counter it unless its controller pays 3. -SVar:TrigCounter:DB$Counter | Cost$ 0 | UnlessCost$ 3 | Defined$ TriggeredSpellAbility | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nether_void.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/netherborn_phalanx.txt b/res/cardsfolder/netherborn_phalanx.txt deleted file mode 100644 index 8e1683fcd38..00000000000 --- a/res/cardsfolder/netherborn_phalanx.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Netherborn Phalanx -ManaCost:5 B -Types:Creature Horror -Text:no text -PT:2/4 -K:Transmute:1 B B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, each opponent loses 1 life for each creature he or she controls. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ X -SVar:X:Count$Valid Creature.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/netherborn_phalanx.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/netter_en_dal.txt b/res/cardsfolder/netter_en_dal.txt deleted file mode 100644 index c736980fe4f..00000000000 --- a/res/cardsfolder/netter_en_dal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Netter en-Dal -ManaCost:W -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ W T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't attack. | IsCurse$ True | SpellDescription$ Target creature can't attack this turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/netter_en_dal.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nettle_sentinel.txt b/res/cardsfolder/nettle_sentinel.txt deleted file mode 100644 index 8e4904c0af3..00000000000 --- a/res/cardsfolder/nettle_sentinel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nettle Sentinel -ManaCost:G -Types:Creature Elf Warrior -Text:no text -PT:2/2 -K:CARDNAME doesn't untap during your untap step. -T:Mode$ SpellCast | ValidCard$ Card.Green+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a green spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nettle_sentinel.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nettletooth_djinn.txt b/res/cardsfolder/nettletooth_djinn.txt deleted file mode 100644 index bcea29e833a..00000000000 --- a/res/cardsfolder/nettletooth_djinn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nettletooth Djinn -ManaCost:3 G -Types:Creature Djinn -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nettletooth_djinn.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nettling_curse.txt b/res/cardsfolder/nettling_curse.txt deleted file mode 100644 index ed981188e89..00000000000 --- a/res/cardsfolder/nettling_curse.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Nettling Curse -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:0/0 -A:AB$ Pump | Cost$ 1 R | Defined$ Enchanted | KW$ HIDDEN CARDNAME attacks each turn if able. | IsCurse$ True | SpellDescription$ Enchanted creature attacks this turn if able. -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLoseLifeAttack | TriggerDescription$ Whenever enchanted creature attacks or blocks, its controller loses 3 life. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLoseLifeBlock | Secondary$ True | TriggerDescription$ Whenever enchanted creature attacks or blocks, its controller loses 3 life. -SVar:TrigLoseLifeAttack:AB$LoseLife | Cost$ 0 | LifeAmount$ 3 | Defined$ TriggeredAttackerController -SVar:TrigLoseLifeBlock:AB$LoseLife | Cost$ 0 | LifeAmount$ 3 | Defined$ TriggeredBlockerController -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nettling_curse.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_commando.txt b/res/cardsfolder/neurok_commando.txt deleted file mode 100644 index 61ad7ee507a..00000000000 --- a/res/cardsfolder/neurok_commando.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Neurok Commando -ManaCost:1 U U -Types:Creature Human Rogue -Text:no text -PT:2/1 -K:Shroud -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_commando.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_familiar.txt b/res/cardsfolder/neurok_familiar.txt deleted file mode 100644 index d42244b5683..00000000000 --- a/res/cardsfolder/neurok_familiar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Neurok Familiar -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Artifact | DestinationZone2$ Graveyard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_familiar.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_hoversail.txt b/res/cardsfolder/neurok_hoversail.txt deleted file mode 100644 index 5337cd951d2..00000000000 --- a/res/cardsfolder/neurok_hoversail.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Neurok Hoversail -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature has flying. -K:eqPump 2:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_hoversail.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_invisimancer.txt b/res/cardsfolder/neurok_invisimancer.txt deleted file mode 100644 index 1748f391228..00000000000 --- a/res/cardsfolder/neurok_invisimancer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Neurok Invisimancer -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:2/1 -K:Unblockable -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature is unblockable this turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_invisimancer.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_prodigy.txt b/res/cardsfolder/neurok_prodigy.txt deleted file mode 100644 index 2efbcc07a95..00000000000 --- a/res/cardsfolder/neurok_prodigy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Neurok Prodigy -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ Discard<1/Artifact> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_prodigy.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_replica.txt b/res/cardsfolder/neurok_replica.txt deleted file mode 100644 index 9fa51670785..00000000000 --- a/res/cardsfolder/neurok_replica.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Neurok Replica -ManaCost:3 -Types:Artifact Creature Wizard -Text:no text -PT:1/4 -A:AB$ ChangeZone | Cost$ 1 U Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_replica.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/neurok_spy.txt b/res/cardsfolder/neurok_spy.txt deleted file mode 100644 index 14fdee1b2cf..00000000000 --- a/res/cardsfolder/neurok_spy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Neurok Spy -ManaCost:2 U -Types:Creature Human Rogue -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/HIDDEN Unblockable:isPresent Artifact.YouDontCtrl:CARDNAME is unblockable as long as defending player controls an artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/neurok_spy.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nevermaker.txt b/res/cardsfolder/nevermaker.txt deleted file mode 100644 index 3a808618509..00000000000 --- a/res/cardsfolder/nevermaker.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nevermaker -ManaCost:3 U -Types:Creature Elemental -Text:no text -PT:2/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME leaves the battlefield, put target nonland permanent on top of its owner's library. -K:Evoke:3 U -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent.nonLand | TgtPrompt$ Choose target non-Land permanent | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nevermaker.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nevinyrrals_disk.txt b/res/cardsfolder/nevinyrrals_disk.txt deleted file mode 100644 index 11f2cd00656..00000000000 --- a/res/cardsfolder/nevinyrrals_disk.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nevinyrral's Disk -ManaCost:4 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ DestroyAll | Cost$ 1 T | ValidCards$ Artifact,Creature,Enchantment | SpellDescription$ Destroy all artifacts, creatures, and enchantments. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3803.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/266.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/268.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/391.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/356.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/267.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/new_benalia.txt b/res/cardsfolder/new_benalia.txt deleted file mode 100644 index 8dd75178709..00000000000 --- a/res/cardsfolder/new_benalia.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:New Benalia -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. -SVar:TrigScry:AB$Scry | Cost$ 0 | ScryNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/new_benalia.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nezumi_bone_reader.txt b/res/cardsfolder/nezumi_bone_reader.txt deleted file mode 100644 index f98803bb3b2..00000000000 --- a/res/cardsfolder/nezumi_bone_reader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nezumi Bone-Reader -ManaCost:1 B -Types:Creature Rat Shaman -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_bone_reader.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nezumi_cutthroat.txt b/res/cardsfolder/nezumi_cutthroat.txt deleted file mode 100644 index 4b5a3503aeb..00000000000 --- a/res/cardsfolder/nezumi_cutthroat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nezumi Cutthroat -ManaCost:1 B -Types:Creature Rat Warrior -Text:no text -PT:2/1 -K:Fear -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80521.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nezumi_ronin.txt b/res/cardsfolder/nezumi_ronin.txt deleted file mode 100644 index df9a6fa341e..00000000000 --- a/res/cardsfolder/nezumi_ronin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nezumi Ronin -ManaCost:2 B -Types:Creature Rat Samurai -Text:no text -PT:3/1 -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_ronin.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nezumi_shadow_watcher.txt b/res/cardsfolder/nezumi_shadow_watcher.txt deleted file mode 100644 index c994e182a93..00000000000 --- a/res/cardsfolder/nezumi_shadow_watcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nezumi Shadow-Watcher -ManaCost:B -Types:Creature Rat Warrior -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Ninja | TgtPrompt$ Select target Ninja | SpellDescription$ Destroy target Ninja. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_shadow_watcher.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/74.jpg -End diff --git a/res/cardsfolder/niall_silvain.txt b/res/cardsfolder/niall_silvain.txt deleted file mode 100644 index 57c2f4d99b5..00000000000 --- a/res/cardsfolder/niall_silvain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Niall Silvain -ManaCost:G G G -Types:Creature Ouphe -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ G G G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/niall_silvain.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nicol_bolas.txt b/res/cardsfolder/nicol_bolas.txt deleted file mode 100644 index cb5a62ce5f0..00000000000 --- a/res/cardsfolder/nicol_bolas.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nicol Bolas -ManaCost:2 U U B B R R -Types:Legendary Creature Elder Dragon -Text:no text -PT:7/7 -K:Flying -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U B R -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that player discards his or her hand. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | Mode$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nicol_bolas.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/98.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nicol_bolas_planeswalker.txt b/res/cardsfolder/nicol_bolas_planeswalker.txt deleted file mode 100644 index 7a9dcf4c219..00000000000 --- a/res/cardsfolder/nicol_bolas_planeswalker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nicol Bolas, Planeswalker -ManaCost:4 U B B R -Types:Planeswalker Bolas -Text:no text -Loyalty:5 -A:AB$ Destroy | Cost$ AddCounter<3/LOYALTY> | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select a noncreature permanent. | Planeswalker$ True | SpellDescription$ Destroy target noncreature permanent. -A:AB$ GainControl | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | Planeswalker$ True | SpellDescription$ Gain control of target creature. -A:AB$ DealDamage | Cost$ SubCounter<9/LOYALTY> | NumDmg$ 7 | ValidTgts$ Player | Planeswalker$ True | SubAbility$ SVar=DBDiscard | SpellDescription$ CARDNAME deals 7 damage to target player. That player discards seven cards, then sacrifices seven permanents. -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 7 | Mode$ TgtChoose | SubAbility$ SVar=DBSac -SVar:DBSac:DB$Sacrifice | Defined$ Targeted | SacValid$ Permanent | Amount$ 7 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/nicol_bolas_planeswalker.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/night_of_souls_betrayal.txt b/res/cardsfolder/night_of_souls_betrayal.txt deleted file mode 100644 index 7810eab619a..00000000000 --- a/res/cardsfolder/night_of_souls_betrayal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Night of Souls' Betrayal -ManaCost:2 B B -Types:Legendary Enchantment -Text:no text -K:stPumpAll:Creature:-1/-1:No Condition:All creatures get -1/-1. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/night_of_souls_betrayal.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/night_soil.txt b/res/cardsfolder/night_soil.txt deleted file mode 100644 index 2b4918e9419..00000000000 --- a/res/cardsfolder/night_soil.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Night Soil -ManaCost:G G -Types:Enchantment -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/night_soil.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/80.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/nightcreep.txt b/res/cardsfolder/nightcreep.txt deleted file mode 100644 index 6fdabfe3ff0..00000000000 --- a/res/cardsfolder/nightcreep.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightcreep -ManaCost:B B -Types:Instant -Text:no text -A:SP$ AnimateAll | Cost$ B B | ValidCards$ Creature | Colors$ Black | OverwriteColors$ True | SubAbility$ AnimateSwamp | SpellDescription$ Until end of turn, all creatures become black and all lands become Swamps. -SVar:AnimateSwamp:DB$AnimateAll | ValidCards$ Land | Types$ Swamp | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightcreep.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightguard_patrol.txt b/res/cardsfolder/nightguard_patrol.txt deleted file mode 100644 index ad256b09f9c..00000000000 --- a/res/cardsfolder/nightguard_patrol.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightguard Patrol -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/1 -K:First Strike -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightguard_patrol.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nighthaze.txt b/res/cardsfolder/nighthaze.txt deleted file mode 100644 index 6185ee0291b..00000000000 --- a/res/cardsfolder/nighthaze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nighthaze -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ Target creature gains swampwalk until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nighthaze.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/118.jpg -End diff --git a/res/cardsfolder/nightmare.txt b/res/cardsfolder/nightmare.txt deleted file mode 100644 index 03638f6c706..00000000000 --- a/res/cardsfolder/nightmare.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Nightmare -ManaCost:5 B -Types:Creature Nightmare -Text:no text -PT:*/* -K:Flying -K:stSetPT:Count$TypeYouCtrl.Swamp:Count$TypeYouCtrl.Swamp:CARDNAME's power and toughness are each equal to the number of Swamps you control. -SVar:BuffedBy:Swamp -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83186.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/150.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/27.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/27.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/150.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/46.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/34.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/150.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/164.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/107.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/146.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/28.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightmare_incursion.txt b/res/cardsfolder/nightmare_incursion.txt deleted file mode 100644 index bdaabe9a255..00000000000 --- a/res/cardsfolder/nightmare_incursion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nightmare Incursion -ManaCost:5 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 5 B | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ X | IsCurse$ True | Shuffle$ True | SpellDescription$ 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. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightmare_incursion.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightmare_lash.txt b/res/cardsfolder/nightmare_lash.txt deleted file mode 100644 index 47a56db7e51..00000000000 --- a/res/cardsfolder/nightmare_lash.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nightmare Lash -ManaCost:4 -Types:Artifact Equipment -Text:no text -K:eqPump PayLife<3>:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:Equipped creature gets +1/+1 for each Swamp you control. -SVar:X:Count$Valid Swamp.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightmare_lash.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightmare_void.txt b/res/cardsfolder/nightmare_void.txt deleted file mode 100644 index 2893faab4f0..00000000000 --- a/res/cardsfolder/nightmare_void.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nightmare Void -ManaCost:3 B -Types:Sorcery -Text:no text -K:Dredge 2 -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | Mode$ RevealYouChoose | NumCards$ 1 | SpellDescription$ Target player reveals his or her hand. You choose a card from it. That player discards that card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightmare_void.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nights_whisper.txt b/res/cardsfolder/nights_whisper.txt deleted file mode 100644 index 9f427427473..00000000000 --- a/res/cardsfolder/nights_whisper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Night's Whisper -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 B | NumCards$ 2 | SubAbility$ SVar=DBLoseLife | SpellDescription$ You draw two cards and you lose 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51178.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightscape_apprentice.txt b/res/cardsfolder/nightscape_apprentice.txt deleted file mode 100644 index fcf64394e20..00000000000 --- a/res/cardsfolder/nightscape_apprentice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nightscape Apprentice -ManaCost:B -Types:Creature Zombie Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightscape_apprentice.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightscape_familiar.txt b/res/cardsfolder/nightscape_familiar.txt deleted file mode 100644 index 54139ac11d1..00000000000 --- a/res/cardsfolder/nightscape_familiar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightscape Familiar -ManaCost:1 B -Types:Creature Zombie -Text:Blue spells and red spells you cast cost 1 less to cast. -PT:1/1 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -K:CostChange:Player:Less:1:Spell:blue/red:All:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightscape_familiar.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightscape_master.txt b/res/cardsfolder/nightscape_master.txt deleted file mode 100644 index 6d0d5df2f4f..00000000000 --- a/res/cardsfolder/nightscape_master.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightscape Master -ManaCost:2 B B -Types:Creature Zombie Wizard -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ U U T | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -A:AB$ DealDamage | Cost$ R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightscape_master.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightshade_schemers.txt b/res/cardsfolder/nightshade_schemers.txt deleted file mode 100644 index 158f63f67f0..00000000000 --- a/res/cardsfolder/nightshade_schemers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightshade Schemers -ManaCost:4 B -Types:Creature Faerie Wizard -Text: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. -PT:3/2 -K:Flying -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightshade_schemers.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightshade_stinger.txt b/res/cardsfolder/nightshade_stinger.txt deleted file mode 100644 index 7690fe54884..00000000000 --- a/res/cardsfolder/nightshade_stinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightshade Stinger -ManaCost:B -Types:Creature Faerie Rogue -Text:no text -PT:1/1 -K:Flying -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139456.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightsky_mimic.txt b/res/cardsfolder/nightsky_mimic.txt deleted file mode 100644 index 51e46135049..00000000000 --- a/res/cardsfolder/nightsky_mimic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nightsky Mimic -ManaCost:1 WB -Types:Creature Shapeshifter -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.White+Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a spell that's both white and black, CARDNAME becomes 4/4 and gains flying until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 4 | Keywords$ Flying -SVar:BuffedBy:Spell.Black+White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightsky_mimic.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightsoil_kami.txt b/res/cardsfolder/nightsoil_kami.txt deleted file mode 100644 index b2c84804603..00000000000 --- a/res/cardsfolder/nightsoil_kami.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nightsoil Kami -ManaCost:4 G G -Types:Creature Spirit -Text:no text -PT:6/4 -K:Soulshift:5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightsoil_kami.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightstalker_engine.txt b/res/cardsfolder/nightstalker_engine.txt deleted file mode 100644 index 5feaa400f55..00000000000 --- a/res/cardsfolder/nightstalker_engine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nightstalker Engine -ManaCost:4 B -Types:Creature Nightstalker -Text:no text -PT:*/3 -K:stSetPT:Count$TypeInYourYard.Creature:3:CARDNAME's power is equal to the number of creature cards in your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightstalker_engine.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightwind_glider.txt b/res/cardsfolder/nightwind_glider.txt deleted file mode 100644 index 3d89ada0f79..00000000000 --- a/res/cardsfolder/nightwind_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightwind Glider -ManaCost:2 W -Types:Creature Human Rebel -Text:no text -PT:2/1 -K:Flying -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightwind_glider.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nightwing_shade.txt b/res/cardsfolder/nightwing_shade.txt deleted file mode 100644 index 341af38c568..00000000000 --- a/res/cardsfolder/nightwing_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nightwing Shade -ManaCost:4 B -Types:Creature Shade -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ 1 B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nightwing_shade.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/109.jpg -End diff --git a/res/cardsfolder/nihil_spellbomb.txt b/res/cardsfolder/nihil_spellbomb.txt deleted file mode 100644 index 1e47df158c0..00000000000 --- a/res/cardsfolder/nihil_spellbomb.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nihil Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Exile all cards from target player's graveyard. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay B. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ B | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nihil_spellbomb.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nihilistic_glee.txt b/res/cardsfolder/nihilistic_glee.txt deleted file mode 100644 index d5703e28b92..00000000000 --- a/res/cardsfolder/nihilistic_glee.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nihilistic Glee -ManaCost:2 B B -Types:Enchantment -Text:no text -A:AB$ LoseLife | Cost$ 2 B Discard<1/Card> | ValidTgts$ Opponent | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target opponent loses 1 life and you gain 1 life. -A:AB$ Draw | Cost$ 1 PayLife<2> | NumCards$ 1 | ActivatingCardsInHand$ 0 | PrecostDesc$ Hellbent - | SpellDescription$ Draw a card. Activate this ability only if you have no cards in hand. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nihilistic_glee.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nihilith.txt b/res/cardsfolder/nihilith.txt deleted file mode 100644 index 04683adf457..00000000000 --- a/res/cardsfolder/nihilith.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nihilith -ManaCost:4 B B -Types:Creature Horror -Text:no text -PT:4/4 -K:Fear -K:Suspend:7:1 B -T:Mode$ ChangesZone | ValidCard$ Card.YouDontCtrl | Origin$ Any | Destination$ Graveyard | IsPresent$ Card.Self+countersGE1TIME | PresentZone$ Exile | TriggerZones$ Exile | Execute$ TrigRemoveCounter | OptionalDecider$ You | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, if CARDNAME is suspended, you may remove a time counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nihilith.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nikko_onna.txt b/res/cardsfolder/nikko_onna.txt deleted file mode 100644 index 830ad99e625..00000000000 --- a/res/cardsfolder/nikko_onna.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nikko-Onna -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Choose target enchantment -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nikko_onna.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nim_abomination.txt b/res/cardsfolder/nim_abomination.txt deleted file mode 100644 index acd61a1db40..00000000000 --- a/res/cardsfolder/nim_abomination.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nim Abomination -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:3/4 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+untapped | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your end step, if CARDNAME is untapped, you lose 3 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_abomination.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/49.jpg -End diff --git a/res/cardsfolder/nim_devourer.txt b/res/cardsfolder/nim_devourer.txt deleted file mode 100644 index 676fb3561c5..00000000000 --- a/res/cardsfolder/nim_devourer.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nim Devourer -ManaCost:3 B B -Types:Creature Zombie -Text:no text -PT:4/1 -K:stPumpSelf:Creature:X/0:no Condition:CARDNAME gets +1/+0 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -A:AB$ ChangeZone | Cost$ B B | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | PlayerTurn$ True | ActivatingPhases$ Upkeep | SubAbility$ SVar=DBSac | SpellDescription$ Return CARDNAME from your graveyard to the battlefield, then sacrifice a creature. Activate this ability only during your upkeep. -SVar:DBSac:DB$Sacrifice | Defined$ You | SacValid$ Creature -SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_devourer.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/70.jpg -End diff --git a/res/cardsfolder/nim_grotesque.txt b/res/cardsfolder/nim_grotesque.txt deleted file mode 100644 index 3e02d1de103..00000000000 --- a/res/cardsfolder/nim_grotesque.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nim Grotesque -ManaCost:6 B -Types:Creature Zombie -Text:no text -PT:3/6 -K:stPumpSelf:Creature:X/0:no Condition:Nim Grotesque gets +1/+0 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_grotesque.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nim_lasher.txt b/res/cardsfolder/nim_lasher.txt deleted file mode 100644 index b54b4e9cbbe..00000000000 --- a/res/cardsfolder/nim_lasher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nim Lasher -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:1/1 -K:stPumpSelf:Creature:X/0:no Condition:Nim Lasher gets +1/+0 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_lasher.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nim_replica.txt b/res/cardsfolder/nim_replica.txt deleted file mode 100644 index 2983650059a..00000000000 --- a/res/cardsfolder/nim_replica.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nim Replica -ManaCost:3 -Types:Artifact Creature Zombie -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ 2 B Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_replica.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nim_shambler.txt b/res/cardsfolder/nim_shambler.txt deleted file mode 100644 index f113ca6ef93..00000000000 --- a/res/cardsfolder/nim_shambler.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nim Shambler -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:2/1 -K:stPumpSelf:Creature:X/0:no Condition:Nim Lasher gets +1/+0 for each artifact you control. -A:AB$ Regenerate | Cost$ Sac<1/Artifact> | SpellDescription$ Regenerate Nim Shambler. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:BuffedBy:Artifact -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_shambler.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nim_shrieker.txt b/res/cardsfolder/nim_shrieker.txt deleted file mode 100644 index 045fd2804d5..00000000000 --- a/res/cardsfolder/nim_shrieker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nim Shrieker -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:0/1 -K:Flying -K:stPumpSelf:Creature:X/0:no Condition:Nim Shrieker gets +1/+0 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nim_shrieker.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nimana_sell_sword.txt b/res/cardsfolder/nimana_sell_sword.txt deleted file mode 100644 index ed5772bc2c0..00000000000 --- a/res/cardsfolder/nimana_sell_sword.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nimana Sell-Sword -ManaCost:3 B -Types:Creature Human Warrior Ally -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nimana_sell_sword.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nimble_mongoose.txt b/res/cardsfolder/nimble_mongoose.txt deleted file mode 100644 index 3c5ef5212ef..00000000000 --- a/res/cardsfolder/nimble_mongoose.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nimble Mongoose -ManaCost:G -Types:Creature Mongoose -Text:no text -PT:1/1 -K:Shroud -K:stPumpSelf:Creature:2/2:Threshold:Threshold - Nimble Mongoose gets +2/+2 as long as seven or more cards are in your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nimble_mongoose.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nimbus_maze.txt b/res/cardsfolder/nimbus_maze.txt deleted file mode 100644 index 28ea605aae0..00000000000 --- a/res/cardsfolder/nimbus_maze.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nimbus Maze -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | IsPresent$ Island.YouCtrl | SpellDescription$ Add W to your mana pool. Activate this ability only if you control an Island. -A:AB$ Mana | Cost$ T | Produced$ U | IsPresent$ Plains.YouCtrl | SpellDescription$ Add U to your mana pool. Activate this ability only if you control a Plains. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nimbus_maze.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nimbus_wings.txt b/res/cardsfolder/nimbus_wings.txt deleted file mode 100644 index 1c3997c3e8c..00000000000 --- a/res/cardsfolder/nimbus_wings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nimbus Wings -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+2/Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nimbus_wings.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nine_ringed_bo.txt b/res/cardsfolder/nine_ringed_bo.txt deleted file mode 100644 index ad1168e8bc8..00000000000 --- a/res/cardsfolder/nine_ringed_bo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nine-Ringed Bo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.Spirit | NumDmg$ 1 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 1 damage to target Spirit creature. If that creature would be put into a graveyard this turn, exile it instead. -SVar:DB:DB$Pump | KW$ HIDDEN If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nine_ringed_bo.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ninja_of_the_deep_hours.txt b/res/cardsfolder/ninja_of_the_deep_hours.txt deleted file mode 100644 index 046620d2bdc..00000000000 --- a/res/cardsfolder/ninja_of_the_deep_hours.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ninja of the Deep Hours -ManaCost:3 U -Types:Creature Human Ninja -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 1 U Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 1 U | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (1 U, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDraw | OptionalDecider$ You | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ninja_of_the_deep_hours.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nip_gwyllion.txt b/res/cardsfolder/nip_gwyllion.txt deleted file mode 100644 index ffa7e9b6d4e..00000000000 --- a/res/cardsfolder/nip_gwyllion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Nip Gwyllion -ManaCost:WB -Types:Creature Hag -Text:no text -PT:1/1 -K:Lifelink -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nip_gwyllion.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nirkana_cutthroat.txt b/res/cardsfolder/nirkana_cutthroat.txt deleted file mode 100644 index a70efe065cb..00000000000 --- a/res/cardsfolder/nirkana_cutthroat.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Nirkana Cutthroat -ManaCost:2 B -Types:Creature Vampire Warrior -Text:no text -PT:3/2 -K:stSetPT:3:2:LevelGE1:4:3:LevelGE3:5:4:LEVEL 1-2 4/3 Deathtouch LEVEL 3+ 5/4 First strike, Deathtouch -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/Deathtouch:No Condition:no text -K:stPumpSelf:Creature.countersGE3LEVEL:0/0/First Strike:No Condition:no text -K:Level up:2 B -K:maxLevel:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nirkana_cutthroat.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nirkana_revenant.txt b/res/cardsfolder/nirkana_revenant.txt deleted file mode 100644 index 21c38eb73eb..00000000000 --- a/res/cardsfolder/nirkana_revenant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nirkana Revenant -ManaCost:4 B B -Types:Creature Vampire Shade -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -T:Mode$ TapsForMana | ValidCard$ Swamp.YouCtrl | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ Whenever you tap a Swamp for mana, add B to your mana pool (in addition to the mana the land produces). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ B | Amount$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/nirkana_revenant.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nissa_revane.txt b/res/cardsfolder/nissa_revane.txt deleted file mode 100644 index a96e1513547..00000000000 --- a/res/cardsfolder/nissa_revane.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nissa Revane -ManaCost:2 G G -Types:Planeswalker Nissa -Text:no text -Loyalty:2 -A:AB$ ChangeZone | Cost$ AddCounter<1/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.namedNissa's Chosen | ChangeNum$ 1 | Planeswalker$ True | SpellDescription$ Search your library for a card named Nissa's Chosen and put it onto the battlefield. Then shuffle your library. -A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | LifeAmount$ XLife | Planeswalker$ True | SpellDescription$ You gain 2 life for each Elf you control. -A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.Elf | ChangeNum$ XFetch | Planeswalker$ True | SpellDescription$ Search your library for any number of Elf creature cards and put them onto the battlefield. Then shuffle your library. -SVar:XLife:Count$TypeYouCtrl.Elf/Times.2 -SVar:XFetch:Count$TypeInYourLibrary.Elf -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/nissa_revane.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nissas_chosen.txt b/res/cardsfolder/nissas_chosen.txt deleted file mode 100644 index ffd312afd51..00000000000 --- a/res/cardsfolder/nissas_chosen.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nissa's Chosen -ManaCost:G G -Types:Creature Elf Warrior -Text:If Nissa's Chosen would be put into a graveyard from the battlefield, put it on the bottom of its owner's library instead. -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nissas_chosen.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/niv_mizzet_the_firemind.txt b/res/cardsfolder/niv_mizzet_the_firemind.txt deleted file mode 100644 index 9f6d46344db..00000000000 --- a/res/cardsfolder/niv_mizzet_the_firemind.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Niv-Mizzet, the Firemind -ManaCost:2 U U R R -Types:Legendary Creature Dragon Wizard -Text:no text -PT:4/4 -K:Flying -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. -T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you draw a card, CARDNAME deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/niv_mizzet_the_firemind.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/123.jpg -End diff --git a/res/cardsfolder/niveous_wisps.txt b/res/cardsfolder/niveous_wisps.txt deleted file mode 100644 index 7ea5bbb1a81..00000000000 --- a/res/cardsfolder/niveous_wisps.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Niveous Wisps -ManaCost:W -Types:Instant -Text:no text -A:SP$ Animate | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ White | OverwriteColors$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature becomes white until end of turn. Tap that creature. Draw a card. -SVar:DBDraw:DB$Draw | SubAbility$ SVar=DBTap | NumCards$ 1 -SVar:DBTap:DB$Tap | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/niveous_wisps.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/no_dachi.txt b/res/cardsfolder/no_dachi.txt deleted file mode 100644 index 1956869c556..00000000000 --- a/res/cardsfolder/no_dachi.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:No-Dachi -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +2/+0 and has first strike. -K:eqPump 3:+2/+0/First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/no_dachi.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/no_mercy.txt b/res/cardsfolder/no_mercy.txt deleted file mode 100644 index cb519e93dde..00000000000 --- a/res/cardsfolder/no_mercy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:No Mercy -ManaCost:2 B B -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ You | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature deals damage to you, destroy it. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredSource -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/no_mercy.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nobilis_of_war.txt b/res/cardsfolder/nobilis_of_war.txt deleted file mode 100644 index f9f0330a26f..00000000000 --- a/res/cardsfolder/nobilis_of_war.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nobilis of War -ManaCost:RW RW RW RW RW -Types:Creature Spirit Avatar -Text:no text -PT:3/4 -K:Flying -K:stPumpAll:Creature.attacking+YouCtrl:2/0:No Condition:Attacking creatures you control get +2/+0. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nobilis_of_war.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_benefactor.txt b/res/cardsfolder/noble_benefactor.txt deleted file mode 100644 index c87b155c379..00000000000 --- a/res/cardsfolder/noble_benefactor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Noble Benefactor -ManaCost:2 U -Types:Creature Human Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, 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. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ Each | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Shuffle$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_benefactor.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_hierarch.txt b/res/cardsfolder/noble_hierarch.txt deleted file mode 100644 index 6b71f9281ef..00000000000 --- a/res/cardsfolder/noble_hierarch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Noble Hierarch -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:0/1 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Exalted -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_hierarch.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_panther.txt b/res/cardsfolder/noble_panther.txt deleted file mode 100644 index a422b806acd..00000000000 --- a/res/cardsfolder/noble_panther.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Noble Panther -ManaCost:1 G W -Types:Creature Cat -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_panther.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/257.jpg -End diff --git a/res/cardsfolder/noble_purpose.txt b/res/cardsfolder/noble_purpose.txt deleted file mode 100644 index 3849b21fa60..00000000000 --- a/res/cardsfolder/noble_purpose.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Noble Purpose -ManaCost:3 W W -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | Execute$ TrigGain | TriggerZones$ Battlefield | CombatDamage$ True | TriggerDescription$ Whenever a creature you control deals combat damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_purpose.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/31.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_stand.txt b/res/cardsfolder/noble_stand.txt deleted file mode 100644 index e98f4315e9b..00000000000 --- a/res/cardsfolder/noble_stand.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Noble Stand -ManaCost:4 W -Types:Enchantment -Text:no text -T:Mode$ Blocks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature you control blocks, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_stand.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_steeds.txt b/res/cardsfolder/noble_steeds.txt deleted file mode 100644 index 3767b67803a..00000000000 --- a/res/cardsfolder/noble_steeds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Noble Steeds -ManaCost:2 W -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_steeds.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/140.jpg|2 -End diff --git a/res/cardsfolder/noble_templar.txt b/res/cardsfolder/noble_templar.txt deleted file mode 100644 index fe980c89591..00000000000 --- a/res/cardsfolder/noble_templar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Noble Templar -ManaCost:5 W -Types:Creature Human Cleric Soldier -Text:no text -PT:3/6 -K:Vigilance -K:TypeCycling:Plains:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_templar.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noble_vestige.txt b/res/cardsfolder/noble_vestige.txt deleted file mode 100644 index 66cbd4f24d0..00000000000 --- a/res/cardsfolder/noble_vestige.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Noble Vestige -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:1/2 -K:Flying -A:AB$ PreventDamage | Cost$ T | ValidTarget$ Player | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/noble_vestige.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nocturnal_raid.txt b/res/cardsfolder/nocturnal_raid.txt deleted file mode 100644 index 24781699919..00000000000 --- a/res/cardsfolder/nocturnal_raid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nocturnal Raid -ManaCost:2 B B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 B B | ValidCards$ Creature.Black | NumAtt$ +2 | SpellDescription$ Black creatures get +2/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card25633.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/30.jpg -End - - - diff --git a/res/cardsfolder/noggle_bandit.txt b/res/cardsfolder/noggle_bandit.txt deleted file mode 100644 index 5c118051d4c..00000000000 --- a/res/cardsfolder/noggle_bandit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Noggle Bandit -ManaCost:1 UR UR -Types:Creature Noggle Rogue -Text:CARDNAME can't be blocked except by creatures with defender. -PT:2/2 -K:CantBeBlockedBy Creature.withoutDefender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/noggle_bandit.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noggle_bridgebreaker.txt b/res/cardsfolder/noggle_bridgebreaker.txt deleted file mode 100644 index 9bc2ee83947..00000000000 --- a/res/cardsfolder/noggle_bridgebreaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Noggle Bridgebreaker -ManaCost:2 UR UR -Types:Creature Noggle Rogue -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/noggle_bridgebreaker.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noggle_hedge_mage.txt b/res/cardsfolder/noggle_hedge_mage.txt deleted file mode 100644 index df3506dda5e..00000000000 --- a/res/cardsfolder/noggle_hedge_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Noggle Hedge-Mage -ManaCost:2 UR -Types:Creature Noggle Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Island.YouCtrl | PresentCompare$ GE2 | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Islands, you may tap two target permanents. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Mountain.YouCtrl | PresentCompare$ GE2 | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Mountains, you may have CARDNAME deal 2 damage to target player. -SVar:TrigTap:AB$Tap | Cost$ 0 | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Permanent -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noggle_hedge_mage.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noggle_ransacker.txt b/res/cardsfolder/noggle_ransacker.txt deleted file mode 100644 index cbb2defcf42..00000000000 --- a/res/cardsfolder/noggle_ransacker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Noggle Ransacker -ManaCost:2 UR -Types:Creature Noggle Rogue -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, each player draws two cards, then discards a card at random. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ Each | NumCards$ 2 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Each | Mode$ Random | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noggle_ransacker.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nomad_stadium.txt b/res/cardsfolder/nomad_stadium.txt deleted file mode 100644 index 985bb5627f1..00000000000 --- a/res/cardsfolder/nomad_stadium.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nomad Stadium -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ GainLife | Cost$ W T Sac<1/CARDNAME> | LifeAmount$ 4 | Threshold$ True | PrecostDesc$ Threshold - | SpellDescription$ You gain 4 life. Activate this ability only if seven or more cards are in your graveyard. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nomad_stadium.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nomadic_elf.txt b/res/cardsfolder/nomadic_elf.txt deleted file mode 100644 index 88d87c8a47f..00000000000 --- a/res/cardsfolder/nomadic_elf.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Nomadic Elf -ManaCost:1 G -Types:Creature Elf Nomad -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ 1 G | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 G | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 G | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 G | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 G | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nomadic_elf.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/northern_paladin.txt b/res/cardsfolder/northern_paladin.txt deleted file mode 100644 index a9e55bb14dc..00000000000 --- a/res/cardsfolder/northern_paladin.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Northern Paladin -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ W W T | ValidTgts$ Permanent.Black | TgtPrompt$ Select target black permanent | SpellDescription$ Destroy target black permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/northern_paladin.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/213.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/215.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/28.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/287.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/213.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/norwood_archers.txt b/res/cardsfolder/norwood_archers.txt deleted file mode 100644 index ea938771e2e..00000000000 --- a/res/cardsfolder/norwood_archers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Norwood Archers -ManaCost:3 G -Types:Creature Elf Archer -Text:no text -PT:3/3 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21054.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/76.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/norwood_priestess.txt b/res/cardsfolder/norwood_priestess.txt deleted file mode 100644 index ddfcc829ed0..00000000000 --- a/res/cardsfolder/norwood_priestess.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Norwood Priestess -ManaCost:2 G G -Types:Creature Elf Druid -Text:no text -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Green | ChangeNum$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ You may put a green creature card from your hand onto the battlefield. Activate this ability only during your turn, before attackers are declared. -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/norwood_priestess.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/norwood_ranger.txt b/res/cardsfolder/norwood_ranger.txt deleted file mode 100644 index 838753979fa..00000000000 --- a/res/cardsfolder/norwood_ranger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Norwood Ranger -ManaCost:G -Types:Creature Elf Scout -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83188.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/271.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/78.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/138.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/norwood_riders.txt b/res/cardsfolder/norwood_riders.txt deleted file mode 100644 index 8a3576a1539..00000000000 --- a/res/cardsfolder/norwood_riders.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Norwood Riders -ManaCost:3 G -Types:Creature Elf -Text:no text -PT:3/3 -K:CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6615.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/norwood_warrior.txt b/res/cardsfolder/norwood_warrior.txt deleted file mode 100644 index 667238bd153..00000000000 --- a/res/cardsfolder/norwood_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Norwood Warrior -ManaCost:2 G -Types:Creature Elf Warrior -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/norwood_warrior.jpg -SVar:Rarity:Common -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/80.jpg -End diff --git a/res/cardsfolder/nosy_goblin.txt b/res/cardsfolder/nosy_goblin.txt deleted file mode 100644 index 53feb9b1a67..00000000000 --- a/res/cardsfolder/nosy_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nosy Goblin -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:2/1 -A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.faceDown | TgtPrompt$ Select target face-down creature | SpellDescription$ Destroy target face-down creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nosy_goblin.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/notorious_assassin.txt b/res/cardsfolder/notorious_assassin.txt deleted file mode 100644 index 3dc78923258..00000000000 --- a/res/cardsfolder/notorious_assassin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Notorious Assassin -ManaCost:3 B -Types:Creature Human Spellshaper Assassin -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ 2 B T Discard<1/Card> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/notorious_assassin.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/150.jpg -End diff --git a/res/cardsfolder/nourish.txt b/res/cardsfolder/nourish.txt deleted file mode 100644 index 14b4d0bc276..00000000000 --- a/res/cardsfolder/nourish.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Nourish -ManaCost:G G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ G G | LifeAmount$ 6 | SpellDescription$ You gain 6 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nourish.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/78.jpg -End diff --git a/res/cardsfolder/nourishing_shoal.txt b/res/cardsfolder/nourishing_shoal.txt deleted file mode 100644 index 89465675d38..00000000000 --- a/res/cardsfolder/nourishing_shoal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nourishing Shoal -ManaCost:X G G -Types:Instant Arcane -Text:no text -A:SP$ GainLife | Cost$ X G G | LifeAmount$ X | SpellDescription$ You gain X life. -A:SP$ GainLife | Cost$ ExileFromHand<1/Card.Green> | CostDesc$ You may exile a green card from your hand rather than pay CARDNAME's mana cost. | LifeAmount$ Y | SpellDescription$ You gain X life, where X is the exiled card's converted mana cost. -SVar:X:Count$xPaid -SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nourishing_shoal.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nova_chaser.txt b/res/cardsfolder/nova_chaser.txt deleted file mode 100644 index 79a7fd1cee3..00000000000 --- a/res/cardsfolder/nova_chaser.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nova Chaser -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:10/2 -K:Trample -K:Champion:Elemental -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nova_chaser.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nova_cleric.txt b/res/cardsfolder/nova_cleric.txt deleted file mode 100644 index b32215363f8..00000000000 --- a/res/cardsfolder/nova_cleric.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nova Cleric -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ DestroyAll | Cost$ 2 W T Sac<1/CARDNAME> | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nova_cleric.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/novablast_wurm.txt b/res/cardsfolder/novablast_wurm.txt deleted file mode 100644 index c4e46731146..00000000000 --- a/res/cardsfolder/novablast_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Novablast Wurm -ManaCost:3 G G W W -Types:Creature Wurm -Text:no text -PT:7/7 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ Whenever CARDNAME attacks, destroy all other creatures. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.Other -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/novablast_wurm.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/novijen_heart_of_progress.txt b/res/cardsfolder/novijen_heart_of_progress.txt deleted file mode 100644 index 42385034f44..00000000000 --- a/res/cardsfolder/novijen_heart_of_progress.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Novijen, Heart of Progress -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/novijen_heart_of_progress.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noxious_field.txt b/res/cardsfolder/noxious_field.txt deleted file mode 100644 index 898aa115ef0..00000000000 --- a/res/cardsfolder/noxious_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Noxious Field -ManaCost:2 B B -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=DamageAll:No Condition:Enchanted land has "tap: This land deals 1 damage to each creature and player." -SVar:DamageAll:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noxious_field.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/70.jpg -End diff --git a/res/cardsfolder/noxious_ghoul.txt b/res/cardsfolder/noxious_ghoul.txt deleted file mode 100644 index 6773bb1954a..00000000000 --- a/res/cardsfolder/noxious_ghoul.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Noxious Ghoul -ManaCost:3 B B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME or another Zombie enters the battlefield, all non-Zombie creatures get -1/-1 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Zombie.Other | Execute$ TrigPumpAll | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Zombie enters the battlefield, all non-Zombie creatures get -1/-1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.nonZombie | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noxious_ghoul.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noxious_hatchling.txt b/res/cardsfolder/noxious_hatchling.txt deleted file mode 100644 index 23c7d489e57..00000000000 --- a/res/cardsfolder/noxious_hatchling.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Noxious Hatchling -ManaCost:3 BG -Types:Creature Elemental -Text:no text -PT:6/6 -K:etbCounter:M1M1:4 -K:Wither -T:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a black spell, remove a -1/-1 counter from CARDNAME. -T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a green spell, remove a -1/-1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:BuffedBy:Spell.Black,Spell.Green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noxious_hatchling.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noxious_revival.txt b/res/cardsfolder/noxious_revival.txt deleted file mode 100644 index ceb24294ed4..00000000000 --- a/res/cardsfolder/noxious_revival.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Noxious Revival -ManaCost:PG -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ PG | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | SpellDescription$ Put target card from a graveyard on top of its owner's library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/noxious_revival.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/noxious_toad.txt b/res/cardsfolder/noxious_toad.txt deleted file mode 100644 index 688ebf0c92b..00000000000 --- a/res/cardsfolder/noxious_toad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Noxious Toad -ManaCost:2 B -Types:Creature Frog -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:SacMe:1 -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/noxious_toad.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nucklavee.txt b/res/cardsfolder/nucklavee.txt deleted file mode 100644 index d5a4dff2cba..00000000000 --- a/res/cardsfolder/nucklavee.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Nucklavee -ManaCost:4 UR UR -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZoneRed | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target red sorcery card from your graveyard to your hand. -SVar:TrigChangeZoneRed:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Sorcery.Red+YouCtrl -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZoneBlue | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target blue instant card from your graveyard to your hand. -SVar:TrigChangeZoneBlue:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.Blue+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nucklavee.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/null_brooch.txt b/res/cardsfolder/null_brooch.txt deleted file mode 100644 index 6424f0dd4bb..00000000000 --- a/res/cardsfolder/null_brooch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Null Brooch -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Counter | Cost$ 2 T Discard<0/Hand> | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature| SpellDescription$ Counter target noncreature spell. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/null_brooch.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/null_champion.txt b/res/cardsfolder/null_champion.txt deleted file mode 100644 index a538c71f312..00000000000 --- a/res/cardsfolder/null_champion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Null Champion -ManaCost:1 B -Types:Creature Zombie Warrior -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:4:2:LevelGE4:7:3:LEVEL 1-3 4/2 LEVEL 4+ 7/3 B: Regenerate Null Champion. -K:stPumpSelf:Creature.countersGE4LEVEL:0/0/SVar=Regen:No Condition:no text -K:Level up:3 -K:maxLevel:4 -SVar:Regen:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/null_champion.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/null_profusion.txt b/res/cardsfolder/null_profusion.txt deleted file mode 100644 index 92648ff5e52..00000000000 --- a/res/cardsfolder/null_profusion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Null Profusion -ManaCost:4 B B -Types:Enchantment -Text:Skip your draw step. Your maximum hand size is 2. -# hardcoded for draw step to be skipped in r6069. -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. -T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:HandSize = 2 Self -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/null_profusion.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/null_rod.txt b/res/cardsfolder/null_rod.txt deleted file mode 100644 index a8af40b2c19..00000000000 --- a/res/cardsfolder/null_rod.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Null Rod -ManaCost:2 -Types:Artifact -Text:no text -K:stPumpAll:Artifact:0/0/HIDDEN CARDNAME's activated abilities can't be activated.:No Condition:Activated abilities of artifacts can't be activated. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/null_rod.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nullmage_advocate.txt b/res/cardsfolder/nullmage_advocate.txt deleted file mode 100644 index e52c3136c5a..00000000000 --- a/res/cardsfolder/nullmage_advocate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nullmage Advocate -ManaCost:2 G -Types:Creature Insect Druid -Text:no text -PT:2/3 -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.YouDontCtrl | TargetMin$ 2 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBDestroy | SpellDescription$ Return two target cards from an opponent's graveyard to his or her hand. Destroy target artifact or enchantment. -SVar:DBDestroy:DB$Destroy | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nullmage_advocate.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nullmage_shepherd.txt b/res/cardsfolder/nullmage_shepherd.txt deleted file mode 100644 index 750909cc12a..00000000000 --- a/res/cardsfolder/nullmage_shepherd.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nullmage Shepherd -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -PT:2/4 -A:AB$ Destroy | Cost$ tapXType<4/Creature> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nullmage_shepherd.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nulltread_gargantuan.txt b/res/cardsfolder/nulltread_gargantuan.txt deleted file mode 100644 index 923222f857e..00000000000 --- a/res/cardsfolder/nulltread_gargantuan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nulltread Gargantuan -ManaCost:1 G U -Types:Creature Beast -Text:no text -PT:5/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, put a creature you control on top of its owner's library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | Hidden$ True | ChangeType$ Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/nulltread_gargantuan.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/numai_outcast.txt b/res/cardsfolder/numai_outcast.txt deleted file mode 100755 index 0d008e997f9..00000000000 --- a/res/cardsfolder/numai_outcast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Numai Outcast -ManaCost:3 B -Types:Creature Human Samurai -Text:no text -PT:1/1 -K:Bushido 2 -A:AB$ Regenerate | Cost$ B PayLife<5> | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/numai_outcast.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/numot_the_devastator.txt b/res/cardsfolder/numot_the_devastator.txt deleted file mode 100644 index 03c29e311c2..00000000000 --- a/res/cardsfolder/numot_the_devastator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Numot, the Devastator -ManaCost:3 R W U -Types:Legendary Creature Dragon -Text:no text -PT:6/6 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay 2 R. If you do, destroy up to two target lands. -SVar:TrigDestroy:AB$ Destroy | Cost$ 2 R | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/numot_the_devastator.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nurturer_initiate.txt b/res/cardsfolder/nurturer_initiate.txt deleted file mode 100644 index a75b4db1da1..00000000000 --- a/res/cardsfolder/nurturer_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nurturer Initiate -ManaCost:G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a player casts a green spell, you may pay 1. If you do, target creature gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/nurturer_initiate.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nut_collector.txt b/res/cardsfolder/nut_collector.txt deleted file mode 100644 index a4d0cefde57..00000000000 --- a/res/cardsfolder/nut_collector.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Nut Collector -ManaCost:5 G -Types:Creature Human Druid -Text:no text -PT:1/1 -K:stPumpAll:Creature.Squirrel:2/2:Threshold:Threshold - Squirrel creatures get +2/+2 as long as seven or more cards are in your graveyard. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ At the beginning of your upkeep, you may put a 1/1 green Squirrel creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nut_collector.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/nyxathid.txt b/res/cardsfolder/nyxathid.txt deleted file mode 100644 index 6e5c307c1f7..00000000000 --- a/res/cardsfolder/nyxathid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Nyxathid -ManaCost:1 B B -Types:Creature Elemental -Text:As CARDNAME enters the battlefield, choose an opponent. -PT:7/7 -K:stPumpSelf:Permanent:-X/-X:No Condition:CARDNAME gets -1/-1 for each card in the chosen player's hand. -SVar:X:Count$InOppHand/Negative -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/nyxathid.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oaken_brawler.txt b/res/cardsfolder/oaken_brawler.txt deleted file mode 100644 index 5ed7baeb085..00000000000 --- a/res/cardsfolder/oaken_brawler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oaken Brawler -ManaCost:3 W -Types:Creature Treefolk Warrior -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on CARDNAME. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oaken_brawler.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oakenform.txt b/res/cardsfolder/oakenform.txt deleted file mode 100644 index 62756a4c469..00000000000 --- a/res/cardsfolder/oakenform.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Oakenform -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/+3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oakenform.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oakgnarl_warrior.txt b/res/cardsfolder/oakgnarl_warrior.txt deleted file mode 100644 index 07bb4e853ae..00000000000 --- a/res/cardsfolder/oakgnarl_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oakgnarl Warrior -ManaCost:5 G G -Types:Creature Treefolk Warrior -Text:no text -PT:5/7 -K:Vigilance -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139494.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oasis.txt b/res/cardsfolder/oasis.txt deleted file mode 100644 index 90bdcf526d0..00000000000 --- a/res/cardsfolder/oasis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oasis -ManaCost:no cost -Types:Land -Text:no text -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature | Amount$ 1 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature this turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oasis.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/185.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oath_of_druids.txt b/res/cardsfolder/oath_of_druids.txt deleted file mode 100644 index ee278c6381f..00000000000 --- a/res/cardsfolder/oath_of_druids.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Oath of Druids -ManaCost:1 G -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_druids.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oath_of_ghouls.txt b/res/cardsfolder/oath_of_ghouls.txt deleted file mode 100644 index b90b6ac5ae6..00000000000 --- a/res/cardsfolder/oath_of_ghouls.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Oath of Ghouls -ManaCost:1 B -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_ghouls.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oathsworn_giant.txt b/res/cardsfolder/oathsworn_giant.txt deleted file mode 100644 index f1ab33fa689..00000000000 --- a/res/cardsfolder/oathsworn_giant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oathsworn Giant -ManaCost:4 W W -Types:Creature Giant Soldier -Text:no text -PT:3/4 -K:Vigilance -K:stPumpAll:Creature.Other+YouCtrl:0/2/Vigilance:No Condition:Other creatures you control get +0/+2 and have vigilance. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oathsworn_giant.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ob_nixilis_the_fallen.txt b/res/cardsfolder/ob_nixilis_the_fallen.txt deleted file mode 100644 index 0a8bbf5b7da..00000000000 --- a/res/cardsfolder/ob_nixilis_the_fallen.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ob Nixilis, the Fallen -ManaCost:3 B B -Types:Legendary Creature Demon -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLose | OptionalDecider$ You | TriggerDescription$ 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 CARDNAME. -SVar:TrigLose:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 3 | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 -SVar:BuffedBy:Land -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/ob_nixilis_the_fallen.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_alara.txt b/res/cardsfolder/obelisk_of_alara.txt deleted file mode 100644 index 7010e6cf591..00000000000 --- a/res/cardsfolder/obelisk_of_alara.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Obelisk of Alara -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 1 W T | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -A:AB$ Draw | Cost$ 1 U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -A:AB$ Pump | Cost$ 1 B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target player. -A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_alara.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_bant.txt b/res/cardsfolder/obelisk_of_bant.txt deleted file mode 100644 index 6d394f88750..00000000000 --- a/res/cardsfolder/obelisk_of_bant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Bant -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_bant.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_esper.txt b/res/cardsfolder/obelisk_of_esper.txt deleted file mode 100644 index 4ad449e92cf..00000000000 --- a/res/cardsfolder/obelisk_of_esper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Esper -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_esper.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_grixis.txt b/res/cardsfolder/obelisk_of_grixis.txt deleted file mode 100644 index 630303e4213..00000000000 --- a/res/cardsfolder/obelisk_of_grixis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Grixis -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_grixis.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_jund.txt b/res/cardsfolder/obelisk_of_jund.txt deleted file mode 100644 index 4365c80d66c..00000000000 --- a/res/cardsfolder/obelisk_of_jund.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Jund -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_jund.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_naya.txt b/res/cardsfolder/obelisk_of_naya.txt deleted file mode 100644 index 0169428d8ca..00000000000 --- a/res/cardsfolder/obelisk_of_naya.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Naya -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_naya.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obelisk_of_undoing.txt b/res/cardsfolder/obelisk_of_undoing.txt deleted file mode 100644 index 803e1035b87..00000000000 --- a/res/cardsfolder/obelisk_of_undoing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obelisk of Undoing -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 6 T | ValidTgts$ Permanent.YouCtrl+YouOwn | TgtPrompt$ Select target permanent you both own and control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent you both own and control to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/obelisk_of_undoing.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/392.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oblation.txt b/res/cardsfolder/oblation.txt deleted file mode 100644 index 0040ee021eb..00000000000 --- a/res/cardsfolder/oblation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Oblation -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDraw| SpellDescription$ The owner of target nonland permanent shuffles it into his or her library, then draws two cards. -SVar:DBDraw:DB$ Draw | Defined$ TargetedOwner | NumCards$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oblation.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obliterate.txt b/res/cardsfolder/obliterate.txt deleted file mode 100644 index 21898f14d45..00000000000 --- a/res/cardsfolder/obliterate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obliterate -ManaCost:6 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 6 R R | ValidCards$ Artifact,Creature,Land | NoRegen$ True | SpellDescription$ Destroy all artifacts, creatures, and lands. They can't be regenerated. -K:CARDNAME can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/obliterate.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/204.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/156.jpg -End diff --git a/res/cardsfolder/oblivion_crown.txt b/res/cardsfolder/oblivion_crown.txt deleted file mode 100644 index c7d638c84b8..00000000000 --- a/res/cardsfolder/oblivion_crown.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Oblivion Crown -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Enchanted | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Enchanted creature gets +1/+1 until end of turn. -K:Flash -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oblivion_crown.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oblivion_ring.txt b/res/cardsfolder/oblivion_ring.txt deleted file mode 100644 index f9e0f0f3f9e..00000000000 --- a/res/cardsfolder/oblivion_ring.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Oblivion Ring -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another target nonland permanent. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:DB$ChangeZone | Cost$ 0 | TargetMin$ 1 | IsCurse$ True | ValidTgts$ Permanent.nonLand+Other | TgtPrompt$ Choose target nonland permanent other than Oblivion Ring | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:DB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139414.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/34.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oboro_breezecaller.txt b/res/cardsfolder/oboro_breezecaller.txt deleted file mode 100644 index 0acf278a148..00000000000 --- a/res/cardsfolder/oboro_breezecaller.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oboro Breezecaller -ManaCost:1 U -Types:Creature Moonfolk Wizard -Text:no text -PT:1/1 -K:Flying -A:AB$ Untap | Cost$ 2 Return<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oboro_breezecaller.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/48.jpg -End diff --git a/res/cardsfolder/oboro_palace_in_the_clouds.txt b/res/cardsfolder/oboro_palace_in_the_clouds.txt deleted file mode 100644 index 8f4e7cb91a3..00000000000 --- a/res/cardsfolder/oboro_palace_in_the_clouds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oboro, Palace in the Clouds -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ ChangeZone | Cost$ 1 | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oboro_palace_in_the_clouds.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obsessive_search.txt b/res/cardsfolder/obsessive_search.txt deleted file mode 100644 index aec3f760693..00000000000 --- a/res/cardsfolder/obsessive_search.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Obsessive Search -ManaCost:U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 1 | SpellDescription$ Draw a card. -K:Madness:U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obsessive_search.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obsianus_golem.txt b/res/cardsfolder/obsianus_golem.txt deleted file mode 100644 index 60d767b2b83..00000000000 --- a/res/cardsfolder/obsianus_golem.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Obsianus Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:4/6 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card15401.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/267.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/269.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/357.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/302.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/268.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obsidian_acolyte.txt b/res/cardsfolder/obsidian_acolyte.txt deleted file mode 100644 index 5fc85d3c84b..00000000000 --- a/res/cardsfolder/obsidian_acolyte.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Obsidian Acolyte -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -K:Protection from black -A:AB$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from black | SpellDescription$ Target creature gains protection from black until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/obsidian_acolyte.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/22.jpg -End diff --git a/res/cardsfolder/obsidian_fireheart.txt b/res/cardsfolder/obsidian_fireheart.txt deleted file mode 100644 index 3eef51a536a..00000000000 --- a/res/cardsfolder/obsidian_fireheart.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Obsidian Fireheart -ManaCost:1 R R R -Types:Creature Elemental -Text:no text -PT:4/4 -A:AB$ PutCounter | Cost$ 1 R R | IsCurse$ True | ValidTgts$ Land.countersEQ0BLAZE | TgtPrompt$ Select target Land without a Blaze Counter | CounterType$ BLAZE | CounterNum$ 1 | SpellDescription$ 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.) -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/obsidian_fireheart.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obsidian_giant.txt b/res/cardsfolder/obsidian_giant.txt deleted file mode 100644 index 03d2bd57750..00000000000 --- a/res/cardsfolder/obsidian_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Obsidian Giant -ManaCost:4 R -Types:Creature Giant -Text:no text -PT:4/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6599.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/obstinate_baloth.txt b/res/cardsfolder/obstinate_baloth.txt deleted file mode 100644 index dfb5c650e43..00000000000 --- a/res/cardsfolder/obstinate_baloth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Obstinate Baloth -ManaCost:2 G G -Types:Creature Beast -Text:no text -PT:4/4 -K: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. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/obstinate_baloth.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ocular_halo.txt b/res/cardsfolder/ocular_halo.txt deleted file mode 100644 index 9809bda5569..00000000000 --- a/res/cardsfolder/ocular_halo.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ocular Halo -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Draw:No Condition:Enchanted creature has "tap: Draw a card." -A:AB$ Pump | Cost$ W | Defined$ Enchanted | KW$ Vigilance | SpellDescription$ Enchanted creature gains vigilance until end of turn. -SVar:Draw:AB$Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ocular_halo.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oculus.txt b/res/cardsfolder/oculus.txt deleted file mode 100644 index d39ff52bf7b..00000000000 --- a/res/cardsfolder/oculus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oculus -ManaCost:1 U -Types:Creature Homonculus -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oculus.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/odious_trow.txt b/res/cardsfolder/odious_trow.txt deleted file mode 100644 index c41b1e99abd..00000000000 --- a/res/cardsfolder/odious_trow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Odious Trow -ManaCost:BG -Types:Creature Troll -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ 1 BG | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/odious_trow.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/odylic_wraith.txt b/res/cardsfolder/odylic_wraith.txt deleted file mode 100644 index fcfb37bef26..00000000000 --- a/res/cardsfolder/odylic_wraith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Odylic Wraith -ManaCost:3 B -Types:Creature Wraith -Text:no text -PT:2/2 -K:Swampwalk -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/odylic_wraith.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/off_balance.txt b/res/cardsfolder/off_balance.txt deleted file mode 100644 index f84cf3a2673..00000000000 --- a/res/cardsfolder/off_balance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Off Balance -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't attack or block. | IsCurse$ True | SpellDescription$ Target creature can't attack or block this turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/off_balance.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/offalsnout.txt b/res/cardsfolder/offalsnout.txt deleted file mode 100644 index 058ced4baea..00000000000 --- a/res/cardsfolder/offalsnout.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Offalsnout -ManaCost:2 B -Types:Creature Elemental -Text:no text -PT:2/2 -K:Flash -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME leaves the battlefield, exile target card from a graveyard. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card -K:Evoke:B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/offalsnout.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/offering_to_asha.txt b/res/cardsfolder/offering_to_asha.txt deleted file mode 100644 index 1696af690f3..00000000000 --- a/res/cardsfolder/offering_to_asha.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Offering to Asha -ManaCost:2 W U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 W U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ Counter target spell unless its controller pays 4. You gain 4 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/offering_to_asha.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_arsonist.txt b/res/cardsfolder/ogre_arsonist.txt deleted file mode 100644 index b810b138e84..00000000000 --- a/res/cardsfolder/ogre_arsonist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ogre Arsonist -ManaCost:4 R -Types:Creature Ogre -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_arsonist.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_berserker.txt b/res/cardsfolder/ogre_berserker.txt deleted file mode 100644 index c8fb0850b0f..00000000000 --- a/res/cardsfolder/ogre_berserker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ogre Berserker -ManaCost:4 R -Types:Creature Ogre Berserker -Text:no text -PT:4/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/ogre_berserker.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_gatecrasher.txt b/res/cardsfolder/ogre_gatecrasher.txt deleted file mode 100644 index 039718e2877..00000000000 --- a/res/cardsfolder/ogre_gatecrasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ogre Gatecrasher -ManaCost:3 R -Types:Creature Ogre Rogue -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target creature with defender. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.withDefender | TgtPrompt$ Select target creature with defender. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_gatecrasher.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_menial.txt b/res/cardsfolder/ogre_menial.txt deleted file mode 100644 index e15177b350b..00000000000 --- a/res/cardsfolder/ogre_menial.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ogre Menial -ManaCost:3 R -Types:Creature Ogre -Text:no text -PT:0/4 -K:Infect -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_menial.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_recluse.txt b/res/cardsfolder/ogre_recluse.txt deleted file mode 100644 index c71d99743b0..00000000000 --- a/res/cardsfolder/ogre_recluse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ogre Recluse -ManaCost:3 R -Types:Creature Ogre Warrior -Text:no text -PT:5/4 -T:Mode$ SpellCast | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell, tap CARDNAME. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ Self -SVar:AntiBuffedBy:Spell -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_recluse.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_resister.txt b/res/cardsfolder/ogre_resister.txt deleted file mode 100644 index 0f9a5f6a9a0..00000000000 --- a/res/cardsfolder/ogre_resister.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ogre Resister -ManaCost:2 R R -Types:Creature Ogre -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_resister.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_sentry.txt b/res/cardsfolder/ogre_sentry.txt deleted file mode 100644 index d06cd2b8b94..00000000000 --- a/res/cardsfolder/ogre_sentry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ogre Sentry -ManaCost:1 R -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_sentry.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_shaman.txt b/res/cardsfolder/ogre_shaman.txt deleted file mode 100644 index 594b70f5c08..00000000000 --- a/res/cardsfolder/ogre_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ogre Shaman -ManaCost:3 R R -Types:Creature Ogre Shaman -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ 2 Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogre_shaman.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_taskmaster.txt b/res/cardsfolder/ogre_taskmaster.txt deleted file mode 100644 index ad192230755..00000000000 --- a/res/cardsfolder/ogre_taskmaster.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ogre Taskmaster -ManaCost:3 R -Types:Creature Ogre -Text:no text -PT:4/3 -K:CARDNAME can't block. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6588.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/205.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/112.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/206.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/205.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogre_warrior.txt b/res/cardsfolder/ogre_warrior.txt deleted file mode 100644 index cd79b03eb71..00000000000 --- a/res/cardsfolder/ogre_warrior.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ogre Warrior -ManaCost:3 R -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p4/en-us/card25476.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/113.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ogres_cleaver.txt b/res/cardsfolder/ogres_cleaver.txt deleted file mode 100644 index c7139be8318..00000000000 --- a/res/cardsfolder/ogres_cleaver.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ogre's Cleaver -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +5/+0. -K:eqPump 5:+5/+0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ogres_cleaver.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ohran_viper.txt b/res/cardsfolder/ohran_viper.txt deleted file mode 100644 index 3f6bc30eda1..00000000000 --- a/res/cardsfolder/ohran_viper.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ohran Viper -ManaCost:1 G G -Types:Snow Creature Snake -Text:no text -PT:1/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy damaged creature at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ohran_viper.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/okiba_gang_shinobi.txt b/res/cardsfolder/okiba_gang_shinobi.txt deleted file mode 100644 index 58262a366e7..00000000000 --- a/res/cardsfolder/okiba_gang_shinobi.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Okiba-Gang Shinobi -ManaCost:3 B B -Types:Creature Rat Ninja -Text:no text -PT:3/2 -A:AB$ ChangeZone | Cost$ 3 B Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 3 B | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (3 B, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 2 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/okiba_gang_shinobi.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/okina_temple_to_the_grandfathers.txt b/res/cardsfolder/okina_temple_to_the_grandfathers.txt deleted file mode 100644 index 35c746a4669..00000000000 --- a/res/cardsfolder/okina_temple_to_the_grandfathers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Okina, Temple to the Grandfathers -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target legendary creature gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/okina_temple_to_the_grandfathers.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/old_ghastbark.txt b/res/cardsfolder/old_ghastbark.txt deleted file mode 100644 index 9f97fb7eaec..00000000000 --- a/res/cardsfolder/old_ghastbark.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Old Ghastbark -ManaCost:3 GW GW -Types:Creature Treefolk Warrior -Text:no text -PT:3/6 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/old_ghastbark.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/old_man_of_the_sea.txt b/res/cardsfolder/old_man_of_the_sea.txt deleted file mode 100644 index 88e2be57188..00000000000 --- a/res/cardsfolder/old_man_of_the_sea.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Old Man of the Sea -ManaCost:1 U U -Types:Creature Djinn -Text:no text -PT:2/3 -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to Old Man's. | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ 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. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/old_man_of_the_sea.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/omega_myr.txt b/res/cardsfolder/omega_myr.txt deleted file mode 100644 index 4201c2945e9..00000000000 --- a/res/cardsfolder/omega_myr.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Omega Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card48605.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/omen.txt b/res/cardsfolder/omen.txt deleted file mode 100644 index 55e3c3ebd4a..00000000000 --- a/res/cardsfolder/omen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Omen -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ 1 U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/omen.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/omen_of_fire.txt b/res/cardsfolder/omen_of_fire.txt deleted file mode 100644 index 84c79a60c3d..00000000000 --- a/res/cardsfolder/omen_of_fire.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Omen of Fire -ManaCost:3 R R -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 R R | ChangeType$ Island | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all Islands to their owners' hands. | SubAbility$ SVar=DBSacYou -SVar:DBSacYou:DB$Sacrifice | Amount$ YouX | SacValid$ Plains,Permanent.White | Defined$ You | SubAbility$ SVar=DBSacOpp | SpellDescription$ Each player sacrifices a Plains or a white permanent for each white permanent he or she controls. -SVar:DBSacOpp:DB$Sacrifice | Amount$ OppX | SacValid$ Plains,Permanent.White | Defined$ Opponent -SVar:YouX:Count$Valid Permanent.White+YouCtrl -SVar:OppX:Count$Valid Permanent.White+YouDontCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/omen_of_fire.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/omnath_locus_of_mana.txt b/res/cardsfolder/omnath_locus_of_mana.txt deleted file mode 100644 index 3a769da93aa..00000000000 --- a/res/cardsfolder/omnath_locus_of_mana.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Omnath, Locus of Mana -ManaCost:2 G -Types:Legendary Creature Elemental -Text:Green mana doesn't empty from your mana pool as steps and phases end. -PT:1/1 -K:stPumpSelf:Permanent:X/X:No Condition:CARDNAME gets +1/+1 for each green mana in your mana pool. -SVar:X:Count$ManaPool:green -#AI doesn't have a mana pool -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/omnath_locus_of_mana.jpg -SetInfo:WWK|Mythic|http://magiccards.info/scans/en/wwk/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/omnibian.txt b/res/cardsfolder/omnibian.txt deleted file mode 100644 index b857df1f933..00000000000 --- a/res/cardsfolder/omnibian.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Omnibian -ManaCost:1 G G U -Types:Creature Frog -Text:no text -PT:3/3 -A:AB$ Animate | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 3 | Toughness$ 3 | Types$ Creature,Frog | OverwriteTypes$ True | SpellDescription$ Target creature becomes a 3/3 Frog until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/omnibian.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ondu_cleric.txt b/res/cardsfolder/ondu_cleric.txt deleted file mode 100644 index 5f13db48c76..00000000000 --- a/res/cardsfolder/ondu_cleric.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Ondu Cleric -ManaCost:1 W -Types:Creature Kor Cleric Ally -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self| OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may gain life equal to the number of Allies you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may gain life equal to the number of Allies you control. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Ally.YouCtrl -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ondu_cleric.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ondu_giant.txt b/res/cardsfolder/ondu_giant.txt deleted file mode 100644 index 2dc71c44663..00000000000 --- a/res/cardsfolder/ondu_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ondu Giant -ManaCost:3 G -Types:Creature Giant Druid -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ondu_giant.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/one_dozen_eyes.txt b/res/cardsfolder/one_dozen_eyes.txt deleted file mode 100644 index 35dca4a6596..00000000000 --- a/res/cardsfolder/one_dozen_eyes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:One Dozen Eyes -ManaCost:5 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 5 G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 5 | TokenToughness$ 5 | SpellDescription$ Choose one - Put a 5/5 green Beast creature token onto the battlefield; -A:SP$ Token | Cost$ 5 G | TokenAmount$ 5 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ or put five 1/1 green Insect creature tokens onto the battlefield. -A:SP$ Token | Cost$ 5 G G G G | PrecostDesc$ Entwine | CostDesc$ G G G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 5 | TokenToughness$ 5 | SpellDescription$ (Choose both if you pay the entwine cost.) | SubAbility$ SVar=DBToken2 -SVar:DBToken2:DB$Token | TokenAmount$ 5 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/one_dozen_eyes.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/one_with_nature.txt b/res/cardsfolder/one_with_nature.txt deleted file mode 100644 index 381eaea60c0..00000000000 --- a/res/cardsfolder/one_with_nature.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:One with Nature -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | TriggerZones$ Battlefield | Execute$ TrigChange | CombatDamage$ True | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/one_with_nature.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/one_with_nothing.txt b/res/cardsfolder/one_with_nothing.txt deleted file mode 100644 index 234f14c6bab..00000000000 --- a/res/cardsfolder/one_with_nothing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:One with Nothing -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | Mode$ Hand | SpellDescription$ Discard your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/one_with_nothing.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oni_of_wild_places.txt b/res/cardsfolder/oni_of_wild_places.txt deleted file mode 100644 index 5a55f9a7062..00000000000 --- a/res/cardsfolder/oni_of_wild_places.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Oni of Wild Places -ManaCost:5 R -Types:Creature Demon Spirit -Text:no text -PT:6/5 -K:Haste -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a red creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target red creature | Mandatory$ True | ValidTgts$ Creature.Red+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oni_of_wild_places.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/onslaught.txt b/res/cardsfolder/onslaught.txt deleted file mode 100644 index 65e46d759b8..00000000000 --- a/res/cardsfolder/onslaught.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Onslaught -ManaCost:R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever you cast a creature spell, tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:BuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/onslaught.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/onulet.txt b/res/cardsfolder/onulet.txt deleted file mode 100644 index 3033a6c636e..00000000000 --- a/res/cardsfolder/onulet.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Onulet -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 2 life. -SVar:TrigSac:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/onulet.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/269.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/358.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/onyx_goblet.txt b/res/cardsfolder/onyx_goblet.txt deleted file mode 100644 index 7b2554a110c..00000000000 --- a/res/cardsfolder/onyx_goblet.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Onyx Goblet -ManaCost:2 B -Types:Artifact -Text:no text -A:AB$ LoseLife | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/onyx_goblet.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/81.jpg -End diff --git a/res/cardsfolder/onyx_talisman.txt b/res/cardsfolder/onyx_talisman.txt deleted file mode 100644 index 4af4daf5b28..00000000000 --- a/res/cardsfolder/onyx_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Onyx Talisman -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever a player casts a black spell, you may pay 3. If you do, untap target permanent. -SVar:TrigUntap:AB$Untap | Cost$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/onyx_talisman.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oonas_gatewarden.txt b/res/cardsfolder/oonas_gatewarden.txt deleted file mode 100644 index 941d58f77c5..00000000000 --- a/res/cardsfolder/oonas_gatewarden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oona's Gatewarden -ManaCost:UB -Types:Creature Faerie Soldier -Text:no text -PT:2/1 -K:Flying -K:Defender -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oonas_gatewarden.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oonas_grace.txt b/res/cardsfolder/oonas_grace.txt deleted file mode 100644 index 0a169281353..00000000000 --- a/res/cardsfolder/oonas_grace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Oona's Grace -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws a card. -A:SP$ Draw | Cost$ 2 U Discard<1/Land> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | ActivatingZone$ Graveyard | CostDesc$ Retrace | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Picture:http://www.wizards.com/global/images/magic/general/oonas_grace.jpg -SVar:Rarity:Common -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/27.jpg -End diff --git a/res/cardsfolder/ooze_garden.txt b/res/cardsfolder/ooze_garden.txt deleted file mode 100644 index 8bd47a63f66..00000000000 --- a/res/cardsfolder/ooze_garden.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ooze Garden -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 1 G Sac<1/Creature.nonOoze> | TokenAmount$ 1 | TokenName$ Ooze | TokenOwner$ You | TokenPower$ X | TokenToughness$ X | TokenTypes$ Creature,Ooze | TokenColors$ Green | SorcerySpeed$ True | CostDesc$ 1 G, Sacrifice a non-Ooze creature | SpellDescription$ 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. -SVar:X:Sacrificed$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ooze_garden.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_acrolith.txt b/res/cardsfolder/opal_acrolith.txt deleted file mode 100644 index 3892480cbdd..00000000000 --- a/res/cardsfolder/opal_acrolith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Opal Acrolith -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/4 Soldier creature. -A:AB$ Animate | Cost$ 0 | Defined$ Self | Types$ Enchantment | OverwriteTypes$ True | Permanent$ True | SpellDescription$ CARDNAME becomes an enchantment. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 2 | Toughness$ 4 | Types$ Creature,Soldier | OverwriteTypes$ True | Permanent$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_acrolith.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_archangel.txt b/res/cardsfolder/opal_archangel.txt deleted file mode 100644 index 1376b7ac14d..00000000000 --- a/res/cardsfolder/opal_archangel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opal Archangel -ManaCost:4 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment| Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/5 Angel creature with flying and vigilance. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 5 | Toughness$ 5 | Keywords$ Flying & Vigilance | Types$ Creature,Angel | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_archangel.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_caryatid.txt b/res/cardsfolder/opal_caryatid.txt deleted file mode 100644 index ee35803a187..00000000000 --- a/res/cardsfolder/opal_caryatid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opal Caryatid -ManaCost:W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/2 Soldier creature. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Soldier | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_caryatid.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_champion.txt b/res/cardsfolder/opal_champion.txt deleted file mode 100644 index fc4729a3b19..00000000000 --- a/res/cardsfolder/opal_champion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opal Champion -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment| Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Knight creature with first strike. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ First Strike | Types$ Creature,Knight | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_champion.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_gargoyle.txt b/res/cardsfolder/opal_gargoyle.txt deleted file mode 100644 index 2b22df8de6e..00000000000 --- a/res/cardsfolder/opal_gargoyle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opal Gargoyle -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/2 Gargoyle creature with flying. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Gargoyle | Keywords$ Flying | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_gargoyle.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opal_guardian.txt b/res/cardsfolder/opal_guardian.txt deleted file mode 100644 index cddd8a78996..00000000000 --- a/res/cardsfolder/opal_guardian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opal Guardian -ManaCost:W W W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/4 Gargoyle creature with flying and protection from red. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Gargoyle | Keywords$ Flying & Protection from red | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_guardian.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opalescence.txt b/res/cardsfolder/opalescence.txt deleted file mode 100644 index 79f1e703c35..00000000000 --- a/res/cardsfolder/opalescence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opalescence -ManaCost:2 W W -Types:Enchantment -Text:no text -K:stAnimateAll:Enchantment.nonAura+Other:Count$CardManaCost/Count$CardManaCost:Creature:no colors:No Abilities:No Condition:Each other non-Aura enchantment is a creature with power and toughness each equal to its converted mana cost. It's still an enchantment. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/opalescence.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opaline_bracers.txt b/res/cardsfolder/opaline_bracers.txt deleted file mode 100644 index 401c4332bec..00000000000 --- a/res/cardsfolder/opaline_bracers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Opaline Bracers -ManaCost:4 -Types:Artifact Equipment -Text:Equipped creature gets +X/+X, where X is the number of charge counters on CARDNAME. -K:eqPump 2:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:no text -K:Sunburst -SVar:X:Count$CardCounters.CHARGE -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/opaline_bracers.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ophidian.txt b/res/cardsfolder/ophidian.txt deleted file mode 100644 index c76c0a6129e..00000000000 --- a/res/cardsfolder/ophidian.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ophidian -ManaCost:2 U -Types:Creature Snake -Text:no text -PT:1/3 -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may draw a card. If you do, CARDNAME assigns no combat damage this turn. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Cost$ 0 | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ophidian.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ophidian_eye.txt b/res/cardsfolder/ophidian_eye.txt deleted file mode 100644 index 279cee29735..00000000000 --- a/res/cardsfolder/ophidian_eye.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ophidian Eye -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Flash -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Opponent | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever enchanted creature deals damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ophidian_eye.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opportunist.txt b/res/cardsfolder/opportunist.txt deleted file mode 100644 index 2582748d4bb..00000000000 --- a/res/cardsfolder/opportunist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Opportunist -ManaCost:2 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.wasDealtDamageThisTurn | TgtPrompt$ Select target creature that was dealt damage this turn | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature that was dealt damage this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/opportunist.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opportunity.txt b/res/cardsfolder/opportunity.txt deleted file mode 100644 index eeb179fca7b..00000000000 --- a/res/cardsfolder/opportunity.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Opportunity -ManaCost:4 U U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 4 U U | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws four cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/opportunity.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opposition.txt b/res/cardsfolder/opposition.txt deleted file mode 100644 index 50ccf217e37..00000000000 --- a/res/cardsfolder/opposition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Opposition -ManaCost:2 U U -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ tapXType<1/Creature> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature or land | SpellDescription$ Tap target artifact, creature or land. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/opposition.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/40.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/92.jpg -End diff --git a/res/cardsfolder/oppression.txt b/res/cardsfolder/oppression.txt deleted file mode 100644 index 7031ae45341..00000000000 --- a/res/cardsfolder/oppression.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oppression -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever a player casts a spell, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oppression.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/143.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oppressive_will.txt b/res/cardsfolder/oppressive_will.txt deleted file mode 100644 index e0bd50a3e1e..00000000000 --- a/res/cardsfolder/oppressive_will.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oppressive Will -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | Type $ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Counter target spell unless its controller pays 1 for each card in your hand. -SVar:X:Count$InYourHand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oppressive_will.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/opt.txt b/res/cardsfolder/opt.txt deleted file mode 100644 index d4376e8d137..00000000000 --- a/res/cardsfolder/opt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Opt -ManaCost:U -Types:Instant -Text:no text -A:SP$ Dig | Cost$ U | DigNum$ 1 | ChangeNum$ 1 | DestinationZone$ Library | LibraryPosition$ -1 | Optional$ True | LibraryPosition2$ 0 | SubAbility$ SVar=DBDraw | SpellDescription$ Look at the top card of your library. You may put that card on the bottom of your library. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/opt.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oracle_of_mul_daya.txt b/res/cardsfolder/oracle_of_mul_daya.txt deleted file mode 100644 index a483cb424fa..00000000000 --- a/res/cardsfolder/oracle_of_mul_daya.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Oracle of Mul Daya -ManaCost:3 G -Types:Creature Elf Shaman -Text:You may play an additional land on each of your turns.\r\nYou may play the top card of your library if it's a land card. -PT:2/2 -K:Play with the top card of your library revealed. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oracle_of_mul_daya.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oracle_of_nectars.txt b/res/cardsfolder/oracle_of_nectars.txt deleted file mode 100644 index 81a9479ae3e..00000000000 --- a/res/cardsfolder/oracle_of_nectars.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oracle of Nectars -ManaCost:2 GW -Types:Creature Elf Cleric -PT:2/2 -Text:no text -A:AB$ GainLife | LifeAmount$ X | Cost$ T X | SpellDescription$ You gain X life. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oracle_of_nectars.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/233.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oran_rief_recluse.txt b/res/cardsfolder/oran_rief_recluse.txt deleted file mode 100644 index 1ad629613bb..00000000000 --- a/res/cardsfolder/oran_rief_recluse.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Oran-Rief Recluse -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:1/3 -K:Kicker:2 G -K:Reach -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target creature with flying. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_recluse.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oran_rief_survivalist.txt b/res/cardsfolder/oran_rief_survivalist.txt deleted file mode 100644 index a21c7ad9563..00000000000 --- a/res/cardsfolder/oran_rief_survivalist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Oran-Rief Survivalist -ManaCost:1 G -Types:Creature Human Warrior Ally -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_survivalist.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oran_rief_the_vastwood.txt b/res/cardsfolder/oran_rief_the_vastwood.txt deleted file mode 100644 index 0006747db4a..00000000000 --- a/res/cardsfolder/oran_rief_the_vastwood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oran-Rief, the Vastwood -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$PutCounterAll | Cost$ T | ValidCards$ Creature.Green+enteredBattlefieldThisTurn | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each green creature that entered the battlefield this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_the_vastwood.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oraxid.txt b/res/cardsfolder/oraxid.txt deleted file mode 100644 index d43435b3ebf..00000000000 --- a/res/cardsfolder/oraxid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Oraxid -ManaCost:3 U -Types:Creature Crab Beast -Text:no text -PT:2/3 -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oraxid.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orb_of_dreams.txt b/res/cardsfolder/orb_of_dreams.txt deleted file mode 100644 index 3a3e1abe39d..00000000000 --- a/res/cardsfolder/orb_of_dreams.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Orb of Dreams -ManaCost:3 -Types:Artifact -Text:Permanents enter the battlefield tapped. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/orb_of_dreams.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orbweaver_kumo.txt b/res/cardsfolder/orbweaver_kumo.txt deleted file mode 100644 index 2f1b9ab3a3f..00000000000 --- a/res/cardsfolder/orbweaver_kumo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Orbweaver Kumo -ManaCost:4 G G -Types:Creature Spirit -Text:no text -PT:3/4 -K:Reach -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gains forestwalk until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Forestwalk -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orbweaver_kumo.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orc_general.txt b/res/cardsfolder/orc_general.txt deleted file mode 100644 index 6eab0c13a71..00000000000 --- a/res/cardsfolder/orc_general.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orc General -ManaCost:2 R -Types:Creature Orc Warrior -Text:no text -PT:2/2 -A:AB$ PumpAll | Cost$ T Sac<1/Goblin.Other;Orc.Other> | ValidCards$ Creature.Orc+Other | CostDesc$ T, Sacrifice another Orc or Goblin: | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Other Orc creatures get +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orc_general.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orchard_warden.txt b/res/cardsfolder/orchard_warden.txt deleted file mode 100644 index a2e15064c80..00000000000 --- a/res/cardsfolder/orchard_warden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Orchard Warden -ManaCost:4 G G -Types:Creature Treefolk Shaman -Text:no text -PT:4/6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Treefolk.YouCtrl+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever another Treefolk creature enters the battlefield under your control, you may gain life equal to that creature's toughness. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ Life -SVar:Life:TriggeredCard$CardToughness -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orchard_warden.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_artillery.txt b/res/cardsfolder/orcish_artillery.txt deleted file mode 100644 index bb280e30bed..00000000000 --- a/res/cardsfolder/orcish_artillery.txt +++ /dev/null @@ -1,22 +0,0 @@ -Name:Orcish Artillery -ManaCost:1 R R -Types:Creature Orc Warrior -Text:no text -PT:1/3 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 3 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83193.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/207.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/166.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/167.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/205.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/253.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/232.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/206.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/220.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/196.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/167.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_bloodpainter.txt b/res/cardsfolder/orcish_bloodpainter.txt deleted file mode 100644 index e3f29b9adeb..00000000000 --- a/res/cardsfolder/orcish_bloodpainter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orcish Bloodpainter -ManaCost:2 R -Types:Creature Orc Shaman -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ T Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_bloodpainter.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_cannonade.txt b/res/cardsfolder/orcish_cannonade.txt deleted file mode 100644 index b95359c460c..00000000000 --- a/res/cardsfolder/orcish_cannonade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Orcish Cannonade -ManaCost:1 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R R | Tgt$ CP | NumDmg$ 2 | SubAbility$ SVar=DB1 | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 3 damage to you. Draw a card. -SVar:DB1:DB$DealDamage | NumDmg$ 3 | Defined$ You | SubAbility$ SVar=DB2 -SVar:DB2:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_cannonade.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_cannoneers.txt b/res/cardsfolder/orcish_cannoneers.txt deleted file mode 100644 index d61ba7086d7..00000000000 --- a/res/cardsfolder/orcish_cannoneers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Orcish Cannoneers -ManaCost:1 R R -Types:Creature Orc Warrior -Text:no text -PT:1/3 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 3 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_cannoneers.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/205.jpg -End diff --git a/res/cardsfolder/orcish_captain.txt b/res/cardsfolder/orcish_captain.txt deleted file mode 100644 index 34cbe56a4db..00000000000 --- a/res/cardsfolder/orcish_captain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orcish Captain -ManaCost:R -Types:Creature Orc Warrior -Text:no text -PT:1/1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_captain.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/254.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_healer.txt b/res/cardsfolder/orcish_healer.txt deleted file mode 100644 index a836f7b8b11..00000000000 --- a/res/cardsfolder/orcish_healer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Orcish Healer -ManaCost:R R -Types:Creature Orc Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't be regenerated. | IsCurse$ True | SpellDescription$ Target creature can't be regenerated this turn. -A:AB$ Regenerate | Cost$ B B R T | ValidTgts$ Creature.Black,Creature.Green | TgtPrompt$ Select target black or green creature | SpellDescription$ Regenerate target black or green creature. -A:AB$ Regenerate | Cost$ R G G T | ValidTgts$ Creature.Black,Creature.Green | TgtPrompt$ Select target black or green creature | SpellDescription$ Regenerate target black or green creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_healer.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_lumberjack.txt b/res/cardsfolder/orcish_lumberjack.txt deleted file mode 100644 index 14e16ea464a..00000000000 --- a/res/cardsfolder/orcish_lumberjack.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Orcish Lumberjack -ManaCost:R -Types:Creature Orc -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R R R | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R R G | SpellDescription$ Add R R G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ R G G | SpellDescription$ Add R G G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Forest> | Produced$ G G G | SpellDescription$ Add G G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_lumberjack.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_mechanics.txt b/res/cardsfolder/orcish_mechanics.txt deleted file mode 100644 index 75422682c77..00000000000 --- a/res/cardsfolder/orcish_mechanics.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orcish Mechanics -ManaCost:2 R -Types:Creature Orc -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T Sac<1/Artifact> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_mechanics.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_oriflamme.txt b/res/cardsfolder/orcish_oriflamme.txt deleted file mode 100644 index abe55fbc057..00000000000 --- a/res/cardsfolder/orcish_oriflamme.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Orcish Oriflamme -ManaCost:3 R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.attacking+YouCtrl:1/0:No Condition:Attacking creatures you control get +1/+0. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_oriflamme.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/167.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/168.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/206.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/257.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/233.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/197.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/168.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_settlers.txt b/res/cardsfolder/orcish_settlers.txt deleted file mode 100644 index 57105f5336a..00000000000 --- a/res/cardsfolder/orcish_settlers.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Orcish Settlers -ManaCost:1 R -Types:Creature Orc -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ X X R T Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Land | TgtPrompt$ Select target lands | SpellDescription$ Destroy X target lands. -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_settlers.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_spy.txt b/res/cardsfolder/orcish_spy.txt deleted file mode 100644 index f24757b2e60..00000000000 --- a/res/cardsfolder/orcish_spy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orcish Spy -ManaCost:R -Types:Creature Orc Rogue -Text:no text -PT:1/1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_spy.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/208.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/124.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/orcish_veteran.txt b/res/cardsfolder/orcish_veteran.txt deleted file mode 100644 index 4a14f5312cb..00000000000 --- a/res/cardsfolder/orcish_veteran.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orcish Veteran -ManaCost:2 R -Types:Creature Orc -Text:no text -PT:2/2 -K:CARDNAME can't block white creatures with power 2 or greater. -A:AB$ Pump | Cost$ R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_veteran.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/127.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/order_of_leitbur.txt b/res/cardsfolder/order_of_leitbur.txt deleted file mode 100644 index ec42fbe7992..00000000000 --- a/res/cardsfolder/order_of_leitbur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Order of Leitbur -ManaCost:W W -Types:Creature Human Cleric Knight -Text:no text -PT:2/1 -K:Protection from black -A:AB$ Pump | Cost$ W | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ W W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_leitbur.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/163.jpg|3 -End diff --git a/res/cardsfolder/order_of_the_ebon_hand.txt b/res/cardsfolder/order_of_the_ebon_hand.txt deleted file mode 100644 index c239164b5b9..00000000000 --- a/res/cardsfolder/order_of_the_ebon_hand.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Order of the Ebon Hand -ManaCost:B B -Types:Creature Cleric Knight -Text:no text -PT:2/1 -K:Protection from white -A:AB$ Pump | Cost$ B | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ B B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_the_ebon_hand.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/25.jpg|3 -End diff --git a/res/cardsfolder/order_of_the_golden_cricket.txt b/res/cardsfolder/order_of_the_golden_cricket.txt deleted file mode 100644 index 37a17540d36..00000000000 --- a/res/cardsfolder/order_of_the_golden_cricket.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Order of the Golden Cricket -ManaCost:1 W -Types:Creature Kithkin Knight -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, you may pay W. If you do, it gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ W | Defined$ Self | KW$ Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_the_golden_cricket.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/order_of_the_sacred_bell.txt b/res/cardsfolder/order_of_the_sacred_bell.txt deleted file mode 100644 index 480c0336d26..00000000000 --- a/res/cardsfolder/order_of_the_sacred_bell.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Order of the Sacred Bell -ManaCost:3 G -Types:Creature Human Monk -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82943.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/232.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/order_of_the_sacred_torch.txt b/res/cardsfolder/order_of_the_sacred_torch.txt deleted file mode 100644 index 4c34872b9f3..00000000000 --- a/res/cardsfolder/order_of_the_sacred_torch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Order of the Sacred Torch -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Counter | Cost$ T PayLife<1> | TargetType$ Spell | TgtPrompt$ Select target Black spell | ValidTgts$ Card.Black | SpellDescription$ Counter target black spell. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_the_sacred_torch.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/324.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/32.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/order_of_the_white_shield.txt b/res/cardsfolder/order_of_the_white_shield.txt deleted file mode 100644 index e8647bd7cb5..00000000000 --- a/res/cardsfolder/order_of_the_white_shield.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Order of the White Shield -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/1 -K:Protection from black -A:AB$ Pump | Cost$ W | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ W W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_the_white_shield.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/325.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/270.jpg -End diff --git a/res/cardsfolder/order_of_whiteclay.txt b/res/cardsfolder/order_of_whiteclay.txt deleted file mode 100644 index aabcbe0698d..00000000000 --- a/res/cardsfolder/order_of_whiteclay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Order of Whiteclay -ManaCost:1 W W -Types:Creature Kithkin Cleric -Text:no text -PT:1/4 -A:AB$ ChangeZone | Cost$ 1 W W Untap | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.cmcLE3+YouCtrl | TgtPrompt$ Select a creature card with converted mana cost 3 or less from your graveyard | ChangeNum$ 1 | SpellDescription$ Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_whiteclay.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/order_of_yawgmoth.txt b/res/cardsfolder/order_of_yawgmoth.txt deleted file mode 100644 index 9eb09ffd081..00000000000 --- a/res/cardsfolder/order_of_yawgmoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Order of Yawgmoth -ManaCost:2 B B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -K:Fear -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/order_of_yawgmoth.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ordered_migration.txt b/res/cardsfolder/ordered_migration.txt deleted file mode 100644 index 4c6d632dd4e..00000000000 --- a/res/cardsfolder/ordered_migration.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ordered Migration -ManaCost:3 W U -Types:Sorcery -Text:Domain - Put a 1/1 blue Bird creature token with flying onto the battlefield for each basic land type among lands you control. -A:SP$ Token | Cost$ 3 W U | TokenAmount$ X | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ordered_migration.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ordruun_commando.txt b/res/cardsfolder/ordruun_commando.txt deleted file mode 100644 index 4e023fa45fa..00000000000 --- a/res/cardsfolder/ordruun_commando.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ordruun Commando -ManaCost:3 R -Types:Creature Minotaur Soldier -Text:no text -PT:4/1 -A:AB$ PreventDamage | Cost$ W | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ordruun_commando.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ore_gorger .txt b/res/cardsfolder/ore_gorger .txt deleted file mode 100644 index 2987267b31c..00000000000 --- a/res/cardsfolder/ore_gorger .txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ore Gorger -ManaCost:3 R R -Types:Creature Spirit -Text:no text -PT:3/1 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may destroy target nonbasic land. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ore_gorger.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/organ_grinder.txt b/res/cardsfolder/organ_grinder.txt deleted file mode 100644 index 39786c016c1..00000000000 --- a/res/cardsfolder/organ_grinder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Organ Grinder -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:3/1 -A:AB$ LoseLife | Cost$ T ExileFromGrave<3/Card> | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | SpellDescription$ Target player loses 3 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/organ_grinder.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/75.jpg -End diff --git a/res/cardsfolder/orgg.txt b/res/cardsfolder/orgg.txt deleted file mode 100644 index 0f7d99ede6d..00000000000 --- a/res/cardsfolder/orgg.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Orgg -ManaCost:3 R R -Types:Creature Orgg -Text:no text -PT:6/6 -K:Trample -K:CARDNAME can't attack if defending player controls an untapped creature with power 3 or greater. -K:CARDNAME can't block creatures with power 3 or greater. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/orgg.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/259.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/131.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/origin_spellbomb.txt b/res/cardsfolder/origin_spellbomb.txt deleted file mode 100644 index 5cfa3ea1c54..00000000000 --- a/res/cardsfolder/origin_spellbomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Origin Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 1 T Sac<1/CARDNAME> | TokenImage$ C 1 1 Myr | TokenColors$ Colorless | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 colorless Myr artifact creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay W. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ W | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/origin_spellbomb.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orim_samite_healer.txt b/res/cardsfolder/orim_samite_healer.txt deleted file mode 100644 index 4901175c52f..00000000000 --- a/res/cardsfolder/orim_samite_healer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Orim, Samite Healer -ManaCost:1 W W -Types:Legendary Creature Human Cleric -Text:no text -PT:1/3 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/orim_samite_healer.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orims_prayer.txt b/res/cardsfolder/orims_prayer.txt deleted file mode 100644 index 498d51d3de8..00000000000 --- a/res/cardsfolder/orims_prayer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Orim's Prayer -ManaCost:1 W W -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever one or more creatures attack you, you gain 1 life for each attacking creature. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 | SpellDescription$ You gain 1 life for each attacking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_prayer.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orims_thunder.txt b/res/cardsfolder/orims_thunder.txt deleted file mode 100644 index 29ea3e28e84..00000000000 --- a/res/cardsfolder/orims_thunder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Orim's Thunder -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -A:SP$ Destroy | Cost$ 2 W R | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBDamage | SpellDescription$ Kicker R (You may pay an additional R as you cast this spell.) If CARDNAME was kicked, it deals damage equal to that permanent's converted mana cost to target creature. -SVar:DBDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X -SVar:X:Remembered$CardManaCost -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orims_thunder.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ornithopter.txt b/res/cardsfolder/ornithopter.txt deleted file mode 100644 index 187fd968d1b..00000000000 --- a/res/cardsfolder/ornithopter.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Ornithopter -ManaCost:0 -Types:Artifact Creature Thopter -Text:no text -PT:0/2 -K:Flying -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card95220.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/393.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/359.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/305.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/336.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/211.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/216.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/303.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/270.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/25.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orochi_hatchery.txt b/res/cardsfolder/orochi_hatchery.txt deleted file mode 100644 index 4369af5788e..00000000000 --- a/res/cardsfolder/orochi_hatchery.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Orochi Hatchery -ManaCost:X X -Types:Artifact -Text:no text -K:etbCounter:CHARGE:X -A:AB$ Token | Cost$ 5 T | TokenAmount$ Y | TokenController$ You | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Snake creature token onto the battlefield for each charge counter on CARDNAME. -SVar:X:Count$xPaid -SVar:Y:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/orochi_hatchery.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orochi_leafcaller.txt b/res/cardsfolder/orochi_leafcaller.txt deleted file mode 100644 index af9aabbdaac..00000000000 --- a/res/cardsfolder/orochi_leafcaller.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Orochi Leafcaller -ManaCost:G -Types:Creature Snake Shaman -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ G | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ G | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ G | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ G | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ G | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orochi_leafcaller.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orochi_ranger.txt b/res/cardsfolder/orochi_ranger.txt deleted file mode 100644 index 54cc81b6d1e..00000000000 --- a/res/cardsfolder/orochi_ranger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Orochi Ranger -ManaCost:1 G -Types:Creature Snake Warrior -Text:no text -PT:2/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredTarget | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orochi_ranger.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orochi_sustainer.txt b/res/cardsfolder/orochi_sustainer.txt deleted file mode 100644 index 300f64ca637..00000000000 --- a/res/cardsfolder/orochi_sustainer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Orochi Sustainer -ManaCost:1 G -Types:Creature Snake Shaman -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card75403.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oros_the_avenger.txt b/res/cardsfolder/oros_the_avenger.txt deleted file mode 100644 index 2d7a9f8bba9..00000000000 --- a/res/cardsfolder/oros_the_avenger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oros, the Avenger -ManaCost:3 W B R -Types:Legendary Creature Dragon -Text:no text -PT:6/6 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDamageAll | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay 2 W. If you do, CARDNAME deals 3 damage to each nonwhite creature. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 2 W | ValidCards$ Creature.nonWhite | NumDmg$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oros_the_avenger.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orzhov_basilica.txt b/res/cardsfolder/orzhov_basilica.txt deleted file mode 100644 index a0a7bc4354b..00000000000 --- a/res/cardsfolder/orzhov_basilica.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Orzhov Basilica -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -A:AB$ Mana | Cost$ T | Produced$ W B | SpellDescription$ Add W B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_basilica.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orzhov_guildmage.txt b/res/cardsfolder/orzhov_guildmage.txt deleted file mode 100644 index 795cf915770..00000000000 --- a/res/cardsfolder/orzhov_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orzhov Guildmage -ManaCost:WB WB -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ GainLife | Cost$ 2 W | LifeAmount$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player gains 1 life. -A:AB$ LoseLife | Cost$ 2 B | LifeAmount$ 1 | Defined$ Each | SpellDescription$ Each player loses 1 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_guildmage.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orzhov_signet.txt b/res/cardsfolder/orzhov_signet.txt deleted file mode 100644 index ae3d71c5a8d..00000000000 --- a/res/cardsfolder/orzhov_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Orzhov Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W B | SpellDescription$ Add W B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhov_signet.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/orzhova_the_church_of_deals.txt b/res/cardsfolder/orzhova_the_church_of_deals.txt deleted file mode 100644 index 81ea81a6cd6..00000000000 --- a/res/cardsfolder/orzhova_the_church_of_deals.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Orzhova, the Church of Deals -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ LoseLife | Cost$ 3 W B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 1 life and you gain 1 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/orzhova_the_church_of_deals.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ostiary_thrull.txt b/res/cardsfolder/ostiary_thrull.txt deleted file mode 100644 index 1652d579265..00000000000 --- a/res/cardsfolder/ostiary_thrull.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ostiary Thrull -ManaCost:3 B -Types:Creature Thrull -Text:no text -PT:2/2 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ostiary_thrull.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/55.jpg -End diff --git a/res/cardsfolder/ostracize.txt b/res/cardsfolder/ostracize.txt deleted file mode 100644 index faa36135601..00000000000 --- a/res/cardsfolder/ostracize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ostracize -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Opponent | NumCards$ 1 | DiscardValid$ Creature | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals his or her hand. You choose a creature card from it. That player discards that card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ostracize.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/57.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/otarian_juggernaut.txt b/res/cardsfolder/otarian_juggernaut.txt deleted file mode 100644 index 7664e82cdfa..00000000000 --- a/res/cardsfolder/otarian_juggernaut.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Otarian Juggernaut -ManaCost:4 -Types:Artifact Creature Juggernaut -Text:no text -PT:2/3 -K:CARDNAME can't be blocked by Walls. -K:stPumpSelf:Creature:3/1/CARDNAME attacks each turn if able.:Threshold:Threshold - As long as seven or more cards are in your graveyard, Otarian Juggernaut gets +3/+0 and attacks each turn if able. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/otarian_juggernaut.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/otherworldly_journey.txt b/res/cardsfolder/otherworldly_journey.txt deleted file mode 100644 index bd2349b7569..00000000000 --- a/res/cardsfolder/otherworldly_journey.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Otherworldly Journey -ManaCost:1 W -Types:Instant Arcane -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | TgtPrompt$ Select target creature | SubAbility$ SVar=DelTrig | SpellDescription$ Exile target creature. At end of turn, return that card to the battlefield under its owner's control with a +1/+1 counter on it. -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return exiled card to the battlefield with a +1/+1 counter on it. -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ SVar=DBAddCounter -SVar:DBAddCounter:DB$ PutCounter | Cost$ 0 | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/otherworldly_journey.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oubliette.txt b/res/cardsfolder/oubliette.txt deleted file mode 100644 index 1e40a45e47c..00000000000 --- a/res/cardsfolder/oubliette.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Oubliette -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME 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. -SVar:TrigExile:DB$ChangeZone | Cost$ 0 | TargetMin$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:DB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity: -SVar:Picture:http://resources.wizards.com/magic/cards/med/en-us/card159135.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/11.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/oust.txt b/res/cardsfolder/oust.txt deleted file mode 100644 index a010f6e23d7..00000000000 --- a/res/cardsfolder/oust.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oust -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Library | ValidTgts$ Creature | LibraryPosition$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Put target creature into its owner's library second from the top. Its controller gains 3 life. -# Library Position is zero indexed. So 1 is second from the top -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oust.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/outbreak.txt b/res/cardsfolder/outbreak.txt deleted file mode 100644 index 68929523643..00000000000 --- a/res/cardsfolder/outbreak.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Outbreak -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ ChooseType | Cost$ 3 B | Defined$ You | Type$ Creature | SubAbility$ SVar=DBPumpAll | SpellDescription$ Choose a creature type. All creatures of that type get -1/-1 until end of turn. -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.ChosenType | IsCurse$ True | NumAtt$ -1 | NumDef$ -1 | PumpAllDescription$ All creatures of that type get -1/-1 until end of turn. -SVar:AltCost:Discard<1/Swamp> -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/outbreak.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/outrage_shaman.txt b/res/cardsfolder/outrage_shaman.txt deleted file mode 100644 index c14475022ea..00000000000 --- a/res/cardsfolder/outrage_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Outrage Shaman -ManaCost:3 R R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ Chroma - When CARDNAME 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. -SVar:TrigDealDamage:DB$DealDamage | Tgt$ TgtC | NumDmg$ X -SVar:X:Count$Chroma.R -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/outrage_shaman.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/outrider_of_jhess.txt b/res/cardsfolder/outrider_of_jhess.txt deleted file mode 100644 index 399e5609c5f..00000000000 --- a/res/cardsfolder/outrider_of_jhess.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Outrider of Jhess -ManaCost:3 U -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/outrider_of_jhess.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overbeing_of_myth.txt b/res/cardsfolder/overbeing_of_myth.txt deleted file mode 100644 index dced4c08b14..00000000000 --- a/res/cardsfolder/overbeing_of_myth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Overbeing of Myth -ManaCost:GU GU GU GU GU -Types:Creature Spirit Avatar -Text:no text -PT:*/* -K:stSetPT:Count$InYourHand:Count$InYourHand:CARDNAME's power and toughness are each equal to the number of cards in your hand. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your draw step, draw an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ You -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overbeing_of_myth.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overburden.txt b/res/cardsfolder/overburden.txt deleted file mode 100644 index 52dc82eede8..00000000000 --- a/res/cardsfolder/overburden.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Overburden -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigBounceYou | TriggerDescription$ Whenever a player puts a nontoken creature onto the battlefield, that player returns a land he or she controls to its owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigBounceOpp | Secondary$ True | TriggerDescription$ Whenever a player puts a nontoken creature onto the battlefield, that player returns a land he or she controls to its owner's hand. -SVar:TrigBounceYou:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Land.YouCtrl | ChangeNum$ 1 | Mandatory$ True | Defined$ You | Hidden$ True -SVar:TrigBounceOpp:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeType$ Land.YouDontCtrl | ChangeNum$ 1 | Mandatory$ True | Defined$ Opponent | Hidden$ True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overburden.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overgrown_battlement.txt b/res/cardsfolder/overgrown_battlement.txt deleted file mode 100644 index 95d63f25a72..00000000000 --- a/res/cardsfolder/overgrown_battlement.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Overgrown Battlement -ManaCost:1 G -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Creature with defender you control. -SVar:X:Count$Valid Creature.withDefender+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/overgrown_battlement.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overgrown_estate.txt b/res/cardsfolder/overgrown_estate.txt deleted file mode 100644 index 9d56ecc32db..00000000000 --- a/res/cardsfolder/overgrown_estate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Overgrown Estate -ManaCost:B G W -Types:Enchantment -Text:no text -A:AB$ GainLife | Cost$ Sac<1/Land> | Defined$ You | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overgrown_estate.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overgrown_tomb.txt b/res/cardsfolder/overgrown_tomb.txt deleted file mode 100644 index f0cbab583ed..00000000000 --- a/res/cardsfolder/overgrown_tomb.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Overgrown Tomb -ManaCost:no cost -Types:Land Swamp Forest -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89072.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overgrowth.txt b/res/cardsfolder/overgrowth.txt deleted file mode 100644 index e885d2fb217..00000000000 --- a/res/cardsfolder/overgrowth.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Overgrowth -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Land -T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 2 | Defined$ TriggeredCardController -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/overgrowth.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/61.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/262.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/override.txt b/res/cardsfolder/override.txt deleted file mode 100644 index 6628341940b..00000000000 --- a/res/cardsfolder/override.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Override -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Counter target spell unless its controller pays 1 for each artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/override.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overrule.txt b/res/cardsfolder/overrule.txt deleted file mode 100644 index f786144d70c..00000000000 --- a/res/cardsfolder/overrule.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Overrule -ManaCost:X W U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ X W U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ Counter target spell unless its controller pays X. You gain X life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/overrule.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overrun.txt b/res/cardsfolder/overrun.txt deleted file mode 100644 index 955e3a5b51c..00000000000 --- a/res/cardsfolder/overrun.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Overrun -ManaCost:2 G G G -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 G G G | ValidCards$ Creature.YouCtrl | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Creatures you control get +3/+3 and gain trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card130506.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/137.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/198.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/284.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/260.jpg -End diff --git a/res/cardsfolder/oversold_cemetery.txt b/res/cardsfolder/oversold_cemetery.txt deleted file mode 100644 index d674f2f7d16..00000000000 --- a/res/cardsfolder/oversold_cemetery.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Oversold Cemetery -ManaCost:1 B -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oversold_cemetery.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oversoul_of_dusk.txt b/res/cardsfolder/oversoul_of_dusk.txt deleted file mode 100644 index 09f0c869d79..00000000000 --- a/res/cardsfolder/oversoul_of_dusk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oversoul of Dusk -ManaCost:GW GW GW GW GW -Types:Creature Spirit Avatar -Text:no text -PT:5/5 -K:Protection from blue -K:Protection from black -K:Protection from red -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oversoul_of_dusk.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overtaker.txt b/res/cardsfolder/overtaker.txt deleted file mode 100644 index e7cbd3dcc3d..00000000000 --- a/res/cardsfolder/overtaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Overtaker -ManaCost:1 U -Types:Creature Merfolk Spellshaper -Text:no text -PT:1/1 -A:AB$ GainControl | Cost$ 3 U T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | AddKWs$ Haste | Untap$ True | SpellDescription$ Untap target creature and gain control of it until end of turn. That creature gains haste until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overtaker.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overwhelming_forces.txt b/res/cardsfolder/overwhelming_forces.txt deleted file mode 100644 index 25c20f9a9d8..00000000000 --- a/res/cardsfolder/overwhelming_forces.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Overwhelming Forces -ManaCost:6 B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 6 B B | ValidCards$ Creature.YouDontCtrl | RememberDestroyed$ True | SubAbility$ SVar=DBDrawCard | SpellDescription$ Destroy all creatures target opponent controls. Draw a card for each creature destroyed this way. -SVar:DBDrawCard:DB$Draw | NumCards$ X -SVar:X:Remembered$Amount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overwhelming_forces.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overwhelming_intellect.txt b/res/cardsfolder/overwhelming_intellect.txt deleted file mode 100644 index 765451f3b3c..00000000000 --- a/res/cardsfolder/overwhelming_intellect.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Overwhelming Intellect -ManaCost:4 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 4 U U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target creature spell. Draw cards equal to that spell's converted mana cost. -SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/overwhelming_intellect.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/overwhelming_stampede.txt b/res/cardsfolder/overwhelming_stampede.txt deleted file mode 100644 index c44be4d4089..00000000000 --- a/res/cardsfolder/overwhelming_stampede.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Overwhelming Stampede -ManaCost:3 G G -Types:Sorcery -Text:Until end of turn, creatures you control gain trample and get +X/+X, where X is the greatest power among creatures you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/overwhelming_stampede.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/owl_familiar.txt b/res/cardsfolder/owl_familiar.txt deleted file mode 100644 index 7d1c3a4b973..00000000000 --- a/res/cardsfolder/owl_familiar.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Owl Familiar -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card, then discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/owl_familiar.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/43.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oxidda_daredevil.txt b/res/cardsfolder/oxidda_daredevil.txt deleted file mode 100644 index 6e9ca0a5153..00000000000 --- a/res/cardsfolder/oxidda_daredevil.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Oxidda Daredevil -ManaCost:1 R -Types:Creature Goblin Artificer -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ Sac<1/Artifact> | KW$ Haste | SpellDescription$ Oxidda Daredevil gains haste until end of turn. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_daredevil.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/100.jpg -End diff --git a/res/cardsfolder/oxidda_golem.txt b/res/cardsfolder/oxidda_golem.txt deleted file mode 100644 index e13ddb942f6..00000000000 --- a/res/cardsfolder/oxidda_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oxidda Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:Affinity for Mountains (This spell costs 1 less to cast for each Mountain you control.) -PT:3/2 -K:Haste -K:CostChange:Player:Less:1:Self:All:All:Affinity/Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_golem.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oxidda_scrapmelter.txt b/res/cardsfolder/oxidda_scrapmelter.txt deleted file mode 100644 index b9b22b37e94..00000000000 --- a/res/cardsfolder/oxidda_scrapmelter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Oxidda Scrapmelter -ManaCost:3 R -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Choose target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidda_scrapmelter.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/oxidize.txt b/res/cardsfolder/oxidize.txt deleted file mode 100644 index 5171717eb55..00000000000 --- a/res/cardsfolder/oxidize.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Oxidize -ManaCost:G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | NoRegen$ True | SpellDescription$ Destroy target artifact. It can't be regenerated. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/oxidize.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/79.jpg -End diff --git a/res/cardsfolder/oyobi_who_split_the_heavens.txt b/res/cardsfolder/oyobi_who_split_the_heavens.txt deleted file mode 100644 index ccb4f0d2991..00000000000 --- a/res/cardsfolder/oyobi_who_split_the_heavens.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Oyobi, Who Split the Heavens -ManaCost:6 W -Types:Legendary Creature Spirit -Text:no text -PT:3/6 -K:Flying -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, put a 3/3 white Spirit creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ W 3 3 Spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/oyobi_who_split_the_heavens.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pacifism.txt b/res/cardsfolder/pacifism.txt deleted file mode 100644 index b1ee375460b..00000000000 --- a/res/cardsfolder/pacifism.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Pacifism -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pacifism.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/33.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/27.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/29.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/31.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/246.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/31.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/23.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/22.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/33.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/47.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pact_of_negation.txt b/res/cardsfolder/pact_of_negation.txt deleted file mode 100644 index b86f39d5b03..00000000000 --- a/res/cardsfolder/pact_of_negation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pact of Negation -ManaCost:0 -Types:Instant -Text:no text -K:CARDNAME is blue. -A:SP$ Counter | Cost$ 0 | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDelTrig | SpellDescription$ Counter target spell. At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game. -SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseGame | TriggerDescription$ At the beginning of your next upkeep, pay 3 U U. If you don't, you lose the game. -SVar:TrigLoseGame:SP$LosesGame | Cost$ 0 | UnlessCost$ 3 U U | UnlessPayer$ You | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pact_of_negation.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pain_kami.txt b/res/cardsfolder/pain_kami.txt deleted file mode 100644 index 6f6392977ce..00000000000 --- a/res/cardsfolder/pain_kami.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pain Kami -ManaCost:2 R -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ X R Sac<1/CARDNAME> | Tgt$ TgtC | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pain_kami.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pain_magnification.txt b/res/cardsfolder/pain_magnification.txt deleted file mode 100644 index ce402987521..00000000000 --- a/res/cardsfolder/pain_magnification.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pain Magnification -ManaCost:1 B R -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidTarget$ Opponent | DamageAmount$ GE3 | Execute$ TrigDestroy | TriggerDescription$ Whenever an opponent is dealt 3 or more damage by a single source, that player discards a card. -SVar:TrigDestroy:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pain_magnification.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/painful_memories.txt b/res/cardsfolder/painful_memories.txt deleted file mode 100644 index c8da4bcd9d3..00000000000 --- a/res/cardsfolder/painful_memories.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Painful Memories -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Opponent | ChangeType$ Card | ChangeNum$ 1 | IsCurse$ True | SpellDescription$ Look at target opponent's hand and choose a card from it. Put that card on top of that player's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/painful_memories.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/147.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/painsmith.txt b/res/cardsfolder/painsmith.txt deleted file mode 100644 index 8c67e00205f..00000000000 --- a/res/cardsfolder/painsmith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Painsmith -ManaCost:1 B -Types:Creature Human Artificer -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may have target creature get +2/+0 and gain deathtouch until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 2 | KW$ Deathtouch -SVar:BuffedBy:Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/painsmith.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/painters_servant.txt b/res/cardsfolder/painters_servant.txt deleted file mode 100644 index 6b531df5479..00000000000 --- a/res/cardsfolder/painters_servant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Painter's Servant -ManaCost:2 -Types:Artifact Creature Scarecrow -Text:As Painter's Servant enters the battlefield, choose a color.\r\nAll cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors. -PT:1/3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/painters_servant.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/painwracker_oni.txt b/res/cardsfolder/painwracker_oni.txt deleted file mode 100644 index 52461484bb3..00000000000 --- a/res/cardsfolder/painwracker_oni.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Painwracker Oni -ManaCost:3 B B -Types:Creature Demon Spirit -Text:no text -PT:5/4 -K:Fear -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, sacrifice a creature if you don't control an Ogre. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature | Defined$ You | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:NeedsToPlay:Ogre.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/painwracker_oni.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paladin_en_vec.txt b/res/cardsfolder/paladin_en_vec.txt deleted file mode 100644 index db7382848d9..00000000000 --- a/res/cardsfolder/paladin_en_vec.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Paladin en-Vec -ManaCost:1 W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from black -K:Protection from red -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/paladin_en_vec.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/12.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/32.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pale_bears.txt b/res/cardsfolder/pale_bears.txt deleted file mode 100644 index 7e0128de5d9..00000000000 --- a/res/cardsfolder/pale_bears.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pale Bears -ManaCost:2 G -Types:Creature Bear -Text:no text -PT:2/2 -K:Islandwalk -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2580.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pale_recluse.txt b/res/cardsfolder/pale_recluse.txt deleted file mode 100644 index ecb0741abcf..00000000000 --- a/res/cardsfolder/pale_recluse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pale Recluse -ManaCost:4 G W -Types:Creature Spider -Text:no text -PT:4/5 -K:Reach -K:TypeCycling:Forest:2 -K:TypeCycling:Plains:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pale_recluse.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paleoloth.txt b/res/cardsfolder/paleoloth.txt deleted file mode 100644 index 150edc28585..00000000000 --- a/res/cardsfolder/paleoloth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Paleoloth -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/paleoloth.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/palinchron.txt b/res/cardsfolder/palinchron.txt deleted file mode 100644 index 42c3ac1df59..00000000000 --- a/res/cardsfolder/palinchron.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Palinchron -ManaCost:5 U U -Types:Creature Illusion -Text:no text -PT:4/5 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap up to seven lands. -SVar:TrigUntap:AB$ Untap | Cost$ 0 | UntapUpTo$ True | UntapType$ Land | Amount$ 7 -A:AB$ ChangeZone | Cost$ 2 U U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/palinchron.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/palladia_mors.txt b/res/cardsfolder/palladia_mors.txt deleted file mode 100644 index 2d4dafd269b..00000000000 --- a/res/cardsfolder/palladia_mors.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Palladia-Mors -ManaCost:2 W W R R G G -Types:Legendary Creature Elder Dragon -Text:no text -PT:7/7 -K:Flying -K:Trample -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay R G W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/palladia_mors.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/palladium_myr.txt b/res/cardsfolder/palladium_myr.txt deleted file mode 100644 index 1987b92e86b..00000000000 --- a/res/cardsfolder/palladium_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Palladium Myr -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/palladium_myr.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/palliation_accord.txt b/res/cardsfolder/palliation_accord.txt deleted file mode 100644 index 786961800ff..00000000000 --- a/res/cardsfolder/palliation_accord.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Palliation Accord -ManaCost:3 W U -Types:Enchantment -Text:no text -T:Mode$ Taps | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature an opponent controls becomes tapped, put a shield counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SHIELD | CounterNum$ 1 -A:AB$ PreventDamage | Cost$ SubCounter<1/SHIELD> | Defined$ You | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to you this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/palliation_accord.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pallid_mycoderm.txt b/res/cardsfolder/pallid_mycoderm.txt deleted file mode 100644 index c0ea20d2d3a..00000000000 --- a/res/cardsfolder/pallid_mycoderm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pallid Mycoderm -ManaCost:3 W -Types:Creature Fungus -Text:no text -PT:2/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ PumpAll | Cost$ Sac<1/Saproling> | ValidCards$ Fungus.Creature+YouCtrl,Saproling.Creature+YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Fungus and/or Saproling creatures you control get +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pallid_mycoderm.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pallimud.txt b/res/cardsfolder/pallimud.txt deleted file mode 100644 index 70a46497355..00000000000 --- a/res/cardsfolder/pallimud.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pallimud -ManaCost:2 R -Types:Creature Beast -Text:As CARDNAME enters the battlefield, choose an opponent. -PT:*/3 -K:stSetPT:Count$Valid Land.tapped+YouDontCtrl:3:CARDNAME's power is equal to the number of tapped lands the chosen player controls. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pallimud.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pang_tong_young_phoenix.txt b/res/cardsfolder/pang_tong_young_phoenix.txt deleted file mode 100644 index 05aac9e40b2..00000000000 --- a/res/cardsfolder/pang_tong_young_phoenix.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pang Tong, "Young Phoenix" -ManaCost:1 W W -Types:Legendary Creature Human Advisor -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Target creature gets +0/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pang_tong_young_phoenix.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pangosaur.txt b/res/cardsfolder/pangosaur.txt deleted file mode 100755 index d13291b2594..00000000000 --- a/res/cardsfolder/pangosaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pangosaur -ManaCost:2 G G -Types:Creature Lizard -Text:no text -PT:6/6 -T:Mode$ LandPlayed | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever a player plays a land, return Pangosaur to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pangosaur.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/panic.txt b/res/cardsfolder/panic.txt deleted file mode 100644 index cea3ff0731b..00000000000 --- a/res/cardsfolder/panic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Panic -ManaCost:R -Types:Instant -Text:Cast Panic only during combat before blockers are declared. -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | ActivatingPhases$ BeginCombat->Declare Attackers - Play Instants and Abilities | IsCurse$ True | SpellDescription$ Target creature can't block this turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/panic.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/260.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/panic_attack.txt b/res/cardsfolder/panic_attack.txt deleted file mode 100644 index f88da4fe1de..00000000000 --- a/res/cardsfolder/panic_attack.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Panic Attack -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 3 | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | TgtPrompt$ Select target creature. | SpellDescription$ Up to three target creatures can't block this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/panic_attack.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/209.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/150.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/98.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/panic_spellbomb.txt b/res/cardsfolder/panic_spellbomb.txt deleted file mode 100644 index 9150a3d6954..00000000000 --- a/res/cardsfolder/panic_spellbomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Panic Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may pay R. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ R | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/panic_spellbomb.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/panther_warriors.txt b/res/cardsfolder/panther_warriors.txt deleted file mode 100644 index 3f3745db394..00000000000 --- a/res/cardsfolder/panther_warriors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Panther Warriors -ManaCost:4 G -Types:Creature Cat Warrior -Text:no text -PT:6/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card16453.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/65.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/243.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paperfin_rascal.txt b/res/cardsfolder/paperfin_rascal.txt deleted file mode 100644 index a6f614d09cd..00000000000 --- a/res/cardsfolder/paperfin_rascal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Paperfin Rascal -ManaCost:2 U -Types:Creature Merfolk Rogue -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME enters the battlefield, clash with an opponent. If you win, put a +1/+1 counter on CARDNAME. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/paperfin_rascal.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paradigm_shift.txt b/res/cardsfolder/paradigm_shift.txt deleted file mode 100644 index b82be9e53ae..00000000000 --- a/res/cardsfolder/paradigm_shift.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Paradigm Shift -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 1 U | ChangeType$ Card.YouOwn | Origin$ Library | Destination$ Exile | SubAbility$ SVar=DBShuffle | SpellDescription$ Exile all cards from your library. Then shuffle your graveyard into your library. -SVar:DBShuffle:DB$ChangeZoneAll | ChangeType$ Card.YouOwn | Origin$ Graveyard | Destination$ Library | Shuffle$ True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/paradigm_shift.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paradise_mantle.txt b/res/cardsfolder/paradise_mantle.txt deleted file mode 100644 index 158f88b135c..00000000000 --- a/res/cardsfolder/paradise_mantle.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Paradise Mantle -ManaCost:0 -Types:Artifact Equipment -Text:no text -K:eqPump 1:+0/+0 -K:stPumpEquipped:Creature:0/0/SVar=ManaW & SVar=ManaU & SVar=ManaB & SVar=ManaR & SVar=ManaG:No Condition:Equipped creature has "tap: Add one mana of any color to your mana pool." -SVar:ManaW:AB$Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:ManaU:AB$Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:ManaB:AB$Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:ManaR:AB$Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:ManaG:AB$Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/paradise_mantle.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paragon_of_the_amesha.txt b/res/cardsfolder/paragon_of_the_amesha.txt deleted file mode 100644 index e88bfdcea57..00000000000 --- a/res/cardsfolder/paragon_of_the_amesha.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Paragon of the Amesha -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -A:AB$ Animate | Cost$ W U B R G | Defined$ Self | Types$ Angel | Keywords$ Flying & Lifelink | SubAbility$ SVar=DBPump | SpellDescription$ Until end of turn, CARDNAME becomes an Angel, gets +3/+3, and gains flying and lifelink. -SVar:DBPump:DB$Pump | Defined$ Self | NumAtt$ +3 | NumDef$ +3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/paragon_of_the_amesha.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parallax_dementia.txt b/res/cardsfolder/parallax_dementia.txt deleted file mode 100644 index f116f2c4c9e..00000000000 --- a/res/cardsfolder/parallax_dementia.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Parallax Dementia -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Fading:1 -K:enPump:+3/+2 -# The trigger part of this will not work until an issue with Auras and LastKnownInfo is sorted out. TODO -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME leaves the battlefield, destroy enchanted creature. That creature can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ Enchanted | NoRegen$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_dementia.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parallax_inhibitor.txt b/res/cardsfolder/parallax_inhibitor.txt deleted file mode 100644 index cb552dee94e..00000000000 --- a/res/cardsfolder/parallax_inhibitor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Parallax Inhibitor -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PutCounterAll | Cost$ 1 T Sac<1/CARDNAME> | ValidCards$ Permanent.withFading+YouCtrl | CounterType$ FADE | CounterNum$ 1 | SpellDescription$ Put a fade counter on each permanent with fading you control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_inhibitor.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parallax_tide.txt b/res/cardsfolder/parallax_tide.txt deleted file mode 100644 index 55d93064092..00000000000 --- a/res/cardsfolder/parallax_tide.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Parallax Tide -ManaCost:2 U U -Types:Enchantment -Text:no text -K:Fading:5 -A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Land | TgtPrompt$ Select target land | RememberTargets$ True | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, each player returns to the battlefield all cards he or she owns exiled with CARDNAME. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_tide.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parallax_wave.txt b/res/cardsfolder/parallax_wave.txt deleted file mode 100644 index c682f5e0f63..00000000000 --- a/res/cardsfolder/parallax_wave.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Parallax Wave -ManaCost:2 W W -Types:Enchantment -Text:no text -K:Fading:5 -A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberTargets$ True | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, each player returns to the battlefield all cards he or she owns exiled with CARDNAME. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_wave.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parallel_evolution.txt b/res/cardsfolder/parallel_evolution.txt deleted file mode 100644 index 13857f3c238..00000000000 --- a/res/cardsfolder/parallel_evolution.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Parallel Evolution -ManaCost:3 G G -Types:Sorcery -Text:no text -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallel_evolution.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paralyzing_grasp.txt b/res/cardsfolder/paralyzing_grasp.txt deleted file mode 100644 index 3a19782bae3..00000000000 --- a/res/cardsfolder/paralyzing_grasp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Paralyzing Grasp -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/paralyzing_grasp.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parapet_watchers.txt b/res/cardsfolder/parapet_watchers.txt deleted file mode 100644 index 7bda60ddf92..00000000000 --- a/res/cardsfolder/parapet_watchers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Parapet Watchers -ManaCost:2 U -Types:Creature Kithkin Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ WU | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/parapet_watchers.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/45.jpg -End diff --git a/res/cardsfolder/parasitic_bond.txt b/res/cardsfolder/parasitic_bond.txt deleted file mode 100644 index 2e0e96db55b..00000000000 --- a/res/cardsfolder/parasitic_bond.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Parasitic Bond -ManaCost:3 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 2 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/parasitic_bond.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parasitic_implant.txt b/res/cardsfolder/parasitic_implant.txt deleted file mode 100644 index 2708a402ca3..00000000000 --- a/res/cardsfolder/parasitic_implant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Parasitic Implant -ManaCost:3 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ 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. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ EnchantedController | SacValid$ Card.AttachedBy | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/parasitic_implant.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/parasitic_strix.txt b/res/cardsfolder/parasitic_strix.txt deleted file mode 100644 index 3246f0576e7..00000000000 --- a/res/cardsfolder/parasitic_strix.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Parasitic Strix -ManaCost:2 U -Types:Artifact Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Black+YouCtrl | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, if you control a black permanent, target player loses 2 life and you gain 2 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Choose target player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/parasitic_strix.jpg -SVar:Rarity:Common -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/32.jpg -End diff --git a/res/cardsfolder/parch.txt b/res/cardsfolder/parch.txt deleted file mode 100644 index bf61f276c30..00000000000 --- a/res/cardsfolder/parch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Parch -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | NumDmg$ 2 | Tgt$ TgtCP | PrecostDesc$ Choose one - | SpellDescription$ CARDNAME deals 2 damage to target creature or player; -A:SP$ DealDamage | Cost$ 1 R | NumDmg$ 4 | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature. | SpellDescription$ or CARDNAME deals 4 damage to target blue creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/parch.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pardic_arsonist.txt b/res/cardsfolder/pardic_arsonist.txt deleted file mode 100644 index 118830186ef..00000000000 --- a/res/cardsfolder/pardic_arsonist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pardic Arsonist -ManaCost:2 R R -Types:Creature Human Barbarian -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "When CARDNAME enters the battlefield, it deals 3 damage to target creature or player." -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_arsonist.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pardic_collaborator.txt b/res/cardsfolder/pardic_collaborator.txt deleted file mode 100644 index 7d9d96a60ec..00000000000 --- a/res/cardsfolder/pardic_collaborator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pardic Collaborator -ManaCost:3 R -Types:Creature Human Barbarian -Text:no text -PT:2/2 -K:First Strike -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_collaborator.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/106.jpg -End diff --git a/res/cardsfolder/pardic_dragon.txt b/res/cardsfolder/pardic_dragon.txt deleted file mode 100644 index a0828faffb9..00000000000 --- a/res/cardsfolder/pardic_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pardic Dragon -ManaCost:4 R R -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -K:Suspend:2:R R -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | TriggerZones$ Exile | IsPresent$ Card.countersGE1TIME+Self | PresentZone$ Exile | OptionalDecider$ Opponent | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts a spell, if CARDNAME is suspended, that player may put a time counter on CARDNAME. -SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_dragon.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/173.jpg -End diff --git a/res/cardsfolder/pardic_firecat.txt b/res/cardsfolder/pardic_firecat.txt deleted file mode 100644 index dd67c023094..00000000000 --- a/res/cardsfolder/pardic_firecat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pardic Firecat -ManaCost:3 R -Types:Creature Elemental Cat -Text:If Pardic Firecat is in a graveyard, effects from spells named Flame Burst count it as a card named Flame Burst. -PT:2/3 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_firecat.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pardic_lancer.txt b/res/cardsfolder/pardic_lancer.txt deleted file mode 100644 index 49da4d96792..00000000000 --- a/res/cardsfolder/pardic_lancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pardic Lancer -ManaCost:4 R -Types:Creature Barbarian -Text:no text -PT:3/2 -A:AB$ Pump | Cost$ Discard<1/Random> | NumAtt$ +1 | KW$ First Strike | SpellDescription$ CARDNAME gets +1/+0 and gains first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_lancer.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pardic_swordsmith.txt b/res/cardsfolder/pardic_swordsmith.txt deleted file mode 100644 index 10c2b5d7acb..00000000000 --- a/res/cardsfolder/pardic_swordsmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pardic Swordsmith -ManaCost:2 R -Types:Creature Dwarf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R Discard<1/Random> | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pardic_swordsmith.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/part_the_veil.txt b/res/cardsfolder/part_the_veil.txt deleted file mode 100644 index e6373c486c9..00000000000 --- a/res/cardsfolder/part_the_veil.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Part the Veil -ManaCost:3 U -Types:Instant Arcane -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U | ChangeType$ Creature.YouCtrl | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all creatures you control to their owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/part_the_veil.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/part_water.txt b/res/cardsfolder/part_water.txt deleted file mode 100644 index 531bfa28724..00000000000 --- a/res/cardsfolder/part_water.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Part Water -ManaCost:X X U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X X U | KW$ Islandwalk | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | TgtPrompt$ Select target Creatures | SpellDescription$ X target creatures gain islandwalk until end of turn. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/part_water.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/patagia_golem.txt b/res/cardsfolder/patagia_golem.txt deleted file mode 100644 index 5f9cdf9e819..00000000000 --- a/res/cardsfolder/patagia_golem.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Patagia Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ 3 | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/patagia_golem.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/308.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/304.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/278.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/310.jpg -End diff --git a/res/cardsfolder/path_of_angers_flame.txt b/res/cardsfolder/path_of_angers_flame.txt deleted file mode 100644 index 7b555a89bfe..00000000000 --- a/res/cardsfolder/path_of_angers_flame.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Path of Anger's Flame -ManaCost:2 R -Types:Instant Arcane -Text:no text -A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | SpellDescription$ Creatures you control get +2/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card74179.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/path_of_peace.txt b/res/cardsfolder/path_of_peace.txt deleted file mode 100644 index 3b7d50a136b..00000000000 --- a/res/cardsfolder/path_of_peace.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Path of Peace -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target creature. Its owner gains 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/path_of_peace.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/29.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/138.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/21.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/path_to_exile.txt b/res/cardsfolder/path_to_exile.txt deleted file mode 100644 index 275aa1f8e85..00000000000 --- a/res/cardsfolder/path_to_exile.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Path to Exile -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature | SubAbility$ SVar=DBChange | SpellDescription$ 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. -SVar:DBChange:DB$ChangeZone | Origin$ Library | Destination$ Battlefield | OptionalDecider$ You | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | Defined$ TargetedController -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/path_to_exile.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/patriarchs_bidding.txt b/res/cardsfolder/patriarchs_bidding.txt deleted file mode 100644 index eac18b2d16d..00000000000 --- a/res/cardsfolder/patriarchs_bidding.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Patriarch's Bidding -ManaCost:3 B B -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/patriarchs_bidding.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/patrol_signaler.txt b/res/cardsfolder/patrol_signaler.txt deleted file mode 100644 index baa28cfcea1..00000000000 --- a/res/cardsfolder/patrol_signaler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Patrol Signaler -ManaCost:1 W -Types:Creature Kithkin Soldier -Text:no text -PT:1/1 -A:AB$ Token | Cost$ 1 W Untap | TokenAmount$ 1 | TokenName$ Kithkin Soldier | TokenTypes$ Creature,Kithkin,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 white Kithkin Soldier creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/patrol_signaler.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/patron_of_the_wild.txt b/res/cardsfolder/patron_of_the_wild.txt deleted file mode 100644 index 5dc175773e8..00000000000 --- a/res/cardsfolder/patron_of_the_wild.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Patron of the Wild -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -K:Morph:2 G -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is turned face up, target creature gets +3/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_of_the_wild.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/patron_wizard.txt b/res/cardsfolder/patron_wizard.txt deleted file mode 100644 index 96d7d1fd1df..00000000000 --- a/res/cardsfolder/patron_wizard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Patron Wizard -ManaCost:U U U -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Counter | Cost$ tapXType<1/Wizard> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/patron_wizard.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pattern_of_rebirth.txt b/res/cardsfolder/pattern_of_rebirth.txt deleted file mode 100644 index dcf2f5baf71..00000000000 --- a/res/cardsfolder/pattern_of_rebirth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pattern of Rebirth -ManaCost:3 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigSearch | TriggerDescription$ When enchanted creature is put into a graveyard, 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. -SVar:TrigSearch:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCardController | ChangeType$ Creature | ChangeNum$ 1 | Hidden$ True | Origin$ Library | Destination$ Battlefield | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pattern_of_rebirth.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/paupers_cage.txt b/res/cardsfolder/paupers_cage.txt deleted file mode 100644 index 53a9daca2d9..00000000000 --- a/res/cardsfolder/paupers_cage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Paupers' Cage -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ LT3 | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has two or fewer cards in hand, CARDNAME deals 2 damage to him or her. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/paupers_cage.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pavel_maliki.txt b/res/cardsfolder/pavel_maliki.txt deleted file mode 100644 index 807d6a27f10..00000000000 --- a/res/cardsfolder/pavel_maliki.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pavel Maliki -ManaCost:4 B R -Types:Legendary Creature Human -Text:no text -PT:5/3 -A:AB$ Pump | Cost$ B R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pavel_maliki.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/288.jpg -End diff --git a/res/cardsfolder/pawn_of_ulamog.txt b/res/cardsfolder/pawn_of_ulamog.txt deleted file mode 100644 index 288cf381492..00000000000 --- a/res/cardsfolder/pawn_of_ulamog.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pawn of Ulamog -ManaCost:1 B B -Types:Creature Vampire Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+nonToken+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another nontoken creature you control is put into a graveyard from the battlefield, you may put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add to your mana pool." -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Secondary$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another nontoken creature you control is put into a graveyard from the battlefield, you may put a 0/1 colorless Eldrazi Spawn creature token onto the battlefield. It has "Sacrifice this creature: Add to your mana pool." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pawn_of_ulamog.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peace_and_quiet.txt b/res/cardsfolder/peace_and_quiet.txt deleted file mode 100644 index ff15e030cd9..00000000000 --- a/res/cardsfolder/peace_and_quiet.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Peace and Quiet -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy two target enchantments. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peace_and_quiet.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peace_of_mind.txt b/res/cardsfolder/peace_of_mind.txt deleted file mode 100644 index fc1fe506f1e..00000000000 --- a/res/cardsfolder/peace_of_mind.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Peace of Mind -ManaCost:1 W -Types:Enchantment -Text:no text -A:AB$ GainLife | Cost$ W Discard<1/Card> | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peace_of_mind.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/13.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peace_strider.txt b/res/cardsfolder/peace_strider.txt deleted file mode 100644 index 568bc09b471..00000000000 --- a/res/cardsfolder/peace_strider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Peace Strider -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peace_strider.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peacekeeper.txt b/res/cardsfolder/peacekeeper.txt deleted file mode 100644 index 602e9932dfb..00000000000 --- a/res/cardsfolder/peacekeeper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Peacekeeper -ManaCost:2 W -Types:Creature Human -Text:Creatures can't attack -PT:1/1 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 W -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/peacekeeper.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peach_garden_oath.txt b/res/cardsfolder/peach_garden_oath.txt deleted file mode 100644 index c7dcfec7616..00000000000 --- a/res/cardsfolder/peach_garden_oath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Peach Garden Oath -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ W | LifeAmount$ X | SpellDescription$ You gain 2 life for each creature you control. -SVar:X:Count$TypeYouCtrl.Creature/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peach_garden_oath.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/34.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pearl_dragon.txt b/res/cardsfolder/pearl_dragon.txt deleted file mode 100644 index 4275b13229c..00000000000 --- a/res/cardsfolder/pearl_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pearl Dragon -ManaCost:4 W W -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -A:AB$ Pump | Cost$ 1 W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pearl_dragon.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/34.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/237.jpg -End diff --git a/res/cardsfolder/pearl_medallion.txt b/res/cardsfolder/pearl_medallion.txt deleted file mode 100644 index a95e7ca5b51..00000000000 --- a/res/cardsfolder/pearl_medallion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pearl Medallion -ManaCost:2 -Types:Artifact -Text:White spells you cast cost 1 less to cast. -K:CostChange:Player:Less:1:Spell:white:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pearl_medallion.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/290.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pearled_unicorn.txt b/res/cardsfolder/pearled_unicorn.txt deleted file mode 100644 index 4a9ef0d8696..00000000000 --- a/res/cardsfolder/pearled_unicorn.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pearled Unicorn -ManaCost:2 W -Types:Creature Unicorn -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4147.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/214.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/216.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/326.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/289.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/214.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peat_bog.txt b/res/cardsfolder/peat_bog.txt deleted file mode 100644 index a34891a8f3b..00000000000 --- a/res/cardsfolder/peat_bog.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Peat Bog -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:DEPLETION:2 -A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ B | Deplete$ DEPLETION | Amount$ 2 | SpellDescription$ Add B B to your mana pool. If there are no depletion counters on CARDNAME, sacrifice it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://wizards.com/global/images/magic/general/peat_bog.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peek.txt b/res/cardsfolder/peek.txt deleted file mode 100644 index 55202379f16..00000000000 --- a/res/cardsfolder/peek.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Peek -ManaCost:U -Types:Instant -Text:no text -A:SP$ RevealHand | Cost$ U | ValidTgts$ Player | TgtPrompt$ Select target player | SubAbility$ SVar=DBDraw | SpellDescription$ Look at target player's hand. -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/peek.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/91.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peel_from_reality.txt b/res/cardsfolder/peel_from_reality.txt deleted file mode 100644 index 3673502b6f9..00000000000 --- a/res/cardsfolder/peel_from_reality.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Peel from Reality -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBBounce | SpellDescription$ Return target creature you control and target creature you don't control to their owner's hands. -SVar:DBBounce:DB$ ChangeZone | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87951.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peer_through_depths.txt b/res/cardsfolder/peer_through_depths.txt deleted file mode 100644 index 1ada9208fd7..00000000000 --- a/res/cardsfolder/peer_through_depths.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Peer Through Depths -ManaCost:1 U -Types:Instant Arcane -Text:no text -A:SP$ Dig | Cost$ 1 U | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Instant,Sorcery | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/peer_through_depths.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pegasus_charger.txt b/res/cardsfolder/pegasus_charger.txt deleted file mode 100644 index 274a0fd55e8..00000000000 --- a/res/cardsfolder/pegasus_charger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pegasus Charger -ManaCost:2 W -Types:Creature Pegasus -Text:no text -PT:2/1 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pegasus_charger.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/30.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pegasus_refuge.txt b/res/cardsfolder/pegasus_refuge.txt deleted file mode 100644 index 5a213063be6..00000000000 --- a/res/cardsfolder/pegasus_refuge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pegasus Refuge -ManaCost:3 W -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ 2 Discard<1/Card> | TokenImage$ W 1 1 Pegasus Flying | TokenAmount$ 1 | TokenName$ Pegasus | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put a 1/1 white Pegasus creature token with flying onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pegasus_refuge.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pegasus_stampede.txt b/res/cardsfolder/pegasus_stampede.txt deleted file mode 100644 index 06f8b5171b4..00000000000 --- a/res/cardsfolder/pegasus_stampede.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pegasus Stampede -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 1 W | TokenAmount$ 1 | TokenName$ Pegasus | TokenColors$ White | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put a 1/1 white Pegasus creature token with flying onto the battlefield. -A:SP$ Token | Cost$ 1 W Sac<1/Land> | TokenAmount$ 1 | TokenName$ Pegasus | TokenColors$ White | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | CostDesc$ Buyback | SubAbility$ SVar=DBBuyback | SpellDescription$ - sacrifice a land -SVar:DBBuyback:DB$ ChangeZone | Origin$ Stack | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pegasus_stampede.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/14.jpg -End diff --git a/res/cardsfolder/pelakka_wurm.txt b/res/cardsfolder/pelakka_wurm.txt deleted file mode 100644 index a7057745b0a..00000000000 --- a/res/cardsfolder/pelakka_wurm.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pelakka Wurm -ManaCost:4 G G G -Types:Creature Wurm -Text:no text -PT:7/7 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 7 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 7 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pelakka_wurm.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pemmins_aura.txt b/res/cardsfolder/pemmins_aura.txt deleted file mode 100644 index aa6b0fe4d60..00000000000 --- a/res/cardsfolder/pemmins_aura.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Pemmin's Aura -ManaCost:1 U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Untap | Cost$ U | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -A:AB$ Pump | Cost$ U | Defined$ Enchanted | KW$ Flying | SpellDescription$ Enchanted creature gains flying until end of turn. -A:AB$ Pump | Cost$ U | Defined$ Enchanted | KW$ Shroud | SpellDescription$ Enchanted creature gains shroud until end of turn. -A:AB$ Pump | Cost$ 1 | Defined$ Enchanted | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ Enchanted creature gets +1/-1 or -A:AB$ Pump | Cost$ 1 | Defined$ Enchanted | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ -1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pemmins_aura.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pendelhaven.txt b/res/cardsfolder/pendelhaven.txt deleted file mode 100644 index 5ed59fb8ada..00000000000 --- a/res/cardsfolder/pendelhaven.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pendelhaven -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Pump | Cost$ T | NumAtt$ +1 | NumDef$ +2 | ValidTgts$ Creature.powerEQ1+toughnessEQ1 | TgtPrompt$ Select target 1/1 Creature | SpellDescription$ Target 1/1 creature gets +1/+2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pendelhaven.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/120.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pendrell_drake.txt b/res/cardsfolder/pendrell_drake.txt deleted file mode 100644 index a1e7ea70f0c..00000000000 --- a/res/cardsfolder/pendrell_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pendrell Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:2/3 -K:Flying -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pendrell_drake.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pendrell_mists.txt b/res/cardsfolder/pendrell_mists.txt deleted file mode 100644 index c3ecf90e3c3..00000000000 --- a/res/cardsfolder/pendrell_mists.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pendrell Mists -ManaCost:3 U -Types:Enchantment -Text:no text -K:stPumpAll:Creature:0/0/At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1:No Condition:All creatures have "At the beginning of your upkeep, sacrifice this creature unless you pay 1." -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pendrell_mists.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pennon_blade.txt b/res/cardsfolder/pennon_blade.txt deleted file mode 100644 index 6c936766d52..00000000000 --- a/res/cardsfolder/pennon_blade.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pennon Blade -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1 for each creature you control. -K:eqPump 4:+0/+0 -K:stPumpEquipped:Creature:X/X:no Condition:no text -SVar:X:Count$Valid Creature.YouCtrl -SVar:BuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pennon_blade.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pentad_prism.txt b/res/cardsfolder/pentad_prism.txt deleted file mode 100644 index 46bf68fafac..00000000000 --- a/res/cardsfolder/pentad_prism.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Pentad Prism -ManaCost:2 -Types:Artifact -Text:no text -K:Sunburst -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pentad_prism.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pentavus.txt b/res/cardsfolder/pentavus.txt deleted file mode 100644 index cb6ce07dfee..00000000000 --- a/res/cardsfolder/pentavus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pentavus -ManaCost:7 -Types:Artifact Creature Construct -Text:no text -PT:0/0 -K:etbCounter:P1P1:5 -A:AB$ Token | Cost$ 1 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Pentavite | TokenTypes$ Artifact,Creature,Pentavite | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put a 1/1 colorless Pentavite artifact creature token with flying onto the battlefield. -A:AB$ PutCounter | Cost$ 1 Sac<1/Pentavite> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on Pentavus. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pentavus.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/penumbra_bobcat.txt b/res/cardsfolder/penumbra_bobcat.txt deleted file mode 100644 index 6bd086ef417..00000000000 --- a/res/cardsfolder/penumbra_bobcat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Penumbra Bobcat -ManaCost:2 G -Types:Creature Cat -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 2/1 black Cat creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ TriggeredCardController | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card26815.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/penumbra_kavu.txt b/res/cardsfolder/penumbra_kavu.txt deleted file mode 100644 index ffaeb7bfe5d..00000000000 --- a/res/cardsfolder/penumbra_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Penumbra Kavu -ManaCost:4 G -Types:Creature Kavu -Text: -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 3/3 black Kavu creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Kavu | TokenTypes$ Creature,Kavu | TokenOwner$ TriggeredCardController | TokenColors$ Black | TokenPower$ 3 | TokenToughness$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card25956.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/penumbra_spider.txt b/res/cardsfolder/penumbra_spider.txt deleted file mode 100644 index 286d60954f6..00000000000 --- a/res/cardsfolder/penumbra_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Penumbra Spider -ManaCost:2 G G -Types:Creature Spider -Text:no text -PT:2/4 -K:Reach -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 2/4 black Spider creature token with reach onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Spider | TokenTypes$ Creature,Spider | TokenOwner$ TriggeredCardController | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 4 | TokenKeywords$ Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/penumbra_spider.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/penumbra_wurm.txt b/res/cardsfolder/penumbra_wurm.txt deleted file mode 100644 index b0afc288540..00000000000 --- a/res/cardsfolder/penumbra_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Penumbra Wurm -ManaCost:5 G G -Types:Creature Wurm -Text:no text -PT:6/6 -K:Trample -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 6/6 black Wurm creature token with trample onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Creature,Wurm | TokenOwner$ TriggeredCardController | TokenColors$ Black | TokenPower$ 6 | TokenToughness$ 6 | TokenKeywords$ Trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/penumbra_wurm.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/people_of_the_woods.txt b/res/cardsfolder/people_of_the_woods.txt deleted file mode 100644 index 1477018f1d2..00000000000 --- a/res/cardsfolder/people_of_the_woods.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:People of the Woods -ManaCost:G G -Types:Creature Human -Text:no text -PT:1/* -K:stSetPT:1:Count$NumTypeYouCtrl.Forest:People of the Woods's toughness is equal to the number of Forests you control. -SVar:BuffedBy:Forest -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/people_of_the_woods.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peppersmoke.txt b/res/cardsfolder/peppersmoke.txt deleted file mode 100644 index eece33ddce2..00000000000 --- a/res/cardsfolder/peppersmoke.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Peppersmoke -ManaCost:B -Types:Tribal Instant Faerie -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature gets -1/-1 until end of turn. If you control a Faerie, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Faerie.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Faerie, -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/peppersmoke.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peregrine_drake.txt b/res/cardsfolder/peregrine_drake.txt deleted file mode 100644 index 877ab50a35a..00000000000 --- a/res/cardsfolder/peregrine_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Peregrine Drake -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:2/3 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap up to five lands. -SVar:TrigUntap:AB$ Untap | Cost$ 0 | UntapUpTo$ True | UntapType$ Land | Amount$ 5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peregrine_drake.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/peregrine_mask.txt b/res/cardsfolder/peregrine_mask.txt deleted file mode 100644 index 88327f68980..00000000000 --- a/res/cardsfolder/peregrine_mask.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Peregrine Mask -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature has defender, flying, and first strike. -K:eqPump 2:Defender & Flying & First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/peregrine_mask.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perilous_forays.txt b/res/cardsfolder/perilous_forays.txt deleted file mode 100644 index ab676aa6a3d..00000000000 --- a/res/cardsfolder/perilous_forays.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Perilous Forays -ManaCost:3 G G -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 Sac<1/Creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Plains,Land.Island,Land.Swamp,Land.Mountain,Land.Forest | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a land card with a basic land type and put it onto the battlefield tapped. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/perilous_forays.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perilous_myr.txt b/res/cardsfolder/perilous_myr.txt deleted file mode 100644 index a4afa1f6b33..00000000000 --- a/res/cardsfolder/perilous_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Perilous Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals 2 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/perilous_myr.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perilous_research.txt b/res/cardsfolder/perilous_research.txt deleted file mode 100644 index 9938ac81063..00000000000 --- a/res/cardsfolder/perilous_research.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Perilous Research -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 U | NumCards$ 2 | SubAbility$ SVar=DBSac | SpellDescription$ Draw two cards, then sacrifice a permanent. -SVar:DBSac:DB$Sacrifice | SacValid$ Permanent -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/perilous_research.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perimeter_captain.txt b/res/cardsfolder/perimeter_captain.txt deleted file mode 100644 index ca202642cba..00000000000 --- a/res/cardsfolder/perimeter_captain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Perimeter Captain -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:0/4 -K:Defender -T:Mode$ Blocks | ValidCard$ Creature.YouCtrl+withDefender | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever a creature you control with defender blocks, you may gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/perimeter_captain.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perish.txt b/res/cardsfolder/perish.txt deleted file mode 100644 index 04297e1e730..00000000000 --- a/res/cardsfolder/perish.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Perish -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.Green | NoRegen$ True | SpellDescription$ Destroy all green creatures. They can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/perish.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/41.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/perish_the_thought.txt b/res/cardsfolder/perish_the_thought.txt deleted file mode 100644 index 05dcbae7c48..00000000000 --- a/res/cardsfolder/perish_the_thought.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Perish the Thought -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | Shuffle$ True | SpellDescription$ Target opponent reveals his or her hand. You choose a nonland card from it and exile that card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/perish_the_thought.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pernicious_deed.txt b/res/cardsfolder/pernicious_deed.txt deleted file mode 100644 index c7116b34f3a..00000000000 --- a/res/cardsfolder/pernicious_deed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pernicious Deed -ManaCost:1 B G -Types:Enchantment -Text:no text -A:AB$ DestroyAll | Cost$ X Sac<1/CARDNAME> | ValidCards$ Artifact.cmcLEX,Creature.cmcLEX,Enchantment.cmcLEX | SpellDescription$ Destroy each artifact, creature, and enchantment with converted mana cost X or less. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pernicious_deed.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/personal_tutor.txt b/res/cardsfolder/personal_tutor.txt deleted file mode 100644 index d0c87fb090c..00000000000 --- a/res/cardsfolder/personal_tutor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Personal Tutor -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Sorcery | ChangeNum$ 1 | SpellDescription$ Search your library for a sorcery card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/personal_tutor.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/persuasion.txt b/res/cardsfolder/persuasion.txt deleted file mode 100644 index 5f3ea571f3b..00000000000 --- a/res/cardsfolder/persuasion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Persuasion -ManaCost:3 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/persuasion.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/92.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pestermite.txt b/res/cardsfolder/pestermite.txt deleted file mode 100644 index 8b1c7eb966a..00000000000 --- a/res/cardsfolder/pestermite.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pestermite -ManaCost:2 U -Types:Creature Faerie Rogue -Text:no text -PT:2/1 -K:Flying -K:Flash -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTapOrUntap | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may tap or untap target permanent. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pestermite.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pestilence.txt b/res/cardsfolder/pestilence.txt deleted file mode 100644 index 8edba0a8776..00000000000 --- a/res/cardsfolder/pestilence.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Pestilence -ManaCost:2 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if no creatures are on the battlefield, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/uz/en-us/card5619.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/147.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/29.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/29.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/48.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/36.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/149.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/30.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pestilence_demon.txt b/res/cardsfolder/pestilence_demon.txt deleted file mode 100644 index 16fdeb56c87..00000000000 --- a/res/cardsfolder/pestilence_demon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pestilence Demon -ManaCost:5 B B B -Types:Creature Demon -Text:no text -PT:7/6 -K:Flying -A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pestilence_demon.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pestilence_rats.txt b/res/cardsfolder/pestilence_rats.txt deleted file mode 100644 index 1ca58f95419..00000000000 --- a/res/cardsfolder/pestilence_rats.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pestilence Rats -ManaCost:2 B -Types:Creature Rat -Text:no text -PT:*/3 -K:stSetPT:Count$Valid Rat.Other:3:Pestilence Rats's power is equal to the number of other Rats on the battlefield. -SVar:BuffedBy:Rat -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pestilence_rats.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pestilent_kathari.txt b/res/cardsfolder/pestilent_kathari.txt deleted file mode 100644 index 89102850870..00000000000 --- a/res/cardsfolder/pestilent_kathari.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pestilent Kathari -ManaCost:2 B -Types:Creature Bird Warrior -Text:no text -PT:1/1 -K:Flying -K:Deathtouch -A:AB$ Pump | Cost$ 2 R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pestilent_kathari.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/50.jpg -End diff --git a/res/cardsfolder/pestilent_souleater.txt b/res/cardsfolder/pestilent_souleater.txt deleted file mode 100644 index 4c4b53960e7..00000000000 --- a/res/cardsfolder/pestilent_souleater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pestilent Souleater -ManaCost:5 -Types:Artifact Creature Insect -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ PB | Defined$ Self | KW$ Infect | SpellDescription$ CARDNAME gains infect until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pestilent_souleater.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/petradon.txt b/res/cardsfolder/petradon.txt deleted file mode 100644 index 211f60b1f77..00000000000 --- a/res/cardsfolder/petradon.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Petradon -ManaCost:6 R R -Types:Creature Nightmare Horror -Text:no text -PT:5/6 -A:AB$ Pump | Cost$ R | Defined$ Self | NumAtt$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile two target lands. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | TargetMin$ 2 | TargetMax$ 2 | IsCurse$ True | ValidTgts$ Land | TgtPrompt$ Choose two target lands. | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/petradon.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/petrahydrox.txt b/res/cardsfolder/petrahydrox.txt deleted file mode 100644 index 7925bb5e6ec..00000000000 --- a/res/cardsfolder/petrahydrox.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Petrahydrox -ManaCost:3 UR -Types:Creature Weird -Text:no text -PT:3/3 -K:When CARDNAME becomes the target of a spell or ability, return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/petrahydrox.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/petravark.txt b/res/cardsfolder/petravark.txt deleted file mode 100644 index bbcb1501bbb..00000000000 --- a/res/cardsfolder/petravark.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Petravark -ManaCost:3 R -Types:Creature Nightmare Beast -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ ChangeZone | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Choose target land. | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/petravark.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/petrified_field.txt b/res/cardsfolder/petrified_field.txt deleted file mode 100644 index 37fd1a25af8..00000000000 --- a/res/cardsfolder/petrified_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Petrified Field -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target land card in your graveyard | ValidTgts$ Land.YouCtrl | SpellDescription$ Return target land card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/petrified_field.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pewter_golem.txt b/res/cardsfolder/pewter_golem.txt deleted file mode 100644 index df3469795ee..00000000000 --- a/res/cardsfolder/pewter_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pewter Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:4/2 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pewter_golem.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantasmal_abomination.txt b/res/cardsfolder/phantasmal_abomination.txt deleted file mode 100644 index 3ff8d57ece9..00000000000 --- a/res/cardsfolder/phantasmal_abomination.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phantasmal Abomination -ManaCost:1 U U -Types:Creature Illusion -Text:no text -PT:5/5 -K:Defender -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_abomination.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantasmal_fiend.txt b/res/cardsfolder/phantasmal_fiend.txt deleted file mode 100644 index 953430b6d5b..00000000000 --- a/res/cardsfolder/phantasmal_fiend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phantasmal Fiend -ManaCost:3 B -Types:Creature Illusion -Text:no text -PT:1/5 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -A:AB$ Pump | Cost$ 1 U | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_fiend.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/20.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/phantasmal_forces.txt b/res/cardsfolder/phantasmal_forces.txt deleted file mode 100644 index cb29cadae78..00000000000 --- a/res/cardsfolder/phantasmal_forces.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Phantasmal Forces -ManaCost:3 U -Types:Creature Illusion -Text:no text -PT:4/1 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_forces.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/68.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/68.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/106.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/88.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/69.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantasmal_terrain.txt b/res/cardsfolder/phantasmal_terrain.txt deleted file mode 100644 index 5dc6ab6b55d..00000000000 --- a/res/cardsfolder/phantasmal_terrain.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Phantasmal Terrain -ManaCost:U U -Types:Enchantment Aura -Text:As Phantasmal Terrain enters the battlefield, choose a basic land type.\r\nEnchanted land is the chosen type. -K:Enchant land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantasmal_terrain.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/69.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/69.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/107.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/65.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/89.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/84.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/70.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantatog.txt b/res/cardsfolder/phantatog.txt deleted file mode 100644 index 96c104a5724..00000000000 --- a/res/cardsfolder/phantatog.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phantatog -ManaCost:1 W U -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Enchantment> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantatog.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_beast.txt b/res/cardsfolder/phantom_beast.txt deleted file mode 100644 index 7f508b231b1..00000000000 --- a/res/cardsfolder/phantom_beast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phantom Beast -ManaCost:3 U -Types:Creature Illusion Beast -Text:no text -PT:4/5 -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_beast.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_centaur.txt b/res/cardsfolder/phantom_centaur.txt deleted file mode 100644 index 7acf9517bf4..00000000000 --- a/res/cardsfolder/phantom_centaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phantom Centaur -ManaCost:2 G G -Types:Creature Centaur Spirit -Text:no text -PT:2/0 -K:Protection from black -K:etbCounter:P1P1:3 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_centaur.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_flock.txt b/res/cardsfolder/phantom_flock.txt deleted file mode 100644 index ea01f9355d1..00000000000 --- a/res/cardsfolder/phantom_flock.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phantom Flock -ManaCost:3 W W -Types:Creature Bird Soldier Spirit -Text:no text -PT:0/0 -K:Flying -K:etbCounter:P1P1:3 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_flock.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_monster.txt b/res/cardsfolder/phantom_monster.txt deleted file mode 100644 index 8fc88d46ec5..00000000000 --- a/res/cardsfolder/phantom_monster.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Phantom Monster -ManaCost:3 U -Types:Creature Phantasm -Text:no text -PT:3/3 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card3929.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/70.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/70.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/108.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/90.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/71.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_nantuko.txt b/res/cardsfolder/phantom_nantuko.txt deleted file mode 100644 index 4deae46bcda..00000000000 --- a/res/cardsfolder/phantom_nantuko.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phantom Nantuko -ManaCost:2 G -Types:Creature Insect Spirit -Text:no text -PT:0/0 -K:Trample -K:etbCounter:P1P1:2 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -A:AB$ PutCounter | Cost$ T | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_nantuko.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_nishoba.txt b/res/cardsfolder/phantom_nishoba.txt deleted file mode 100644 index d82c94d5c46..00000000000 --- a/res/cardsfolder/phantom_nishoba.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Phantom Nishoba -ManaCost:5 G W -Types:Creature Cat Beast Spirit -Text:no text -PT:0/0 -K:etbCounter:P1P1:7 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_nishoba.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_nomad.txt b/res/cardsfolder/phantom_nomad.txt deleted file mode 100644 index 7468d7a2ec0..00000000000 --- a/res/cardsfolder/phantom_nomad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phantom Nomad -ManaCost:1 W -Types:Creature Spirit Nomad -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_nomad.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_tiger.txt b/res/cardsfolder/phantom_tiger.txt deleted file mode 100644 index 157a0aa36fb..00000000000 --- a/res/cardsfolder/phantom_tiger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phantom Tiger -ManaCost:2 G -Types:Creature Cat Spirit -Text:no text -PT:1/0 -K:etbCounter:P1P1:2 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_tiger.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_warrior.txt b/res/cardsfolder/phantom_warrior.txt deleted file mode 100644 index 15fa9a5ed12..00000000000 --- a/res/cardsfolder/phantom_warrior.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Phantom Warrior -ManaCost:1 U U -Types:Creature Illusion -Text:no text -PT:2/2 -K:Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83200.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/93.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/93.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/66.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/88.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/96.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/66.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/85.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/48.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_whelp.txt b/res/cardsfolder/phantom_whelp.txt deleted file mode 100644 index 9d33f8b99d8..00000000000 --- a/res/cardsfolder/phantom_whelp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phantom Whelp -ManaCost:1 U -Types:Creature Illusion Hound -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return CARDNAME to it's owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_whelp.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_wings.txt b/res/cardsfolder/phantom_wings.txt deleted file mode 100644 index 5de23041966..00000000000 --- a/res/cardsfolder/phantom_wings.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phantom Wings -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying:Enchanted creature has flying. -A:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Enchanted | SubAbility$ SVar=DBSacrifice | CostDesc$ Sacrifice CARDNAME: | SpellDescription$ Return enchanted creature to owner's hand. -SVar:DBSacrifice:DB$Sacrifice | Defined$ Card.Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_wings.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/49.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phantom_wurm.txt b/res/cardsfolder/phantom_wurm.txt deleted file mode 100644 index eb97aeb2a34..00000000000 --- a/res/cardsfolder/phantom_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phantom Wurm -ManaCost:4 G G -Types:Creature Wurm Spirit -Text:no text -PT:2/0 -K:etbCounter:P1P1:4 -K:If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_wurm.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phelddagrif.txt b/res/cardsfolder/phelddagrif.txt deleted file mode 100644 index 7fb2a7fb693..00000000000 --- a/res/cardsfolder/phelddagrif.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Phelddagrif -ManaCost:1 W U G -Types:Legendary Creature Phelddagrif -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ G | KW$ Trample | SubAbility$ SVar=DBToken | SpellDescription$ CARDNAME gains trample until end of turn. Target opponent puts a 1/1 green Hippo creature token onto the battlefield. -A:AB$ Pump | Cost$ W | KW$ Flying | SubAbility$ SVar=DBGain | SpellDescription$ CARDNAME gains flying until end of turn. Target opponent gains 2 life. -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBDraw | SpellDescription$ Return CARDNAME to its owner's hand. Target opponent may draw a card. -SVar:DBToken:DB$Token | ValidTgts$ Opponent | TokenAmount$ 1 | TokenName$ Hippo | TokenTypes$ Creature,Hippo | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:DBGain:DB$GainLife | LifeAmount$ 2 | ValidTgts$ Opponent -SVar:DBDraw:DB$Draw | NumCards$ 1 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | OptionalDecider$ Opponent -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phelddagrif.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phobian_phantasm.txt b/res/cardsfolder/phobian_phantasm.txt deleted file mode 100644 index cca06d1362c..00000000000 --- a/res/cardsfolder/phobian_phantasm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phobian Phantasm -ManaCost:1 B B -Types:Creature Illusion -Text:no text -PT:3/3 -K:Flying -K:Fear -K:Cumulative upkeep:B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phobian_phantasm.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phylactery_lich.txt b/res/cardsfolder/phylactery_lich.txt deleted file mode 100644 index e650881fa51..00000000000 --- a/res/cardsfolder/phylactery_lich.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phylactery Lich -ManaCost:B B B -Types:Creature Zombie -Text:As Phylactery Lich enters the battlefield, put a phylactery counter on an artifact you control.\r\nWhen you control no permanents with phylactery counters on them, sacrifice Phylactery Lich. -PT:5/5 -K:Indestructible -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phylactery_lich.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyresis.txt b/res/cardsfolder/phyresis.txt deleted file mode 100644 index 49cdfcd686c..00000000000 --- a/res/cardsfolder/phyresis.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyresis -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0/Infect:Enchanted creature has infect. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyresis.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_altar.txt b/res/cardsfolder/phyrexian_altar.txt deleted file mode 100644 index 3c551845060..00000000000 --- a/res/cardsfolder/phyrexian_altar.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Altar -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_altar.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_arena.txt b/res/cardsfolder/phyrexian_arena.txt deleted file mode 100644 index 2ffee15053b..00000000000 --- a/res/cardsfolder/phyrexian_arena.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Arena -ManaCost:1 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of your upkeep, you draw a card and you lose 1 life. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_arena.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/152.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/47.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_battleflies.txt b/res/cardsfolder/phyrexian_battleflies.txt deleted file mode 100644 index 6c6776ce169..00000000000 --- a/res/cardsfolder/phyrexian_battleflies.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Battleflies -ManaCost:B -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +1 | ActivationLimit$ 2 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_battleflies.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_bloodstock.txt b/res/cardsfolder/phyrexian_bloodstock.txt deleted file mode 100644 index a7e6eb4c3a1..00000000000 --- a/res/cardsfolder/phyrexian_bloodstock.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian Bloodstock -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME leaves the battlefield, destroy target white creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.White | NoRegen$ True | TgtPrompt$ Select target white creature. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_bloodstock.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_boon.txt b/res/cardsfolder/phyrexian_boon.txt deleted file mode 100644 index 0af83a22d18..00000000000 --- a/res/cardsfolder/phyrexian_boon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Boon -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Black:2/1:No Condition:Enchanted creature gets +2/+1 as long as it's black. -K:stPumpEnchanted:Creature.nonBlack:-1/-2:No Condition:Otherwise, it gets -1/-2. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_boon.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/22.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_broodlings.txt b/res/cardsfolder/phyrexian_broodlings.txt deleted file mode 100644 index a63c9a4f370..00000000000 --- a/res/cardsfolder/phyrexian_broodlings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Broodlings -ManaCost:1 B B -Types:Creature Minion -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ 1 Sac<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_broodlings.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_crusader.txt b/res/cardsfolder/phyrexian_crusader.txt deleted file mode 100644 index e860ce2882e..00000000000 --- a/res/cardsfolder/phyrexian_crusader.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Crusader -ManaCost:1 B B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from red -K:Protection from white -K:Infect -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_crusader.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_debaser.txt b/res/cardsfolder/phyrexian_debaser.txt deleted file mode 100644 index e5936fb9254..00000000000 --- a/res/cardsfolder/phyrexian_debaser.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian Debaser -ManaCost:3 B -Types:Creature Carrier -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_debaser.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_defiler.txt b/res/cardsfolder/phyrexian_defiler.txt deleted file mode 100644 index 4424395efbc..00000000000 --- a/res/cardsfolder/phyrexian_defiler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Defiler -ManaCost:2 B B -Types:Creature Carrier -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_defiler.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_delver.txt b/res/cardsfolder/phyrexian_delver.txt deleted file mode 100644 index 9bd8e5278cc..00000000000 --- a/res/cardsfolder/phyrexian_delver.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Delver -ManaCost:3 B B -Types:Creature Zombie -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target creature card from your graveyard to the battlefield. You lose life equal to that card's converted mana cost. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature card in your graveyard | GainControl$ True | ChangeNum$ 1 | SubAbility$ SVar=DBLoseLifeYou -SVar:DBLoseLifeYou:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_delver.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/115.jpg -End diff --git a/res/cardsfolder/phyrexian_denouncer.txt b/res/cardsfolder/phyrexian_denouncer.txt deleted file mode 100644 index 99b022001c9..00000000000 --- a/res/cardsfolder/phyrexian_denouncer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Denouncer -ManaCost:1 B -Types:Creature Carrier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_denouncer.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_digester.txt b/res/cardsfolder/phyrexian_digester.txt deleted file mode 100644 index c62553eb56a..00000000000 --- a/res/cardsfolder/phyrexian_digester.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Digester -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/1 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_digester.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_dreadnought.txt b/res/cardsfolder/phyrexian_dreadnought.txt deleted file mode 100644 index 5b0cfd7457e..00000000000 --- a/res/cardsfolder/phyrexian_dreadnought.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Dreadnought -ManaCost:1 -Types:Artifact Creature Dreadnought -Text:When CARDNAME enters the battlefield, sacrifice it unless you sacrifice any number of creatures with total power 12 or greater. -PT:12/12 -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_dreadnought.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_driver.txt b/res/cardsfolder/phyrexian_driver.txt deleted file mode 100644 index 2e092e0c88a..00000000000 --- a/res/cardsfolder/phyrexian_driver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Driver -ManaCost:2 B -Types:Creature Zombie Mercenary -Text:no text -PT:1/1 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, other Mercenary creatures get +1/+1 until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Mercenary+Other | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_driver.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_gargantua.txt b/res/cardsfolder/phyrexian_gargantua.txt deleted file mode 100644 index e1d4c63f6f3..00000000000 --- a/res/cardsfolder/phyrexian_gargantua.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Gargantua -ManaCost:4 B B -Types:Creature Horror -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw two cards and you lose 2 life. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84393.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/48.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_ghoul.txt b/res/cardsfolder/phyrexian_ghoul.txt deleted file mode 100644 index 8df6ceb1175..00000000000 --- a/res/cardsfolder/phyrexian_ghoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Ghoul -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_ghoul.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_hulk.txt b/res/cardsfolder/phyrexian_hulk.txt deleted file mode 100644 index d6f7143debf..00000000000 --- a/res/cardsfolder/phyrexian_hulk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian Hulk -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:5/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83203.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/310.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/292.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/306.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_hydra.txt b/res/cardsfolder/phyrexian_hydra.txt deleted file mode 100644 index 2359475728f..00000000000 --- a/res/cardsfolder/phyrexian_hydra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Hydra -ManaCost:3 G G -Types:Creature Hydra -Text:If damage would be dealt to CARDNAME, prevent that damage. Put a -1/-1 counter on CARDNAME for each 1 damage prevented this way. -PT:7/7 -K:Infect -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_hydra.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_ingester.txt b/res/cardsfolder/phyrexian_ingester.txt deleted file mode 100644 index f01e8870ca5..00000000000 --- a/res/cardsfolder/phyrexian_ingester.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Phyrexian Ingester -ManaCost:6 U -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Imprint - When CARDNAME enters the battlefield, you may exile target nontoken creature. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Imprint$ True | ValidTgts$ Creature.nonToken | TgtPrompt$ Select target nontoken creature | Origin$ Battlefield | Destination$ Exile -K:stPumpSelf:Creature:X/Y:Imprint:CARDNAME gets +X/+Y, where X is the exiled creature card's power and Y is its toughness. -SVar:X:Imprinted$CardPower -SVar:Y:Imprinted$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_ingester.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_ironfoot.txt b/res/cardsfolder/phyrexian_ironfoot.txt deleted file mode 100644 index da7863815d4..00000000000 --- a/res/cardsfolder/phyrexian_ironfoot.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Ironfoot -ManaCost:3 -Types:Snow Artifact Creature Construct -Text:no text -PT:3/4 -K:CARDNAME doesn't untap during your untap step. -A:AB$ Untap | Cost$ 1 S | SpellDescription$ Untap CARDNAME. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_ironfoot.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_juggernaut.txt b/res/cardsfolder/phyrexian_juggernaut.txt deleted file mode 100644 index e79eb5fbc5d..00000000000 --- a/res/cardsfolder/phyrexian_juggernaut.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Juggernaut -ManaCost:6 -Types:Artifact Creature Juggernaut -Text:no text -PT:5/5 -K:Infect -K:CARDNAME attacks each turn if able. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_juggernaut.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_lens.txt b/res/cardsfolder/phyrexian_lens.txt deleted file mode 100644 index 4cfc9764efc..00000000000 --- a/res/cardsfolder/phyrexian_lens.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Lens -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_lens.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/307.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_metamorph.txt b/res/cardsfolder/phyrexian_metamorph.txt deleted file mode 100644 index 57895b4cb92..00000000000 --- a/res/cardsfolder/phyrexian_metamorph.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Phyrexian Metamorph -ManaCost:3 PU -Types:Artifact Creature Shapeshifter -Text:You may have CARDNAME 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. -PT:0/0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_metamorph.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_monitor.txt b/res/cardsfolder/phyrexian_monitor.txt deleted file mode 100644 index 9816d08efb0..00000000000 --- a/res/cardsfolder/phyrexian_monitor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Monitor -ManaCost:3 B -Types:Creature Skeleton -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_monitor.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_negator.txt b/res/cardsfolder/phyrexian_negator.txt deleted file mode 100644 index 81f48fb9e86..00000000000 --- a/res/cardsfolder/phyrexian_negator.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Negator -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:5/5 -K:Trample -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, sacrifice that many permanents. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Amount$ X | SacValid$ Permanent -SVar:X:TriggerCount$DamageAmount -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_negator.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_obliterator.txt b/res/cardsfolder/phyrexian_obliterator.txt deleted file mode 100644 index 665258bdd4a..00000000000 --- a/res/cardsfolder/phyrexian_obliterator.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Obliterator -ManaCost:B B B B -Types:Creature Horror -Text:no text -PT:5/5 -K:Trample -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever a source deals damage to CARDNAME, that source's controller sacrifices that many permanents. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Amount$ X | SacValid$ Permanent | Defined$ TriggeredSourceController -SVar:X:TriggerCount$DamageAmount -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_obliterator.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_plaguelord.txt b/res/cardsfolder/phyrexian_plaguelord.txt deleted file mode 100644 index ab1923aa8b8..00000000000 --- a/res/cardsfolder/phyrexian_plaguelord.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Plaguelord -ManaCost:3 B B -Types:Creature Carrier -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. -A:AB$ Pump | Cost$ Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_plaguelord.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/153.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_processor.txt b/res/cardsfolder/phyrexian_processor.txt deleted file mode 100644 index 658facf777e..00000000000 --- a/res/cardsfolder/phyrexian_processor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Processor -ManaCost:4 -Types:Artifact -Text:As CARDNAME enters the battlefield, pay any amount of life. -A:AB$ Token | Cost$ 4 T | TokenAmount$ 1 | TokenName$ Minion | TokenTypes$ Creature,Minion | TokenOwner$ You | TokenColors$ Black | TokenPower$ X | TokenToughness$ X | TokenImage$ B X X Minion | SpellDescription$ Put an X/X black Minion creature token onto the battlefield, where X is the life paid as Phyrexian Processor entered the battlefield. -SVar:X:Count$xLifePaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_processor.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_prowler.txt b/res/cardsfolder/phyrexian_prowler.txt deleted file mode 100644 index 2add00f31bf..00000000000 --- a/res/cardsfolder/phyrexian_prowler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Prowler -ManaCost:3 B -Types:Creature Zombie Mercenary -Text:no text -PT:3/3 -K:Fading:3 -A:AB$ Pump | Cost$ SubCounter<1/FADE> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_prowler.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/65.jpg -End diff --git a/res/cardsfolder/phyrexian_rager.txt b/res/cardsfolder/phyrexian_rager.txt deleted file mode 100644 index bb5624a80a7..00000000000 --- a/res/cardsfolder/phyrexian_rager.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Phyrexian Rager -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw a card and you lose 1 life. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card27660.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/49.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/51.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_rebirth.txt b/res/cardsfolder/phyrexian_rebirth.txt deleted file mode 100644 index 2d7e5b43b40..00000000000 --- a/res/cardsfolder/phyrexian_rebirth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian Rebirth -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature | RememberDestroyed$ True | SubAbility$ SVar=DBToken | SpellDescription$ 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. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Horror | TokenTypes$ Artifact,Creature,Horror | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ X | TokenToughness$ X -SVar:X:Remembered$Amount -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_rebirth.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_reclamation.txt b/res/cardsfolder/phyrexian_reclamation.txt deleted file mode 100644 index c4d2d4f9c2d..00000000000 --- a/res/cardsfolder/phyrexian_reclamation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Reclamation -ManaCost:1 B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 B PayLife<2> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_reclamation.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_scuta.txt b/res/cardsfolder/phyrexian_scuta.txt deleted file mode 100644 index 29078550385..00000000000 --- a/res/cardsfolder/phyrexian_scuta.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Scuta -ManaCost:3 B -Types:Creature Zombie -Text:If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it. -PT:3/3 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_scuta.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_snowcrusher.txt b/res/cardsfolder/phyrexian_snowcrusher.txt deleted file mode 100644 index 347865faaec..00000000000 --- a/res/cardsfolder/phyrexian_snowcrusher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Snowcrusher -ManaCost:6 -Types:Snow Artifact Creature Juggernaut -Text:no text -PT:6/5 -K:CARDNAME attacks each turn if able. -A:AB$ Pump | Cost$ 1 S | NumAtt$ +1 | SpellDescription$ Phyrexian Snowcrusher gets +1/+0 until end of turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_snowcrusher.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_swarmlord.txt b/res/cardsfolder/phyrexian_swarmlord.txt deleted file mode 100644 index 1d57f6ac14e..00000000000 --- a/res/cardsfolder/phyrexian_swarmlord.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Swarmlord -ManaCost:4 G G -Types:Creature Insect Horror -Text:no text -PT:4/4 -K:Infect -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Infect -SVar:X:Count$OppPoisonCounters -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_swarmlord.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_tower.txt b/res/cardsfolder/phyrexian_tower.txt deleted file mode 100644 index 4c8e327cead..00000000000 --- a/res/cardsfolder/phyrexian_tower.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Tower -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/Creature> | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tower.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_tribute.txt b/res/cardsfolder/phyrexian_tribute.txt deleted file mode 100644 index 672b706ef48..00000000000 --- a/res/cardsfolder/phyrexian_tribute.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexian Tribute -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B Sac<2/Creature> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tribute.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_tyranny.txt b/res/cardsfolder/phyrexian_tyranny.txt deleted file mode 100644 index debabdee490..00000000000 --- a/res/cardsfolder/phyrexian_tyranny.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Phyrexian Tyranny -ManaCost:U B R -Types:Enchantment -Text:no text -T:Mode$ Drawn | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever a player draws a card, that player loses 2 life unless he or she pays 2. -SVar:TrigLose:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 2 | UnlessCost$ 2 | UnlessPayer$ TriggeredCardController -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_tyranny.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_vatmother.txt b/res/cardsfolder/phyrexian_vatmother.txt deleted file mode 100644 index 3baa96cecf9..00000000000 --- a/res/cardsfolder/phyrexian_vatmother.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Phyrexian Vatmother -ManaCost:2 B B -Types:Creature Horror -Text:no text -PT:4/5 -K:Infect -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ At the beginning of your upkeep, you get a poison counter. -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ You | Num$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_vatmother.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_vault.txt b/res/cardsfolder/phyrexian_vault.txt deleted file mode 100644 index fdb6ac782c5..00000000000 --- a/res/cardsfolder/phyrexian_vault.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian Vault -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 2 T Sac<1/Creature> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_vault.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/306.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/281.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/337.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_walker.txt b/res/cardsfolder/phyrexian_walker.txt deleted file mode 100644 index b47fdb61090..00000000000 --- a/res/cardsfolder/phyrexian_walker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Phyrexian Walker -ManaCost:0 -Types:Artifact Creature Construct -Text:no text -PT:0/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/vi/en-us/card3600.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexian_war_beast.txt b/res/cardsfolder/phyrexian_war_beast.txt deleted file mode 100644 index 4dfc1b87fb2..00000000000 --- a/res/cardsfolder/phyrexian_war_beast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Phyrexian War Beast -ManaCost:3 -Types:Artifact Creature Beast -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME leaves the battlefield, sacrifice a land and Phyrexian War Beast deals 1 damage to you. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | SacValid$ Land | SubAbility$ SVar=DBDealDamage -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_war_beast.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/169.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/phyrexias_core.txt b/res/cardsfolder/phyrexias_core.txt deleted file mode 100644 index bc75d76e034..00000000000 --- a/res/cardsfolder/phyrexias_core.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Phyrexia's Core -ManaCost:no cost -Types:Land -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ GainLife | Cost$ 1 T Sac<1/Artifact> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexias_core.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/phytohydra.txt b/res/cardsfolder/phytohydra.txt deleted file mode 100644 index 80c5f6278b1..00000000000 --- a/res/cardsfolder/phytohydra.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Phytohydra -ManaCost:2 W W G -Types:Creature Plant Hydra -Text:If damage would be dealt to Phytohydra, put that many +1/+1 counters on it instead. -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/phytohydra.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pianna_nomad_captain.txt b/res/cardsfolder/pianna_nomad_captain.txt deleted file mode 100644 index f7cfb64715b..00000000000 --- a/res/cardsfolder/pianna_nomad_captain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pianna, Nomad Captain -ManaCost:1 W W -Types:Legendary Creature Human Nomad -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, attacking creatures get +1/+1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pianna_nomad_captain.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pierce_strider.txt b/res/cardsfolder/pierce_strider.txt deleted file mode 100644 index 2a4e0882bf3..00000000000 --- a/res/cardsfolder/pierce_strider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pierce Strider -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, target opponent loses 3 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pierce_strider.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/piety.txt b/res/cardsfolder/piety.txt deleted file mode 100644 index c5206c57401..00000000000 --- a/res/cardsfolder/piety.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Piety -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.blocking | NumDef$ +3 | SpellDescription$ Blocking creatures get +0/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/piety.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/291.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/64.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/pilgrims_eye.txt b/res/cardsfolder/pilgrims_eye.txt deleted file mode 100644 index 031b17e133d..00000000000 --- a/res/cardsfolder/pilgrims_eye.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pilgrim's Eye -ManaCost:3 -Types:Artifact Creature Thopter -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pilgrims_eye.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pili_pala.txt b/res/cardsfolder/pili_pala.txt deleted file mode 100644 index 80d0e98c423..00000000000 --- a/res/cardsfolder/pili_pala.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Pili-Pala -ManaCost:2 -Types:Artifact Creature Scarecrow -Text:no text -PT:1/1 -K:Flying -A:AB$ Mana | Cost$ 2 Q | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 Q | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 Q | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 Q | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 2 Q | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pili_pala.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pillage.txt b/res/cardsfolder/pillage.txt deleted file mode 100644 index 71cc4996344..00000000000 --- a/res/cardsfolder/pillage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pillage -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 R R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | NoRegen$ True | SpellDescription$ Destroy target artifact or land. It can't be regenerated. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pillage.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/198.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/113.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/207.jpg -End diff --git a/res/cardsfolder/pillaging_horde.txt b/res/cardsfolder/pillaging_horde.txt deleted file mode 100644 index 2fe2a3769fb..00000000000 --- a/res/cardsfolder/pillaging_horde.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pillaging Horde -ManaCost:2 R R -Types:Creature Human Barbarian -Text:When CARDNAME enters the battlefield, sacrifice it unless you discard a card at random. -PT:5/5 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/pillaging_horde.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pillarfield_ox.txt b/res/cardsfolder/pillarfield_ox.txt deleted file mode 100644 index eaded998176..00000000000 --- a/res/cardsfolder/pillarfield_ox.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Pillarfield Ox -ManaCost:3 W -Types:Creature Ox -Text:no text -PT:2/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pillarfield_ox.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pillory_of_the_sleepless.txt b/res/cardsfolder/pillory_of_the_sleepless.txt deleted file mode 100644 index 43655ea6bbe..00000000000 --- a/res/cardsfolder/pillory_of_the_sleepless.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Pillory of the Sleepless -ManaCost:1 W B -Types:Enchantment Aura -Text:Enchanted creature can't attack or block.\r\nEnchanted creature has "At the beginning of your upkeep, you lose 1 life." -K:Enchant creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pillory_of_the_sleepless.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pincer_spider.txt b/res/cardsfolder/pincer_spider.txt deleted file mode 100644 index a4e10399435..00000000000 --- a/res/cardsfolder/pincer_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pincer Spider -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:2/3 -K:Reach -K:Kicker:3 -K:etbCounter:P1P1:1:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pincer_spider.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pincher_beetles.txt b/res/cardsfolder/pincher_beetles.txt deleted file mode 100644 index 670fc4de42f..00000000000 --- a/res/cardsfolder/pincher_beetles.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pincher Beetles -ManaCost:2 G -Types:Creature Insect -Text:no text -PT:3/1 -K:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pincher_beetles.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/138.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pine_barrens.txt b/res/cardsfolder/pine_barrens.txt deleted file mode 100644 index 237e0ca7422..00000000000 --- a/res/cardsfolder/pine_barrens.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pine Barrens -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pine_barrens.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pinecrest_ridge.txt b/res/cardsfolder/pinecrest_ridge.txt deleted file mode 100644 index fcaf126d5f7..00000000000 --- a/res/cardsfolder/pinecrest_ridge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pinecrest Ridge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add R to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add G to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pinecrest_ridge.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pinpoint_avalanche.txt b/res/cardsfolder/pinpoint_avalanche.txt deleted file mode 100644 index ad910bfdae3..00000000000 --- a/res/cardsfolder/pinpoint_avalanche.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Pinpoint Avalanche -ManaCost:3 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | NoPrevention$ True | SpellDescription$ CARDNAME deals 4 damage to target creature. The damage can't be prevented. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pinpoint_avalanche.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pipers_melody.txt b/res/cardsfolder/pipers_melody.txt deleted file mode 100644 index 1c8f2f18cb1..00000000000 --- a/res/cardsfolder/pipers_melody.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Piper's Melody -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | Shuffle$ True | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Shuffle any number of target creature cards from your graveyard into your library. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pipers_melody.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/piracy_charm.txt b/res/cardsfolder/piracy_charm.txt deleted file mode 100644 index 5f20fec3d53..00000000000 --- a/res/cardsfolder/piracy_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Piracy Charm -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Islandwalk | PrecostDesc$ Choose one - | SpellDescription$ Target creature gains islandwalk until end of turn; -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ -1 | SpellDescription$ or target creature gets +2/-1 until end of turn; -A:SP$ Discard | Cost$ U | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ or target player discards a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/piracy_charm.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/58.jpg -End diff --git a/res/cardsfolder/piranha_marsh.txt b/res/cardsfolder/piranha_marsh.txt deleted file mode 100644 index 0af4cf3e526..00000000000 --- a/res/cardsfolder/piranha_marsh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Piranha Marsh -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, target player loses 1 life. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/piranha_marsh.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pirate_ship.txt b/res/cardsfolder/pirate_ship.txt deleted file mode 100644 index 64c90d95127..00000000000 --- a/res/cardsfolder/pirate_ship.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Pirate Ship -ManaCost:4 U -Types:Creature Human Pirate -Text:no text -PT:4/3 -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pirate_ship.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/71.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/71.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/91.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/28.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/72.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/109.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/piston_sledge.txt b/res/cardsfolder/piston_sledge.txt deleted file mode 100644 index ff18ad93c95..00000000000 --- a/res/cardsfolder/piston_sledge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Piston Sledge -ManaCost:3 -Types:Artifact Equipment -Text:When CARDNAME enters the battlefield, attach it to target creature you control.\r\n\r\nEquipped creature gets +3/+1. -K:eqPump Sac<1/Artifact>:+3/+1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/piston_sledge.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pistus_strike.txt b/res/cardsfolder/pistus_strike.txt deleted file mode 100644 index 16e3bbff2b5..00000000000 --- a/res/cardsfolder/pistus_strike.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pistus Strike -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SubAbility$ SVar=DBPoison | SpellDescription$ Destroy target creature with flying. Its controller gets a poison counter. -SVar:DBPoison:DB$Poison | Cost$ 0 | Defined$ TargetedController | Num$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pistus_strike.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/86.jpg -End diff --git a/res/cardsfolder/pit_imp.txt b/res/cardsfolder/pit_imp.txt deleted file mode 100644 index 7b65bf0a9d5..00000000000 --- a/res/cardsfolder/pit_imp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pit Imp -ManaCost:B -Types:Creature Imp -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +1 | ActivationLimit$ 2 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pit_imp.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pit_keeper.txt b/res/cardsfolder/pit_keeper.txt deleted file mode 100644 index 4969128bcec..00000000000 --- a/res/cardsfolder/pit_keeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pit Keeper -ManaCost:1 B -Types:Creature Human Wizard -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | IsPresent$ Creature.YouCtrl | PresentZone$ Graveyard | PresentPlayer$ You | PresentCompare$ GE4 | TriggerDescription$ When CARDNAME 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. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pit_keeper.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pit_raptor.txt b/res/cardsfolder/pit_raptor.txt deleted file mode 100644 index 382175f835f..00000000000 --- a/res/cardsfolder/pit_raptor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pit Raptor -ManaCost:2 B B -Types:Creature Bird Mercenary -Text:no text -PT:4/3 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2 B B -K:Flying -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pit_raptor.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pit_scorpion.txt b/res/cardsfolder/pit_scorpion.txt deleted file mode 100644 index 455a245752f..00000000000 --- a/res/cardsfolder/pit_scorpion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pit Scorpion -ManaCost:2 B -Types:Creature Scorpion -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigPoison | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, that player gets a poison counter. (A player with ten or more poison counters loses the game.) -SVar:TrigPoison:AB$ Poison | Cost$ 0 | Defined$ TriggeredTarget | Num$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pit_scorpion.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/49.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/37.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pit_trap.txt b/res/cardsfolder/pit_trap.txt deleted file mode 100644 index d5ba4a1da3c..00000000000 --- a/res/cardsfolder/pit_trap.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pit Trap -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Destroy | Cost$ 2 T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | NoRegen$ True | SpellDescription$ Destroy target attacking creature without flying. It can't be regenerated. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pit_trap.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/307.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/308.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pitfall_trap.txt b/res/cardsfolder/pitfall_trap.txt deleted file mode 100644 index 16e3cb59cf1..00000000000 --- a/res/cardsfolder/pitfall_trap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pitfall Trap -ManaCost:2 W -Types:Instant Trap -Text:no text -A:SP$ Destroy | Cost$ W | ValidTgts$ Creature.attacking+withoutFlying | IsPresent$ Creature.attacking | PresentCompare$ EQ1 | TgtPrompt$ Select target attacking creature without flying | SpellDescription$ If exactly one creature is attacking, you may pay W rather than pay CARDNAME mana cost. -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | SpellDescription$ Destroy target attacking creature without flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pitfall_trap.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pith_driller.txt b/res/cardsfolder/pith_driller.txt deleted file mode 100644 index 7295d19f33e..00000000000 --- a/res/cardsfolder/pith_driller.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pith Driller -ManaCost:4 PB -Types:Artifact Creature Horror -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on target creature. -SVar:TrigPutCounter:DB$PutCounter | Tgt$ TgtC | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pith_driller.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pithing_needle.txt b/res/cardsfolder/pithing_needle.txt deleted file mode 100644 index dd01247abb2..00000000000 --- a/res/cardsfolder/pithing_needle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pithing Needle -ManaCost:1 -Types:Artifact -Text:As Pithing Needle enters the battlefield, name a card.\r\nActivated abilities of sources with the chosen name can't be activated unless they're mana abilities. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pithing_needle.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/217.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/158.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/338.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pixie_queen.txt b/res/cardsfolder/pixie_queen.txt deleted file mode 100644 index 9667a9ef7c7..00000000000 --- a/res/cardsfolder/pixie_queen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pixie Queen -ManaCost:2 G G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ G G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pixie_queen.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/110.jpg -End diff --git a/res/cardsfolder/plague_beetle.txt b/res/cardsfolder/plague_beetle.txt deleted file mode 100644 index 0546c175eca..00000000000 --- a/res/cardsfolder/plague_beetle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Plague Beetle -ManaCost:B -Types:Creature Insect -Text:no text -PT:1/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129678.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/154.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/168.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/64.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/154.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_dogs.txt b/res/cardsfolder/plague_dogs.txt deleted file mode 100644 index 0402942e8c4..00000000000 --- a/res/cardsfolder/plague_dogs.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Plague Dogs -ManaCost:4 B -Types:Creature Zombie Hound -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigNausea | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, all creatures get -1/-1 until end of turn. -SVar:TrigNausea:AB$PumpAll | Cost$ 0 | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-1 until end of turn. -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_dogs.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_fiend.txt b/res/cardsfolder/plague_fiend.txt deleted file mode 100644 index 88feafea44d..00000000000 --- a/res/cardsfolder/plague_fiend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plague Fiend -ManaCost:1 B -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature unless its controller pays 2. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget | UnlessCost$ 2 | UnlessPayer$ TriggeredTargetController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_fiend.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_myr.txt b/res/cardsfolder/plague_myr.txt deleted file mode 100644 index bfbee7266f1..00000000000 --- a/res/cardsfolder/plague_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plague Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -K:Infect -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_myr.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_rats.txt b/res/cardsfolder/plague_rats.txt deleted file mode 100644 index 44f510d02be..00000000000 --- a/res/cardsfolder/plague_rats.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Plague Rats -ManaCost:2 B -Types:Creature Rat -Text:no text -PT:*/* -K:stSetPT:Count$Valid Creature.namedPlague Rats:Count$Valid Creature.namedPlague Rats:Plague Rats's power and toughness are each equal to the number of creatures named Plague Rats on the battlefield. -SVar:BuffedBy:Creature.namedPlague Rats -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_rats.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/30.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/30.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/50.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/38.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/31.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_spitter.txt b/res/cardsfolder/plague_spitter.txt deleted file mode 100644 index 3ba998cb9f2..00000000000 --- a/res/cardsfolder/plague_spitter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Plague Spitter -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageAll | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each creature and each player. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, CARDNAME deals 1 damage to each creature and each player. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 0 | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 | ValidDescription$ each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_spitter.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_spores.txt b/res/cardsfolder/plague_spores.txt deleted file mode 100644 index 9229350c8d3..00000000000 --- a/res/cardsfolder/plague_spores.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plague Spores -ManaCost:4 B R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B R | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select nonblack creature | NoRegen$ True | SubAbility$ SVar=DestroyLand | SpellDescription$ Destroy target nonblack creature and target land. They can't be regenerated. -SVar:DestroyLand:DB$ Destroy | Cost$ 0 | ValidTgts$ Land | NoRegen$ True | TgtPrompt$ Select target land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_spores.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_stinger.txt b/res/cardsfolder/plague_stinger.txt deleted file mode 100644 index ade03f7dd3e..00000000000 --- a/res/cardsfolder/plague_stinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plague Stinger -ManaCost:1 B -Types:Creature Insect Horror -Text:no text -PT:1/1 -K:Flying -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_stinger.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_wind.txt b/res/cardsfolder/plague_wind.txt deleted file mode 100644 index a21f48a842d..00000000000 --- a/res/cardsfolder/plague_wind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Plague Wind -ManaCost:7 B B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 7 B B | ValidCards$ Creature.YouDontCtrl | NoRegen$ True | SpellDescription$ Destroy all creatures you don't control. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_wind.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/155.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/74.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/155.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plague_witch.txt b/res/cardsfolder/plague_witch.txt deleted file mode 100644 index 5bcebaba9ea..00000000000 --- a/res/cardsfolder/plague_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plague Witch -ManaCost:1 B -Types:Creature Elf Spellshaper -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B T Discard<1/Card> | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plague_witch.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plaguebearer.txt b/res/cardsfolder/plaguebearer.txt deleted file mode 100644 index 2a7e9667040..00000000000 --- a/res/cardsfolder/plaguebearer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Plaguebearer -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ X X B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature with converted mana cost X. -# It may seem wrong to not use X in the target, but since the Target is what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/plaguebearer.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/71.jpg -End diff --git a/res/cardsfolder/plagued_rusalka.txt b/res/cardsfolder/plagued_rusalka.txt deleted file mode 100644 index c4008dff04a..00000000000 --- a/res/cardsfolder/plagued_rusalka.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plagued Rusalka -ManaCost:B -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plagued_rusalka.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/56.jpg -End diff --git a/res/cardsfolder/plaguemaw_beast.txt b/res/cardsfolder/plaguemaw_beast.txt deleted file mode 100644 index 2bf57695227..00000000000 --- a/res/cardsfolder/plaguemaw_beast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plaguemaw Beast -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:4/3 -A:AB$ Proliferate | Cost$ T Sac<1/Creature> | SpellDescription$ Proliferate. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plaguemaw_beast.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plains.txt b/res/cardsfolder/plains.txt deleted file mode 100644 index c922f56e830..00000000000 --- a/res/cardsfolder/plains.txt +++ /dev/null @@ -1,44 +0,0 @@ -Name:Plains -ManaCost:no cost -Types:Basic Land Plains -Text:no text -SVar:PicCount:4 -SVar:Rarity:Land -SVar:Picture:http://resources.wizards.com/magic/cards/unh/en-us/card73963.jpg\http://gatherer.wizards.com/handlers/image.ashx?multiverseid=8322&type=card\http://gatherer.wizards.com/handlers/image.ashx?multiverseid=159288&type=card\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=4428 -SetInfo:USG|Land|http://magiccards.info/scans/en/us/331.jpg|4 -SetInfo:TMP|Land|http://magiccards.info/scans/en/tp/324.jpg|4 -SetInfo:ZEN|Land|http://magiccards.info/scans/en/zen/230.jpg|4 -SetInfo:4ED|Land|http://magiccards.info/scans/en/4e/186.jpg|3 -SetInfo:3ED|Land|http://magiccards.info/scans/en/rv/293.jpg|3 -SetInfo:SOM|Land|http://magiccards.info/scans/en/som/230.jpg|4 -SetInfo:TSP|Land|http://magiccards.info/scans/en/ts/282.jpg|4 -SetInfo:ODY|Land|http://magiccards.info/scans/en/od/331.jpg|4|4 -SetInfo:MIR|Land|http://magiccards.info/scans/en/mr/306.jpg|4 -SetInfo:PTK|Land|http://magiccards.info/scans/en/p3k/166.jpg|3 -SetInfo:7ED|Land|http://magiccards.info/scans/en/7e/341.jpg|4 -SetInfo:POR|Land|http://magiccards.info/scans/en/po/215.jpg|4 -SetInfo:ROE|Land|http://magiccards.info/scans/en/roe/229.jpg|4 -SetInfo:10E|Land|http://magiccards.info/scans/en/10e/364.jpg|4 -SetInfo:RAV|Land|http://magiccards.info/scans/en/rav/287.jpg|4 -SetInfo:6ED|Land|http://magiccards.info/scans/en/6e/331.jpg|4 -SetInfo:5ED|Land|http://magiccards.info/scans/en/5e/434.jpg|4 -SetInfo:ONS|Land|http://magiccards.info/scans/en/on/331.jpg|4 -SetInfo:S99|Land|http://magiccards.info/scans/en/st/154.jpg|4 -SetInfo:MBS|Land|http://magiccards.info/scans/en/mbs/146.jpg|2 -SetInfo:8ED|Land|http://magiccards.info/scans/en/8e/331.jpg|4 -SetInfo:CHK|Land|http://magiccards.info/scans/en/chk/287.jpg|4 -SetInfo:PO2|Land|http://magiccards.info/scans/en/po2/160.jpg|3 -SetInfo:9ED|Land|http://magiccards.info/scans/en/9e/331.jpg|4 -SetInfo:ICE|Land|http://magiccards.info/scans/en/ia/343.jpg|3 -SetInfo:MRD|Land|http://magiccards.info/scans/en/mi/287.jpg|4 -SetInfo:SHM|Land|http://magiccards.info/scans/en/shm/282.jpg|4 -SetInfo:LEA|Land|http://magiccards.info/scans/en/al/285.jpg|2 -SetInfo:LEB|Land|http://magiccards.info/scans/en/be/289.jpg|3 -SetInfo:INV|Land|http://magiccards.info/scans/en/in/331.jpg|4 -SetInfo:MMQ|Land|http://magiccards.info/scans/en/mm/331.jpg|4 -SetInfo:ALA|Land|http://magiccards.info/scans/en/ala/230.jpg|4 -SetInfo:M11|Land|http://magiccards.info/scans/en/m11/230.jpg|4 -SetInfo:M10|Land|http://magiccards.info/scans/en/m10/230.jpg|4 -SetInfo:LRW|Land|http://magiccards.info/scans/en/lw/282.jpg|4 -SetInfo:2ED|Land|http://magiccards.info/scans/en/un/289.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/planar_birth.txt b/res/cardsfolder/planar_birth.txt deleted file mode 100644 index 77c490ac892..00000000000 --- a/res/cardsfolder/planar_birth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Planar Birth -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 1 W | ChangeType$ Land.Basic | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | SpellDescription$ Return all basic land cards from all graveyards to the battlefield tapped under their owners' control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_birth.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_cleansing.txt b/res/cardsfolder/planar_cleansing.txt deleted file mode 100644 index 926407573cb..00000000000 --- a/res/cardsfolder/planar_cleansing.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Planar Cleansing -ManaCost:3 W W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 W W W | ValidCards$ Permanent.nonLand | SpellDescription$ Destroy all nonland permanents. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_cleansing.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/24.jpg -End diff --git a/res/cardsfolder/planar_collapse.txt b/res/cardsfolder/planar_collapse.txt deleted file mode 100644 index 3b6458697c9..00000000000 --- a/res/cardsfolder/planar_collapse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Planar Collapse -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ GE4 | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, if there are four or more creatures on the battlefield, sacrifice CARDNAME and destroy all creatures. They can't be regenerated. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | SubAbility$ SVar=DBDestroyAll -SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Creature | NoRegen$ True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_collapse.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_despair.txt b/res/cardsfolder/planar_despair.txt deleted file mode 100644 index 59f63f5d651..00000000000 --- a/res/cardsfolder/planar_despair.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Planar Despair -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 3 B B | ValidCards$ Creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Domain - All creatures get -1/-1 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_despair.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_gate.txt b/res/cardsfolder/planar_gate.txt deleted file mode 100644 index a53711ee44b..00000000000 --- a/res/cardsfolder/planar_gate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Planar Gate -ManaCost:6 -Types:Artifact -Text:Creature spells you cast cost up to 2 less to cast. -K:CostChange:Player:Less:2:Spell:All:Creature:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_gate.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_guide.txt b/res/cardsfolder/planar_guide.txt deleted file mode 100644 index e4f34c51d21..00000000000 --- a/res/cardsfolder/planar_guide.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Planar Guide -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ ChangeZoneAll | Cost$ 3 W Exile<1/CARDNAME> | ChangeType$ Creature | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DelTrig | SpellDescription$ Exile all creatures. At the beginning of the next end step, return those cards to the battlefield under their owners' control. -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return cards exiled by CARDNAME to the battlefield. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | ChangeType$ Card.Other | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_guide.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_portal.txt b/res/cardsfolder/planar_portal.txt deleted file mode 100644 index fa01468471e..00000000000 --- a/res/cardsfolder/planar_portal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Planar Portal -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 6 T | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card and put that card into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_portal.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/311.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/308.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/planar_void.txt b/res/cardsfolder/planar_void.txt deleted file mode 100644 index 741ca2a9c33..00000000000 --- a/res/cardsfolder/planar_void.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Planar Void -ManaCost:B -Types:Enchantment -Text:Whenever another card is put into a graveyard from anywhere, exile that card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/planar_void.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plasma_elemental.txt b/res/cardsfolder/plasma_elemental.txt deleted file mode 100644 index 4fe36cd382f..00000000000 --- a/res/cardsfolder/plasma_elemental.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plasma Elemental -ManaCost:5 U -Types:Creature Elemental -Text:no text -PT:4/1 -K:Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card73562.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plateau.txt b/res/cardsfolder/plateau.txt deleted file mode 100644 index 451e25f70ce..00000000000 --- a/res/cardsfolder/plateau.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plateau -ManaCost:no cost -Types:Land Mountain Plains -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/plateau.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/287.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/292.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/296.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_geopede.txt b/res/cardsfolder/plated_geopede.txt deleted file mode 100644 index a72ad0e3465..00000000000 --- a/res/cardsfolder/plated_geopede.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Plated Geopede -ManaCost:1 R -Types:Creature Insect -Text:no text -PT:1/1 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_geopede.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_pegasus.txt b/res/cardsfolder/plated_pegasus.txt deleted file mode 100644 index e3716153bc0..00000000000 --- a/res/cardsfolder/plated_pegasus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Plated Pegasus -ManaCost:2 W -Types:Creature Pegasus -Text:no text -PT:1/2 -K:Flash -K:Flying -K:stPreventDamage:Player:Spell:1:If a spell would deal damage to a creature or player, prevent 1 damage that spell would deal to that creature or player. -K:stPreventDamage:Creature:Spell:1:no text -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_pegasus.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_rootwalla.txt b/res/cardsfolder/plated_rootwalla.txt deleted file mode 100644 index b2a45b397ac..00000000000 --- a/res/cardsfolder/plated_rootwalla.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plated Rootwalla -ManaCost:4 G -Types:Creature Lizard -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 G | NumAtt$ +3 | NumDef$ +3 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_rootwalla.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_seastrider.txt b/res/cardsfolder/plated_seastrider.txt deleted file mode 100644 index ac04fd7e873..00000000000 --- a/res/cardsfolder/plated_seastrider.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Plated Seastrider -ManaCost:U U -Types:Creature Beast -Text:no text -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_seastrider.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_slagwurm.txt b/res/cardsfolder/plated_slagwurm.txt deleted file mode 100644 index 8cd88245530..00000000000 --- a/res/cardsfolder/plated_slagwurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plated Slagwurm -ManaCost:4 G G G -Types:Creature Wurm -Text:no text -PT:8/8 -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_slagwurm.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_sliver.txt b/res/cardsfolder/plated_sliver.txt deleted file mode 100644 index f2242b35270..00000000000 --- a/res/cardsfolder/plated_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plated Sliver -ManaCost:W -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/1:no Condition:All Sliver creatures get +0/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_sliver.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_spider.txt b/res/cardsfolder/plated_spider.txt deleted file mode 100644 index 219acbe6057..00000000000 --- a/res/cardsfolder/plated_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plated Spider -ManaCost:4 G -Types:Creature Spider -Text:no text -PT:4/4 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card19239.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plated_wurm.txt b/res/cardsfolder/plated_wurm.txt deleted file mode 100644 index 696a7a33cb1..00000000000 --- a/res/cardsfolder/plated_wurm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Plated Wurm -ManaCost:4 G -Types:Creature Wurm -Text:no text -PT:4/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6617.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/platinum_angel.txt b/res/cardsfolder/platinum_angel.txt deleted file mode 100644 index 6115c996dcd..00000000000 --- a/res/cardsfolder/platinum_angel.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Platinum Angel -ManaCost:7 -Types:Artifact Creature Angel -Text:no text -PT:4/4 -K:Flying -K:You can't lose the game. -K:Your opponents can't win the game. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/platinum_angel.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/212.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/218.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/339.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/platinum_emperion.txt b/res/cardsfolder/platinum_emperion.txt deleted file mode 100644 index ac0a0578313..00000000000 --- a/res/cardsfolder/platinum_emperion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Platinum Emperion -ManaCost:8 -Types:Artifact Creature Golem -Text:Your life total can't change. (You can't gain or lose life. You can't pay any amount of life except 0.) -PT:8/8 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/platinum_emperion.jpg -#Uses card-specific code! -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plover_knights.txt b/res/cardsfolder/plover_knights.txt deleted file mode 100644 index 4afb0e24daf..00000000000 --- a/res/cardsfolder/plover_knights.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Plover Knights -ManaCost:3 W W -Types:Creature Kithkin Knight -Text:no text -PT:3/3 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plover_knights.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plow_under.txt b/res/cardsfolder/plow_under.txt deleted file mode 100644 index d4e25df9bfa..00000000000 --- a/res/cardsfolder/plow_under.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plow Under -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G G | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Land | TgtPrompt$ Select target Land | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put two target lands on top of their owners' libraries. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/plow_under.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/272.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plumes_of_peace.txt b/res/cardsfolder/plumes_of_peace.txt deleted file mode 100644 index f6f9f139384..00000000000 --- a/res/cardsfolder/plumes_of_peace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Plumes of Peace -ManaCost:1 W U -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -A:AB$ Tap | Cost$ W U | TgtPrompt$ Choose target creature | ValidTgts$ Creature | ActivatingZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | CostDesc$ W U, Reveal CARDNAME from your hand: | SpellDescription$ Tap target creature. (Activate this ability only during your upkeep and only once each turn.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plumes_of_peace.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plumeveil.txt b/res/cardsfolder/plumeveil.txt deleted file mode 100644 index 319bda21368..00000000000 --- a/res/cardsfolder/plumeveil.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Plumeveil -ManaCost:WU WU WU -Types:Creature Elemental -Text:no text -PT:4/4 -K:Flash -K:Defender -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/plumeveil.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/plummet.txt b/res/cardsfolder/plummet.txt deleted file mode 100644 index 2d194b39e8d..00000000000 --- a/res/cardsfolder/plummet.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Plummet -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Destroy target creature with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plummet.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/190.jpg -End diff --git a/res/cardsfolder/plunder.txt b/res/cardsfolder/plunder.txt deleted file mode 100644 index da42b875cd2..00000000000 --- a/res/cardsfolder/plunder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Plunder -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SpellDescription$ Destroy target artifact or land. -K:Suspend:4:1 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/plunder.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/174.jpg -End diff --git a/res/cardsfolder/poison_arrow.txt b/res/cardsfolder/poison_arrow.txt deleted file mode 100644 index 5468cbf81f8..00000000000 --- a/res/cardsfolder/poison_arrow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Poison Arrow -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target nonblack creature. You gain 3 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/poison_arrow.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/poison_the_well.txt b/res/cardsfolder/poison_the_well.txt deleted file mode 100644 index e4681bc3bc3..00000000000 --- a/res/cardsfolder/poison_the_well.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Poison the Well -ManaCost:2 BR BR -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 BR BR | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy target land. CARDNAME deals 2 damage to that land's controller. -SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/poison_the_well.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/193.jpg -End diff --git a/res/cardsfolder/poisonbelly_ogre.txt b/res/cardsfolder/poisonbelly_ogre.txt deleted file mode 100644 index 9c5842b9a3f..00000000000 --- a/res/cardsfolder/poisonbelly_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Poisonbelly Ogre -ManaCost:4 B -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever another creature enters the battlefield, its controller loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/poisonbelly_ogre.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/political_trickery.txt b/res/cardsfolder/political_trickery.txt deleted file mode 100644 index 33d88d42f93..00000000000 --- a/res/cardsfolder/political_trickery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Political Trickery -ManaCost:2 U -Types:Sorcery -Text:Exchange control of target land you control and target land an opponent controls. (This effect lasts indefinitely.) -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/political_trickery.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pollen_lullaby.txt b/res/cardsfolder/pollen_lullaby.txt deleted file mode 100644 index ccefa1e2fd9..00000000000 --- a/res/cardsfolder/pollen_lullaby.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pollen Lullaby -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 W | SubAbility$ SVar=DBClash | SpellDescription$ 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. -SVar:DBClash:DB$Clash | WinSubAbility$ DBPumpAll -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.YouDontCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pollen_lullaby.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pollenbright_wings.txt b/res/cardsfolder/pollenbright_wings.txt deleted file mode 100644 index 9439f12c28d..00000000000 --- a/res/cardsfolder/pollenbright_wings.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pollenbright Wings -ManaCost:4 G W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigToken | ValidTarget$ Player | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, put that many 1/1 green Saproling creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pollenbright_wings.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/polluted_bonds.txt b/res/cardsfolder/polluted_bonds.txt deleted file mode 100644 index 4e345bfcaee..00000000000 --- a/res/cardsfolder/polluted_bonds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Polluted Bonds -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever a land enters the battlefield under an opponent's control, that player loses 2 life and you gain 2 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/polluted_bonds.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/polluted_delta.txt b/res/cardsfolder/polluted_delta.txt deleted file mode 100644 index 755100984ab..00000000000 --- a/res/cardsfolder/polluted_delta.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Polluted Delta -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Island,Swamp | ChangeNum$ 1 | SpellDescription$ Search your library for a Island or Swamp card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/polluted_delta.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/polluted_mire.txt b/res/cardsfolder/polluted_mire.txt deleted file mode 100644 index f1b6b440c24..00000000000 --- a/res/cardsfolder/polluted_mire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Polluted Mire -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/polluted_mire.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ponder.txt b/res/cardsfolder/ponder.txt deleted file mode 100644 index da59db1c8b7..00000000000 --- a/res/cardsfolder/ponder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ponder -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ U | Defined$ You | NumCards$ 3 | MayShuffle$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Look at the top three cards of your library, then put them back in any order. You may shuffle your library. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ponder.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/68.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pongify.txt b/res/cardsfolder/pongify.txt deleted file mode 100644 index 31d8de7c76b..00000000000 --- a/res/cardsfolder/pongify.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pongify -ManaCost:U -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select a creature | SubAbility$ SVar=DBToken | NoRegen$ True | SpellDescription$ Destroy target creature. It can't be regenerated. That creature's controller puts a 3/3 green Ape creature token into play. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Ape | TokenTypes$ Creature,Ape | TokenOwner$ TargetedController | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pongify.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/44.jpg -End diff --git a/res/cardsfolder/pooling_venom.txt b/res/cardsfolder/pooling_venom.txt deleted file mode 100644 index 58937a7001a..00000000000 --- a/res/cardsfolder/pooling_venom.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pooling Venom -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Land Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLose | TriggerDescription$ Whenever enchanted land becomes tapped, its controller loses 2 life. -SVar:TrigLose:AB$LoseLife | Cost$ 0 | Defined$ EnchantedController | LifeAmount$ 2 -A:AB$ Destroy | Cost$ 3 B | Defined$ Enchanted | SpellDescription$ Destroy enchanted land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pooling_venom.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/porcelain_legionnaire.txt b/res/cardsfolder/porcelain_legionnaire.txt deleted file mode 100644 index bff66b3c924..00000000000 --- a/res/cardsfolder/porcelain_legionnaire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Porcelain Legionnaire -ManaCost:2 PW -Types:Artifact Creature Soldier -Text:no text -PT:3/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/porcelain_legionnaire.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/porphyry_nodes.txt b/res/cardsfolder/porphyry_nodes.txt deleted file mode 100644 index 9e436b9afde..00000000000 --- a/res/cardsfolder/porphyry_nodes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Porphyry Nodes -ManaCost:W -Types:Enchantment -Text: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.\r\nWhen there are no creatures on the battlefield, sacrifice Porphyry Nodes. -SVar:Rarity:Rare -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/porphyry_nodes.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/port_inspector.txt b/res/cardsfolder/port_inspector.txt deleted file mode 100644 index c1461a7c030..00000000000 --- a/res/cardsfolder/port_inspector.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Port Inspector -ManaCost:1 U -Types:Creature Human -Text:no text -PT:1/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ Whenever CARDNAME becomes blocked, you may look at defending player's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | Defined$ Opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/port_inspector.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/portcullis.txt b/res/cardsfolder/portcullis.txt deleted file mode 100644 index 26c421c743c..00000000000 --- a/res/cardsfolder/portcullis.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Portcullis -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | ValidCard$ Creature | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature enters the battlefield, if there are two or more other creatures on the battlefield, exile that creature. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerDescription$ Return that card to the battlefield under its owner's control when CARDNAME leaves the battlefield. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ConditionPresent$ Creature | ConditionCompare$ GE2 | Defined$ TriggeredCard | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/portcullis.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/portent.txt b/res/cardsfolder/portent.txt deleted file mode 100644 index 551d4274c42..00000000000 --- a/res/cardsfolder/portent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Portent -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ U | ValidTgts$ Player | TgtPrompt$ Choose target player. | NumCards$ 3 | MayShuffle$ True | SpellDescription$ 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. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/portent.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/110.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/possessed_aven.txt b/res/cardsfolder/possessed_aven.txt deleted file mode 100644 index 3941123cbdf..00000000000 --- a/res/cardsfolder/possessed_aven.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Possessed Aven -ManaCost:2 U U -Types:Creature Bird Soldier Horror -Text:no text -PT:3/3 -K:Flying -K:stPumpSelf:Creature:1/1/CARDNAME is black. & SVar=Destroy:Threshold:Threshold - As long as seven or more cards are in your graveyard, Possessed Aven gets +1/+1, is black, and has "2 B, tap: Destroy target blue creature." -SVar:Destroy:AB$Destroy | Cost$ 2 B T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | SpellDescription$ Destroy target blue creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/possessed_aven.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/possessed_barbarian.txt b/res/cardsfolder/possessed_barbarian.txt deleted file mode 100644 index d2b8c25c01e..00000000000 --- a/res/cardsfolder/possessed_barbarian.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Possessed Barbarian -ManaCost:2 R R -Types:Creature Human Barbarian Horror -Text:no text -PT:3/3 -K:First Strike -K:stPumpSelf:Creature:1/1/CARDNAME is black. & SVar=Destroy:Threshold:Threshold - As long as seven or more cards are in your graveyard, Possessed Barbarian gets +1/+1, is black, and has "2 B, tap: Destroy target red creature." -SVar:Destroy:AB$Destroy | Cost$ 2 B T | ValidTgts$ Creature.Red | TgtPrompt$ Select target red creature | SpellDescription$ Destroy target red creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/possessed_barbarian.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/111.jpg -End diff --git a/res/cardsfolder/possessed_centaur.txt b/res/cardsfolder/possessed_centaur.txt deleted file mode 100644 index 0e2fb00daf1..00000000000 --- a/res/cardsfolder/possessed_centaur.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Possessed Centaur -ManaCost:2 G G -Types:Creature Centaur Horror -Text:no text -PT:3/3 -K:Trample -K:stPumpSelf:Creature:1/1/CARDNAME is black. & SVar=Destroy:Threshold:Threshold - As long as seven or more cards are in your graveyard, Possessed Centaur gets +1/+1, is black, and has "2 B, tap: Destroy target green creature." -SVar:Destroy:AB$Destroy | Cost$ 2 B T | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | SpellDescription$ Destroy target green creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/possessed_centaur.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/137.jpg -End diff --git a/res/cardsfolder/possessed_nomad.txt b/res/cardsfolder/possessed_nomad.txt deleted file mode 100644 index b0e17fa0c87..00000000000 --- a/res/cardsfolder/possessed_nomad.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Possessed Nomad -ManaCost:2 W W -Types:Creature Human Nomad Horror -Text:no text -PT:3/3 -K:Vigilance -K:stPumpSelf:Creature:1/1/CARDNAME is black. & SVar=Destroy:Threshold:Threshold - As long as seven or more cards are in your graveyard, Possessed Nomad gets +1/+1, is black, and has "2 B, tap: Destroy target white creature." -SVar:Destroy:AB$Destroy | Cost$ 2 B T | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | SpellDescription$ Destroy target white creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/possessed_nomad.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/13.jpg -End diff --git a/res/cardsfolder/postmortem_lunge.txt b/res/cardsfolder/postmortem_lunge.txt deleted file mode 100644 index 5c50f7bca8b..00000000000 --- a/res/cardsfolder/postmortem_lunge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Postmortem Lunge -ManaCost:X PB -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ X PB | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.CMCEQX | TgtPromp$ Choose target creature with CMC equal to X. | SubAbility$ SVar=DBPump | SpellDescription$ 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. -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Haste & HIDDEN At the beginning of the end step, exile CARDNAME. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/postmortem_lunge.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/poultice_sliver.txt b/res/cardsfolder/poultice_sliver.txt deleted file mode 100644 index 86b5e477557..00000000000 --- a/res/cardsfolder/poultice_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Poultice Sliver -ManaCost:2 W -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Regen:no Condition:All Slivers have "2, Tap, Regenerate target Sliver." -SVar:Regen:AB$Regenerate | Cost$ 2 T | ValidTgts$ Sliver | TgtPrompt$ Select a target Sliver. | SpellDescription$ Regenerate a target Sliver. -SVar:BuffedBy:Sliver -SVar:Picture:http://www.wizards.com/global/images/magic/general/poultice_sliver.jpg -SVar:Rarity:Common -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/11.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pouncing_jaguar.txt b/res/cardsfolder/pouncing_jaguar.txt deleted file mode 100644 index fc7658f93c2..00000000000 --- a/res/cardsfolder/pouncing_jaguar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pouncing Jaguar -ManaCost:G -Types:Creature Cat -Text:no text -PT:2/2 -K:Echo:G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pouncing_jaguar.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/powder_keg.txt b/res/cardsfolder/powder_keg.txt deleted file mode 100644 index 88b0ef8bf0c..00000000000 --- a/res/cardsfolder/powder_keg.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Powder Keg -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a fuse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ FUSE | CounterNum$ 1 -A:AB$ DestroyAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Artifact.cmcEQX,Creature.cmcEQX | SpellDescription$ Destroy each artifact and creature with converted mana cost equal to the number of fuse counters on CARDNAME. -SVar:X:Count$CardCounters.FUSE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/powder_keg.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/power_armor.txt b/res/cardsfolder/power_armor.txt deleted file mode 100644 index 5f8c1b1b16d..00000000000 --- a/res/cardsfolder/power_armor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Power Armor -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | PrecostDesc$ Domain - | SpellDescription$ Target creature gets +1/+1 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_armor.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/309.jpg -End diff --git a/res/cardsfolder/power_artifact.txt b/res/cardsfolder/power_artifact.txt deleted file mode 100644 index b311e9c0113..00000000000 --- a/res/cardsfolder/power_artifact.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Power Artifact -ManaCost:U U -Types:Enchantment Aura -Text: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. -K:CostChange:Player:Less:2:Enchanted:All:Artifact:TargetInPlay -K:Enchant Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_artifact.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/power_matrix.txt b/res/cardsfolder/power_matrix.txt deleted file mode 100644 index b9e44bcb6c7..00000000000 --- a/res/cardsfolder/power_matrix.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Power Matrix -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ Flying & First Strike & Trample | SpellDescription$ Target creature gets +1/+1 and gains flying, first strike, and trample until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_matrix.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/309.jpg -End diff --git a/res/cardsfolder/power_of_fire.txt b/res/cardsfolder/power_of_fire.txt deleted file mode 100644 index a62db8703fd..00000000000 --- a/res/cardsfolder/power_of_fire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Power of Fire -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_of_fire.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/power_sink.txt b/res/cardsfolder/power_sink.txt deleted file mode 100644 index 487dc6b3feb..00000000000 --- a/res/cardsfolder/power_sink.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Power Sink -ManaCost:X U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ X U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | PowerSink$ True | SpellDescription$ 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. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_sink.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/89.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/78.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/73.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/73.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/111.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/93.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/91.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/87.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/74.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/83.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/power_surge.txt b/res/cardsfolder/power_surge.txt deleted file mode 100644 index 7037a2c9eb6..00000000000 --- a/res/cardsfolder/power_surge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Power Surge -ManaCost:R R -Types:Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_surge.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/168.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/169.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/169.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/234.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/powerstone_minefield.txt b/res/cardsfolder/powerstone_minefield.txt deleted file mode 100644 index 55488edb086..00000000000 --- a/res/cardsfolder/powerstone_minefield.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Powerstone Minefield -ManaCost:2 R W -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks or blocks, CARDNAME deals 2 damage to it. -T:Mode$ Blocks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigDamage2 | Secondary$ True | TriggerDescription$ Whenever a creature attacks or blocks, CARDNAME deals 2 damage to it. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredAttacker | NumDmg$ 2 -SVar:TrigDamage2:AB$DealDamage | Cost$ 0 | Defined$ TriggeredBlocker | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:RemRandomDeck:TrueSVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/powerstone_minefield.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pradesh_gypsies.txt b/res/cardsfolder/pradesh_gypsies.txt deleted file mode 100644 index 67803201d5e..00000000000 --- a/res/cardsfolder/pradesh_gypsies.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pradesh Gypsies -ManaCost:2 G -Types:Creature Human Nomad -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pradesh_gypsies.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/179.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/244.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/149.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/praetors_counsel.txt b/res/cardsfolder/praetors_counsel.txt deleted file mode 100644 index f6fb9c44bdd..00000000000 --- a/res/cardsfolder/praetors_counsel.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Praetor's Counsel -ManaCost:5 G G G -Types:Sorcery -Text:Return all cards from your graveyard to your hand. Exile CARDNAME. You have no maximum hand size for the rest of the game. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/praetors_counsel.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/precognition.txt b/res/cardsfolder/precognition.txt deleted file mode 100644 index 269ada9ab80..00000000000 --- a/res/cardsfolder/precognition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Precognition -ManaCost:4 U -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ 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. -SVar:TrigDig:AB$ Dig | Cost$ 0 | ValidTgts$ Opponent | DigNum$ 1 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 | -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/precognition.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/predator_dragon.txt b/res/cardsfolder/predator_dragon.txt deleted file mode 100644 index 645930b68ef..00000000000 --- a/res/cardsfolder/predator_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Predator Dragon -ManaCost:3 R R R -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -K:Haste -K:Devour:2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/predator_dragon.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/predator_flagship.txt b/res/cardsfolder/predator_flagship.txt deleted file mode 100644 index 3a8077bce5f..00000000000 --- a/res/cardsfolder/predator_flagship.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Predator, Flagship -ManaCost:5 -Types:Legendary Artifact -Text:no text -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -A:AB$ Destroy | Cost$ 5 T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Destroy target creature with flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/predator_flagship.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/135.jpg -End diff --git a/res/cardsfolder/predators_strike.txt b/res/cardsfolder/predators_strike.txt deleted file mode 100644 index b8ffd6cbcd5..00000000000 --- a/res/cardsfolder/predators_strike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Predator's Strike -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ Trample | SpellDescription$ Target creature gets +3/+3 and gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/predators_strike.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/128.jpg -End diff --git a/res/cardsfolder/predatory_advantage.txt b/res/cardsfolder/predatory_advantage.txt deleted file mode 100644 index 06f418c5db6..00000000000 --- a/res/cardsfolder/predatory_advantage.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Predatory Advantage -ManaCost:3 R G -Types:Enchantment -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/predatory_advantage.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/predatory_hunger.txt b/res/cardsfolder/predatory_hunger.txt deleted file mode 100644 index ef92d9617f9..00000000000 --- a/res/cardsfolder/predatory_hunger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Predatory Hunger -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -T:Mode$ SpellCast | ValidCard$ Creature.YouDontCtrl | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent casts a creature spell, put a +1/+1 counter on enchanted creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/predatory_hunger.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/117.jpg -End diff --git a/res/cardsfolder/predatory_nightstalker.txt b/res/cardsfolder/predatory_nightstalker.txt deleted file mode 100644 index 696ff803897..00000000000 --- a/res/cardsfolder/predatory_nightstalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Predatory Nightstalker -ManaCost:3 B B -Types:Creature Nightstalker -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigSac | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may have target opponent sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | ValidTgts$ Opponent | SacValid$ Creature -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Second_Age/predatory_nightstalker.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/preeminent_captain.txt b/res/cardsfolder/preeminent_captain.txt deleted file mode 100644 index f8abdf7789e..00000000000 --- a/res/cardsfolder/preeminent_captain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Preeminent Captain -ManaCost:2 W -Types:Creature Kithkin Soldier -Text:Whenever CARDNAME attacks, you may put a Soldier creature card from your hand onto the battlefield tapped and attacking. -PT:2/2 -K:First Strike -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/preeminent_captain.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/preemptive_strike.txt b/res/cardsfolder/preemptive_strike.txt deleted file mode 100644 index a8fc926e6a3..00000000000 --- a/res/cardsfolder/preemptive_strike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Preemptive Strike -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/preemptive_strike.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/preordain.txt b/res/cardsfolder/preordain.txt deleted file mode 100644 index dbfd3d5c094..00000000000 --- a/res/cardsfolder/preordain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Preordain -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Scry | Cost$ U | ScryNum$ 2 | SpellDescription$ 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.) | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/preordain.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/presence_of_gond.txt b/res/cardsfolder/presence_of_gond.txt deleted file mode 100644 index 733c0f02df9..00000000000 --- a/res/cardsfolder/presence_of_gond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Presence of Gond -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpAll:Card.AttachedBy:0/0/SVar=Token:no Condition:Enchanted creature has "Tap: Put a 1/1 green Elf Warrior creature token onto the battlefield." -SVar:Token:AB$Token | Cost$ T | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Put a 1/1 green Elf Warrior creature token onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/presence_of_gond.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/presence_of_the_master.txt b/res/cardsfolder/presence_of_the_master.txt deleted file mode 100644 index a709a75c9f3..00000000000 --- a/res/cardsfolder/presence_of_the_master.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Presence of the Master -ManaCost:3 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Enchantment | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever a player casts an enchantment spell, counter it. -SVar:TrigCounter:AB$Counter | Cost$ 0 | Defined$ TriggeredSpellAbility -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/presence_of_the_master.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/32.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/presence_of_the_wise.txt b/res/cardsfolder/presence_of_the_wise.txt deleted file mode 100644 index 4994e2552ef..00000000000 --- a/res/cardsfolder/presence_of_the_wise.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Presence of the Wise -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 W W | LifeAmount$ X | SpellDescription$ You gain 2 life for each card in your hand. -SVar:X:Count$CardsInYourHand/Times.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/presence_of_the_wise.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/23.jpg -End diff --git a/res/cardsfolder/pretenders_claim.txt b/res/cardsfolder/pretenders_claim.txt deleted file mode 100755 index 0ac734fffd5..00000000000 --- a/res/cardsfolder/pretenders_claim.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pretender's Claim -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ AttackerBlocked | ValidCard$ Card.AttachedBy | Execute$ TrigTapAll | TriggerDescription$ Whenever enchanted creature becomes blocked, tap all lands defending player controls. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Land.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pretenders_claim.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/price_of_progress.txt b/res/cardsfolder/price_of_progress.txt deleted file mode 100644 index 74ad64afec8..00000000000 --- a/res/cardsfolder/price_of_progress.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Price of Progress -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Defined$ Opponent | NumDmg$ XOpp | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 2 damage to each player for each nonbasic land he or she controls. -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ XYou -SVar:XOpp:Count$Valid Land.nonBasic+YouDontCtrl/Times.2 -SVar:XYou:Count$Valid Land.nonBasic+YouCtrl/Times.2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/price_of_progress.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prickly_boggart.txt b/res/cardsfolder/prickly_boggart.txt deleted file mode 100644 index 7ec21739c9c..00000000000 --- a/res/cardsfolder/prickly_boggart.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Prickly Boggart -ManaCost:B -Types:Creature Goblin Rogue -Text:no text -PT:1/1 -K:Fear -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/prickly_boggart.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pride_of_the_clouds.txt b/res/cardsfolder/pride_of_the_clouds.txt deleted file mode 100644 index 0c956ad55bf..00000000000 --- a/res/cardsfolder/pride_of_the_clouds.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pride of the Clouds -ManaCost:W U -Types:Creature Elemental Cat -Text:no text -PT:1/1 -K:Flying -K:stPumpSelf:Creature:X/X:no Condition:Pride of the Clouds gets +1/+1 for each other creature with flying on the battlefield. -A:AB$ Token | Cost$ 2 W U | ActivatingZone$ Hand | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ You | TokenColors$ White,Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | SpellDescription$ 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.) -SVar:X:Count$Valid Creature.withFlying+Other -SVar:BuffedBy:Creature.withFlying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pride_of_the_clouds.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/priest_of_gix.txt b/res/cardsfolder/priest_of_gix.txt deleted file mode 100644 index 8f49d025764..00000000000 --- a/res/cardsfolder/priest_of_gix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Priest of Gix -ManaCost:2 B -Types:Creature Human Cleric Minion -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ When CARDNAME enters the battlefield, add B B B to your mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ B | Amount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/priest_of_gix.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/priest_of_titania.txt b/res/cardsfolder/priest_of_titania.txt deleted file mode 100644 index 57a51282437..00000000000 --- a/res/cardsfolder/priest_of_titania.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Priest of Titania -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Elf on the battlefield. -SVar:X:Count$Valid Elf -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/priest_of_titania.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/priest_of_urabrask.txt b/res/cardsfolder/priest_of_urabrask.txt deleted file mode 100644 index b991559b0e9..00000000000 --- a/res/cardsfolder/priest_of_urabrask.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Priest of Urabrask -ManaCost:2 R -Types:Creature Human Cleric -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ When CARDNAME enters the battlefield, add R R R to your mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ R | Amount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/priest_of_urabrask.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/priest_of_yawgmoth.txt b/res/cardsfolder/priest_of_yawgmoth.txt deleted file mode 100644 index 600fc94fd96..00000000000 --- a/res/cardsfolder/priest_of_yawgmoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Priest of Yawgmoth -ManaCost:1 B -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T Sac<1/Artifact> | Produced$ B | Amount$ X | SpellDescription$ Add to your mana pool an amount of black mana equal to the sacrificed artifact's converted mana cost. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/priest_of_yawgmoth.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/priests_of_norn.txt b/res/cardsfolder/priests_of_norn.txt deleted file mode 100644 index c4d1d9ff295..00000000000 --- a/res/cardsfolder/priests_of_norn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Priests of Norn -ManaCost:2 W -Types:Creature Cleric -Text:no text -PT:1/4 -K:Vigilance -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/priests_of_norn.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_bellow.txt b/res/cardsfolder/primal_bellow.txt deleted file mode 100644 index 29e2ef62413..00000000000 --- a/res/cardsfolder/primal_bellow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Primal Bellow -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +1/+1 until end of turn for each Forest you control. -SVar:X:Count$TypeYouCtrl.Forest -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_bellow.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/176.jpg -End diff --git a/res/cardsfolder/primal_boost.txt b/res/cardsfolder/primal_boost.txt deleted file mode 100644 index bdffd399fbb..00000000000 --- a/res/cardsfolder/primal_boost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Primal Boost -ManaCost:2 G -Types:Instant -Text:no text -K:Cycling:2 G -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 4 | NumDef$ 4 | SpellDescription$ Target creature gets +4/+4 until end of turn. -T:Mode$ Cycled | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ When you cycle CARDNAME, you may have target creature get +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card41145.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_clay.txt b/res/cardsfolder/primal_clay.txt deleted file mode 100644 index 2bff8073a61..00000000000 --- a/res/cardsfolder/primal_clay.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Primal Clay -ManaCost:4 -Types:Artifact Creature Shapeshifter -Text:As CARDNAME 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. -PT:*/* -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2065.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/395.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/307.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/271.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/360.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_cocoon.txt b/res/cardsfolder/primal_cocoon.txt deleted file mode 100644 index 2f9f62a1b68..00000000000 --- a/res/cardsfolder/primal_cocoon.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Primal Cocoon -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on enchanted creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 -T:Mode$ Attacks | ValidCard$ Card.AttachedBy | Execute$ TrigSac | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice Primal Cocoon. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice Primal Cocoon. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_cocoon.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_frenzy.txt b/res/cardsfolder/primal_frenzy.txt deleted file mode 100644 index 2ee0625f9b5..00000000000 --- a/res/cardsfolder/primal_frenzy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Primal Frenzy -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_frenzy.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_order.txt b/res/cardsfolder/primal_order.txt deleted file mode 100644 index 786fb7a1866..00000000000 --- a/res/cardsfolder/primal_order.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Primal Order -ManaCost:2 G G -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of nonbasic lands he or she controls. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ X -SVar:X:Count$Valid Land.nonBasic+YouCtrl -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDamageOpp | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals damage to that player equal to the number of nonbasic lands he or she controls. -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ Y -SVar:Y:Count$Valid Land.nonBasic+YouDontCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_order.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/65.jpg -End diff --git a/res/cardsfolder/primal_plasma.txt b/res/cardsfolder/primal_plasma.txt deleted file mode 100644 index 4f0da2adfb8..00000000000 --- a/res/cardsfolder/primal_plasma.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Primal Plasma -ManaCost:3 U -Types:Creature Elemental Shapeshifter -Text:As CARDNAME 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. -PT:*/* -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card124757.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_rage.txt b/res/cardsfolder/primal_rage.txt deleted file mode 100644 index c261359aa63..00000000000 --- a/res/cardsfolder/primal_rage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Primal Rage -ManaCost:1 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Trample:No Condition:Creatures you control have trample. (If a creature you control would deal enough damage to its blockers to destroy them, you may have it deal the rest of its damage to defending player or planeswalker.) -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_rage.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/62.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primal_whisperer.txt b/res/cardsfolder/primal_whisperer.txt deleted file mode 100644 index 65660e0afbb..00000000000 --- a/res/cardsfolder/primal_whisperer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Primal Whisperer -ManaCost:4 G -Types:Creature Elf Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Creature:X/X:no Condition:Primal Whisperer gets +2/+2 for each face-down creature on the battlefield. -K:Morph:3 R -SVar:X:Count$Valid Creature.faceDown+YouCtrl/Times.2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/primal_whisperer.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primalcrux.txt b/res/cardsfolder/primalcrux.txt deleted file mode 100644 index d06eb5f5157..00000000000 --- a/res/cardsfolder/primalcrux.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Primalcrux -ManaCost:G G G G G G -Types:Creature Elemental -Text:no text -PT:1/1 -K:Trample -K:stSetPT:Count$Chroma.G:Count$Chroma.G:Chroma - CARDNAME's power and toughness are each equal to the number of green mana symbols in the mana costs of permanents you control. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/primalcrux.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primeval_shambler.txt b/res/cardsfolder/primeval_shambler.txt deleted file mode 100644 index 0923948aac2..00000000000 --- a/res/cardsfolder/primeval_shambler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Primeval Shambler -ManaCost:4 B -Types:Creature Horror Mercenary -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/primeval_shambler.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/156.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/152.jpg -End diff --git a/res/cardsfolder/primeval_titan.txt b/res/cardsfolder/primeval_titan.txt deleted file mode 100644 index e443319fc32..00000000000 --- a/res/cardsfolder/primeval_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Primeval Titan -ManaCost:4 G G -Types:Creature Giant -Text:no text -PT:6/6 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for up to two land cards, put them onto the battlefield tapped, then shuffle your library. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may search your library for up to two land cards, put them onto the battlefield tapped, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land | ChangeNum$ 2 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/primeval_titan.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primoc_escapee.txt b/res/cardsfolder/primoc_escapee.txt deleted file mode 100644 index 9db5d01d6d5..00000000000 --- a/res/cardsfolder/primoc_escapee.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Primoc Escapee -ManaCost:6 U -Types:Creature Bird Beast -Text:no text -PT:4/4 -K:Flying -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/primoc_escapee.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/primordial_sage.txt b/res/cardsfolder/primordial_sage.txt deleted file mode 100644 index 5d91e963ee9..00000000000 --- a/res/cardsfolder/primordial_sage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Primordial Sage -ManaCost:4 G G -Types:Creature Spirit -Text:no text -PT:4/5 -T:Mode$ SpellCast | ValidCard$ Card.Creature+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a creature spell, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/primordial_sage.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/princess_lucrezia.txt b/res/cardsfolder/princess_lucrezia.txt deleted file mode 100644 index 239cdff6061..00000000000 --- a/res/cardsfolder/princess_lucrezia.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Princess Lucrezia -ManaCost:3 U U B -Types:Legendary Creature Human Wizard -Text:no text -PT:5/4 -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1675.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prismatic_lens.txt b/res/cardsfolder/prismatic_lens.txt deleted file mode 100644 index 8152e8535d9..00000000000 --- a/res/cardsfolder/prismatic_lens.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Prismatic Lens -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_lens.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prismatic_omen.txt b/res/cardsfolder/prismatic_omen.txt deleted file mode 100644 index 8a3a819229b..00000000000 --- a/res/cardsfolder/prismatic_omen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Prismatic Omen -ManaCost:1 G -Types:Enchantment -Text:no text -K:stPumpAll:Land.YouCtrl:0/0/Types=Plains & Types=Island & Types=Swamp & Types=Mountain & Types=Forest:No Condition:Lands you control are every basic land type in addition to their other types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_omen.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pristine_angel.txt b/res/cardsfolder/pristine_angel.txt deleted file mode 100644 index 57599886338..00000000000 --- a/res/cardsfolder/pristine_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pristine Angel -ManaCost:4 W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -K:stPumpSelf:Creature:0/0/Protection from artifacts & Protection from white & Protection from blue & Protection from black & Protection from red & Protection from green:isUntapped:As long as Pristine Angel is untapped, it has protection from artifacts and from all colors. -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigUntap | TriggerDescription$ Whenever you cast a spell, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pristine_angel.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/9.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pristine_talisman.txt b/res/cardsfolder/pristine_talisman.txt deleted file mode 100644 index f500825b1d0..00000000000 --- a/res/cardsfolder/pristine_talisman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pristine Talisman -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SubAbility$ SVar=DBGainLife | SpellDescription$ Add 1 to your mana pool. You gain 1 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pristine_talisman.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/privileged_position.txt b/res/cardsfolder/privileged_position.txt deleted file mode 100644 index efa2f3d5fe1..00000000000 --- a/res/cardsfolder/privileged_position.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Privileged Position -ManaCost:2 GW GW GW -Types:Enchantment -Text:no text -K:stPumpAll:Permanent.Other+YouCtrl:0/0/CARDNAME can't be the target of spells or abilities your opponents control.:No Condition:Other permanents you control can't be the targets of spells or abilities your opponents control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/privileged_position.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prized_unicorn.txt b/res/cardsfolder/prized_unicorn.txt deleted file mode 100644 index 0c67fb2979a..00000000000 --- a/res/cardsfolder/prized_unicorn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Prized Unicorn -ManaCost:3 G -Types:Creature Unicorn -Text:no text -PT:2/2 -K:All creatures able to block CARDNAME do so. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/prized_unicorn.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/193.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/proclamation_of_rebirth.txt b/res/cardsfolder/proclamation_of_rebirth.txt deleted file mode 100644 index 99f8d9de71f..00000000000 --- a/res/cardsfolder/proclamation_of_rebirth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Proclamation of Rebirth -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 W | TargetMin$ 0 | TargetMax$ 3 | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with converted mana cost 1 or less in your graveyard | ValidTgts$ Creature.cmcLE1+YouCtrl | SpellDescription$ Return up to three target creature cards with converted mana cost 1 or less from your graveyard to the battlefield. -A:AB$ ChangeZone | Cost$ 5 W | ActivatingZone$ Hand | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with converted mana cost 1 or less in your graveyard | ValidTgts$ Creature.cmcLE1+YouCtrl | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | SpellDescription$ 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.) -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/proclamation_of_rebirth.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prodigal_pyromancer.txt b/res/cardsfolder/prodigal_pyromancer.txt deleted file mode 100644 index d46297b10f0..00000000000 --- a/res/cardsfolder/prodigal_pyromancer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Prodigal Pyromancer -ManaCost:2 R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122338.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/152.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/151.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/118.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prodigal_sorcerer.txt b/res/cardsfolder/prodigal_sorcerer.txt deleted file mode 100644 index 1b8fd8bd206..00000000000 --- a/res/cardsfolder/prodigal_sorcerer.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Prodigal Sorcerer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108906.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/74.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/74.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/94.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/94.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/29.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/88.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/75.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/112.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/profane_command.txt b/res/cardsfolder/profane_command.txt deleted file mode 100644 index a2dfeeef2de..00000000000 --- a/res/cardsfolder/profane_command.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Profane Command -ManaCost:X B B -Types:Sorcery -Text: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.) -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_command.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/profane_prayers.txt b/res/cardsfolder/profane_prayers.txt deleted file mode 100644 index db65fbd53c7..00000000000 --- a/res/cardsfolder/profane_prayers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Profane Prayers -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B B | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ 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. -SVar:X:Count$TypeOnBattlefield.Cleric -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/profane_prayers.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/162.jpg -End diff --git a/res/cardsfolder/progenitus.txt b/res/cardsfolder/progenitus.txt deleted file mode 100644 index 7fa80c2613c..00000000000 --- a/res/cardsfolder/progenitus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Progenitus -ManaCost:W W U U B B R R G G -Types:Legendary Creature Hydra Avatar -Text:no text -PT:10/10 -K:Protection from everything -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and shuffle it into its owner's library instead. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/progenitus.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/promise_of_power.txt b/res/cardsfolder/promise_of_power.txt deleted file mode 100644 index bd5ec7340ae..00000000000 --- a/res/cardsfolder/promise_of_power.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Promise of Power -ManaCost:2 B B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 B B B | NumCards$ 5 | SpellDescription$ Choose one - You draw five cards and you lose 5 life; | SubAbility$ SVar=DBLoseLife -A:SP$ Token | Cost$ 2 B B B | TokenAmount$ 1 | TokenName$ Demon | TokenTypes$ Creature,Demon | TokenOwner$ You | TokenColors$ Black | TokenKeywords$ Flying | TokenPower$ X | TokenToughness$ X | SpellDescription$ 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. -A:SP$ Draw | Cost$ 6 B B B | NumCards$ 5 | PrecostDesc$ Entwine | CostDesc$ 4 | SpellDescription$ (Choose both if you pay the entwine cost.) | SubAbility$ SVar=DBLoseLife2 -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 5 -SVar:DBLoseLife2:DB$LoseLife | LifeAmount$ 5 | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Demon | TokenTypes$ Creature,Demon | TokenOwner$ You | TokenColors$ Black | TokenKeywords$ Flying | TokenPower$ X | TokenToughness$ X -SVar:X:Count$NumCardsInYourHand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/promise_of_power.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/promised_kannushi.txt b/res/cardsfolder/promised_kannushi.txt deleted file mode 100644 index 3a8a526480e..00000000000 --- a/res/cardsfolder/promised_kannushi.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Promised Kannushi -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/1 -K:Soulshift:7 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/promised_kannushi.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/propaganda.txt b/res/cardsfolder/propaganda.txt deleted file mode 100644 index b029e95ea12..00000000000 --- a/res/cardsfolder/propaganda.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Propaganda -ManaCost:2 U -Types:Enchantment -Text:Creatures can't attack you unless their controller pays 2 for each creature he or she controls that's attacking you. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/propaganda.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/proper_burial.txt b/res/cardsfolder/proper_burial.txt deleted file mode 100644 index 59eb77ea843..00000000000 --- a/res/cardsfolder/proper_burial.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Proper Burial -ManaCost:3 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGain | TriggerDescription$ Whenever a creature you control is put into a graveyard from the battlefield, you gain life equal to that creature's toughness. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggeredCard$CardToughness -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/proper_burial.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prophetic_bolt.txt b/res/cardsfolder/prophetic_bolt.txt deleted file mode 100644 index 361c28bd809..00000000000 --- a/res/cardsfolder/prophetic_bolt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Prophetic Bolt -ManaCost:3 U R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 U R | Tgt$TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBDig | SpellDescription$ CARDNAME 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. -SVar:DBDig:DB$Dig | DigNum$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/prophetic_bolt.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prophetic_prism.txt b/res/cardsfolder/prophetic_prism.txt deleted file mode 100644 index 7b003ffb826..00000000000 --- a/res/cardsfolder/prophetic_prism.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Prophetic Prism -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/prophetic_prism.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prosperity.txt b/res/cardsfolder/prosperity.txt deleted file mode 100644 index 57b45a3e734..00000000000 --- a/res/cardsfolder/prosperity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Prosperity -ManaCost:X U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ X U | Defined$ Each | NumCards$ X | SpellDescription$ Each player draws X cards. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/prosperity.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/40.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/89.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/protective_bubble.txt b/res/cardsfolder/protective_bubble.txt deleted file mode 100644 index e80fdb17032..00000000000 --- a/res/cardsfolder/protective_bubble.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Protective Bubble -ManaCost:3 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN Unblockable & Shroud:Enchanted creature is unblockable and has shroud. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/protective_bubble.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/protomatter_powder.txt b/res/cardsfolder/protomatter_powder.txt deleted file mode 100644 index 5c2537eacaf..00000000000 --- a/res/cardsfolder/protomatter_powder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Protomatter Powder -ManaCost:2 U -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 4 W T Sac<1/CARDNAME> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target artifact card from your graveyard to the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/protomatter_powder.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prototype_portal.txt b/res/cardsfolder/prototype_portal.txt deleted file mode 100644 index d86c6fd2ca4..00000000000 --- a/res/cardsfolder/prototype_portal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Prototype Portal -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Imprint - When CARDNAME enters the battlefield, you may exile an artifact card from your hand. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Imprint$ True | Origin$ Hand | Destination$ Exile | ChangeType$ Artifact | ChangeNum$ 1 -A:AB$CopyPermanent | Cost$ X T | Defined$ Imprinted | SpellDescription$ Put a token that's a copy of the exiled card onto the battlefield. X is the converted mana cost of that card. -SVar:X:Imprinted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/prototype_portal.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/provoke.txt b/res/cardsfolder/provoke.txt deleted file mode 100644 index 836635fce3f..00000000000 --- a/res/cardsfolder/provoke.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Provoke -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | KW$ HIDDEN CARDNAME blocks each turn if able. | IsCurse$ True | SubAbility$ SVar=DBUntap | SpellDescription$ Untap target creature you don't control. That creature blocks this turn if able. Draw a card. -SVar:DBUntap:DB$Untap | Defined$ Targeted | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/provoke.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prowess_of_the_fair.txt b/res/cardsfolder/prowess_of_the_fair.txt deleted file mode 100644 index 8e06577e6ca..00000000000 --- a/res/cardsfolder/prowess_of_the_fair.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Prowess of the Fair -ManaCost:1 B -Types:Tribal Enchantment Elf -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Elf.nonToken+Other+YouOwn | TriggerZones$ Battlefield | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/prowess_of_the_fair.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/prowling_nightstalker.txt b/res/cardsfolder/prowling_nightstalker.txt deleted file mode 100644 index 6218e552a25..00000000000 --- a/res/cardsfolder/prowling_nightstalker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Prowling Nightstalker -ManaCost:3 B -Types:Creature Nightstalker -Text:CARDNAME can't be blocked except by black creatures. -PT:2/2 -K:CantBeBlockedBy Creature.nonBlack -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/prowling_nightstalker.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psionic_blast.txt b/res/cardsfolder/psionic_blast.txt deleted file mode 100644 index 942501709aa..00000000000 --- a/res/cardsfolder/psionic_blast.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Psionic Blast -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 U | Tgt$ TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 4 damage to target creature or player and 2 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108812.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/75.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/75.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/30.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psionic_entity.txt b/res/cardsfolder/psionic_entity.txt deleted file mode 100644 index e0badf8c6d6..00000000000 --- a/res/cardsfolder/psionic_entity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Psionic Entity -ManaCost:4 U -Types:Creature Illusion -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ T | Tgt$ CP | NumDmg$ 2 | SubAbility$ SVar=DB1 | SpellDescription$ CARDNAME deals 2 damage to target creature or player and 3 damage to itself. -SVar:DB1:DB$DealDamage | NumDmg$ 3 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/psionic_entity.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/95.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psionic_gift.txt b/res/cardsfolder/psionic_gift.txt deleted file mode 100644 index 870d06dc271..00000000000 --- a/res/cardsfolder/psionic_gift.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Psionic Gift -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psionic_gift.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psionic_sliver.txt b/res/cardsfolder/psionic_sliver.txt deleted file mode 100644 index 1c59e523d37..00000000000 --- a/res/cardsfolder/psionic_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Psionic Sliver -ManaCost:4 U -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=DamageOther & SVar=DBDamageSelf:no Condition:All Sliver creatues have "tap: This creature deals 2 damage to target creature or player and 3 damage to itself." -SVar:DamageOther:AB$DealDamage | Cost$ T | Tgt$ CP | NumDmg$ 2 | SubAbility$ SVar=DBDamageSelf | SpellDescription$ This creature deals 2 damage to target creature or player and 3 damage to itself. -SVar:DBDamageSelf:DB$DealDamage | NumDmg$ 3 | Defined$ Self -SVar:BuffedBy:Sliver -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/psionic_sliver.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychatog.txt b/res/cardsfolder/psychatog.txt deleted file mode 100644 index bc97a271119..00000000000 --- a/res/cardsfolder/psychatog.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Psychatog -ManaCost:1 U B -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ ExileFromGrave<2/card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychatog.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_barrier.txt b/res/cardsfolder/psychic_barrier.txt deleted file mode 100644 index 51e3745ac06..00000000000 --- a/res/cardsfolder/psychic_barrier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Psychic Barrier -ManaCost:U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ SVar=DBDrain | SpellDescription$ Counter target creature spell. Its controller loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_barrier.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_drain.txt b/res/cardsfolder/psychic_drain.txt deleted file mode 100644 index b443bdaa513..00000000000 --- a/res/cardsfolder/psychic_drain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Psychic Drain -ManaCost:X U B -Types:Sorcery -Text:no text -A:SP$ Mill | Cost$ X U B | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | SubAbility$ SVar=DBYouGainLife | SpellDescription$ Target player puts the top X cards of his or her library into his or her graveyard and you gain X life. -SVar:DBYouGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_drain.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_membrane.txt b/res/cardsfolder/psychic_membrane.txt deleted file mode 100644 index 8e055cf5dee..00000000000 --- a/res/cardsfolder/psychic_membrane.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Psychic Membrane -ManaCost:2 U -Types:Creature Wall -Text:no text -PT:0/3 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME blocks, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_membrane.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_purge.txt b/res/cardsfolder/psychic_purge.txt deleted file mode 100644 index 90c71132fc2..00000000000 --- a/res/cardsfolder/psychic_purge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Psychic Purge -ManaCost:U -Types:Sorcery -Text:When a spell or ability an opponent controls causes you to discard Psychic Purge, that player loses 5 life.\r\n -A:SP$ DealDamage | Cost$ U | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_purge.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_spear.txt b/res/cardsfolder/psychic_spear.txt deleted file mode 100644 index 4e0392c3a71..00000000000 --- a/res/cardsfolder/psychic_spear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Psychic Spear -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | NumCards$ 1 | DiscardValid$ Creature.Spirit,Instant.Arcane,Sorcery.Arcane | Mode$ RevealYouChoose | SpellDescription$ Target player reveals his or her hand. You choose a Spirit or Arcane card from it. That player discards that card. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_spear.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_surgery.txt b/res/cardsfolder/psychic_surgery.txt deleted file mode 100644 index 2b637b2342f..00000000000 --- a/res/cardsfolder/psychic_surgery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Psychic Surgery -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ Shuffled | ValidPlayer$ Opponent | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDig | TriggerDescription$ 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | Defined$ TriggeredPlayer | DigNum$ 2 | ChangeNum$ 1 | Optional$ True | DestinationZone$ Exile | LibraryPosition2$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_surgery.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychic_venom.txt b/res/cardsfolder/psychic_venom.txt deleted file mode 100644 index 41415342a85..00000000000 --- a/res/cardsfolder/psychic_venom.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Psychic Venom -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant Land Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted land becomes tapped, CARDNAME deals 2 damage to that land's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_venom.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/76.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/76.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/113.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/96.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/91.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/76.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychosis_crawler.txt b/res/cardsfolder/psychosis_crawler.txt deleted file mode 100644 index eaae0ef1035..00000000000 --- a/res/cardsfolder/psychosis_crawler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Psychosis Crawler -ManaCost:5 -Types:Artifact Creature Horror -Text:no text -PT:*/* -K:stSetPT:Count$InYourHand:Count$InYourHand:CARDNAME's power and toughness are each equal to the number of cards in your hand. -T:Mode$ Drawn | ValidCard$ Card.YouOwn | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever you draw a card, each opponent loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychosis_crawler.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychotic_fury.txt b/res/cardsfolder/psychotic_fury.txt deleted file mode 100644 index 506acb22bb4..00000000000 --- a/res/cardsfolder/psychotic_fury.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Psychotic Fury -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature.MultiColor | TgtPrompt$ Select target multicolored creature | KW$ Double Strike | SubAbility$ SVar=DBDraw | SpellDescription$ Target multicolored creature gains double strike until end of turn. -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychotic_fury.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychotic_haze.txt b/res/cardsfolder/psychotic_haze.txt deleted file mode 100644 index ef07989a6ac..00000000000 --- a/res/cardsfolder/psychotic_haze.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Psychotic Haze -ManaCost:2 B B -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 2 B B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -K:Madness:1 B -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychotic_haze.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/psychotrope_thallid.txt b/res/cardsfolder/psychotrope_thallid.txt deleted file mode 100644 index c21e14ecb75..00000000000 --- a/res/cardsfolder/psychotrope_thallid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Psychotrope Thallid -ManaCost:2 G -Types:Creature Fungus -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Draw | Cost$ 1 Sac<1/Saproling> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychotrope_thallid.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pteron_ghost.txt b/res/cardsfolder/pteron_ghost.txt deleted file mode 100644 index 17c543d9dd9..00000000000 --- a/res/cardsfolder/pteron_ghost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pteron Ghost -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:1/1 -K:Flying -A:AB$ Regenerate | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Regenerate target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pteron_ghost.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/puffer_extract.txt b/res/cardsfolder/puffer_extract.txt deleted file mode 100755 index 55078daba73..00000000000 --- a/res/cardsfolder/puffer_extract.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Puffer Extract -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ X T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | KW$ At the beginning of the end step, destroy CARDNAME. | SpellDescription$ Target creature you control gets +X/+X until end of turn. Destroy it at the beginning of the next end step. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/puffer_extract.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pull_under.txt b/res/cardsfolder/pull_under.txt deleted file mode 100644 index 502c0b439cb..00000000000 --- a/res/cardsfolder/pull_under.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Pull Under -ManaCost:5 B -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ 5 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -5 | NumDef$ -5 | IsCurse$ True | SpellDescription$ Target creature gets -5/-5 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pull_under.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/137.jpg -End diff --git a/res/cardsfolder/pulling_teeth.txt b/res/cardsfolder/pulling_teeth.txt deleted file mode 100644 index c10b1bc3288..00000000000 --- a/res/cardsfolder/pulling_teeth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pulling Teeth -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Clash | Cost$ 1 B | ValidTgts$ Player | TgtPrompt$ Select target player | WinSubAbility$ DBDiscardTwo | OtherwiseSubAbility$ DBDiscardOne | SpellDescription$ Clash with an opponent. If you win, target player discards two cards. Otherwise, that player discards a card. -SVar:DBDiscardOne:DB$Discard | Cost$ 0 | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose -SVar:DBDiscardTwo:DB$Discard | Cost$ 0 | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pulling_teeth.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pulsating_illusion.txt b/res/cardsfolder/pulsating_illusion.txt deleted file mode 100644 index 455bd7f835c..00000000000 --- a/res/cardsfolder/pulsating_illusion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pulsating Illusion -ManaCost:4 U -Types:Creature Illusion -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ Discard<1/Card> | NumAtt$ +4 | NumDef$ +4 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +4/+4 until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pulsating_illusion.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pulse_of_the_tangle.txt b/res/cardsfolder/pulse_of_the_tangle.txt deleted file mode 100644 index 40c873ab2e1..00000000000 --- a/res/cardsfolder/pulse_of_the_tangle.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Pulse of the Tangle -ManaCost:1 G G -Types:Sorcery -Text:Put a 3/3 green Beast creature token onto the battlefield. Then if an opponent controls more creatures than you, return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card39690.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pulse_tracker.txt b/res/cardsfolder/pulse_tracker.txt deleted file mode 100644 index 95b935c42a6..00000000000 --- a/res/cardsfolder/pulse_tracker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pulse Tracker -ManaCost:B -Types:Creature Vampire Rogue -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME attacks, each opponent loses 1 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pulse_tracker.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pulsemage_advocate.txt b/res/cardsfolder/pulsemage_advocate.txt deleted file mode 100644 index 5297167aec9..00000000000 --- a/res/cardsfolder/pulsemage_advocate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pulsemage Advocate -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:1/3 -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.YouDontCtrl | TargetMin$ 3 | TargetMax$ 3 | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBReturn | SpellDescription$ Return three target cards from an opponent's graveyard to his or her hand. Return target creature card from your graveyard to the battlefield. -SVar:DBReturn:DB$ChangeZone | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | Origin$ Graveyard | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pulsemage_advocate.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pulverize.txt b/res/cardsfolder/pulverize.txt deleted file mode 100644 index 043ed9f33b3..00000000000 --- a/res/cardsfolder/pulverize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pulverize -ManaCost:4 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 R R | ValidCards$ Artifact | SpellDescription$ Destroy all artifacts. -SVar:AltCost:Sac<2/Mountain>$You may sacrifice two Mountains rather than pay Pulverize's mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pulverize.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/207.jpg -End diff --git a/res/cardsfolder/puncture_blast.txt b/res/cardsfolder/puncture_blast.txt deleted file mode 100644 index 3c6a72f30f4..00000000000 --- a/res/cardsfolder/puncture_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Puncture Blast -ManaCost:2 R -Types:Instant -Text:no text -K:Wither -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 3 | SpellDescription$ Puncture Blast deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/puncture_blast.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/puncture_bolt.txt b/res/cardsfolder/puncture_bolt.txt deleted file mode 100644 index 24eaf91295a..00000000000 --- a/res/cardsfolder/puncture_bolt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Puncture Bolt -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DB1 | SpellDescription$ CARDNAME deals 1 damage to target creature. Put a -1/-1 counter on that creature. -SVar:DB1:DB$PutCounter | Defined$ Targeted | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/puncture_bolt.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/puncturing_light.txt b/res/cardsfolder/puncturing_light.txt deleted file mode 100644 index c9f230cc10a..00000000000 --- a/res/cardsfolder/puncturing_light.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Puncturing Light -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Creature.powerLE3+attacking,Creature.powerLE3+blocking | TgtPrompt$ Select target attacking or blocking creature with power 3 or less | SpellDescription$ Destroy target attacking or blocking creature with power 3 or less. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/puncturing_light.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/41.jpg -End diff --git a/res/cardsfolder/punish_ignorance.txt b/res/cardsfolder/punish_ignorance.txt deleted file mode 100644 index 78e98b7eece..00000000000 --- a/res/cardsfolder/punish_ignorance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Punish Ignorance -ManaCost:W U U B -Types:Instant -Text:no text -A:SP$ Counter | Cost$ W U U B | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDrain | SpellDescription$ Counter target spell. Its controller loses 3 life and you gain 3 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 3 | SubAbility$ SVar=DBGain -SVar:DBGain:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/punish_ignorance.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/punishing_fire.txt b/res/cardsfolder/punishing_fire.txt deleted file mode 100644 index 91d59102caa..00000000000 --- a/res/cardsfolder/punishing_fire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Punishing Fire -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -T:Mode$ LifeGained | ValidPlayer$ Opponent | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever an opponent gains life, you may pay R. If you do, return CARDNAME from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ R | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/punishing_fire.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/puppet_conjurer.txt b/res/cardsfolder/puppet_conjurer.txt deleted file mode 100644 index 80d75612bf6..00000000000 --- a/res/cardsfolder/puppet_conjurer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Puppet Conjurer -ManaCost:1 B -Types:Artifact Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ Token | Cost$ U T | TokenAmount$ 1 | TokenName$ Homunculus | TokenTypes$ Artifact,Creature,Homunculus | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 0 | TokenToughness$ 1 | SpellDescription$ Put a 0/1 blue Homunculus artifact creature token onto the battlefield. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, sacrifice a Homunculus. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Homunculus -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/puppet_conjurer.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/puppet_strings.txt b/res/cardsfolder/puppet_strings.txt deleted file mode 100644 index 093c8d6ce37..00000000000 --- a/res/cardsfolder/puppet_strings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Puppet Strings -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ TapOrUntap | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/puppet_strings.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/294.jpg -End diff --git a/res/cardsfolder/puppeteer.txt b/res/cardsfolder/puppeteer.txt deleted file mode 100644 index 666487cc4ae..00000000000 --- a/res/cardsfolder/puppeteer.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Puppeteer -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ TapOrUntap | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/puppeteer.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/94.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/97.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/91.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/98.jpg -End diff --git a/res/cardsfolder/puppeteer_clique.txt b/res/cardsfolder/puppeteer_clique.txt deleted file mode 100644 index 3c6f8b0ea9e..00000000000 --- a/res/cardsfolder/puppeteer_clique.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Puppeteer Clique -ManaCost:3 B B -Types:Creature Faerie Wizard -Text:no text -PT:3/2 -K:Flying -K:Persist -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME 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. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature from an opponent's graveyard | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | KW$ Haste & HIDDEN At the beginning of the end step, exile CARDNAME. | Defined$ Targeted -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/puppeteer_clique.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/purge.txt b/res/cardsfolder/purge.txt deleted file mode 100644 index e12c6f69ac8..00000000000 --- a/res/cardsfolder/purge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Purge -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Creature.Artifact,Creature.Black | TgtPrompt$ Select target artifact creature or black creature | NoRegen$ True | SpellDescription$ Destroy target artifact creature or black creature. It can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/purge.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/12.jpg -End diff --git a/res/cardsfolder/purify.txt b/res/cardsfolder/purify.txt deleted file mode 100644 index c749767b78c..00000000000 --- a/res/cardsfolder/purify.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Purify -ManaCost:3 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 W W | ValidCards$ Artifact,Enchantment | SpellDescription$ Destroy all artifacts and enchantments. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/purify.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/19.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/31.jpg -End diff --git a/res/cardsfolder/purity.txt b/res/cardsfolder/purity.txt deleted file mode 100644 index 5500c88e8fd..00000000000 --- a/res/cardsfolder/purity.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Purity -ManaCost:3 W W W -Types:Creature Elemental Incarnation -Text:If noncombat damage would be dealt to you, prevent that damage. You gain life equal to the damage prevented this way. -PT:6/6 -K:Flying -K:When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/purity.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/purraj_of_urborg.txt b/res/cardsfolder/purraj_of_urborg.txt deleted file mode 100644 index 03916cb7c9b..00000000000 --- a/res/cardsfolder/purraj_of_urborg.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Purraj of Urborg -ManaCost:3 B B -Types:Legendary Creature Cat Warrior -Text:no text -PT:2/3 -K:stPumpSelf:Creature.attacking:0/0/First Strike:No Condition:Purraj of Urborg has first strike as long as it's attacking. -T:Mode$SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a player casts a black spell, you may pay B. If you do, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ B | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/purraj_of_urborg.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pus_kami.txt b/res/cardsfolder/pus_kami.txt deleted file mode 100644 index cf76bd7f5a5..00000000000 --- a/res/cardsfolder/pus_kami.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pus Kami -ManaCost:6 B -Types:Creature Spirit -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -K:Soulshift:6 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pus_kami.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/put_away.txt b/res/cardsfolder/put_away.txt deleted file mode 100644 index c03d35179f4..00000000000 --- a/res/cardsfolder/put_away.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Put Away -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBChangeZone | SpellDescription$ Counter target spell. You may shuffle up to one target card from your graveyard into your library. -SVar:DBChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Library | ValidTgts$ Card.YouCtrl | TgtPrompt$ Select target card from your graveyard | TargetMin$ 0 | TargetMax$ 1 | Shuffle$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/put_away.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/putrefaction.txt b/res/cardsfolder/putrefaction.txt deleted file mode 100755 index 25a3cf86abe..00000000000 --- a/res/cardsfolder/putrefaction.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Putrefaction -ManaCost:4 B -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green,Card.White | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a green or white spell, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrefaction.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/putrefax.txt b/res/cardsfolder/putrefax.txt deleted file mode 100644 index 0f5d482464e..00000000000 --- a/res/cardsfolder/putrefax.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Putrefax -ManaCost:3 G G -Types:Creature Horror -Text:no text -PT:5/3 -K:Trample -K:Haste -K:Infect -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrefax.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/putrefy.txt b/res/cardsfolder/putrefy.txt deleted file mode 100644 index 318faf7ca1e..00000000000 --- a/res/cardsfolder/putrefy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Putrefy -ManaCost:1 B G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B G | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | NoRegen$ True | SpellDescription$ Destroy target artifact or creature. It can't be regenerated. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrefy.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/221.jpg -End diff --git a/res/cardsfolder/putrid_imp.txt b/res/cardsfolder/putrid_imp.txt deleted file mode 100644 index 0c463017263..00000000000 --- a/res/cardsfolder/putrid_imp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Putrid Imp -ManaCost:B -Types:Creature Zombie Imp -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -K:stPumpSelf:Creature:1/1/HIDDEN CARDNAME can't block.:Threshold:Threshold - As long as seven or more cards are in your graveyard, CARDNAME gets +1/+1 and can't block. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_imp.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/putrid_leech.txt b/res/cardsfolder/putrid_leech.txt deleted file mode 100644 index 1f77aeed074..00000000000 --- a/res/cardsfolder/putrid_leech.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Putrid Leech -ManaCost:B G -Types:Creature Zombie Leech -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ PayLife<2> | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ Putrid Leech gets +2/+2 until end of turn. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_leech.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/putrid_raptor.txt b/res/cardsfolder/putrid_raptor.txt deleted file mode 100644 index cb8797ee102..00000000000 --- a/res/cardsfolder/putrid_raptor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Putrid Raptor -ManaCost:4 B B -Types:Creature Zombie Lizard Beast -Text:no text -PT:4/4 -K:Morph:Discard<1/Zombie> -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/putrid_raptor.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pygmy_allosaurus.txt b/res/cardsfolder/pygmy_allosaurus.txt deleted file mode 100644 index 4902ee4c2ce..00000000000 --- a/res/cardsfolder/pygmy_allosaurus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pygmy Allosaurus -ManaCost:2 G -Types:Creature Lizard -Text:no text -PT:2/2 -K:Swampwalk -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2581.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pygmy_kavu.txt b/res/cardsfolder/pygmy_kavu.txt deleted file mode 100644 index bc3ed09260d..00000000000 --- a/res/cardsfolder/pygmy_kavu.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pygmy Kavu -ManaCost:3 G -Types:Creature Kavu -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card for each black creature your opponents control. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:Count$BlackTypeOppCtrl.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pygmy_kavu.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pygmy_pyrosaur.txt b/res/cardsfolder/pygmy_pyrosaur.txt deleted file mode 100644 index 4ec425df37d..00000000000 --- a/res/cardsfolder/pygmy_pyrosaur.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pygmy Pyrosaur -ManaCost:1 R -Types:Creature Lizard -Text:no text -PT:1/1 -K:CARDNAME can't block. -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pygmy_pyrosaur.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/87.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/208.jpg -End diff --git a/res/cardsfolder/pygmy_razorback.txt b/res/cardsfolder/pygmy_razorback.txt deleted file mode 100644 index a717aa2f117..00000000000 --- a/res/cardsfolder/pygmy_razorback.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pygmy Razorback -ManaCost:1 G -Types:Creature Boar -Text:no text -PT:2/1 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24663.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pygmy_troll.txt b/res/cardsfolder/pygmy_troll.txt deleted file mode 100644 index afb2cd0f622..00000000000 --- a/res/cardsfolder/pygmy_troll.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Pygmy Troll -ManaCost:1 G -Types:Creature Troll -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME get +1/+1 until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pygmy_troll.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/118.jpg -End diff --git a/res/cardsfolder/pyknite.txt b/res/cardsfolder/pyknite.txt deleted file mode 100644 index 6ed9cf85d09..00000000000 --- a/res/cardsfolder/pyknite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyknite -ManaCost:2 G -Types:Creature Ouphe -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyknite.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyre_charger.txt b/res/cardsfolder/pyre_charger.txt deleted file mode 100644 index 32dcf164122..00000000000 --- a/res/cardsfolder/pyre_charger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyre Charger -ManaCost:R R -Types:Creature Elemental Warrior -Text:no text -PT:1/1 -K:Haste -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyre_charger.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/103.jpg -End diff --git a/res/cardsfolder/pyre_zombie.txt b/res/cardsfolder/pyre_zombie.txt deleted file mode 100644 index 5d9f5f00187..00000000000 --- a/res/cardsfolder/pyre_zombie.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Pyre Zombie -ManaCost:1 B R -Types:Creature Zombie -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ 1 R R Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -#The IsPresent stuff in the trigger is necessary because it must be checked on resolve as well. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.Self | PresentZone$ Graveyard | PresentPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay 1 B B. If you do, return CARDNAME to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 1 B B | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyre_zombie.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyretic_ritual.txt b/res/cardsfolder/pyretic_ritual.txt deleted file mode 100644 index 335bd3b5faa..00000000000 --- a/res/cardsfolder/pyretic_ritual.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pyretic Ritual -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Mana | Cost$ 1 R | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyretic_ritual.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyric_salamander.txt b/res/cardsfolder/pyric_salamander.txt deleted file mode 100644 index ceb628b9df5..00000000000 --- a/res/cardsfolder/pyric_salamander.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyric Salamander -ManaCost:1 R -Types:Creature Salamander -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ +1 | KW$ At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Sacrifice CARDNAME at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyric_salamander.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/187.jpg -End diff --git a/res/cardsfolder/pyrite_spellbomb.txt b/res/cardsfolder/pyrite_spellbomb.txt deleted file mode 100644 index 9a3c1a1bb7e..00000000000 --- a/res/cardsfolder/pyrite_spellbomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pyrite Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrite_spellbomb.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyroclasm.txt b/res/cardsfolder/pyroclasm.txt deleted file mode 100644 index c553501806e..00000000000 --- a/res/cardsfolder/pyroclasm.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Pyroclasm -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 2 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 2 damage to each creature. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83216.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/210.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/209.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/148.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/208.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/214.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/222.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/154.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyroclast_consul.txt b/res/cardsfolder/pyroclast_consul.txt deleted file mode 100644 index 2b80a657ec2..00000000000 --- a/res/cardsfolder/pyroclast_consul.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pyroclast Consul -ManaCost:3 R R -Types:Creature Elemental Shaman -Text: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. -PT:3/3 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyroclast_consul.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyrohemia.txt b/res/cardsfolder/pyrohemia.txt deleted file mode 100644 index 407f81d4c29..00000000000 --- a/res/cardsfolder/pyrohemia.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyrohemia -ManaCost:2 R R -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if no creatures are on the battlefield, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -A:AB$ DamageAll | Cost$ R | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122436.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyrokinesis.txt b/res/cardsfolder/pyrokinesis.txt deleted file mode 100644 index 02298ee458b..00000000000 --- a/res/cardsfolder/pyrokinesis.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Pyrokinesis -ManaCost:4 R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 4 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ 4 R R - CARDNAME deals 4 damage divided as you choose among any number of target creatures. -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature (3) | NumDmg$ 1 | SubAbility$ SVar=DBDamage4 -SVar:DBDamage4:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature (4) | NumDmg$ 1 -SVar:AltCost:ExileFromHand<1/Card.Red>$You may exile a red card from your hand rather than pay CARDNAME 's mana cost. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrokinesis.jpg -SVar:Rarity:Uncommon -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyromancy.txt b/res/cardsfolder/pyromancy.txt deleted file mode 100644 index 2ddb3e29d25..00000000000 --- a/res/cardsfolder/pyromancy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyromancy -ManaCost:2 R R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 3 Discard<1/Random> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature or player equal to the converted mana cost of the discarded card. -SVar:X:Discarded$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromancy.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyromania.txt b/res/cardsfolder/pyromania.txt deleted file mode 100644 index 67e8dfdc198..00000000000 --- a/res/cardsfolder/pyromania.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyromania -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 1 R Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -A:AB$ DealDamage | Cost$ 1 R Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromania.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyromatics.txt b/res/cardsfolder/pyromatics.txt deleted file mode 100644 index f0870e9a287..00000000000 --- a/res/cardsfolder/pyromatics.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Pyromatics -ManaCost:1 R -Types:Instant -Text:no text -K:Replicate 1 R -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyromatics.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyrostatic_pillar.txt b/res/cardsfolder/pyrostatic_pillar.txt deleted file mode 100644 index d901b28e094..00000000000 --- a/res/cardsfolder/pyrostatic_pillar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Pyrostatic Pillar -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.cmcLE3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player casts a spell with converted mana cost 3 or less, CARDNAME deals 2 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrostatic_pillar.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/pyrotechnics.txt b/res/cardsfolder/pyrotechnics.txt deleted file mode 100644 index 992a3fc365c..00000000000 --- a/res/cardsfolder/pyrotechnics.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Pyrotechnics -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 | SpellDescription$ CARDNAME deals 4 damage divided as you choose among any number of target creatures and/or players. -SVar:DBDamage2:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (3) | NumDmg$ 1 | SubAbility$ SVar=DBDamage4 -SVar:DBDamage4:DB$DealDamage | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player (4) | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/pyrotechnics.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/211.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/210.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/199.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/263.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/235.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/python.txt b/res/cardsfolder/python.txt deleted file mode 100644 index 52483938c5f..00000000000 --- a/res/cardsfolder/python.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Python -ManaCost:1 B B -Types:Creature Snake -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card15392.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/18.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/150.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/qasali_pridemage.txt b/res/cardsfolder/qasali_pridemage.txt deleted file mode 100644 index 68597d56fd1..00000000000 --- a/res/cardsfolder/qasali_pridemage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Qasali Pridemage -ManaCost:G W -Types:Creature Cat Wizard -Text:no text -PT:2/2 -K:Exalted -A:AB$ Destroy | Cost$ 1 Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/qasali_pridemage.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/75.jpg -End diff --git a/res/cardsfolder/quag_sickness.txt b/res/cardsfolder/quag_sickness.txt deleted file mode 100644 index deba1a7aad1..00000000000 --- a/res/cardsfolder/quag_sickness.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Quag Sickness -ManaCost:2 B -Types:Enchantment Aura -Text:Enchanted creature gets -1/-1 for each Swamp you control. -K:Enchant creature -K:enPumpCurse:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$Valid Swamp.YouCtrl/Negative -SVar:BuffedBy:Swamp -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quag_sickness.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quag_vampires.txt b/res/cardsfolder/quag_vampires.txt deleted file mode 100644 index feb716961c4..00000000000 --- a/res/cardsfolder/quag_vampires.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quag Vampires -ManaCost:B -Types:Creature Vampire Rogue -Text:Quag Vampires enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:1/1 -K:Swampwalk -K:Multikicker 1 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quag_vampires.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quagmire.txt b/res/cardsfolder/quagmire.txt deleted file mode 100644 index 3fd9029bfbc..00000000000 --- a/res/cardsfolder/quagmire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quagmire -ManaCost:2 B -Types:Enchantment -Text:Creatures with swampwalk can be blocked as though they didn't have swampwalk. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quagmire_druid.txt b/res/cardsfolder/quagmire_druid.txt deleted file mode 100644 index bb50c0bdfb3..00000000000 --- a/res/cardsfolder/quagmire_druid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quagmire Druid -ManaCost:2 B -Types:Creature Zombie Druid -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ G T Sac<1/Creature> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire_druid.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/51.jpg -End diff --git a/res/cardsfolder/quagmire_lamprey.txt b/res/cardsfolder/quagmire_lamprey.txt deleted file mode 100644 index b8ba97fe864..00000000000 --- a/res/cardsfolder/quagmire_lamprey.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quagmire Lamprey -ManaCost:2 B -Types:Creature Fish -Text:no text -PT:1/1 -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, put a -1/-1 counter on that creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredBlocker | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quagmire_lamprey.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quagnoth.txt b/res/cardsfolder/quagnoth.txt deleted file mode 100644 index 434fcd7c383..00000000000 --- a/res/cardsfolder/quagnoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Quagnoth -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:4/5 -K:If a spell or ability an opponent controls causes you to discard CARDNAME, return it to your hand. -K:Split second -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quagnoth.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_ancient_secrets.txt b/res/cardsfolder/quest_for_ancient_secrets.txt deleted file mode 100644 index 38b8d36ef81..00000000000 --- a/res/cardsfolder/quest_for_ancient_secrets.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Quest for Ancient Secrets -ManaCost:U -Types:Enchantment -Text:no text -A:AB$ ChangeZoneAll | Cost$ SubCounter<5/QUEST> Sac<1/CARDNAME> | TgtPrompt$ Select target player. | ValidTgts$ Player | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | SpellDescription$ Target player shuffles his or her graveyard into his or her library. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Permanent.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into your graveyard from anywhere, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_ancient_secrets.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_renewal.txt b/res/cardsfolder/quest_for_renewal.txt deleted file mode 100644 index c40e6786039..00000000000 --- a/res/cardsfolder/quest_for_renewal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quest for Renewal -ManaCost:1 G -Types:Enchantment -Text:no text -T:Mode$ Taps | ValidCard$ Creature.YouCtrl | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control becomes tapped, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN CARDNAME untaps during each other player's untap step.:isPresent Card.Self+countersGE4QUEST:As long as there are four or more quest counters on CARDNAME, untap all creatures you control during each other player's untap step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_renewal.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_the_gemblades.txt b/res/cardsfolder/quest_for_the_gemblades.txt deleted file mode 100644 index ef0ca0dd565..00000000000 --- a/res/cardsfolder/quest_for_the_gemblades.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quest for the Gemblades -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ SubCounter<1/QUEST> Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 4 | SpellDescription$ Put four +1/+1 counters on target creature. -T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl | ValidTarget$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | CombatDamage$ True | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control deals combat damage to a creature, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Quest_for_the_Gemblades.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_the_goblin_lord.txt b/res/cardsfolder/quest_for_the_goblin_lord.txt deleted file mode 100644 index 0765256e9ec..00000000000 --- a/res/cardsfolder/quest_for_the_goblin_lord.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Quest for the Goblin Lord -ManaCost:R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Goblin.YouCtrl | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Goblin enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -K:stPumpAll:Creature.YouCtrl:2/0:isPresent Card.Self+countersGE5QUEST:As long as CARDNAME has five or more quest counters on it, creatures you control get +2/+0. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_the_goblin_lord.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_the_gravelord.txt b/res/cardsfolder/quest_for_the_gravelord.txt deleted file mode 100644 index edc120f0cb2..00000000000 --- a/res/cardsfolder/quest_for_the_gravelord.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quest for the Gravelord -ManaCost:B -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | TokenAmount$ 1 | TokenImage$ B 5 5 Zombie Giant | TokenName$ Zombie Giant | TokenColors$ Black | TokenTypes$ Creature,Zombie,Giant | TokenPower$ 5 | TokenToughness$ 5 | TokenOwner$ You | TokenAmount$ 1 | SpellDescription$ Put a 5/5 black Zombie Giant creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Quest_for_the_Gravelord.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quest_for_the_nihil_stone.txt b/res/cardsfolder/quest_for_the_nihil_stone.txt deleted file mode 100644 index 7b93d859f7c..00000000000 --- a/res/cardsfolder/quest_for_the_nihil_stone.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Quest for the Nihil Stone -ManaCost:B -Types:Enchantment -Text:no text -T:Mode$ Discarded | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent discards a card, you may put a quest counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card | PresentZone$ Hand | PresentPlayer$ Opponent | PresentCompare$ EQ0 | IsPresent2$ Card.Self+countersGE2QUEST | Execute$ TrigLoseLife | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of each opponent's upkeep, if that player has no cards in hand and CARDNAME has two or more quest counters on it, you may have that player lose 5 life. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 5 -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quest_for_the_nihil_stone.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/questing_phelddagrif.txt b/res/cardsfolder/questing_phelddagrif.txt deleted file mode 100644 index eacb7bf8cde..00000000000 --- a/res/cardsfolder/questing_phelddagrif.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Questing Phelddagrif -ManaCost:1 G W U -Types:Creature Phelddagrif -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ G | NumAtt$ +1 | NumDef$ +1 | SubAbility$ SVar=DBToken | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Target opponent puts a 1/1 green Hippo creature token onto the battlefield. -A:AB$ Pump | Cost$ W | KW$ Protection from black, Protection from red | SubAbility$ SVar=DBGain | SpellDescription$ CARDNAME gains protection from black and from red until end of turn. Target opponent gains 2 life. -A:AB$ Pump | Cost$ U | KW$ Flying | SubAbility$ SVar=DBDraw | SpellDescription$ CARDNAME gains flying until end of turn. Target opponent may draw a card. -SVar:DBToken:DB$Token | ValidTgts$ Opponent | TokenAmount$ 1 | TokenName$ Hippo | TokenTypes$ Creature,Hippo | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:DBGain:DB$GainLife | LifeAmount$ 2 | ValidTgts$ Opponent -SVar:DBDraw:DB$Draw | NumCards$ 1 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | OptionalDecider$ Opponent -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/questing_phelddagrif.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quick_sliver.txt b/res/cardsfolder/quick_sliver.txt deleted file mode 100644 index 55ed298fc85..00000000000 --- a/res/cardsfolder/quick_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Quick Sliver -ManaCost:1 G -Types:Creature Sliver -Text:no text -PT:1/1 -K:Flash -K:stPumpAll:Sliver:0/0/HIDDEN Flash:No Condition:Any player may play Sliver cards as though they had flash. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quick_sliver.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksand.txt b/res/cardsfolder/quicksand.txt deleted file mode 100644 index e7f9acb267c..00000000000 --- a/res/cardsfolder/quicksand.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Quicksand -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | NumAtt$ -1 | NumDef$ -2 | IsCurse$ True | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | SpellDescription$ Target attacking creature without flying gets -1/-2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksand.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/166.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/323.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/140.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/356.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_amulet.txt b/res/cardsfolder/quicksilver_amulet.txt deleted file mode 100644 index 8eb8d648f6b..00000000000 --- a/res/cardsfolder/quicksilver_amulet.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quicksilver Amulet -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 4 T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ You may put a creature card from your hand onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_amulet.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_behemoth.txt b/res/cardsfolder/quicksilver_behemoth.txt deleted file mode 100644 index 5d89e740bfb..00000000000 --- a/res/cardsfolder/quicksilver_behemoth.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Quicksilver Behemoth -ManaCost:6 U -Types:Creature Beast -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:4/5 -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelayedTrig | TriggerDescription$ When CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelayedTrig | Secondary$ True | TriggerDescription$ When CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigReturn | TriggerDescription$ Return CARDNAME to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_behemoth.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_dagger.txt b/res/cardsfolder/quicksilver_dagger.txt deleted file mode 100644 index 772496350ff..00000000000 --- a/res/cardsfolder/quicksilver_dagger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Quicksilver Dagger -ManaCost:1 U R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Damage:No Condition:Enchanted creature has "tap: This creature deals 1 damage to target player. You draw a card." -SVar:Damage:AB$DealDamage | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select a player | NumDmg$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ CARDNAME deals 1 damage to target player. -SVar:DBDraw:DB$Draw | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_dagger.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_gargantuan.txt b/res/cardsfolder/quicksilver_gargantuan.txt deleted file mode 100644 index ae50a1b0ea1..00000000000 --- a/res/cardsfolder/quicksilver_gargantuan.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quicksilver Gargantuan -ManaCost:5 U U -Types:Creature Shapeshifter -Text:You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield. It's still 7/7. -PT:7/7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_gargantuan.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_geyser.txt b/res/cardsfolder/quicksilver_geyser.txt deleted file mode 100644 index 4d8add4cf4c..00000000000 --- a/res/cardsfolder/quicksilver_geyser.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quicksilver Geyser -ManaCost:4 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 4 U | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target nonland permanent | ValidTgts$ Permanent.nonLand | TargetMin$ 0 | TargetMax$ 2 | SpellDescription$ Return up to two target nonland permanents to their owner's hands. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_geyser.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quicksilver_wall.txt b/res/cardsfolder/quicksilver_wall.txt deleted file mode 100644 index 8c7eae458be..00000000000 --- a/res/cardsfolder/quicksilver_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Quicksilver Wall -ManaCost:2 U -Types:Creature Wall -Text:no text -PT:1/6 -A:AB$ ChangeZone | Cost$ 4 | Origin$ Battlefield | Destination$ Hand | AnyPlayer$ True | SpellDescription$ Return CARDNAME to its owner's hand. Any player may activate this ability. -K:Defender -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksilver_wall.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quiet_purity.txt b/res/cardsfolder/quiet_purity.txt deleted file mode 100644 index 8a4a8fd46ad..00000000000 --- a/res/cardsfolder/quiet_purity.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quiet Purity -ManaCost:W -Types:Instant Arcane -Text:no text -A:SP$ Destroy | Cost$ W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quiet_purity.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/39.jpg -End diff --git a/res/cardsfolder/quietus_spike.txt b/res/cardsfolder/quietus_spike.txt deleted file mode 100644 index e90cbdd6bac..00000000000 --- a/res/cardsfolder/quietus_spike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quietus Spike -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature has deathtouch. Whenever equipped creature deals combat damage to a player, that player loses half his or her life, rounded up. -K:eqPump 3:Deathtouch -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quietus_spike.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quill_slinger_boggart.txt b/res/cardsfolder/quill_slinger_boggart.txt deleted file mode 100644 index 0fc8d029217..00000000000 --- a/res/cardsfolder/quill_slinger_boggart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quill-Slinger Boggart -ManaCost:3 B -Types:Creature Goblin Warrior -Text:no text -PT:3/2 -T:Mode$ SpellCast | ValidCard$ Card.Kithkin | TriggerZones$ Battlefield | Execute$ TrigLoseLife | OptionalDecider$ You | TriggerDescription$ Whenever a player casts a Kithkin spell, you may have target player lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quill_slinger_boggart.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quilled_slagwurm.txt b/res/cardsfolder/quilled_slagwurm.txt deleted file mode 100644 index 95f34695e6d..00000000000 --- a/res/cardsfolder/quilled_slagwurm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Quilled Slagwurm -ManaCost:4 G G G -Types:Creature Wurm -Text:no text -PT:8/8 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quilled_slagwurm.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quilled_sliver.txt b/res/cardsfolder/quilled_sliver.txt deleted file mode 100644 index d9564b855a9..00000000000 --- a/res/cardsfolder/quilled_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quilled Sliver -ManaCost:1 W -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=Damage:no Condition:All Slivers have "Tap: This permanent deals 1 damage to target attacking or blocking creature." -SVar:Damage:AB$DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Choose target attacking or blocking creature. | NumDmg$ 1 | SpellDescription$ This premanent deals 1 damage to target attacking or blocking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/quilled_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quirion_druid.txt b/res/cardsfolder/quirion_druid.txt deleted file mode 100644 index 8ce1f41d0f6..00000000000 --- a/res/cardsfolder/quirion_druid.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Quirion Druid -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -PT:1/2 -A:AB$ Animate | Cost$ G T | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Colors$ Green | Types$ Creature | Permanent$ True | SpellDescription$ Target land becomes a 2/2 green creature that's still a land. (This effect lasts indefinitely.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_druid.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quirion_dryad.txt b/res/cardsfolder/quirion_dryad.txt deleted file mode 100644 index eb9a17bb400..00000000000 --- a/res/cardsfolder/quirion_dryad.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Quirion Dryad -ManaCost:1 G -Types:Creature Dryad -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl,Card.Blue+YouCtrl,Card.Black+YouCtrl,Card.Red+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a white, blue, black, or red spell, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Card.White,Card.Blue,Card.Black,Card.Red -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_dryad.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/89.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quirion_explorer.txt b/res/cardsfolder/quirion_explorer.txt deleted file mode 100644 index b0d368a4288..00000000000 --- a/res/cardsfolder/quirion_explorer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quirion Explorer -ManaCost:1 G -Types:Creature Elf Druid Scout -Text:no text -PT:1/1 -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Land.YouDontCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color that a land an opponent controls could produce. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_explorer.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quirion_ranger.txt b/res/cardsfolder/quirion_ranger.txt deleted file mode 100644 index 5b8e65a38a5..00000000000 --- a/res/cardsfolder/quirion_ranger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quirion Ranger -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ Return<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_ranger.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/quirion_trailblazer.txt b/res/cardsfolder/quirion_trailblazer.txt deleted file mode 100644 index 9177b40b259..00000000000 --- a/res/cardsfolder/quirion_trailblazer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Quirion Trailblazer -ManaCost:3 G -Types:Creature Elf Scout -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_trailblazer.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/qumulox.txt b/res/cardsfolder/qumulox.txt deleted file mode 100644 index 13aba0e41d8..00000000000 --- a/res/cardsfolder/qumulox.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Qumulox -ManaCost:6 U U -Types:Creature Beast -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:5/4 -K:Flying -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/qumulox.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rabble_rouser.txt b/res/cardsfolder/rabble_rouser.txt deleted file mode 100644 index d80eda9a8fa..00000000000 --- a/res/cardsfolder/rabble_rouser.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rabble-Rouser -ManaCost:3 R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -K:Bloodthirst 1 -A:AB$ PumpAll | Cost$ R T | ValidCards$ Creature.attacking | NumAtt$ +X | SpellDescription$ Attacking creatures get +X/+0 until end of turn, where X is CARDNAME's power. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rabble_rouser.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rabid_elephant.txt b/res/cardsfolder/rabid_elephant.txt deleted file mode 100644 index 0a455a7ce70..00000000000 --- a/res/cardsfolder/rabid_elephant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rabid Elephant -ManaCost:4 G -Types:Creature Elephant -Text:no text -PT:3/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +X | NumDef$ +X -SVar:X:Count$NumBlockingMe/Times.2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rabid_elephant.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rabid_rats.txt b/res/cardsfolder/rabid_rats.txt deleted file mode 100644 index 3600b5773c6..00000000000 --- a/res/cardsfolder/rabid_rats.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rabid Rats -ManaCost:1 B -Types:Creature Rat -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.blocking | TgtPrompt$ Select target blocking creature | IsCurse$ True | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Target blocking creature gets -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rabid_rats.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rabid_wolverines.txt b/res/cardsfolder/rabid_wolverines.txt deleted file mode 100644 index 317bf628c3f..00000000000 --- a/res/cardsfolder/rabid_wolverines.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rabid Wolverines -ManaCost:3 G G -Types:Creature Wolverine -Text:no text -PT:4/4 -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME get +1/+1 until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rabid_wolverines.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rabid_wombat.txt b/res/cardsfolder/rabid_wombat.txt deleted file mode 100644 index a6b2408863e..00000000000 --- a/res/cardsfolder/rabid_wombat.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Rabid Wombat -ManaCost:2 G G -Types:Creature Wombat -Text:no text -PT:0/1 -K:Vigilance -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +2/+2 for each Aura attached to it. -SVar:X:Count$Valid Aura.Attached/Times.2 -SVar:EnchantMe:Multiple -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rabid_wombat.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/181.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rack_and_ruin.txt b/res/cardsfolder/rack_and_ruin.txt deleted file mode 100644 index c6eafc3beb9..00000000000 --- a/res/cardsfolder/rack_and_ruin.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rack and Ruin -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 R | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy two target artifacts. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rack_and_ruin.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rackling.txt b/res/cardsfolder/rackling.txt deleted file mode 100644 index e625f2c3fd5..00000000000 --- a/res/cardsfolder/rackling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rackling -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ LT3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each opponent's upkeep, CARDNAME deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/NMinus.3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rackling.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/radha_heir_to_keld.txt b/res/cardsfolder/radha_heir_to_keld.txt deleted file mode 100644 index cd37acc764b..00000000000 --- a/res/cardsfolder/radha_heir_to_keld.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Radha, Heir to Keld -ManaCost:R G -Types:Legendary Creature Elf Warrior -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigMana | TriggerDescription$ Whenever CARDNAME attacks, add R R to your mana pool. -SVar:TrigMana:AB$ Mana | Cost$ 0 | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/radha_heir_to_keld.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/radiant_archangel.txt b/res/cardsfolder/radiant_archangel.txt deleted file mode 100644 index f0739231a5d..00000000000 --- a/res/cardsfolder/radiant_archangel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Radiant, Archangel -ManaCost:3 W W -Types:Legendary Creature Angel -Text:no text -PT:3/3 -K:Flying -K:Vigilance -K:stPumpSelf:Creature:X/X:no Condition:Radiant, Archangel gets +1/+1 for each other creature with flying on the battlefield. -SVar:X:Count$Valid Creature.Other+withFlying -SVar:BuffedBy:Creature.withFlying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gu/en-us/card12368.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/radiant_essence.txt b/res/cardsfolder/radiant_essence.txt deleted file mode 100644 index 578aafe667f..00000000000 --- a/res/cardsfolder/radiant_essence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Radiant Essence -ManaCost:1 W G -Types:Creature Spirit -Text:no text -PT:2/3 -K:stPumpSelf:Creature:1/2:isPresent Permanent.Black+YouDontCtrl:Radiant Essence gets +1/+2 as long as an opponent controls a black permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/radiant_essence.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/336.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/radiants_dragoons.txt b/res/cardsfolder/radiants_dragoons.txt deleted file mode 100644 index 3e6a88c23f4..00000000000 --- a/res/cardsfolder/radiants_dragoons.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Radiant's Dragoons -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 5 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 5 -K:Echo:3 W -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/radiants_dragoons.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/radiants_judgment.txt b/res/cardsfolder/radiants_judgment.txt deleted file mode 100644 index 7625b1d876e..00000000000 --- a/res/cardsfolder/radiants_judgment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Radiant's Judgment -ManaCost:2 W -Types:Instant -Text:no text -A:SP$Destroy | Cost$ 2 W | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | SpellDescription$ Destroy target creature with power 4 or greater. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/radiants_judgment.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/22.jpg -End diff --git a/res/cardsfolder/radjan_spirit.txt b/res/cardsfolder/radjan_spirit.txt deleted file mode 100644 index 9e2dbb1bf48..00000000000 --- a/res/cardsfolder/radjan_spirit.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Radjan Spirit -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:3/2 -K:Flying -A:AB$ Debuff | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Flying | SpellDescription$ Target creature loses flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/radjan_spirit.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/182.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/245.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/150.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rafiq_of_the_many.txt b/res/cardsfolder/rafiq_of_the_many.txt deleted file mode 100644 index 1e5e2079eea..00000000000 --- a/res/cardsfolder/rafiq_of_the_many.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rafiq of the Many -ManaCost:1 G W U -Types:Legendary Creature Human Knight -Text:no text -PT:3/3 -K:Exalted -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gains double strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | KW$ Double Strike -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/rafiq_of_the_many.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ragamuffyn.txt b/res/cardsfolder/ragamuffyn.txt deleted file mode 100644 index ca265534f7a..00000000000 --- a/res/cardsfolder/ragamuffyn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ragamuffyn -ManaCost:2 B -Types:Creature Zombie Cleric -Text:no text -PT:2/2 -A:AB$ Draw | Cost$ T Sac<1/Creature;Land> | CostDesc$ Tap, Sacrifice a creature or land: | PrecostDesc$ Hellbent - | NumCards$ 1 | ActivatingCardsInHand$ 0 | SpellDescription$ Draw a card. Activate this ability only if you have no cards in hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ragamuffyn.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rage_extractor.txt b/res/cardsfolder/rage_extractor.txt deleted file mode 100644 index 8778c8d5075..00000000000 --- a/res/cardsfolder/rage_extractor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rage Extractor -ManaCost:4 PR -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.CostsPhyrexianMana | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you cast a spell with P in its mana cost, CARDNAME deals damage equal to that spell's converted mana cost to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ X -SVar:X:TriggeredCard$CardManaCost -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_extractor.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rage_nimbus.txt b/res/cardsfolder/rage_nimbus.txt deleted file mode 100644 index 500d680d537..00000000000 --- a/res/cardsfolder/rage_nimbus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rage Nimbus -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:5/3 -K:Defender -K:Flying -A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME attacks each turn if able. | IsCurse$ True | SpellDescription$ Target creature attacks this turn if able. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_nimbus.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rage_reflection.txt b/res/cardsfolder/rage_reflection.txt deleted file mode 100644 index 7d31c56f701..00000000000 --- a/res/cardsfolder/rage_reflection.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rage Reflection -ManaCost:4 R R -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Double Strike:No Condition:Creatures you control have double strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_reflection.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rage_weaver.txt b/res/cardsfolder/rage_weaver.txt deleted file mode 100644 index 5d8a589e0cc..00000000000 --- a/res/cardsfolder/rage_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rage Weaver -ManaCost:1 R -Types:Creature Human Wizard -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Black,Creature.Green | KW$ Haste | SpellDescription$ Target black or green creature gains haste until end of turn. | TgtPrompt$ Select target black or green creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rage_weaver.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/159.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ragged_veins.txt b/res/cardsfolder/ragged_veins.txt deleted file mode 100644 index 1ed2d19fbab..00000000000 --- a/res/cardsfolder/ragged_veins.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ragged Veins -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant Creature Curse -T:Mode$ DamageDone | ValidTarget$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever enchanted creature is dealt damage, its controller loses that much life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ragged_veins.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_bull.txt b/res/cardsfolder/raging_bull.txt deleted file mode 100644 index 01b030a8721..00000000000 --- a/res/cardsfolder/raging_bull.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Raging Bull -ManaCost:2 R -Types:Creature Ox -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raging_bull.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_cougar.txt b/res/cardsfolder/raging_cougar.txt deleted file mode 100644 index cae4e8703d7..00000000000 --- a/res/cardsfolder/raging_cougar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raging Cougar -ManaCost:2 R -Types:Creature Cat -Text:no text -PT:2/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raging_cougar.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_goblin.txt b/res/cardsfolder/raging_goblin.txt deleted file mode 100644 index 1df1f769e96..00000000000 --- a/res/cardsfolder/raging_goblin.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Raging Goblin -ManaCost:R -Types:Creature Goblin Berserker -Text:no text -PT:1/1 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83218.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/212.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/153.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/96.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/211.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/150.jpg|2 -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/209.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/224.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/114.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/200.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_gorilla.txt b/res/cardsfolder/raging_gorilla.txt deleted file mode 100644 index 4e1b53313cc..00000000000 --- a/res/cardsfolder/raging_gorilla.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Raging Gorilla -ManaCost:2 R -Types:Creature Ape -Text:no text -PT:2/3 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +2/-2 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets +2/-2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ -2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raging_gorilla.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_kavu.txt b/res/cardsfolder/raging_kavu.txt deleted file mode 100644 index 6a234360f25..00000000000 --- a/res/cardsfolder/raging_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Raging Kavu -ManaCost:1 R G -Types:Creature Kavu -Text:no text -PT:3/1 -K:Flash -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/raging_kavu.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_minotaur.txt b/res/cardsfolder/raging_minotaur.txt deleted file mode 100644 index f829a7e413e..00000000000 --- a/res/cardsfolder/raging_minotaur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raging Minotaur -ManaCost:2 R R -Types:Creature Minotaur -Text:no text -PT:3/3 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4358.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raging_ravine.txt b/res/cardsfolder/raging_ravine.txt deleted file mode 100644 index 91e364ee64f..00000000000 --- a/res/cardsfolder/raging_ravine.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Raging Ravine -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Animate | Cost$ 2 R G | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Elemental | Colors$ Red,Green | Triggers$ TrigAttack | SpellDescription$ Until end of turn, CARDNAME 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. -SVar:TrigAttack:Mode$ Attacks | ValidCard$ Creature.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME attacks, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/raging_ravine.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ragnar.txt b/res/cardsfolder/ragnar.txt deleted file mode 100644 index 8929e34aeaa..00000000000 --- a/res/cardsfolder/ragnar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ragnar -ManaCost:U W G -Types:Legendary Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ U W G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ragnar.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/290.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raid_bombardment.txt b/res/cardsfolder/raid_bombardment.txt deleted file mode 100644 index 477eae97b6b..00000000000 --- a/res/cardsfolder/raid_bombardment.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Raid Bombardment -ManaCost:2 R -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.powerLE2+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature you control with power 2 or less attacks, CARDNAME deals 1 damage to defending player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raid_bombardment.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raiding_nightstalker.txt b/res/cardsfolder/raiding_nightstalker.txt deleted file mode 100644 index 7cf90be5a5e..00000000000 --- a/res/cardsfolder/raiding_nightstalker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raiding Nightstalker -ManaCost:2 B -Types:Creature Nightstalker -Text:no text -PT:2/2 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6558.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rain_of_blades.txt b/res/cardsfolder/rain_of_blades.txt deleted file mode 100644 index d249deb3352..00000000000 --- a/res/cardsfolder/rain_of_blades.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rain of Blades -ManaCost:W -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ W | NumDmg$ 1 | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | SpellDescription$ CARDNAME deals 1 damage to each attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_blades.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/35.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rain_of_embers.txt b/res/cardsfolder/rain_of_embers.txt deleted file mode 100644 index 7e328ab92ac..00000000000 --- a/res/cardsfolder/rain_of_embers.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rain of Embers -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_embers.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rain_of_salt.txt b/res/cardsfolder/rain_of_salt.txt deleted file mode 100644 index 5e820be265d..00000000000 --- a/res/cardsfolder/rain_of_salt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rain of Salt -ManaCost:4 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R R | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy two target lands. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_salt.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/206.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rain_of_tears.txt b/res/cardsfolder/rain_of_tears.txt deleted file mode 100644 index a11b215d116..00000000000 --- a/res/cardsfolder/rain_of_tears.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rain of Tears -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rain_of_tears.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/43.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/155.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/29.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/170.jpg -End diff --git a/res/cardsfolder/rainbow_vale.txt b/res/cardsfolder/rainbow_vale.txt deleted file mode 100644 index 103d3ef73d0..00000000000 --- a/res/cardsfolder/rainbow_vale.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Rainbow Vale -ManaCost:no cost -Types:Land -Text:If CARDNAME is tapped for mana, an opponent gains control of CARDNAME at the beginning of the next end step. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rainbow_vale.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raise_dead.txt b/res/cardsfolder/raise_dead.txt deleted file mode 100644 index e6e53e6d307..00000000000 --- a/res/cardsfolder/raise_dead.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Raise Dead -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83220.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/157.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/31.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/31.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/157.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/26.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/40.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/30.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/156.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/152.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/32.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/53.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/85.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raise_the_alarm.txt b/res/cardsfolder/raise_the_alarm.txt deleted file mode 100644 index 646b356d226..00000000000 --- a/res/cardsfolder/raise_the_alarm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Raise the Alarm -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Token | Cost$ 1 W | TokenAmount$ 2 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 white Soldier creature tokens onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card48103.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raka_disciple.txt b/res/cardsfolder/raka_disciple.txt deleted file mode 100644 index ef78c31413a..00000000000 --- a/res/cardsfolder/raka_disciple.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Raka Disciple -ManaCost:R -Types:Creature Minotaur Wizard -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ W T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -A:AB$ Pump | Cost$ U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raka_disciple.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakdos_augermage.txt b/res/cardsfolder/rakdos_augermage.txt deleted file mode 100644 index 364b3db5992..00000000000 --- a/res/cardsfolder/rakdos_augermage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rakdos Augermage -ManaCost:B B R -Types:Creature Human Wizard -Text:no text -PT:3/2 -K:First Strike -A:AB$ Discard | Cost$ T | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ RevealYouChoose | SubAbility$ SVar=DBDiscard | SpellDescription$ 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. -SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ RevealOppChoose -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_augermage.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakdos_carnarium.txt b/res/cardsfolder/rakdos_carnarium.txt deleted file mode 100644 index 368b1287c91..00000000000 --- a/res/cardsfolder/rakdos_carnarium.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rakdos Carnarium -ManaCost:no cost -Types:Land -Text:no text -K:Rakdos Carnarium enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B R | SpellDescription$ Add B R to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_carnarium.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakdos_guildmage.txt b/res/cardsfolder/rakdos_guildmage.txt deleted file mode 100644 index 5a1ee46848e..00000000000 --- a/res/cardsfolder/rakdos_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rakdos Guildmage -ManaCost:BR BR -Types:Creature Zombie Shaman -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 3 B Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | NumDef$ -2 | IsCurse$True | SpellDescription$ Target creature gets -2/-2 until end of turn. -A:AB$ Token | Cost$ 3 R | TokenAmount$ 1 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 2 | TokenToughness$ 1 | TokenKeywords$ Haste<>At the beginning of the end step, exile CARDNAME. | SpellDescription$ Put a 2/1 red Goblin creature token with haste onto the battlefield. Exile it at the beginning of the next end step. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_guildmage.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakdos_ickspitter.txt b/res/cardsfolder/rakdos_ickspitter.txt deleted file mode 100644 index 62e2b547fe9..00000000000 --- a/res/cardsfolder/rakdos_ickspitter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rakdos Ickspitter -ManaCost:1 B R -Types:Creature Thrull -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBDrain | SpellDescription$ CARDNAME deals 1 damage to target creature and that creature's controller loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_ickspitter.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/128.jpg -End diff --git a/res/cardsfolder/rakdos_pit_dragon.txt b/res/cardsfolder/rakdos_pit_dragon.txt deleted file mode 100644 index 304d3fb4dfd..00000000000 --- a/res/cardsfolder/rakdos_pit_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rakdos Pit Dragon -ManaCost:2 R R -Types:Creature Dragon -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ R R | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -K:stPumpSelf:Creature:0/0/Double Strike:Hellbent:Hellbent - Rakdos Pit Dragon has double strike as long as you have no cards in hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_pit_dragon.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/69.jpg -End diff --git a/res/cardsfolder/rakdos_signet.txt b/res/cardsfolder/rakdos_signet.txt deleted file mode 100644 index 2585f84ba28..00000000000 --- a/res/cardsfolder/rakdos_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rakdos Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ B R | SpellDescription$ Add B R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_signet.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakdos_the_defiler.txt b/res/cardsfolder/rakdos_the_defiler.txt deleted file mode 100644 index 6f985bfdeae..00000000000 --- a/res/cardsfolder/rakdos_the_defiler.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Rakdos the Defiler -ManaCost:2 B B R R -Types:Legendary Creature Demon -Text:no text -PT:7/6 -K:Flying -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME attacks, sacrifice half the non-Demon permanents you control, rounded up. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigSac2 | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player sacrifices half the non-Demon permanents he or she controls, rounded up. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | Amount$ X | SacValid$ Permanent.nonDemon | SacMessage$ non-Demon Permanent -SVar:TrigSac2:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | Amount$ Y | SacValid$ Permanent.nonDemon | SacMessage$ non-Demon Permanent -SVar:X:Count$Valid Permanent.nonDemon+YouCtrl/HalfUp -SVar:Y:Count$Valid Permanent.nonDemon+YouDontCtrl/HalfUp -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakdos_the_defiler.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakeclaw_gargantuan.txt b/res/cardsfolder/rakeclaw_gargantuan.txt deleted file mode 100644 index 2cd7711c7dc..00000000000 --- a/res/cardsfolder/rakeclaw_gargantuan.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rakeclaw Gargantuan -ManaCost:2 R G W -Types:Creature Beast -Text:no text -PT:5/3 -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ First Strike | SpellDescription$ Target creature with power 5 or greater gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakeclaw_gargantuan.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/186.jpg -End diff --git a/res/cardsfolder/raking_canopy.txt b/res/cardsfolder/raking_canopy.txt deleted file mode 100644 index 8e8f5ea30a1..00000000000 --- a/res/cardsfolder/raking_canopy.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raking Canopy -ManaCost:1 G G -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature.YouDontCtrl+withFlying | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature with flying attacks you, CARDNAME deals 4 damage to it. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredAttacker | NumDmg$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/raking_canopy.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rakka_mar.txt b/res/cardsfolder/rakka_mar.txt deleted file mode 100644 index 89505731176..00000000000 --- a/res/cardsfolder/rakka_mar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rakka Mar -ManaCost:2 R R -Types:Legendary Creature Human Shaman -Text:no text -PT:2/2 -K:Haste -A:AB$ Token | Cost$ R T | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste | SpellDescription$ Put a 3/1 red Elemental creature token with haste onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rakka_mar.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raksha_golden_cub.txt b/res/cardsfolder/raksha_golden_cub.txt deleted file mode 100644 index 6871deeaf46..00000000000 --- a/res/cardsfolder/raksha_golden_cub.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Raksha Golden Cub -ManaCost:5 W W -Types:Legendary Creature Cat Soldier -Text:no text -PT:3/4 -K:Vigilance -K:stPumpAll:Creature.Cat+YouCtrl:2/2/Double Strike:isEquipped:As long as Raksha Golden Cub is equipped, Cat creatures you control get +2/+2 and have double strike. -SVar:EquipMe:Once -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/raksha_golden_cub.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rally.txt b/res/cardsfolder/rally.txt deleted file mode 100644 index 65c378eb11a..00000000000 --- a/res/cardsfolder/rally.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rally -ManaCost:W W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ W W | ValidCards$ Creature.blocking | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Blocking creatures get +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rally.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rally_the_forces.txt b/res/cardsfolder/rally_the_forces.txt deleted file mode 100644 index 2dbe66adf76..00000000000 --- a/res/cardsfolder/rally_the_forces.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rally the Forces -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature.attacking | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Attacking creatures get +1/+0 and gain first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_forces.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramirez_depietro.txt b/res/cardsfolder/ramirez_depietro.txt deleted file mode 100644 index a306e057968..00000000000 --- a/res/cardsfolder/ramirez_depietro.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ramirez DePietro -ManaCost:3 U B B -Types:Legendary Creature Human Pirate -Text:no text -PT:4/3 -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramirez_depietro.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_captain.txt b/res/cardsfolder/ramosian_captain.txt deleted file mode 100644 index 8df2abd3d70..00000000000 --- a/res/cardsfolder/ramosian_captain.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ramosian Captain -ManaCost:1 W W -Types:Creature Human Rebel -Text:no text -PT:2/2 -K:First Strike -K:SearchRebel:5 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_captain.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_commander.txt b/res/cardsfolder/ramosian_commander.txt deleted file mode 100644 index 19c8eea4d20..00000000000 --- a/res/cardsfolder/ramosian_commander.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ramosian Commander -ManaCost:2 W W -Types:Creature Human Rebel -Text:no text -PT:2/4 -K:SearchRebel:6 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_commander.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_lieutenant.txt b/res/cardsfolder/ramosian_lieutenant.txt deleted file mode 100644 index 7be9b4479f7..00000000000 --- a/res/cardsfolder/ramosian_lieutenant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ramosian Lieutenant -ManaCost:1 W -Types:Creature Human Rebel -Text:no text -PT:1/2 -K:SearchRebel:4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_lieutenant.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_rally.txt b/res/cardsfolder/ramosian_rally.txt deleted file mode 100755 index c6d322bceef..00000000000 --- a/res/cardsfolder/ramosian_rally.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ramosian Rally -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -A:SP$ PumpAll | Cost$ tapXType<1/Creature> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | IsPresent$ Plains.YouCtrl | SpellDescription$ If you control a Plains, you may tap an untapped creature you control rather than pay CARDNAME's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_rally.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_revivalist.txt b/res/cardsfolder/ramosian_revivalist.txt deleted file mode 100644 index 980e5ce1b7a..00000000000 --- a/res/cardsfolder/ramosian_revivalist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ramosian Revivalist -ManaCost:3 W -Types:Creature Human Rebel Cleric -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 6 T | TgtPrompt$ Choose target Rebel permanent card with converted mana cost 5 or less | ValidTgts$ Permanent.Rebel+cmcLE5 | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target Rebel permanent card with converted mana cost 5 or less from your graveyard to the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_revivalist.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_sergeant.txt b/res/cardsfolder/ramosian_sergeant.txt deleted file mode 100644 index 3aee69e760f..00000000000 --- a/res/cardsfolder/ramosian_sergeant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ramosian Sergeant -ManaCost:W -Types:Creature Human Rebel -Text:no text -PT:1/1 -K:SearchRebel:3 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_sergeant.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramosian_sky_marshal.txt b/res/cardsfolder/ramosian_sky_marshal.txt deleted file mode 100644 index 30fb8b38f94..00000000000 --- a/res/cardsfolder/ramosian_sky_marshal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ramosian Sky Marshal -ManaCost:3 W W -Types:Creature Human Rebel -Text:no text -PT:3/3 -K:Flying -K:SearchRebel:7 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramosian_sky_marshal.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rampaging_baloths.txt b/res/cardsfolder/rampaging_baloths.txt deleted file mode 100644 index fbc55351261..00000000000 --- a/res/cardsfolder/rampaging_baloths.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rampaging Baloths -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:6/6 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a 4/4 green Beast creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/rampaging_baloths.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rampant_growth.txt b/res/cardsfolder/rampant_growth.txt deleted file mode 100644 index 8f33ed86da3..00000000000 --- a/res/cardsfolder/rampant_growth.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Rampant Growth -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rampant_growth.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/274.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/139.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/262.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/263.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/288.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/201.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/246.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rampart_crawler.txt b/res/cardsfolder/rampart_crawler.txt deleted file mode 100644 index 784b04aa0d9..00000000000 --- a/res/cardsfolder/rampart_crawler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rampart Crawler -ManaCost:B -Types:Creature Lizard Mercenary -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by Walls. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rampart_crawler.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ramses_overdark.txt b/res/cardsfolder/ramses_overdark.txt deleted file mode 100644 index 3763d37977d..00000000000 --- a/res/cardsfolder/ramses_overdark.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ramses Overdark -ManaCost:2 U U B B -Types:Legendary Creature Human Assassin -Text:no text -PT:4/3 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.enchanted | TgtPrompt$ Select target enchanted creature | SpellDescription$ Destroy target enchanted creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ramses_overdark.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/292.jpg -End diff --git a/res/cardsfolder/rancor.txt b/res/cardsfolder/rancor.txt deleted file mode 100644 index 882c6b4f981..00000000000 --- a/res/cardsfolder/rancor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rancor -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+0/Trample -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rancor.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ranger_en_vec.txt b/res/cardsfolder/ranger_en_vec.txt deleted file mode 100644 index 9862d40e0d3..00000000000 --- a/res/cardsfolder/ranger_en_vec.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ranger en-Vec -ManaCost:1 G W -Types:Creature Human Soldier Archer -Text:no text -PT:2/2 -K:First Strike -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ranger_en_vec.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/343.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ranger_of_eos.txt b/res/cardsfolder/ranger_of_eos.txt deleted file mode 100644 index 9cf8402c80f..00000000000 --- a/res/cardsfolder/ranger_of_eos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ranger of Eos -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Creature.cmcLE1 | ChangeNum$ 2 -PT:3/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ranger_of_eos.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rank_and_file.txt b/res/cardsfolder/rank_and_file.txt deleted file mode 100644 index aab36a9a700..00000000000 --- a/res/cardsfolder/rank_and_file.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rank and File -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, green creatures get -1/-1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Green | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rank_and_file.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ransack.txt b/res/cardsfolder/ransack.txt deleted file mode 100644 index 71990f79e4b..00000000000 --- a/res/cardsfolder/ransack.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ransack -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ 3 U | ValidTgts$ Player | DigNum$ 5 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition2$ 0 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ransack.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/47.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rapacious_one.txt b/res/cardsfolder/rapacious_one.txt deleted file mode 100644 index 186a810107e..00000000000 --- a/res/cardsfolder/rapacious_one.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Rapacious One -ManaCost:5 R -Types:Creature Eldrazi Drone -Text:no text -PT:5/4 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME 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." -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rapacious_one.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rappelling_scouts.txt b/res/cardsfolder/rappelling_scouts.txt deleted file mode 100644 index 553ab4303dc..00000000000 --- a/res/cardsfolder/rappelling_scouts.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Rappelling Scouts -ManaCost:2 W W -Types:Creature Human Rebel Scout -Text:no text -PT:1/4 -K:Flying -A:AB$ Pump | Cost$ 2 W | KW$ Protection from white | SpellDescription$ CARDNAME gains protection from white until end of turn. -A:AB$ Pump | Cost$ 2 W | KW$ Protection from blue | SpellDescription$ CARDNAME gains protection from blue until end of turn. -A:AB$ Pump | Cost$ 2 W | KW$ Protection from black | SpellDescription$ CARDNAME gains protection from black until end of turn. -A:AB$ Pump | Cost$ 2 W | KW$ Protection from red | SpellDescription$ CARDNAME gains protection from red until end of turn. -A:AB$ Pump | Cost$ 2 W | KW$ Protection from green | SpellDescription$ CARDNAME gains protection from green until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rappelling_scouts.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/41.jpg -End diff --git a/res/cardsfolder/rashida_scalebane.txt b/res/cardsfolder/rashida_scalebane.txt deleted file mode 100644 index a66f65cbda4..00000000000 --- a/res/cardsfolder/rashida_scalebane.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rashida Scalebane -ManaCost:3 W W -Types:Legendary Creature Human Soldier -Text:no text -PT:3/4 -A:AB$ Destroy | Cost$ T | ValidTgts$ Dragon.attacking,Dragon.blocking | NoRegen$ True | TgtPrompt$ Select target attacking or blocking Dragon | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target attacking or blocking Dragon. It can't be regenerated. You gain life equal to its power. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rashida_scalebane.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rashka_the_slayer.txt b/res/cardsfolder/rashka_the_slayer.txt deleted file mode 100644 index 2c217915f16..00000000000 --- a/res/cardsfolder/rashka_the_slayer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rashka the Slayer -ManaCost:3 W W -Types:Legendary Creature Human Archer -PT:3/3 -K:Reach -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.Black | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks one or more black creatures, CARDNAME gets +1/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rashka_the_slayer.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/115.jpg -End diff --git a/res/cardsfolder/ratcatcher.txt b/res/cardsfolder/ratcatcher.txt deleted file mode 100644 index 9e4e2dc57f6..00000000000 --- a/res/cardsfolder/ratcatcher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ratcatcher -ManaCost:4 B B -Types:Creature Ogre Rogue -Text: -PT:4/4 -K:Fear -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Rat | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ratcatcher.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ratchet_bomb.txt b/res/cardsfolder/ratchet_bomb.txt deleted file mode 100644 index 1effbb21ddd..00000000000 --- a/res/cardsfolder/ratchet_bomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ratchet Bomb -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ DestroyAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Permanent.nonLand+cmcEQX | SpellDescription$ Destroy each nonland permanent with converted mana cost equal to the number of charge counters on CARDNAME. -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ratchet_bomb.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rathi_assassin.txt b/res/cardsfolder/rathi_assassin.txt deleted file mode 100644 index abec7ebf843..00000000000 --- a/res/cardsfolder/rathi_assassin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rathi Assassin -ManaCost:2 B B -Types:Creature Zombie Mercenary Assassin -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ 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. -A:AB$ Destroy | Cost$ 1 B B T | ValidTgts$ Creature.tapped+nonBlack | TgtPrompt$ Select target tapped nonblack creature | SpellDescription$ Destroy target tapped nonblack creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_assassin.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/67.jpg -End diff --git a/res/cardsfolder/rathi_fiend.txt b/res/cardsfolder/rathi_fiend.txt deleted file mode 100644 index cc7ac885d77..00000000000 --- a/res/cardsfolder/rathi_fiend.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rathi Fiend -ManaCost:3 B -Types:Creature Horror Mercenary -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, each player loses 3 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Each | LifeAmount$ 3 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE3 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_fiend.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rathi_intimidator.txt b/res/cardsfolder/rathi_intimidator.txt deleted file mode 100644 index c7cf2a603b3..00000000000 --- a/res/cardsfolder/rathi_intimidator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rathi Intimidator -ManaCost:1 B B -Types:Creature Horror Mercenary -Text:no text -PT:2/1 -K:Fear -A:AB$ ChangeZone | Cost$ 2 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Mercenary+cmcLE2 | ChangeNum$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_intimidator.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rathi_trapper.txt b/res/cardsfolder/rathi_trapper.txt deleted file mode 100644 index 23b244867a6..00000000000 --- a/res/cardsfolder/rathi_trapper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rathi Trapper -ManaCost:1 B -Types:Creature Human Rebel Rogue -Text:no text -PT:1/2 -A:AB$ Tap | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rathi_trapper.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/90.jpg -End diff --git a/res/cardsfolder/raths_edge.txt b/res/cardsfolder/raths_edge.txt deleted file mode 100644 index d9bb1349f09..00000000000 --- a/res/cardsfolder/raths_edge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rath's Edge -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ DealDamage | Cost$ 4 T Sac<1/Land> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/raths_edge.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rats_of_rath.txt b/res/cardsfolder/rats_of_rath.txt deleted file mode 100644 index f164ab0a696..00000000000 --- a/res/cardsfolder/rats_of_rath.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rats of Rath -ManaCost:1 B -Types:Creature Rat -Text:no text -PT:2/1 -A:AB$ Destroy | Cost$ B | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl,Land.YouCtrl | TgtPrompt$ Select target artifact, creature or land you control | SpellDescription$ Destroy target artifact, creature, or land you control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rats_of_rath.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rattleblaze_scarecrow.txt b/res/cardsfolder/rattleblaze_scarecrow.txt deleted file mode 100644 index 1233f7b1cf8..00000000000 --- a/res/cardsfolder/rattleblaze_scarecrow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rattleblaze Scarecrow -ManaCost:6 -Types:Artifact Creature Scarecrow -Text:no text -PT:5/3 -K:stPumpSelf:Creature:0/0/Persist:isPresent Creature.Black+YouCtrl:CARDNAME has persist as long as you control a black creature. -K:stPumpSelf:Creature:0/0/Haste:isPresent Creature.Red+YouCtrl:CARDNAME has haste as long as you control a red creature. -SVar:BuffedBy:Creature.Black,Creature.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rattleblaze_scarecrow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravaged_highlands.txt b/res/cardsfolder/ravaged_highlands.txt deleted file mode 100644 index 4b1e10c7403..00000000000 --- a/res/cardsfolder/ravaged_highlands.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Ravaged Highlands -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravaged_highlands.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravages_of_war.txt b/res/cardsfolder/ravages_of_war.txt deleted file mode 100644 index e3ae7502276..00000000000 --- a/res/cardsfolder/ravages_of_war.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ravages of War -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 W | ValidCards$ Land | SpellDescription$ Destroy all lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravages_of_war.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravaging_horde.txt b/res/cardsfolder/ravaging_horde.txt deleted file mode 100644 index ca5e01ce087..00000000000 --- a/res/cardsfolder/ravaging_horde.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ravaging Horde -ManaCost:3 R R -Types:Creature Human Soldier -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land | TgtPrompt$ Select a land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravaging_horde.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravaging_riftwurm.txt b/res/cardsfolder/ravaging_riftwurm.txt deleted file mode 100644 index af9adcf1c7e..00000000000 --- a/res/cardsfolder/ravaging_riftwurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ravaging Riftwurm -ManaCost:1 G G -Types:Creature Wurm -Text:no text -PT:6/6 -K:Kicker:4 -K:Vanishing:2 -K:etbCounter:TIME:3:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with three additional time counters on it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravaging_riftwurm.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raven_familiar.txt b/res/cardsfolder/raven_familiar.txt deleted file mode 100644 index 738e3f4d52c..00000000000 --- a/res/cardsfolder/raven_familiar.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Raven Familiar -ManaCost:2 U -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -K:Echo:2 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 3 | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/raven_familiar.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raven_guild_initiate.txt b/res/cardsfolder/raven_guild_initiate.txt deleted file mode 100644 index d877dc113d3..00000000000 --- a/res/cardsfolder/raven_guild_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Raven Guild Initiate -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/4 -K:Morph:Return<1/Bird> -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raven_guild_initiate.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raven_guild_master.txt b/res/cardsfolder/raven_guild_master.txt deleted file mode 100644 index 8002d37d7f8..00000000000 --- a/res/cardsfolder/raven_guild_master.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Raven Guild Master -ManaCost:1 U U -Types:Creature Human Wizard Mutant -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player exiles the top ten cards of his or her library. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ 10 | Destination$ Exile -K:Morph:2 U U -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/raven_guild_master.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravenous_baboons.txt b/res/cardsfolder/ravenous_baboons.txt deleted file mode 100644 index 0c34681e5ac..00000000000 --- a/res/cardsfolder/ravenous_baboons.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ravenous Baboons -ManaCost:3 R -Types:Creature Ape -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonbasic land. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select a nonbasic land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_baboons.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravenous_baloth.txt b/res/cardsfolder/ravenous_baloth.txt deleted file mode 100644 index 1a334d8beef..00000000000 --- a/res/cardsfolder/ravenous_baloth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ravenous Baloth -ManaCost:2 G G -Types:Creature Beast -Text:no text -PT:4/4 -A:AB$ GainLife | Cost$ Sac<1/Beast> | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_baloth.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/278.jpg -End diff --git a/res/cardsfolder/ravenous_rats.txt b/res/cardsfolder/ravenous_rats.txt deleted file mode 100644 index 542edf5273f..00000000000 --- a/res/cardsfolder/ravenous_rats.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Ravenous Rats -ManaCost:1 B -Types:Creature Rat -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select an opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_rats.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/158.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/68.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/120.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/157.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/171.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/27.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravenous_skirge.txt b/res/cardsfolder/ravenous_skirge.txt deleted file mode 100644 index d405d9f81f2..00000000000 --- a/res/cardsfolder/ravenous_skirge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ravenous Skirge -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:1/1 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravenous_skirge.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravens_crime.txt b/res/cardsfolder/ravens_crime.txt deleted file mode 100644 index c264aac6152..00000000000 --- a/res/cardsfolder/ravens_crime.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raven's Crime -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -A:SP$ Discard | Cost$ B Discard<1/Land> | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | ActivatingZone$ Graveyard | Mode$ TgtChoose | CostDesc$ Retrace | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravens_crime.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ravens_run_dragoon.txt b/res/cardsfolder/ravens_run_dragoon.txt deleted file mode 100644 index 4dc102ef3d9..00000000000 --- a/res/cardsfolder/ravens_run_dragoon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raven's Run Dragoon -ManaCost:2 GW GW -Types:Creature Elf Knight -Text:CARDNAME can't be blocked by black creatures. -PT:3/3 -K:CantBeBlockedBy Creature.Black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravens_run_dragoon.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raving_oni_slave.txt b/res/cardsfolder/raving_oni_slave.txt deleted file mode 100644 index b2b69803942..00000000000 --- a/res/cardsfolder/raving_oni_slave.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Raving Oni-Slave -ManaCost:1 B -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, you lose 3 life if you don't control a Demon. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raving_oni_slave.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ray_of_command.txt b/res/cardsfolder/ray_of_command.txt deleted file mode 100644 index 9db677301bc..00000000000 --- a/res/cardsfolder/ray_of_command.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ray of Command -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ GainControl | Cost$ 3 U | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature opponent controls | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | TapOnLose$ True | SpellDescription$ 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. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ray_of_command.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/114.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/86.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ray_of_distortion.txt b/res/cardsfolder/ray_of_distortion.txt deleted file mode 100644 index 7cb8306b784..00000000000 --- a/res/cardsfolder/ray_of_distortion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ray of Distortion -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. | SpellDescription$ Destroy target artifact or enchantment. -A:SP$ Destroy | Cost$ 4 W W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment. | Flashback$ True | CostDesc$ Flashback 4 W W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ray_of_distortion.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ray_of_erasure.txt b/res/cardsfolder/ray_of_erasure.txt deleted file mode 100644 index 9ff72ecbf2a..00000000000 --- a/res/cardsfolder/ray_of_erasure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ray of Erasure -ManaCost:U -Types:Instant -Text:no text -A:SP$ Mill | Cost$ U | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ray_of_erasure.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ray_of_revelation.txt b/res/cardsfolder/ray_of_revelation.txt deleted file mode 100644 index 15047c47419..00000000000 --- a/res/cardsfolder/ray_of_revelation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ray of Revelation -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. | SpellDescription$ Destroy target enchantment. -A:SP$ Destroy | Cost$ G | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment. | Flashback$ True | CostDesc$ Flashback G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ray_of_revelation.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/raze.txt b/res/cardsfolder/raze.txt deleted file mode 100644 index 06ae3812fb0..00000000000 --- a/res/cardsfolder/raze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Raze -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ R Sac<1/Land> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/raze.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razing_snidd.txt b/res/cardsfolder/razing_snidd.txt deleted file mode 100644 index bc450caf681..00000000000 --- a/res/cardsfolder/razing_snidd.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Razing Snidd -ManaCost:4 B R -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a black or red creature you control to its owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each player sacrifices a land. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Black+YouCtrl,Creature.Red+YouCtrl -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ Each | SacValid$ Land -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/razing_snidd.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razor_golem.txt b/res/cardsfolder/razor_golem.txt deleted file mode 100644 index cfb30da6452..00000000000 --- a/res/cardsfolder/razor_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Razor Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:Affinity for Plains (This spell costs 1 less to cast for each Plains you control.) -PT:3/4 -K:Vigilance -K:CostChange:Player:Less:1:Self:All:All:Affinity/Plains -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_golem.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razor_hippogriff.txt b/res/cardsfolder/razor_hippogriff.txt deleted file mode 100644 index 0c7ec6e4171..00000000000 --- a/res/cardsfolder/razor_hippogriff.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Razor Hippogriff -ManaCost:3 W W -Types:Creature Hippogriff -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target artifact card from your graveyard to your hand. You gain life equal to that card's converted mana cost. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_hippogriff.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razor_pendulum.txt b/res/cardsfolder/razor_pendulum.txt deleted file mode 100644 index 6fa90351a5b..00000000000 --- a/res/cardsfolder/razor_pendulum.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Razor Pendulum -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageYou | LifeTotal$ You | LifeAmount$ LE5 | TriggerDescription$ At the beginning of each player's end step, if that player has 5 or less life, CARDNAME deals 2 damage to him or her. -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDamageOpp | LifeTotal$ Opponent | LifeAmount$ LE5 | Secondary$ True | TriggerDescription$ At the beginning of each player's end step, if that player has 5 or less life, CARDNAME deals 2 damage to him or her. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 2 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_pendulum.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razor_swine.txt b/res/cardsfolder/razor_swine.txt deleted file mode 100644 index c9ee6e6e043..00000000000 --- a/res/cardsfolder/razor_swine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razor Swine -ManaCost:2 R -Types:Creature Boar -Text:no text -PT:2/1 -K:First Strike -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razor_swine.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorclaw_bear.txt b/res/cardsfolder/razorclaw_bear.txt deleted file mode 100644 index 20faa6d8550..00000000000 --- a/res/cardsfolder/razorclaw_bear.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razorclaw Bear -ManaCost:2 G G -Types:Creature Bear -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorclaw_bear.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorfield_rhino.txt b/res/cardsfolder/razorfield_rhino.txt deleted file mode 100644 index 2dd72ac6d56..00000000000 --- a/res/cardsfolder/razorfield_rhino.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razorfield Rhino -ManaCost:6 -Types:Artifact Creature Rhino -Text:no text -PT:4/4 -K:stPumpSelf:Creature:2/2:Metalcraft:Metalcraft - Razorfield Rhino gets +2/+2 as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorfield_rhino.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorfield_thresher.txt b/res/cardsfolder/razorfield_thresher.txt deleted file mode 100644 index dd158a076eb..00000000000 --- a/res/cardsfolder/razorfield_thresher.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Razorfield Thresher -ManaCost:7 -Types:Artifact Creature Construct -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorfield_thresher.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorfin_hunter.txt b/res/cardsfolder/razorfin_hunter.txt deleted file mode 100644 index e866c395b07..00000000000 --- a/res/cardsfolder/razorfin_hunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Razorfin Hunter -ManaCost:U R -Types:Creature Merfolk Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorfin_hunter.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorfoot_griffin.txt b/res/cardsfolder/razorfoot_griffin.txt deleted file mode 100644 index b81beed9f93..00000000000 --- a/res/cardsfolder/razorfoot_griffin.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Razorfoot Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorfoot_griffin.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/36.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/25.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/29.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorgrass_screen.txt b/res/cardsfolder/razorgrass_screen.txt deleted file mode 100644 index c77fbe58e6c..00000000000 --- a/res/cardsfolder/razorgrass_screen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razorgrass Screen -ManaCost:1 -Types:Artifact Creature Wall -Text:no text -PT:2/1 -K:Defender -K:CARDNAME blocks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorgrass_screen.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorjaw_oni.txt b/res/cardsfolder/razorjaw_oni.txt deleted file mode 100644 index a8adbdd31cc..00000000000 --- a/res/cardsfolder/razorjaw_oni.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razorjaw Oni -ManaCost:3 B -Types:Creature Demon Spirit -Text:no text -PT:4/5 -K:stPumpAll:Creature.Black:0/0/HIDDEN CARDNAME can't block.:No Condition:Black creatures can't block. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorjaw_oni.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razortooth_rats.txt b/res/cardsfolder/razortooth_rats.txt deleted file mode 100644 index 0fcbe588f54..00000000000 --- a/res/cardsfolder/razortooth_rats.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Razortooth Rats -ManaCost:2 B -Types:Creature Rat -Text:no text -PT:2/1 -K:Fear -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83418.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/20.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/153.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/158.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/razorverge_thicket.txt b/res/cardsfolder/razorverge_thicket.txt deleted file mode 100644 index 62a34949450..00000000000 --- a/res/cardsfolder/razorverge_thicket.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Razorverge Thicket -ManaCost:no cost -Types:Land -text:Razorverge Thicket enters the battlefield tapped unless you control two or fewer other lands. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:CARDNAME enters the battlefield tapped unless you control two or fewer other lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/razorverge_thicket.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reach_of_branches.txt b/res/cardsfolder/reach_of_branches.txt deleted file mode 100644 index 5a96ad6a677..00000000000 --- a/res/cardsfolder/reach_of_branches.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reach of Branches -ManaCost:4 G -Types:Tribal Instant Treefolk -Text:no text -A:SP$ Token | Cost$ 4 G | TokenAmount$ 1 | TokenName$ Treefolk Shaman | TokenTypes$ Creature,Treefolk,Shaman | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 5 | SpellDescription$ Put a 2/5 green Treefolk Shaman creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Forest.YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever a Forest enters the battlefield under your control, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reach_of_branches.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reach_through_mists.txt b/res/cardsfolder/reach_through_mists.txt deleted file mode 100644 index db6f8cfcd4d..00000000000 --- a/res/cardsfolder/reach_through_mists.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Reach Through Mists -ManaCost:U -Types:Instant Arcane -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reach_through_mists.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reality_spasm.txt b/res/cardsfolder/reality_spasm.txt deleted file mode 100644 index 125c4871cc2..00000000000 --- a/res/cardsfolder/reality_spasm.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Reality Spasm -ManaCost:X U U -Types:Instant -Text:no text -A:SP$ Tap | Cost$ X U U | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Permanent | TgtPrompt$ Select target permanents | SpellDescription$ Choose one - Tap X target permanents; -A:SP$ Untap | Cost$ X U U | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Permanent | TgtPrompt$ Select target permanents | SpellDescription$ or untap X target permanents. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Permanent -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_spasm.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reality_strobe.txt b/res/cardsfolder/reality_strobe.txt deleted file mode 100644 index 2b6b8f3a9d5..00000000000 --- a/res/cardsfolder/reality_strobe.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reality Strobe -ManaCost:4 U U -Types:Sorcery -Text:no text -K:Suspend:3:2 U -A:SP$ ChangeZone | Cost$ 4 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBChange | SpellDescription$ Return target permanent to its owner's hand. Exile CARDNAME with three time counters on it. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | CounterType$ TIME | CounterNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reality_strobe.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reanimate.txt b/res/cardsfolder/reanimate.txt deleted file mode 100644 index 9c938ecf70b..00000000000 --- a/res/cardsfolder/reanimate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reanimate -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ SVar=DBLoseLifeYou | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. You lose life equal to its converted mana cost. -SVar:DBLoseLifeYou:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reanimate.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reap_and_sow.txt b/res/cardsfolder/reap_and_sow.txt deleted file mode 100644 index e0934e44a6b..00000000000 --- a/res/cardsfolder/reap_and_sow.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reap and Sow -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Land | TgtPrompt$ Select target land | PrecostDesc$ Choose one - | SpellDescription$ Destroy target land; -A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ or search your library for a land card, put that card onto the battlefield, then shuffle your library. -A:SP$ Destroy | Cost$ 4 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBChange | PrecostDesc$ Entwine 1 G | SpellDescription$ (Choose both if you pay the entwine cost.) -SVar:DBChange:DB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reap_and_sow.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reaper_king.txt b/res/cardsfolder/reaper_king.txt deleted file mode 100644 index 87cf087c00b..00000000000 --- a/res/cardsfolder/reaper_king.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Reaper King -ManaCost:2/W 2/U 2/B 2/R 2/G -Types:Legendary Artifact Creature Scarecrow -Text:no text -PT:6/6 -K:stPumpAll:Creature.Scarecrow+Other+YouCtrl:1/1:No Condition:Other Scarecrow creatures you control get +1/+1. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Scarecrow.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever another Scarecrow enters the battlefield under your control, destroy target permanent. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reaper_king.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reaper_of_sheoldred.txt b/res/cardsfolder/reaper_of_sheoldred.txt deleted file mode 100644 index 70c24873b59..00000000000 --- a/res/cardsfolder/reaper_of_sheoldred.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reaper of Sheoldred -ManaCost:4 B -Types:Creature Horror -Text:no text -PT:2/5 -K:Infect -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigSac | TriggerZones$ Battlefield | TriggerDescription$ Whenever a source deals damage to CARDNAME, that source's controller gets a poison counter. -SVar:TrigSac:AB$Poison | Cost$ 0 | Num$ 1 | Defined$ TriggeredSourceController -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reaper_of_sheoldred.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reaping_the_graves.txt b/res/cardsfolder/reaping_the_graves.txt deleted file mode 100644 index 8f1c2d7e374..00000000000 --- a/res/cardsfolder/reaping_the_graves.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reaping the Graves -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reaping_the_graves.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reaping_the_rewards.txt b/res/cardsfolder/reaping_the_rewards.txt deleted file mode 100644 index 5e9d3cd68e6..00000000000 --- a/res/cardsfolder/reaping_the_rewards.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reaping the Rewards -ManaCost:W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ W | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -A:SP$ GainLife | Cost$ W Sac<1/Land> | LifeAmount$ 2 | CostDesc$ Buyback | SubAbility$ SVar=DBBuyback | SpellDescription$ - sacrifice a land -SVar:DBBuyback:DB$ ChangeZone | Origin$ Stack | Destination$ Hand | ValidCard$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reaping_the_rewards.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/16.jpg -End diff --git a/res/cardsfolder/reassembling_skeleton.txt b/res/cardsfolder/reassembling_skeleton.txt deleted file mode 100644 index b9951db8e46..00000000000 --- a/res/cardsfolder/reassembling_skeleton.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reassembling Skeleton -ManaCost:1 B -Types:Creature Skeleton Warrior -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ActivatingZone$ Graveyard | Tapped$ True | SpellDescription$ Return CARDNAME from your graveyard to the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reassembling_skeleton.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rebel_informer.txt b/res/cardsfolder/rebel_informer.txt deleted file mode 100644 index 496a2cd004a..00000000000 --- a/res/cardsfolder/rebel_informer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rebel Informer -ManaCost:2 B -Types:Creature Human Mercenary Rebel -Text:no text -PT:1/2 -K:CARDNAME can't be the target of white spells or abilities from white sources. -A:AB$ ChangeZone | Cost$ 3 | ValidTgts$ Rebel | IsCurse$ True | TgtPrompt$ Select target Rebel | Origin$ Battlefield | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target Rebel on the bottom of its owner's library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rebel_informer.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rebellion_of_the_flamekin.txt b/res/cardsfolder/rebellion_of_the_flamekin.txt deleted file mode 100644 index 34f6743f049..00000000000 --- a/res/cardsfolder/rebellion_of_the_flamekin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rebellion of the Flamekin -ManaCost:3 R -Types:Tribal Enchantment Elemental -Text:no text -T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigTokenW | TriggerDescription$ 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.) -SVar:TrigTokenW:AB$Token | Cost$ 1 | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental Shaman | TokenColors$ Red | TokenTypes$ Creature,Elemental,Shaman | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste -T:Mode$ Clashed | ValidPlayer$ You | Won$ False | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigTokenL | Secondary$ True | TriggerDescription$ 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.) -SVar:TrigTokenL:AB$Token | Cost$ 1 | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental Shaman | TokenColors$ Red | TokenTypes$ Creature,Elemental,Shaman | TokenPower$ 3 | TokenToughness$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rebellion_of_the_flamekin.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reborn_hope.txt b/res/cardsfolder/reborn_hope.txt deleted file mode 100644 index 3e556485643..00000000000 --- a/res/cardsfolder/reborn_hope.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reborn Hope -ManaCost:G W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G W | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target multicolored card in your graveyard | ValidTgts$ Card.MultiColor+YouCtrl | SpellDescription$ Return target multicolored card from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reborn_hope.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rebuff_the_wicked.txt b/res/cardsfolder/rebuff_the_wicked.txt deleted file mode 100644 index b731578d497..00000000000 --- a/res/cardsfolder/rebuff_the_wicked.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rebuff the Wicked -ManaCost:W -Types:Instant -Text:no text -A:SP$ Counter | Cost$ W | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl | SpellDescription$ Counter target spell that targets a permanent you control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rebuff_the_wicked.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rebuild.txt b/res/cardsfolder/rebuild.txt deleted file mode 100644 index 58484238fae..00000000000 --- a/res/cardsfolder/rebuild.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rebuild -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Artifact | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all artifacts to their owners' hands. -K:Cycling:2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rebuild.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rebuking_ceremony.txt b/res/cardsfolder/rebuking_ceremony.txt deleted file mode 100644 index 7f149f24ef3..00000000000 --- a/res/cardsfolder/rebuking_ceremony.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rebuking Ceremony -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G G | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Library | SpellDescription$ Put two target artifacts on top of their owners' libraries. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rebuking_ceremony.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recall.txt b/res/cardsfolder/recall.txt deleted file mode 100644 index 772d176f7a0..00000000000 --- a/res/cardsfolder/recall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Recall -ManaCost:X X U -Types:Sorcery -Text:Discard X cards, then return a card from your graveyard to your hand for each card discarded this way. Exile Recall. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/recall.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/115.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/92.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recantation.txt b/res/cardsfolder/recantation.txt deleted file mode 100644 index 643f5cabe93..00000000000 --- a/res/cardsfolder/recantation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Recantation -ManaCost:3 U U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ U Sac<1/CARDNAME> | Origin$ Battlefield | Destination$ Hand | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Permanent | TgtPrompt$ Select target permanent. | SpellDescription$ Return up to X target permanents to their owners' hands, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/recantation.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reciprocate.txt b/res/cardsfolder/reciprocate.txt deleted file mode 100644 index 8d5a1cd5e8e..00000000000 --- a/res/cardsfolder/reciprocate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reciprocate -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | ValidTgts$ Creature.dealtDamageToYouThisTurn | TgtPrompt$ Select target creature that dealt damage to you this turn | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature that dealt damage to you this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reciprocate.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_abandon.txt b/res/cardsfolder/reckless_abandon.txt deleted file mode 100644 index 237bcb01370..00000000000 --- a/res/cardsfolder/reckless_abandon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reckless Abandon -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_abandon.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_assault.txt b/res/cardsfolder/reckless_assault.txt deleted file mode 100644 index 962baccad09..00000000000 --- a/res/cardsfolder/reckless_assault.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reckless Assault -ManaCost:2 B R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 1 PayLife<2> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_assault.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_charge.txt b/res/cardsfolder/reckless_charge.txt deleted file mode 100644 index b3390e68c49..00000000000 --- a/res/cardsfolder/reckless_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reckless Charge -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | KW$ Haste | SpellDescription$ Target creature gets +3/+0 and gains haste until end of turn. -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | KW$ Haste | Flashback$ True | CostDesc$ Flashback 2 R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_charge.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_embermage.txt b/res/cardsfolder/reckless_embermage.txt deleted file mode 100644 index 58f9827cede..00000000000 --- a/res/cardsfolder/reckless_embermage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reckless Embermage -ManaCost:3 R -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or player and 1 damage to itself. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ 1 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_embermage.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/201.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/189.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/212.jpg -End diff --git a/res/cardsfolder/reckless_ogre.txt b/res/cardsfolder/reckless_ogre.txt deleted file mode 100644 index 51e498d472d..00000000000 --- a/res/cardsfolder/reckless_ogre.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reckless Ogre -ManaCost:3 R -Types:Creature Ogre -Text:no text -PT:3/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, it gets +3/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_ogre.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_one.txt b/res/cardsfolder/reckless_one.txt deleted file mode 100644 index ad40fce1827..00000000000 --- a/res/cardsfolder/reckless_one.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reckless One -ManaCost:3 R -Types:Creature Goblin Avatar -Text:no text -PT:*/* -K:Haste -K:stSetPT:Count$Valid Goblin:Count$Valid Goblin:Reckless One's power and toughness are each equal to the number of Goblins on the battlefield. -SVar:BuffedBy:Goblin -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_one.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_scholar.txt b/res/cardsfolder/reckless_scholar.txt deleted file mode 100644 index 53ab6b5fbba..00000000000 --- a/res/cardsfolder/reckless_scholar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reckless Scholar -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws a card, then discards a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_scholar.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/60.jpg -End diff --git a/res/cardsfolder/reckless_spite.txt b/res/cardsfolder/reckless_spite.txt deleted file mode 100644 index 5226cac05b4..00000000000 --- a/res/cardsfolder/reckless_spite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reckless Spite -ManaCost:1 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B B | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creatures | SubAbility$ SVar=DBLoseLife | SpellDescription$ Destroy two target nonblack creatures. You lose 5 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reckless_spite.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/46.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reckless_wurm.txt b/res/cardsfolder/reckless_wurm.txt deleted file mode 100644 index c0510e24ca3..00000000000 --- a/res/cardsfolder/reckless_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reckless Wurm -ManaCost:3 R R -Types:Creature Wurm -Text:no text -PT:4/4 -K:Trample -K:Madness:2 R -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card126818.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reclaim.txt b/res/cardsfolder/reclaim.txt deleted file mode 100644 index 2065a14a0c4..00000000000 --- a/res/cardsfolder/reclaim.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reclaim -ManaCost:G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Put target card from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reclaim.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/120.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reclusive_wight.txt b/res/cardsfolder/reclusive_wight.txt deleted file mode 100644 index 0347ecf14dd..00000000000 --- a/res/cardsfolder/reclusive_wight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reclusive Wight -ManaCost:3 B -Types:Creature Zombie Minion -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.nonLand+YouCtrl | PresentCompare$ GE2 | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you control another nonland permanent, sacrifice CARDNAME. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reclusive_wight.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recoil.txt b/res/cardsfolder/recoil.txt deleted file mode 100644 index e2b7a192945..00000000000 --- a/res/cardsfolder/recoil.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Recoil -ManaCost:1 U B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U B | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. Then that player discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ TargetedOwner | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/recoil.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recollect.txt b/res/cardsfolder/recollect.txt deleted file mode 100644 index 99b0aca2e00..00000000000 --- a/res/cardsfolder/recollect.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Recollect -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Return target card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/recollect.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reconstruction.txt b/res/cardsfolder/reconstruction.txt deleted file mode 100644 index f309cded0c8..00000000000 --- a/res/cardsfolder/reconstruction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reconstruction -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reconstruction.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/77.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recover.txt b/res/cardsfolder/recover.txt deleted file mode 100644 index 9017cd3136f..00000000000 --- a/res/cardsfolder/recover.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Recover -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/recover.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recumbent_bliss.txt b/res/cardsfolder/recumbent_bliss.txt deleted file mode 100644 index 69fcf2be066..00000000000 --- a/res/cardsfolder/recumbent_bliss.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Recumbent Bliss -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/recumbent_bliss.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recuperate.txt b/res/cardsfolder/recuperate.txt deleted file mode 100644 index fa735ef3427..00000000000 --- a/res/cardsfolder/recuperate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Recuperate -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 3 W | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 6 | PrecostDesc$ Choose one - | SpellDescription$ Target player gains 6 life; -A:SP$ PreventDamage | Cost$ 3 W | Tgt$ TgtCP | Amount$ 6 | PrecostDesc$ or | SpellDescription$ prevent the next 6 damage that would be dealt to target creature or player this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/recuperate.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recurring_nightmare.txt b/res/cardsfolder/recurring_nightmare.txt deleted file mode 100644 index e648e10056e..00000000000 --- a/res/cardsfolder/recurring_nightmare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Recurring Nightmare -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ Sac<1/Creature> Return<1/CARDNAME> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/recurring_nightmare.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/recycle.txt b/res/cardsfolder/recycle.txt deleted file mode 100644 index c2c6b4b9316..00000000000 --- a/res/cardsfolder/recycle.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Recycle -ManaCost:4 G G -Types:Enchantment -Text:Skip your draw step. Your maximum hand size is 2. -# hardcoded for draw step to be skipped in r6069. -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you play a card, draw a card. -T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | Secondary$ True | TriggerDescription$ Whenever you play a card, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:HandSize = 2 Self -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/recycle.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_cliffs_armada.txt b/res/cardsfolder/red_cliffs_armada.txt deleted file mode 100644 index 9d1aaa6810c..00000000000 --- a/res/cardsfolder/red_cliffs_armada.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Red Cliffs Armada -ManaCost:4 U -Types:Creature Human Soldier -Text:no text -PT:5/4 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_cliffs_armada.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_elemental_blast.txt b/res/cardsfolder/red_elemental_blast.txt deleted file mode 100644 index a31c5ce5660..00000000000 --- a/res/cardsfolder/red_elemental_blast.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Red Elemental Blast -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Permanent.Blue | TgtPrompt$ Select target blue permanent | SpellDescription$ Choose one - Destroy target blue permanent -A:SP$ Counter | Cost$ R | TargetType$ Spell | ValidTgts$ Card.Blue | SpellDescription$ or Counter target blue spell. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_elemental_blast.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/170.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/171.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/170.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/236.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_mana_battery.txt b/res/cardsfolder/red_mana_battery.txt deleted file mode 100644 index 2ecfe145b79..00000000000 --- a/res/cardsfolder/red_mana_battery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Red Mana Battery -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_mana_battery.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/361.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_scarab.txt b/res/cardsfolder/red_scarab.txt deleted file mode 100644 index c1a10e8f87c..00000000000 --- a/res/cardsfolder/red_scarab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Red Scarab -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:CARDNAME can't be blocked by red creatures. -K:stPumpEnchanted:Creature:2/2:isPresent Permanent.Red+YouDontCtrl:Enchanted creature gets +2/+2 as long as an opponent controls a red permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_scarab.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_suns_zenith.txt b/res/cardsfolder/red_suns_zenith.txt deleted file mode 100644 index c7e47aabbdf..00000000000 --- a/res/cardsfolder/red_suns_zenith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Red Sun's Zenith -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R | Tgt$ TgtCP | NumDmg$ X | SubAbility$ SVar=DBCurse | SpellDescription$ CARDNAME deals X damage to target creature or player. If a creature dealt damage this way would be put into a graveyard this turn, exile it instead. Shuffle CARDNAME into its owner's library. -SVar:X:Count$xPaid -SVar:DBCurse:DB$Pump | KW$ If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted | SubAbility$ SVar=DBShuffle -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_suns_zenith.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/red_ward.txt b/res/cardsfolder/red_ward.txt deleted file mode 100644 index 64f24c353eb..00000000000 --- a/res/cardsfolder/red_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Red Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from red:Enchanted creature has protection from red. This effect doesn't remove Red Ward. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/red_ward.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/217.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/219.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/217.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/294.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/redeem.txt b/res/cardsfolder/redeem.txt deleted file mode 100644 index df690f5d1af..00000000000 --- a/res/cardsfolder/redeem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Redeem -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | ValidTgts$ Creature | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Prevent all damage that would be dealt this turn to up to two target creatures. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/redeem.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/37.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reduce_to_dreams.txt b/res/cardsfolder/reduce_to_dreams.txt deleted file mode 100644 index 38f99d5f292..00000000000 --- a/res/cardsfolder/reduce_to_dreams.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reduce to Dreams -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U | ChangeType$ Artifact,Enchantment | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all artifacts and enchantments to their owners' hands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reduce_to_dreams.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/redwood_treefolk.txt b/res/cardsfolder/redwood_treefolk.txt deleted file mode 100644 index 67709357c77..00000000000 --- a/res/cardsfolder/redwood_treefolk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Redwood Treefolk -ManaCost:4 G -Types:Creature Treefolk -Text:no text -PT:3/6 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/wl/en-us/card4526.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/80.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/247.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/109.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reef_pirates.txt b/res/cardsfolder/reef_pirates.txt deleted file mode 100644 index 72f23cde0ef..00000000000 --- a/res/cardsfolder/reef_pirates.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reef Pirates -ManaCost:1 U U -Types:Creature Zombie Pirate -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that player puts the top card of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | NumCards$ 1 | Defined$ Opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reef_pirates.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/45.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reflecting_pool.txt b/res/cardsfolder/reflecting_pool.txt deleted file mode 100644 index 3d6931d3177..00000000000 --- a/res/cardsfolder/reflecting_pool.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reflecting Pool -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Type | Valid$ Land.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any type that a land you control could produce. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reflecting_pool.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/328.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reflex_sliver.txt b/res/cardsfolder/reflex_sliver.txt deleted file mode 100644 index 112199f782c..00000000000 --- a/res/cardsfolder/reflex_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reflex Sliver -ManaCost:3 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Haste:no Condition:All Sliver creatures have haste. -SVar:PlayMain1:TRUE -SVar:AntiBuffedBy:Sliver -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reflex_sliver.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reflexes.txt b/res/cardsfolder/reflexes.txt deleted file mode 100644 index 418cb01db24..00000000000 --- a/res/cardsfolder/reflexes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reflexes -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reflexes.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/213.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/208.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/211.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/refresh.txt b/res/cardsfolder/refresh.txt deleted file mode 100644 index 7a7e2662dc4..00000000000 --- a/res/cardsfolder/refresh.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Refresh -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Regenerate | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/refresh.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regal_force.txt b/res/cardsfolder/regal_force.txt deleted file mode 100644 index d4a69a0969a..00000000000 --- a/res/cardsfolder/regal_force.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Regal Force -ManaCost:4 G G G -Types:Creature Elemental -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card for each green creature you control. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:Count$GreenTypeYouCtrl.Creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/regal_force.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regal_unicorn.txt b/res/cardsfolder/regal_unicorn.txt deleted file mode 100644 index 50197ac4dea..00000000000 --- a/res/cardsfolder/regal_unicorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Regal Unicorn -ManaCost:2 W -Types:Creature Unicorn -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14473.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/35.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regenerate.txt b/res/cardsfolder/regenerate.txt deleted file mode 100644 index bc8cf6d2259..00000000000 --- a/res/cardsfolder/regenerate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Regenerate -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Regenerate | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/regenerate.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regeneration.txt b/res/cardsfolder/regeneration.txt deleted file mode 100644 index 40c0fed5094..00000000000 --- a/res/cardsfolder/regeneration.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Regeneration -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/regeneration.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/275.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/122.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/122.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/265.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/183.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/152.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/265.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/147.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/290.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/248.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/120.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/134.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regress.txt b/res/cardsfolder/regress.txt deleted file mode 100644 index e125185988e..00000000000 --- a/res/cardsfolder/regress.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Regress -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card49061.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/48.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/regrowth.txt b/res/cardsfolder/regrowth.txt deleted file mode 100644 index e3f1ad2f7a6..00000000000 --- a/res/cardsfolder/regrowth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Regrowth -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Return target card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/1e/en-us/card170.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/123.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/123.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/121.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reign_of_chaos.txt b/res/cardsfolder/reign_of_chaos.txt deleted file mode 100644 index 23455aa3eff..00000000000 --- a/res/cardsfolder/reign_of_chaos.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reign of Chaos -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Plains | TgtPrompt$ Select target Plains | SubAbility$ SVar=DBDestroyWhite | SpellDescription$ Choose one - Destroy target Plains and target white creature; -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Island | TgtPrompt$ Select target Island | SubAbility$ SVar=DBDestroyBlue | SpellDescription$ or destroy target Island and target blue creature. -SVar:DBDestroyWhite:DB$Destroy | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature -SVar:DBDestroyBlue:DB$Destroy | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reign_of_chaos.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reinforced_bulwark.txt b/res/cardsfolder/reinforced_bulwark.txt deleted file mode 100644 index 1582e062c6b..00000000000 --- a/res/cardsfolder/reinforced_bulwark.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reinforced Bulwark -ManaCost:3 -Types:Artifact Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ PreventDamage | Cost$ T | Defined$ You | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to you this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reinforced_bulwark.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reinforcements.txt b/res/cardsfolder/reinforcements.txt deleted file mode 100644 index f4f7ec8f831..00000000000 --- a/res/cardsfolder/reinforcements.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reinforcements -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 3 | SpellDescription$ Put up to three target creature cards from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reinforcements.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/142.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/reiterate.txt b/res/cardsfolder/reiterate.txt deleted file mode 100644 index 8d30ab9d417..00000000000 --- a/res/cardsfolder/reiterate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reiterate -ManaCost:1 R R -Types:Instant -Text:no text -SVar:Buyback:3 -A:SP$ CopySpell | Cost$ 1 R R | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reiterate.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reito_lantern.txt b/res/cardsfolder/reito_lantern.txt deleted file mode 100644 index 5856b974ee3..00000000000 --- a/res/cardsfolder/reito_lantern.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reito Lantern -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 3 | ValidTgts$ Card | TgtPrompt$ Select target card in a graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put target card from a graveyard on the bottom of its owner's library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reito_lantern.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rejuvenate.txt b/res/cardsfolder/rejuvenate.txt deleted file mode 100644 index a3d99ba18ec..00000000000 --- a/res/cardsfolder/rejuvenate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rejuvenate -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 3 G | LifeAmount$ 6 | SpellDescription$ You gain 6 life. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rejuvenate.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/271.jpg -End diff --git a/res/cardsfolder/rejuvenation_chamber.txt b/res/cardsfolder/rejuvenation_chamber.txt deleted file mode 100644 index 0e5f99d11ed..00000000000 --- a/res/cardsfolder/rejuvenation_chamber.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rejuvenation Chamber -ManaCost:3 -Types:Artifact -Text:no text -K:Fading:2 -A:AB$ GainLife | Cost$ T | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rejuvenation_chamber.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/137.jpg -End diff --git a/res/cardsfolder/reki_the_history_of_kamigawa.txt b/res/cardsfolder/reki_the_history_of_kamigawa.txt deleted file mode 100644 index 5084f2bdb1b..00000000000 --- a/res/cardsfolder/reki_the_history_of_kamigawa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reki, the History of Kamigawa -ManaCost:2 G -Types:Legendary Creature Human Shaman -Text:no text -PT:1/2 -T:Mode$ SpellCast | ValidCard$ Legendary.YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a legendary spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reki_the_history_of_kamigawa.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rekindled_flame.txt b/res/cardsfolder/rekindled_flame.txt deleted file mode 100644 index 7dba0ba854c..00000000000 --- a/res/cardsfolder/rekindled_flame.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rekindled Flame -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ EQ0 | Execute$ TrigReturn | TriggerZones$ Graveyard | TriggerDescription$ At the beginning of your upkeep, if an opponent has no cards in hand, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rekindled_flame.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reknit.txt b/res/cardsfolder/reknit.txt deleted file mode 100644 index 3e79119c973..00000000000 --- a/res/cardsfolder/reknit.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Reknit -ManaCost:1 GW -Types:Instant -Text:no text -A:SP$ Regenerate | Cost$ 1 GW | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Regenerate target permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reknit.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relearn.txt b/res/cardsfolder/relearn.txt deleted file mode 100644 index 2ce500a104a..00000000000 --- a/res/cardsfolder/relearn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Relearn -ManaCost:1 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Return target instant or sorcery card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/relearn.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/51.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/48.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/release_the_ants.txt b/res/cardsfolder/release_the_ants.txt deleted file mode 100644 index 2541502af27..00000000000 --- a/res/cardsfolder/release_the_ants.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Release the Ants -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBClash | SpellDescription$ Release the Ants deals 1 damage to target creature or player. Clash with an opponent. If you win, return CARDNAME to its owner's hand. -SVar:DBClash:DB$Clash | WinSubAbility$ DBReturn -SVar:DBReturn:DB$ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/release_the_ants.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relentless_rats.txt b/res/cardsfolder/relentless_rats.txt deleted file mode 100644 index 34bfbbf1aeb..00000000000 --- a/res/cardsfolder/relentless_rats.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Relentless Rats -ManaCost:1 B B -Types:Creature Rat -Text:A deck can have any number of cards named Relentless Rats. -PT:2/2 -K:stPumpSelf:Creature:X/X:No Condition:Relentless Rats gets +1/+1 for each other creature on the battlefield named Relentless Rats. -SVar:X:Count$Valid Creature.namedRelentless Rats+Other -SVar:RemRandomDeck:True -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card73573.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/113.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/108.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/58.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relic_barrier.txt b/res/cardsfolder/relic_barrier.txt deleted file mode 100644 index 59ac577c041..00000000000 --- a/res/cardsfolder/relic_barrier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Relic Barrier -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Tap target artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_barrier.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/147.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relic_crush.txt b/res/cardsfolder/relic_crush.txt deleted file mode 100644 index 4f62349ae14..00000000000 --- a/res/cardsfolder/relic_crush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Relic Crush -ManaCost:4 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 4 G | ValidTgts$ Artifact,Enchantment | TargetMin$ 1 | TargetMax$ 2 | TgtPrompt$ Select at least one but no more than two target artifacts or enchantments | SpellDescription$ Destroy target artifact or enchantment and up to one other target artifact or enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Relic_Crush.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relic_of_progenitus.txt b/res/cardsfolder/relic_of_progenitus.txt deleted file mode 100644 index a94376c0230..00000000000 --- a/res/cardsfolder/relic_of_progenitus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Relic of Progenitus -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ T | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | Hidden$ True | IsCurse$ True | Chooser$ Targeted -A:AB$ ChangeZoneAll | Cost$ 1 Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ChangeType$ Card | SubAbility$ SVar=DBDraw | SpellDescription$ Exile all cards from all graveyards. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_of_progenitus.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/relic_putrescence.txt b/res/cardsfolder/relic_putrescence.txt deleted file mode 100644 index 0d60f80163f..00000000000 --- a/res/cardsfolder/relic_putrescence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Relic Putrescence -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant Artifact Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever enchanted artifact becomes tapped, its controller gets a poison counter. -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ TriggeredCardController | Num$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/relic_putrescence.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reliquary_monk.txt b/res/cardsfolder/reliquary_monk.txt deleted file mode 100644 index d0bdb0859c1..00000000000 --- a/res/cardsfolder/reliquary_monk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reliquary Monk -ManaCost:2 W -Types:Creature Human Monk Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, destroy target artifact or enchantment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reliquary_monk.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reliquary_tower.txt b/res/cardsfolder/reliquary_tower.txt deleted file mode 100644 index 245f01deb21..00000000000 --- a/res/cardsfolder/reliquary_tower.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reliquary Tower -ManaCost:no cost -Types:Land -Text:You have no maximum hand size. -K:HandSize = INF Self -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reliquary_tower.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remand.txt b/res/cardsfolder/remand.txt deleted file mode 100644 index dcd1c18d24e..00000000000 --- a/res/cardsfolder/remand.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Remand -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Hand | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell. If that spell is countered this way, put it into it's owner's hand instead of into that player's graveyard. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87919.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reminisce.txt b/res/cardsfolder/reminisce.txt deleted file mode 100644 index 5fca7921b7d..00000000000 --- a/res/cardsfolder/reminisce.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Reminisce -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 U | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Library | ChangeType$ Card | Shuffle$ True | SpellDescription$ Target player shuffles his or her graveyard into his or her library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reminisce.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/105.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/92.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remote_farm.txt b/res/cardsfolder/remote_farm.txt deleted file mode 100644 index a784817378d..00000000000 --- a/res/cardsfolder/remote_farm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Remote Farm -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:DEPLETION:2 -A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ W | Deplete$ DEPLETION | Amount$ 2 | SpellDescription$ Add W W to your mana pool. If there are no depletion counters on CARDNAME, sacrifice it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://wizards.com/global/images/magic/general/remote_farm.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remote_isle.txt b/res/cardsfolder/remote_isle.txt deleted file mode 100644 index a41535be717..00000000000 --- a/res/cardsfolder/remote_isle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Remote Isle -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/remote_isle.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remove.txt b/res/cardsfolder/remove.txt deleted file mode 100644 index 27db0b6be5b..00000000000 --- a/res/cardsfolder/remove.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Remove -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Hand | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6541.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remove_enchantments.txt b/res/cardsfolder/remove_enchantments.txt deleted file mode 100644 index d98e4033f0e..00000000000 --- a/res/cardsfolder/remove_enchantments.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Remove Enchantments -ManaCost:W -Types:Instant -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/remove_enchantments.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/remove_soul.txt b/res/cardsfolder/remove_soul.txt deleted file mode 100644 index 91e76a06e9f..00000000000 --- a/res/cardsfolder/remove_soul.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Remove Soul -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83228.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/95.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/72.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/117.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/95.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/93.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/100.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/94.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rend_flesh.txt b/res/cardsfolder/rend_flesh.txt deleted file mode 100644 index 4d91b3e1da0..00000000000 --- a/res/cardsfolder/rend_flesh.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rend Flesh -ManaCost:2 B -Types:Instant Arcane -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.nonSpirit | TgtPrompt$ Select target non-Spirit creature | SpellDescription$ Destroy target non-Spirit creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rend_flesh.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/140.jpg -End diff --git a/res/cardsfolder/rend_spirit.txt b/res/cardsfolder/rend_spirit.txt deleted file mode 100644 index d3be5368748..00000000000 --- a/res/cardsfolder/rend_spirit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rend Spirit -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.Spirit | TgtPrompt$ Select target Spirit | SpellDescription$ Destroy target Spirit. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rend_spirit.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rendclaw_trow.txt b/res/cardsfolder/rendclaw_trow.txt deleted file mode 100644 index 5786c87f9d4..00000000000 --- a/res/cardsfolder/rendclaw_trow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rendclaw Trow -ManaCost:2 BG -Types:Creature Troll -Text:no text -PT:2/2 -K:Persist -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rendclaw_trow.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/renegade_troops.txt b/res/cardsfolder/renegade_troops.txt deleted file mode 100644 index 5f22cf2760c..00000000000 --- a/res/cardsfolder/renegade_troops.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Renegade Troops -ManaCost:4 R -Types:Creature Human Soldier -Text:no text -PT:4/2 -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/renegade_troops.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/renewal.txt b/res/cardsfolder/renewal.txt deleted file mode 100644 index efaaa786fa9..00000000000 --- a/res/cardsfolder/renewal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Renewal -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G Sac<1/Land> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield. Then shuffle your library. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/renewal.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/renewed_faith.txt b/res/cardsfolder/renewed_faith.txt deleted file mode 100644 index cb1c93505fc..00000000000 --- a/res/cardsfolder/renewed_faith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Renewed Faith -ManaCost:2 W -Types:Instant -Text:no text -K:Cycling:1 W -A:SP$ GainLife | Cost$ 2 W | LifeAmount$ 6 | SpellDescription$ You gain 6 life. -T:Mode$ Cycled | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ When you cycle Renewed Faith, you may gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card41153.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/50.jpg -End diff --git a/res/cardsfolder/renewing_dawn.txt b/res/cardsfolder/renewing_dawn.txt deleted file mode 100644 index 16f7f86426a..00000000000 --- a/res/cardsfolder/renewing_dawn.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Renewing Dawn -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ X | SpellDescription$ You gain 2 life for each Mountain target opponent controls. -SVar:X:Count$TypeOppCtrl.Mountain/Times.2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/renewing_dawn.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/renewing_touch.txt b/res/cardsfolder/renewing_touch.txt deleted file mode 100644 index 1eb430d7cef..00000000000 --- a/res/cardsfolder/renewing_touch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Renewing Touch -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Graveyard | Destination$ Library | TargetMin$ 0 | TargetMax$ X | Shuffle$ True | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Shuffle any number of target creature cards from your graveyard into your library. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/renewing_touch.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reparations.txt b/res/cardsfolder/reparations.txt deleted file mode 100644 index 870c912fcf3..00000000000 --- a/res/cardsfolder/reparations.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reparations -ManaCost:1 W U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | TriggerZones$ Battlefield | ValidCard$ Spell.YouDontCtrl | TargetsValid$ You,Creature.YouCtrl | Execute$ TrigDraw | TriggerDescription$ Whenever an opponent casts a spell that targets you or a creature you control, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reparations.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/338.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repay_in_kind.txt b/res/cardsfolder/repay_in_kind.txt deleted file mode 100644 index 9e1eafc7f04..00000000000 --- a/res/cardsfolder/repay_in_kind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Repay in Kind -ManaCost:5 B B -Types:Sorcery -Text:no text -A:SP$ SetLife | Cost$ 5 B B | Defined$ Each | LifeAmount$ X | SpellDescription$ Each player's life total becomes the lowest life total among all players. -SVar:X:Count$LowestLifeTotal -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/repay_in_kind.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repeal.txt b/res/cardsfolder/repeal.txt deleted file mode 100644 index 2322af92953..00000000000 --- a/res/cardsfolder/repeal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Repeal -ManaCost:X U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ X U | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target nonland permanent | ValidTgts$ Permanent.nonLand | SubAbility$ SVar=DBDraw | SpellDescription$ Return target nonland permanent with converted mana cost X to its owner's hand. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/repeal.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repel.txt b/res/cardsfolder/repel.txt deleted file mode 100644 index fa96fa5d5ca..00000000000 --- a/res/cardsfolder/repel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Repel -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/repel.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repel_the_darkness.txt b/res/cardsfolder/repel_the_darkness.txt deleted file mode 100644 index ef1e0bb75bb..00000000000 --- a/res/cardsfolder/repel_the_darkness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Repel the Darkness -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Tap | Cost$ 2 W | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SpellDescription$ Tap up to two target creatures. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/repel_the_darkness.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repentance.txt b/res/cardsfolder/repentance.txt deleted file mode 100644 index 172f4326beb..00000000000 --- a/res/cardsfolder/repentance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Repentance -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 W | Tgt$ TgtC | DamageSource$ Targeted | NumDmg$ X | SpellDescription$ Target creature deals damage to itself equal to its power. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/repentance.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/249.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repentant_blacksmith.txt b/res/cardsfolder/repentant_blacksmith.txt deleted file mode 100644 index c5773c25b8f..00000000000 --- a/res/cardsfolder/repentant_blacksmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Repentant Blacksmith -ManaCost:1 W -Types:Creature Human -Text:no text -PT:1/2 -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/repentant_blacksmith.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/330.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repentant_vampire.txt b/res/cardsfolder/repentant_vampire.txt deleted file mode 100644 index 9a7a49fb8f0..00000000000 --- a/res/cardsfolder/repentant_vampire.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Repentant Vampire -ManaCost:3 B B -Types:Creature Vampire -Text:no text -PT:3/3 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -K:stPumpSelf:Creature:0/0/CARDNAME is white. & SVar=Destroy:Threshold:Threshold - As long as seven or more cards are in your graveyard, Repentant Vampire is white and has "tap: Destroy target black creature." -SVar:Destroy:AB$Destroy | Cost$ T | ValidTgts$ Creature.Black | TgtPrompt$ Select target black creature | SpellDescription$ Destroy target black creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/repentant_vampire.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/157.jpg -End diff --git a/res/cardsfolder/repercussion.txt b/res/cardsfolder/repercussion.txt deleted file mode 100644 index 0b91f9cc766..00000000000 --- a/res/cardsfolder/repercussion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Repercussion -ManaCost:1 R R -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidTarget$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ Whenever a creature is dealt damage, CARDNAME deals that much damage to that creature's controller. -T:Mode$ DamageDone | ValidTarget$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDamageOpp | Secondary$ True | TriggerDescription$ Whenever a creature is dealt damage, CARDNAME deals that much damage to that creature's controller. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ X -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ Y -SVar:X:TriggerCount$DamageAmount -SVar:Y:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/repercussion.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/repopulate.txt b/res/cardsfolder/repopulate.txt deleted file mode 100644 index 440e54a666d..00000000000 --- a/res/cardsfolder/repopulate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Repopulate -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 1 G | Origin$ Graveyard | Destination$ Library | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Creature | Shuffle$ True | SpellDescription$ Shuffle all creature cards from target player's graveyard into that player's library. -K:Cycling:2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/repopulate.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reprisal.txt b/res/cardsfolder/reprisal.txt deleted file mode 100644 index c064d232ec6..00000000000 --- a/res/cardsfolder/reprisal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reprisal -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | NoRegen$ True | SpellDescription$ Destroy target creature with power 4 or greater. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/reprisal.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/37.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/144.jpg|2 -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/33.jpg -End diff --git a/res/cardsfolder/repulse.txt b/res/cardsfolder/repulse.txt deleted file mode 100644 index dfb74b9473f..00000000000 --- a/res/cardsfolder/repulse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Repulse -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card22985.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rescind.txt b/res/cardsfolder/rescind.txt deleted file mode 100644 index 53f19dda719..00000000000 --- a/res/cardsfolder/rescind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rescind -ManaCost:1 U U -Types:Instant -Text: -K:Cycling:2 -A:SP$ ChangeZone | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rescind.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rescue.txt b/res/cardsfolder/rescue.txt deleted file mode 100644 index 6a959f099e6..00000000000 --- a/res/cardsfolder/rescue.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rescue -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent | SpellDescription$ Return target permanent you control to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rescue.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/research_the_deep.txt b/res/cardsfolder/research_the_deep.txt deleted file mode 100644 index f16ffc56286..00000000000 --- a/res/cardsfolder/research_the_deep.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Research the Deep -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 U | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBClash | SpellDescription$ Draw a card. Clash with an opponent. If you win, return CARDNAME to it's owners hand. -SVar:DBClash:DB$Clash | WinSubAbility$ DBReturn -SVar:DBReturn:DB$ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/research_the_deep.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reset.txt b/res/cardsfolder/reset.txt deleted file mode 100644 index eccbafd4d03..00000000000 --- a/res/cardsfolder/reset.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reset -ManaCost:U U -Types:Instant -Text:no text -A:SP$ UntapAll | Cost$ U U | ValidCards$ Land.YouCtrl | OpponentTurn$ True | ActivatingPhases$ Draw-> | SpellDescription$ Cast Reset only during an opponent's turn after his or her upkeep step. Untap all lands you control. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reset.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resilient_wanderer.txt b/res/cardsfolder/resilient_wanderer.txt deleted file mode 100644 index 84fe5cb7225..00000000000 --- a/res/cardsfolder/resilient_wanderer.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Resilient Wanderer -ManaCost:2 W W -Types:Creature Human Nomad -Text:no text -PT:2/3 -K:First Strike -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Protection from black | SpellDescription$ CARDNAME gains protection from black until end of turn. -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Protection from blue | SpellDescription$ CARDNAME gains protection from blue until end of turn. -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Protection from green | SpellDescription$ CARDNAME gains protection from green until end of turn. -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Protection from red | SpellDescription$ CARDNAME gains protection from red until end of turn. -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Protection from white | SpellDescription$ CARDNAME gains protection from white until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/resilient_wanderer.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resistance_fighter.txt b/res/cardsfolder/resistance_fighter.txt deleted file mode 100644 index 6b3cf0fcb66..00000000000 --- a/res/cardsfolder/resistance_fighter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Resistance Fighter -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Prevent all combat damage target creature would deal this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resistance_fighter.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/118.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resize.txt b/res/cardsfolder/resize.txt deleted file mode 100644 index 5370c46ba4f..00000000000 --- a/res/cardsfolder/resize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Resize -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -K:Recover:1 G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/resize.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resounding_roar.txt b/res/cardsfolder/resounding_roar.txt deleted file mode 100644 index 948ac7feff0..00000000000 --- a/res/cardsfolder/resounding_roar.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resounding Roar -ManaCost:1 G -Types:Instant -Text:no text -K:Cycling:5 R G W -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When you cycle CARDNAME, target creature gets +6/+6 until end of turn -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +6 | NumDef$ +6 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_roar.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resounding_scream.txt b/res/cardsfolder/resounding_scream.txt deleted file mode 100644 index 832fa51cb23..00000000000 --- a/res/cardsfolder/resounding_scream.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resounding Scream -ManaCost:2 B -Types:Sorcery -Text:no text -K:Cycling:5 U R B -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | Mode$ Random | SpellDescription$ Target player discards a card at random. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When you cycle CARDNAME, target player discards two cards at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 2 | Mode$ Random -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_scream.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resounding_silence.txt b/res/cardsfolder/resounding_silence.txt deleted file mode 100644 index 8f51066ca77..00000000000 --- a/res/cardsfolder/resounding_silence.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resounding Silence -ManaCost:3 W -Types:Instant -Text:no text -K:Cycling:5 G W U -A:SP$ ChangeZone | Cost$ 3 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When you cycle CARDNAME, exile up to two target attacking creatures. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Exile -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_silence.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resounding_thunder.txt b/res/cardsfolder/resounding_thunder.txt deleted file mode 100644 index 1fed71aea33..00000000000 --- a/res/cardsfolder/resounding_thunder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resounding Thunder -ManaCost:2 R -Types:Instant -Text:no text -K:Cycling:5 R B G -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When you cycle CARDNAME, it deals 6 damage to target creature or player. -SVar:TrigDamage:SP$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 6 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_thunder.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resounding_wave.txt b/res/cardsfolder/resounding_wave.txt deleted file mode 100644 index 368643bd5f0..00000000000 --- a/res/cardsfolder/resounding_wave.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resounding Wave -ManaCost:2 U -Types:Instant -Text:no text -K:Cycling:5 W U B -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When you cycle CARDNAME, return up to two target permanents to their owners' hands -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/resounding_wave.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/respite.txt b/res/cardsfolder/respite.txt deleted file mode 100644 index dc0aa1e89a8..00000000000 --- a/res/cardsfolder/respite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Respite -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ 1 G | SubAbility$ SVar=DBGainLife | SpellDescription$ Prevent all combat damage that would be dealt this turn. You gain 1 life for each attacking creature. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Creature.attacking+YouDontCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/respite.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/143.jpg -End diff --git a/res/cardsfolder/resplendent_mentor.txt b/res/cardsfolder/resplendent_mentor.txt deleted file mode 100644 index 09417a97c4b..00000000000 --- a/res/cardsfolder/resplendent_mentor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Resplendent Mentor -ManaCost:4 W -Types:Creature Kithkin Cleric -Text:no text -PT:2/2 -K:stPumpAll:Creature.White+YouCtrl:0/0/SVar=GainLife:no Condition:White creatures you control have "Tap: You gain 1 life." -SVar:GainLife:AB$GainLife | Cost$ T | LifeAmount$ 1 | Defined$ You | SpellDescription$ You gain 1 life. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/resplendent_mentor.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/restless_apparition.txt b/res/cardsfolder/restless_apparition.txt deleted file mode 100644 index 9bdad0fde79..00000000000 --- a/res/cardsfolder/restless_apparition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Restless Apparition -ManaCost:WB WB WB -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ WB WB WB | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. -K:Persist -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/restless_apparition.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/94.jpg -End diff --git a/res/cardsfolder/restless_bones.txt b/res/cardsfolder/restless_bones.txt deleted file mode 100644 index 830d4193a12..00000000000 --- a/res/cardsfolder/restless_bones.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Restless Bones -ManaCost:2 B -Types:Creature Skeleton -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 3 B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ Target creature gains swampwalk until end of turn. -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/restless_bones.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/58.jpg -End diff --git a/res/cardsfolder/restless_dead.txt b/res/cardsfolder/restless_dead.txt deleted file mode 100644 index c0947a7ba0a..00000000000 --- a/res/cardsfolder/restless_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Restless Dead -ManaCost:1 B -Types:Creature Skeleton -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/restless_dead.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resurrection.txt b/res/cardsfolder/resurrection.txt deleted file mode 100644 index 5535523b775..00000000000 --- a/res/cardsfolder/resurrection.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Resurrection -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 W W | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/resurrection.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/218.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/220.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/218.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/12.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/resuscitate.txt b/res/cardsfolder/resuscitate.txt deleted file mode 100644 index d754822c11e..00000000000 --- a/res/cardsfolder/resuscitate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Resuscitate -ManaCost:1 G -Types:Instant -Text:Until end of turn, creatures you control gain "1: Regenerate this creature." (NOTE: This ability is not currently implemented.) -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:None -SVar:Picture:http://www.wizards.com/global/images/magic/general/resuscitate.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/retaliate.txt b/res/cardsfolder/retaliate.txt deleted file mode 100644 index f9ed74fb986..00000000000 --- a/res/cardsfolder/retaliate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Retaliate -ManaCost:2 W W -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature.dealtDamageToYouThisTurn | SpellDescription$ Destroy all creatures that dealt damage to you this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/retaliate.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/retract.txt b/res/cardsfolder/retract.txt deleted file mode 100644 index 5bfcf01b6d4..00000000000 --- a/res/cardsfolder/retract.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Retract -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ U | ChangeType$ Artifact.YouCtrl | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all artifacts you control to their owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/retract.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/retribution_of_the_meek.txt b/res/cardsfolder/retribution_of_the_meek.txt deleted file mode 100644 index 737f38bf116..00000000000 --- a/res/cardsfolder/retribution_of_the_meek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Retribution of the Meek -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 W | ValidCards$ Creature.powerGE4 | NoRegen$ True | SpellDescription$ Destroy all creatures with power 4 or greater. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/retribution_of_the_meek.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/119.jpg -End diff --git a/res/cardsfolder/retromancer.txt b/res/cardsfolder/retromancer.txt deleted file mode 100644 index f2eae1e56cc..00000000000 --- a/res/cardsfolder/retromancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Retromancer -ManaCost:2 R R -Types:Creature Viashino Shaman -Text:no text -PT:3/3 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, CARDNAME deals 3 damage to that spell or ability's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/retromancer.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/return_to_battle.txt b/res/cardsfolder/return_to_battle.txt deleted file mode 100644 index cbc4c2d084f..00000000000 --- a/res/cardsfolder/return_to_battle.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Return to Battle -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/return_to_battle.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/return_to_dust.txt b/res/cardsfolder/return_to_dust.txt deleted file mode 100644 index 0185292530b..00000000000 --- a/res/cardsfolder/return_to_dust.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Return to Dust -ManaCost:2 W W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 W W | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | TargetMin$ 1 | TargetMax$ X | SpellDescription$ 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. -SVar:X:Count$IfMainPhase.2.1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/return_to_dust.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reveillark.txt b/res/cardsfolder/reveillark.txt deleted file mode 100644 index 5ff00f1ae79..00000000000 --- a/res/cardsfolder/reveillark.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Reveillark -ManaCost:4 W -Types:Creature Elemental -Text:no text -PT:4/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturnCreatures | TriggerDescription$ When CARDNAME leaves the battlefield, return up to two target creature cards with power 2 or less from your graveyard to the battlefield. -K:Evoke:5 W -SVar:TrigReturnCreatures:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.powerLE2+YouCtrl | TgtPrompt$ Choose target creature -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reveillark.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reveille_squad.txt b/res/cardsfolder/reveille_squad.txt deleted file mode 100644 index 14bc28f4185..00000000000 --- a/res/cardsfolder/reveille_squad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reveille Squad -ManaCost:2 W W -Types:Creature Human Rebel -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigUntapAll | IsPresent$ Creature.untapped+Self | TriggerDescription$ Whenever one or more creatures attack you, if CARDNAME is untapped, you may untap all creatures you control. -SVar:TrigUntapAll:AB$UntapAll | Cost$ 0 | ValidCards$ Creature.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/reveille_squad.jpg -SVar:Rarity:Uncommon -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reveka_wizard_savant.txt b/res/cardsfolder/reveka_wizard_savant.txt deleted file mode 100644 index 75578ab83ee..00000000000 --- a/res/cardsfolder/reveka_wizard_savant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reveka, Wizard Savant -ManaCost:2 U U -Types:Legendary Creature Dwarf Wizard -Text:no text -PT:0/1 -A:AB$ DealDamage | Cost$ T | NumDmg$ 2 | Tgt$ TgtCP | SubAbility$ SVar=DBPump | SpellDescription$ CARDNAME deals 2 damage to target creature or player and doesn't untap during your next untap step. -SVar:DBPump:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reveka_wizard_savant.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/revelsong_horn.txt b/res/cardsfolder/revelsong_horn.txt deleted file mode 100644 index 4df2909df0c..00000000000 --- a/res/cardsfolder/revelsong_horn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Revelsong Horn -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 1 T tapXType<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/revelsong_horn.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/261.jpg -End diff --git a/res/cardsfolder/revenant.txt b/res/cardsfolder/revenant.txt deleted file mode 100644 index 786fbedd7fe..00000000000 --- a/res/cardsfolder/revenant.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Revenant -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:0/0 -K:Flying -K:stPumpSelf:Creature:X/X:No Condition:Revenant's power and toughness are each equal to the number of creature cards in your graveyard. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/revenant.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/18.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reverberate.txt b/res/cardsfolder/reverberate.txt deleted file mode 100644 index e0dc2c23ed0..00000000000 --- a/res/cardsfolder/reverberate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Reverberate -ManaCost:R R -Types:Instant -Text:no text -A:SP$ CopySpell | Cost$ R R | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reverberate.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/revered_dead.txt b/res/cardsfolder/revered_dead.txt deleted file mode 100644 index 63f59ca59e8..00000000000 --- a/res/cardsfolder/revered_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Revered Dead -ManaCost:1 W -Types:Creature Spirit Soldier -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ W | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122282.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reverence.txt b/res/cardsfolder/reverence.txt deleted file mode 100644 index 8fbf820eb32..00000000000 --- a/res/cardsfolder/reverence.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Reverence -ManaCost:2 W W -Types:Enchantment -Text:Creatures with power 2 or less can't attack you. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/reverence.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/revive.txt b/res/cardsfolder/revive.txt deleted file mode 100644 index 45886890752..00000000000 --- a/res/cardsfolder/revive.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Revive -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target green card in your graveyard | ValidTgts$ Card.Green+YouCtrl | SpellDescription$ Return target green card from your graveyard to your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/revive.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/revive_the_fallen.txt b/res/cardsfolder/revive_the_fallen.txt deleted file mode 100644 index bcf6bf8c077..00000000000 --- a/res/cardsfolder/revive_the_fallen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Revive the Fallen -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 B | ValidTgts$ Creature | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBClash | SpellDescription$ Return target creature card from a graveyard to its owner's hand. Clash with an opponent. If you win, return CARDNAME to its owner's hand. -SVar:DBClash:DB$Clash | WinSubAbility$ DBReturn -SVar:DBReturn:DB$ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/revive_the_fallen.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reviving_dose.txt b/res/cardsfolder/reviving_dose.txt deleted file mode 100644 index bde9de85ef3..00000000000 --- a/res/cardsfolder/reviving_dose.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Reviving Dose -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 2 W | LifeAmount$ 3 | SpellDescription$ You gain 3 life. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card22941.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/31.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/34.jpg -End diff --git a/res/cardsfolder/revoke_existence.txt b/res/cardsfolder/revoke_existence.txt deleted file mode 100644 index fb1e3a5fd90..00000000000 --- a/res/cardsfolder/revoke_existence.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Revoke Existence -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/revoke_existence.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reward_the_faithful.txt b/res/cardsfolder/reward_the_faithful.txt deleted file mode 100644 index e874e42d054..00000000000 --- a/res/cardsfolder/reward_the_faithful.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Reward the Faithful -ManaCost:W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | TargetMin$ 0 | TargetMax$ 2 | LifeAmount$ X | SpellDescription$ Any number of target players each gain life equal to the highest converted mana cost among permanents you control. -SVar:X:Count$MaxCMCYouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/reward_the_faithful.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rewind.txt b/res/cardsfolder/rewind.txt deleted file mode 100644 index 7a947aabe74..00000000000 --- a/res/cardsfolder/rewind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rewind -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBUntap | SpellDescription$ Counter target spell. Untap up to four lands. -SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rewind.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/96.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/93.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/reya_dawnbringer.txt b/res/cardsfolder/reya_dawnbringer.txt deleted file mode 100644 index 1f8385dbd7f..00000000000 --- a/res/cardsfolder/reya_dawnbringer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Reya Dawnbringer -ManaCost:6 W W W -Types:Legendary Creature Angel -Text:no text -PT:4/6 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return target creature card from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Cost$ 0 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card22965.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/33.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhox_bodyguard.txt b/res/cardsfolder/rhox_bodyguard.txt deleted file mode 100644 index bb4cf5a3113..00000000000 --- a/res/cardsfolder/rhox_bodyguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rhox Bodyguard -ManaCost:3 G W -Types:Creature Rhino Monk Soldier -Text:no text -PT:2/3 -K:Exalted -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_bodyguard.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhox_brute.txt b/res/cardsfolder/rhox_brute.txt deleted file mode 100644 index a58eef772f7..00000000000 --- a/res/cardsfolder/rhox_brute.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rhox Brute -ManaCost:2 R G -Types:Creature Rhino Warrior -Text:no text -PT:4/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_brute.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhox_charger.txt b/res/cardsfolder/rhox_charger.txt deleted file mode 100644 index cd2ab6a7256..00000000000 --- a/res/cardsfolder/rhox_charger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rhox Charger -ManaCost:3 G -Types:Creature Rhino Soldier -Text:no text -PT:3/3 -K:Trample -K:Exalted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_charger.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhox_meditant.txt b/res/cardsfolder/rhox_meditant.txt deleted file mode 100644 index 57954a5d2f5..00000000000 --- a/res/cardsfolder/rhox_meditant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rhox Meditant -ManaCost:3 W -Types:Creature Rhino Monk -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Green+YouCtrl | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, if you control a green permanent, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_meditant.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/16.jpg -End diff --git a/res/cardsfolder/rhox_pikemaster.txt b/res/cardsfolder/rhox_pikemaster.txt deleted file mode 100644 index fde376d7502..00000000000 --- a/res/cardsfolder/rhox_pikemaster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rhox Pikemaster -ManaCost:2 W W -Types:Creature Rhino Soldier -Text:no text -PT:3/3 -K:First Strike -K:stPumpAll:Creature.Soldier+Other+YouCtrl:0/0/First Strike:No Condition:Other Soldier creatures you control have first strike. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_pikemaster.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhox_war_monk.txt b/res/cardsfolder/rhox_war_monk.txt deleted file mode 100644 index 65b56ebb269..00000000000 --- a/res/cardsfolder/rhox_war_monk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rhox War Monk -ManaCost:G W U -Types:Creature Rhino Monk -Text:no text -PT:3/4 -K:Lifelink -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhox_war_monk.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhys_the_exiled.txt b/res/cardsfolder/rhys_the_exiled.txt deleted file mode 100644 index 41c5e56e6a5..00000000000 --- a/res/cardsfolder/rhys_the_exiled.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Rhys the Exiled -ManaCost:2 G -Types:Legendary Creature Elf Warrior -Text:no text -PT:3/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME attacks, you gain 1 life for each Elf you control. -A:AB$ Regenerate | Cost$ B Sac<1/Elf> | SpellDescription$ Regenerate Rhys the Exiled. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Elf.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhys_the_exiled.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhys_the_redeemed.txt b/res/cardsfolder/rhys_the_redeemed.txt deleted file mode 100644 index faa78120e7c..00000000000 --- a/res/cardsfolder/rhys_the_redeemed.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rhys the Redeemed -ManaCost:GW -Types:Legendary Creature Elf Warrior -Text:no text -PT:1/1 -A:AB$ Token | Cost$ 2 GW T | TokenAmount$ 1 | TokenName$ Elf Warrior | TokenTypes$ Creature,Elf,Warrior | TokenOwner$ You | TokenColors$ Green,White | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green and white Elf Warrior creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhys_the_redeemed.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhystic_deluge.txt b/res/cardsfolder/rhystic_deluge.txt deleted file mode 100644 index ec53dc9ebac..00000000000 --- a/res/cardsfolder/rhystic_deluge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rhystic Deluge -ManaCost:2 U -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Tap target creature unless its controller pays 1. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_deluge.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rhystic_study.txt b/res/cardsfolder/rhystic_study.txt deleted file mode 100644 index 1457d81f302..00000000000 --- a/res/cardsfolder/rhystic_study.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rhystic Study -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a spell, you may draw a card unless that player pays 1. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | UnlessCost$ 1 | UnlessPayer$ TriggeredPlayer | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rhystic_study.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rib_cage_spider.txt b/res/cardsfolder/rib_cage_spider.txt deleted file mode 100644 index 8bd3080c484..00000000000 --- a/res/cardsfolder/rib_cage_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rib Cage Spider -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:1/4 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24653.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ribbons_of_the_reikai.txt b/res/cardsfolder/ribbons_of_the_reikai.txt deleted file mode 100644 index d42d3087061..00000000000 --- a/res/cardsfolder/ribbons_of_the_reikai.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ribbons of the Reikai -ManaCost:4 U -Types:Sorcery Arcane -Text:no text -A:SP$ Draw | Cost$ 4 U | NumCards$ X | SpellDescription$ Draw a card for each Spirit you control. -SVar:X:Count$TypeYouCtrl.Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ribbons_of_the_reikai.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/50.jpg -End diff --git a/res/cardsfolder/riddlesmith.txt b/res/cardsfolder/riddlesmith.txt deleted file mode 100644 index ea043e08807..00000000000 --- a/res/cardsfolder/riddlesmith.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Riddlesmith -ManaCost:1 U -Types:Creature Human Artificer -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Artifact.YouCtrl | Execute$ TrigLoot | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, you may draw a card. If you do, discard a card. -SVar:TrigLoot:AB$Draw | Cost$ 0 | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/riddlesmith.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ridge_rannet.txt b/res/cardsfolder/ridge_rannet.txt deleted file mode 100644 index f0ea4def873..00000000000 --- a/res/cardsfolder/ridge_rannet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ridge Rannet -ManaCost:5 R R -Types:Creature Beast -Text:no text -PT:6/4 -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ridge_rannet.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ridged_kusite.txt b/res/cardsfolder/ridged_kusite.txt deleted file mode 100644 index 8776236e38d..00000000000 --- a/res/cardsfolder/ridged_kusite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ridged Kusite -ManaCost:B -Types:Creature Horror Spellshaper -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 B T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ First Strike | SpellDescription$ Target creature gets +1/+0 and gains first strike until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ridged_kusite.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/78.jpg -End diff --git a/res/cardsfolder/ridgeline_rager.txt b/res/cardsfolder/ridgeline_rager.txt deleted file mode 100644 index bb7c69dfc13..00000000000 --- a/res/cardsfolder/ridgeline_rager.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ridgeline Rager -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ridgeline_rager.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/215.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/100.jpg -End diff --git a/res/cardsfolder/ridgetop_raptor.txt b/res/cardsfolder/ridgetop_raptor.txt deleted file mode 100644 index f7fb72df9fb..00000000000 --- a/res/cardsfolder/ridgetop_raptor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ridgetop Raptor -ManaCost:3 R -Types:Creature Lizard Beast -Text:no text -PT:2/1 -K:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ridgetop_raptor.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riding_red_hare.txt b/res/cardsfolder/riding_red_hare.txt deleted file mode 100644 index cad043aaf20..00000000000 --- a/res/cardsfolder/riding_red_hare.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Riding Red Hare -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ Horsemanship | SpellDescription$ Target creature gets +3/+3 and gains horsemanship until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/riding_red_hare.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riding_the_dilu_horse.txt b/res/cardsfolder/riding_the_dilu_horse.txt deleted file mode 100644 index e1621158ffa..00000000000 --- a/res/cardsfolder/riding_the_dilu_horse.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Riding the Dilu Horse -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Horsemanship | Permanent$ True | SpellDescription$ Target creature gets +2/+2 and gains horsemanship. (It can't be blocked except by creatures with horsemanship. This effect lasts indefinitely.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/riding_the_dilu_horse.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rift_bolt.txt b/res/cardsfolder/rift_bolt.txt deleted file mode 100644 index 24336146379..00000000000 --- a/res/cardsfolder/rift_bolt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rift Bolt -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -K:Suspend:1:R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rift_bolt.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/176.jpg -End diff --git a/res/cardsfolder/riftwing_cloudskate.txt b/res/cardsfolder/riftwing_cloudskate.txt deleted file mode 100644 index d6f593bee6d..00000000000 --- a/res/cardsfolder/riftwing_cloudskate.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Riftwing Cloudskate -ManaCost:3 U U -Types:Creature Illusion -Text:no text -PT:2/2 -K:Flying -K:Suspend:3:1 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target permanent to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riftwing_cloudskate.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteous_avengers.txt b/res/cardsfolder/righteous_avengers.txt deleted file mode 100644 index f4a2aa844ba..00000000000 --- a/res/cardsfolder/righteous_avengers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Righteous Avengers -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:3/1 -K:Plainswalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1632.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteous_cause.txt b/res/cardsfolder/righteous_cause.txt deleted file mode 100644 index 0e0bb6d645f..00000000000 --- a/res/cardsfolder/righteous_cause.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Righteous Cause -ManaCost:3 W W -Types:Enchantment -Text:no text -T:Mode$ Attacks | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature attacks, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 | SpellDescription$ You gain 1 life for each attacking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/righteous_cause.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteous_charge.txt b/res/cardsfolder/righteous_charge.txt deleted file mode 100644 index feb8093e6bf..00000000000 --- a/res/cardsfolder/righteous_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Righteous Charge -ManaCost:1 W W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Creatures you control get +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6503.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/140.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteous_fury.txt b/res/cardsfolder/righteous_fury.txt deleted file mode 100644 index 8eb73a9967e..00000000000 --- a/res/cardsfolder/righteous_fury.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Righteous Fury -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature.tapped | RememberDestroyed$ True | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy all tapped creatures. You gain 2 life for each creature destroyed this way. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Remembered$Amount.Twice -SVar:Rarity:Rare -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal_Second_Age/righteous_fury.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/141.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteous_war.txt b/res/cardsfolder/righteous_war.txt deleted file mode 100644 index fde28f28ddb..00000000000 --- a/res/cardsfolder/righteous_war.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Righteous War -ManaCost:1 W B -Types:Enchantment -Text:no text -K:stPumpAll:Creature.White+YouCtrl:0/0/Protection from black:No Condition:White creatures you control have protection from black. -K:stPumpAll:Creature.Black+YouCtrl:0/0/Protection from white:No Condition:Black creatures you control have protection from white. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/righteous_war.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/righteousness.txt b/res/cardsfolder/righteousness.txt deleted file mode 100644 index 9f010fc6a28..00000000000 --- a/res/cardsfolder/righteousness.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Righteousness -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature.blocking | NumAtt$ +7 | NumDef$ +7 | TgtPrompt$ Select target blocking creature | SpellDescription$ Target blocking creature gets +7/+7 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/righteousness.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/220.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/222.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/332.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/296.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/36.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/36.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/27.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/221.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rime_dryad.txt b/res/cardsfolder/rime_dryad.txt deleted file mode 100644 index 17446eb36f3..00000000000 --- a/res/cardsfolder/rime_dryad.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rime Dryad -ManaCost:G -Types:Creature Dryad -Text:no text -PT:1/2 -K:Snow forestwalk -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rime_dryad.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rimebound_dead.txt b/res/cardsfolder/rimebound_dead.txt deleted file mode 100644 index d986e3e4dba..00000000000 --- a/res/cardsfolder/rimebound_dead.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rimebound Dead -ManaCost:B -Types:Snow Creature Skeleton -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ S | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rimebound_dead.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rimescale_dragon.txt b/res/cardsfolder/rimescale_dragon.txt deleted file mode 100644 index 17d9965f0b8..00000000000 --- a/res/cardsfolder/rimescale_dragon.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Rimescale Dragon -ManaCost:5 R R -Types:Snow Creature Dragon -Text:no text -PT:5/5 -K:Flying -A:AB$ PutCounter | Cost$ 2 S | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ ICE | CounterNum$ 1 | SubAbility$ SVar=DBTap | SpellDescription$ Put an ice counter on target creature. Tap that creature. -SVar:DBTap:DB$Tap | Defined$ Targeted -K:stPumpAll:Creature.countersGE1ICE:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:No Condition:Creatures with ice counters on them don't untap during their controllers' untap steps. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rimescale_dragon.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/95.jpg -End diff --git a/res/cardsfolder/rimewind_cryomancer.txt b/res/cardsfolder/rimewind_cryomancer.txt deleted file mode 100644 index 1772c35b606..00000000000 --- a/res/cardsfolder/rimewind_cryomancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rimewind Cryomancer -ManaCost:3 U -Types:Creature Human Wizard -Text:no text -PT:2/3 -A:AB$ Counter | Cost$ 1 T | TgtPrompt$ Select target Activated Ability | ValidTgts$ Card | TargetType$ Activated | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE4 | SpellDescription$ Counter target activated ability. Activate this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rimewind_cryomancer.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/43.jpg -End diff --git a/res/cardsfolder/rimewind_taskmage.txt b/res/cardsfolder/rimewind_taskmage.txt deleted file mode 100644 index 104dca6e2a4..00000000000 --- a/res/cardsfolder/rimewind_taskmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rimewind Taskmage -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -A:AB$ TapOrUntap | Cost$ 1 T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | IsPresent$ Permanent.Snow+YouCtrl | PresentCompare$ GE4 | SpellDescription$ You may tap or untap target permanent. Activate this ability only if you control four or more snow permanents. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rimewind_taskmage.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ring_of_gix.txt b/res/cardsfolder/ring_of_gix.txt deleted file mode 100644 index dd18fa66ba4..00000000000 --- a/res/cardsfolder/ring_of_gix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ring of Gix -ManaCost:3 -Types:Artifact -Text:no text -K:Echo:3 -A:AB$ Tap | Cost$ 1 T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ Tap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_gix.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/131.jpg -End diff --git a/res/cardsfolder/ring_of_immortals.txt b/res/cardsfolder/ring_of_immortals.txt deleted file mode 100644 index cf0b6f01403..00000000000 --- a/res/cardsfolder/ring_of_immortals.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ring of Immortals -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Counter | Cost$ 3 T | TargetType$ Spell | ValidTgts$ Instant,Aura | TargetValidTargeting$ Permanent.YouCtrl | TgtPrompt$ Select target instant or Aura spell | SpellDescription$ Counter target instant or Aura spell that targets a permanent you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_immortals.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ring_of_renewal.txt b/res/cardsfolder/ring_of_renewal.txt deleted file mode 100644 index ef41ffea86b..00000000000 --- a/res/cardsfolder/ring_of_renewal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ring of Renewal -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Discard | Cost$ 5 T | NumCards$ 1 | Mode$ Random | SpellDescription$ Discard a card at random, then draw two cards. | SubAbility$ SVar=DB -SVar:DB:DB$Draw | NumCards$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ring_of_renewal.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ringskipper.txt b/res/cardsfolder/ringskipper.txt deleted file mode 100644 index c490a0b4b4c..00000000000 --- a/res/cardsfolder/ringskipper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Ringskipper -ManaCost:1 U -Types:Creature Faerie Wizard -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, clash with an opponent. If you win, return CARDNAME to its owner's hand. -SVar:TrigClash:AB$Clash | Cost$ 0 | WinSubAbility$ DBReturn -SVar:DBReturn:DB$ChangeZone | Defined$ Self | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ringskipper.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riot_spikes.txt b/res/cardsfolder/riot_spikes.txt deleted file mode 100644 index 25e714daa99..00000000000 --- a/res/cardsfolder/riot_spikes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Riot Spikes -ManaCost:BR -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/-1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/riot_spikes.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rip_clan_crasher.txt b/res/cardsfolder/rip_clan_crasher.txt deleted file mode 100644 index 79efe328e93..00000000000 --- a/res/cardsfolder/rip_clan_crasher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rip-Clan Crasher -ManaCost:R G -Types:Creature Human Warrior -Text:no text -PT:2/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rip_clan_crasher.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide.txt b/res/cardsfolder/riptide.txt deleted file mode 100644 index ced5f07ba41..00000000000 --- a/res/cardsfolder/riptide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Riptide -ManaCost:U -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ U | ValidCards$ Creature.Blue | SpellDescription$ Tap all blue creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_biologist.txt b/res/cardsfolder/riptide_biologist.txt deleted file mode 100644 index 97876fa39f7..00000000000 --- a/res/cardsfolder/riptide_biologist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Riptide Biologist -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -K:Protection:Beast:Protection from Beasts -K:Morph:2 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_biologist.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_crab.txt b/res/cardsfolder/riptide_crab.txt deleted file mode 100644 index 22b5b012e6e..00000000000 --- a/res/cardsfolder/riptide_crab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Riptide Crab -ManaCost:1 W U -Types:Creature Crab -Text:no text -PT:1/3 -K:Vigilance -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_crab.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_director.txt b/res/cardsfolder/riptide_director.txt deleted file mode 100644 index c73ead7dec9..00000000000 --- a/res/cardsfolder/riptide_director.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Riptide Director -ManaCost:2 U U -Types:Creature Human Wizard -Text:no text -PT:2/3 -A:AB$ Draw | Cost$ 2 U U T | NumCards$ X | SpellDescription$ Draw a card for each Wizard you control. -SVar:X:Count$TypeYouCtrl.Wizard -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_director.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_laboratory.txt b/res/cardsfolder/riptide_laboratory.txt deleted file mode 100644 index cbb9f2c8fc1..00000000000 --- a/res/cardsfolder/riptide_laboratory.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Riptide Laboratory -ManaCost:no cost -Types:Land -A:AB$ Mana | Cost$T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 U T | ValidTgts$ Creature.Wizard | TgtPrompt$ Select target Wizard | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target Wizard you control to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_laboratory.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/322.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_pilferer.txt b/res/cardsfolder/riptide_pilferer.txt deleted file mode 100644 index 77cc00ed5d7..00000000000 --- a/res/cardsfolder/riptide_pilferer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Riptide Pilferer -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:1/1 -K:Morph:U -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_pilferer.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riptide_survivor.txt b/res/cardsfolder/riptide_survivor.txt deleted file mode 100644 index f697a3ff822..00000000000 --- a/res/cardsfolder/riptide_survivor.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Riptide Survivor -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/1 -K:Morph:1 U U -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is turned face up, discard two cards, then draw three cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_survivor.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rise_from_the_grave.txt b/res/cardsfolder/rise_from_the_grave.txt deleted file mode 100644 index e618f24a283..00000000000 --- a/res/cardsfolder/rise_from_the_grave.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rise from the Grave -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | SubAbility$ SVar=Animate | SpellDescription$ 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. -SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Zombie | Colors$ Black | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rise_from_the_grave.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/114.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/109.jpg -End diff --git a/res/cardsfolder/rise_of_the_hobgoblins.txt b/res/cardsfolder/rise_of_the_hobgoblins.txt deleted file mode 100644 index 5b50313ceb4..00000000000 --- a/res/cardsfolder/rise_of_the_hobgoblins.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rise of the Hobgoblins -ManaCost:RW RW -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may pay X. If you do, put X 1/1 red and white Goblin Soldier creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ X | TokenAmount$ X | TokenName$ Goblin Soldier | TokenTypes$ Creature,Goblin,Soldier | TokenOwner$ You | TokenColors$ Red,White | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$xPaid -A:AB$ PumpAll | Cost$ RW | ValidCards$ Creature.Red+YouCtrl,Creature.White+YouCtrl | KW$ First Strike | SpellDescription$ Red creatures and white creatures you control gain first strike until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rise_of_the_hobgoblins.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_airship.txt b/res/cardsfolder/rishadan_airship.txt deleted file mode 100644 index 0c1762c2a2c..00000000000 --- a/res/cardsfolder/rishadan_airship.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rishadan Airship -ManaCost:2 U -Types:Creature Human Pirate -Text:no text -PT:3/1 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_airship.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_brigand.txt b/res/cardsfolder/rishadan_brigand.txt deleted file mode 100644 index 17af1336588..00000000000 --- a/res/cardsfolder/rishadan_brigand.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Rishadan Brigand -ManaCost:4 U -Types:Creature Human Pirate -Text:no text -PT:3/2 -K:Flying -K:CARDNAME can block only creatures with flying. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each opponent sacrifices a permanent unless he or she pays 3. -SVar:TrigSac:DB$ Sacrifice | Defined$ Opponent | SacValid$ Permanent | SacMessage$ Permanent | UnlessCost$ 3 | UnlessPayer$ Opponent -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_brigand.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_cutpurse.txt b/res/cardsfolder/rishadan_cutpurse.txt deleted file mode 100644 index 4e6ec729262..00000000000 --- a/res/cardsfolder/rishadan_cutpurse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rishadan Cutpurse -ManaCost:2 U -Types:Creature Human Pirate -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each opponent sacrifices a permanent unless he or she pays 1. -SVar:TrigSac:DB$ Sacrifice | Defined$ Opponent | SacValid$ Permanent | SacMessage$ Permanent | UnlessCost$ 1 | UnlessPayer$ Opponent -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_cutpurse.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_footpad.txt b/res/cardsfolder/rishadan_footpad.txt deleted file mode 100644 index e8bb2f21c31..00000000000 --- a/res/cardsfolder/rishadan_footpad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rishadan Footpad -ManaCost:3 U -Types:Creature Human Pirate -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, each opponent sacrifices a permanent unless he or she pays 2. -SVar:TrigSac:DB$ Sacrifice | Defined$ Opponent | SacValid$ Permanent | SacMessage$ Permanent | UnlessCost$ 2 | UnlessPayer$ Opponent -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_footpad.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_pawnshop.txt b/res/cardsfolder/rishadan_pawnshop.txt deleted file mode 100644 index 3678fca1ce6..00000000000 --- a/res/cardsfolder/rishadan_pawnshop.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rishadan Pawnshop -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent.nonToken+YouCtrl | TgtPrompt$ Select target nontoken permanent you control | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SpellDescription$ Shuffle target nontoken permanent you control into its owner's library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_pawnshop.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rishadan_port.txt b/res/cardsfolder/rishadan_port.txt deleted file mode 100644 index e711cb6fae7..00000000000 --- a/res/cardsfolder/rishadan_port.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rishadan Port -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Tap | Cost$ 1 T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Tap target land. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_port.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rite_of_flame.txt b/res/cardsfolder/rite_of_flame.txt deleted file mode 100644 index fa7d12b7597..00000000000 --- a/res/cardsfolder/rite_of_flame.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rite of Flame -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Mana | Cost$ R | Produced$ R | Amount$ X | SpellDescription$ Add R R to your mana pool, then add R to your mana pool for each card named CARDNAME in each graveyard. -SVar:X:Count$NamedInAllYards.Rite of Flame/Plus.2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_flame.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rite_of_passage.txt b/res/cardsfolder/rite_of_passage.txt deleted file mode 100644 index e8e654794ab..00000000000 --- a/res/cardsfolder/rite_of_passage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rite of Passage -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ DamageDone | ValidTarget$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ 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.) -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredTarget | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_passage.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rite_of_replication.txt b/res/cardsfolder/rite_of_replication.txt deleted file mode 100644 index 22269f37b1d..00000000000 --- a/res/cardsfolder/rite_of_replication.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rite of Replication -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$CopyPermanent | Cost$ 7 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumCopies$ 5 | SpellDescription$ Kicker 5 (You may pay an additional 5 as you cast this spell.) -A:SP$CopyPermanent | Cost$ 2 U U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumCopies$ 1 | SpellDescription$ Put a token onto the battlefield that's a copy of target creature. If CARDNAME was kicked, put five of those tokens onto the battlefield instead. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rite_of_replication.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rites_of_flourishing.txt b/res/cardsfolder/rites_of_flourishing.txt deleted file mode 100644 index 608d346c716..00000000000 --- a/res/cardsfolder/rites_of_flourishing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rites of Flourishing -ManaCost:2 G -Types:Enchantment -Text:Each player may play an additional land on each of his or her turns. -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredPlayer -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rites_of_flourishing.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rith_the_awakener.txt b/res/cardsfolder/rith_the_awakener.txt deleted file mode 100644 index b2ca3a1bd6d..00000000000 --- a/res/cardsfolder/rith_the_awakener.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rith, the Awakener -ManaCost:3 R G W -Types:Legendary Creature Dragon -Text: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. -PT:6/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rith_the_awakener.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riths_attendant.txt b/res/cardsfolder/riths_attendant.txt deleted file mode 100644 index 368b83e4474..00000000000 --- a/res/cardsfolder/riths_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rith's Attendant -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced $R G W | SpellDescription$ Add R G W to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riths_attendant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riths_grove.txt b/res/cardsfolder/riths_grove.txt deleted file mode 100644 index 2c194d07170..00000000000 --- a/res/cardsfolder/riths_grove.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rith's Grove -ManaCost:no cost -Types:Land Lair -Text:When CARDNAME enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:NeedsToPlay:Land.nonLair+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/riths_grove.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ritual_of_restoration.txt b/res/cardsfolder/ritual_of_restoration.txt deleted file mode 100644 index 4af413704cb..00000000000 --- a/res/cardsfolder/ritual_of_restoration.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ritual of Restoration -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ritual_of_restoration.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ritual_of_steel.txt b/res/cardsfolder/ritual_of_steel.txt deleted file mode 100644 index 050ee767687..00000000000 --- a/res/cardsfolder/ritual_of_steel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ritual of Steel -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ritual_of_steel.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ritual_of_the_machine.txt b/res/cardsfolder/ritual_of_the_machine.txt deleted file mode 100644 index 09af9e9c890..00000000000 --- a/res/cardsfolder/ritual_of_the_machine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ritual of the Machine -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 2 B B Sac<1/Creature> | ValidTgts$ Creature.nonBlack+nonArtifact | TgtPrompt$Select target nonartifact, nonblack creature | SpellDescription$ Gain control of target nonblack, nonartifact creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ritual_of_the_machine.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riven_turnbull.txt b/res/cardsfolder/riven_turnbull.txt deleted file mode 100644 index db83e2061eb..00000000000 --- a/res/cardsfolder/riven_turnbull.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Riven Turnbull -ManaCost:5 U B -Types:Legendary Creature Human Advisor -Text:no text -PT:5/7 -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1680.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/294.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/river_bear.txt b/res/cardsfolder/river_bear.txt deleted file mode 100644 index fcbfce3a1f4..00000000000 --- a/res/cardsfolder/river_bear.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:River Bear -ManaCost:3 G -Types:Creature Bear -Text:no text -PT:3/3 -K:Islandwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83022.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/84.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/river_boa.txt b/res/cardsfolder/river_boa.txt deleted file mode 100644 index 0069ba6b1a6..00000000000 --- a/res/cardsfolder/river_boa.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:River Boa -ManaCost:1 G -Types:Creature Snake -Text:no text -PT:2/1 -K:Islandwalk -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/river_boa.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/68.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/249.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/river_delta.txt b/res/cardsfolder/river_delta.txt deleted file mode 100644 index 469b474d264..00000000000 --- a/res/cardsfolder/river_delta.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:River Delta -ManaCost:no cost -Types:Land -Text:no text -K:stPumpSelf:Permanent:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:isValid Permanent.countersGE1DEPLETION:CARDNAME doesn't untap during your untap step if it has a depletion counter on it. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add U to your mana pool. Put a depletion counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add B to your mana pool. Put a depletion counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At the beginning of your upkeep, remove a depletion counter from CARDNAME. -SVar:TrigSubCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:AddCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/river_delta.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/346.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/river_kaijin.txt b/res/cardsfolder/river_kaijin.txt deleted file mode 100644 index ed656e17cb2..00000000000 --- a/res/cardsfolder/river_kaijin.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:River Kaijin -ManaCost:2 U -Types:Creature Spirit -Text:no text -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card78586.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/river_merfolk.txt b/res/cardsfolder/river_merfolk.txt deleted file mode 100644 index 8cbd51af56e..00000000000 --- a/res/cardsfolder/river_merfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:River Merfolk -ManaCost:U U -Types:Creature Merfolk -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ U | KW$ Mountainwalk | SpellDescription$ CARDNAME gains mountainwalk until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/river_merfolk.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/riverfall_mimic.txt b/res/cardsfolder/riverfall_mimic.txt deleted file mode 100644 index dfc4bbd33c6..00000000000 --- a/res/cardsfolder/riverfall_mimic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Riverfall Mimic -ManaCost:1 UR -Types:Creature Shapeshifter -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.Blue+Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a spell that's both blue and red, CARDNAME becomes 3/3 and is unblockable until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ HIDDEN Unblockable -SVar:BuffedBy:Spell.Blue+Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/riverfall_mimic.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rix_maadi_dungeon_palace.txt b/res/cardsfolder/rix_maadi_dungeon_palace.txt deleted file mode 100644 index 6d670d82946..00000000000 --- a/res/cardsfolder/rix_maadi_dungeon_palace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rix Maadi, Dungeon Palace -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Discard | Cost$ 1 B R T | NumCards$ 1 | Mode$ TgtChoose | Defined$ Each | SorcerySpeed$ True | SpellDescription$ Each player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rix_maadi_dungeon_palace.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roar_of_reclamation.txt b/res/cardsfolder/roar_of_reclamation.txt deleted file mode 100644 index 5377d3bbae6..00000000000 --- a/res/cardsfolder/roar_of_reclamation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Roar of Reclamation -ManaCost:5 W W -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 5 W W | ChangeType$ Artifact | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Each player returns all artifact cards from his or her graveyard to the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_reclamation.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roar_of_the_wurm.txt b/res/cardsfolder/roar_of_the_wurm.txt deleted file mode 100644 index c919436ed16..00000000000 --- a/res/cardsfolder/roar_of_the_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Roar of the Wurm -ManaCost:6 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 6 G | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Creature,Wurm | TokenOwner$ You | TokenColors$ Green | TokenPower$ 6 | TokenToughness$ 6 | SpellDescription$ Put a 6/6 green Wurm creature token onto the battlefield. -A:SP$ Token | Cost$ 3 G | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Creature,Wurm | TokenOwner$ You | TokenColors$ Green | TokenPower$ 6 | TokenToughness$ 6 | Flashback$ True | CostDesc$ Flashback 3 G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/roar_of_the_wurm.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roaring_slagwurm.txt b/res/cardsfolder/roaring_slagwurm.txt deleted file mode 100644 index 129244e74e1..00000000000 --- a/res/cardsfolder/roaring_slagwurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Roaring Slagwurm -ManaCost:5 G G -Types:Creature Wurm -Text:no text -PT:6/4 -T:Mode$Attacks | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ Whenever CARDNAME attacks, tap all artifacts. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Artifact -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/roaring_slagwurm.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/robber_fly.txt b/res/cardsfolder/robber_fly.txt deleted file mode 100644 index b5f165e30f3..00000000000 --- a/res/cardsfolder/robber_fly.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Robber Fly -ManaCost:2 R -Types:Creature Insect -Text:Whenever Robber Fly becomes blocked, defending player discards all the cards in his or her hand, then draws that many cards. -PT:1/1 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/robber_fly.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/robe_of_mirrors.txt b/res/cardsfolder/robe_of_mirrors.txt deleted file mode 100644 index a30612e3609..00000000000 --- a/res/cardsfolder/robe_of_mirrors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Robe of Mirrors -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/robe_of_mirrors.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/43.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roc_egg.txt b/res/cardsfolder/roc_egg.txt deleted file mode 100644 index 8352ed482f3..00000000000 --- a/res/cardsfolder/roc_egg.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Roc Egg -ManaCost:2 W -Types:Creature Bird -Text:no text -PT:0/3 -K:Defender -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 3/3 white Bird creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenOwner$ TriggeredCardController | TokenColors$ White | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Flying -SVar:SacMe:4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/roc_egg.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roc_hatchling.txt b/res/cardsfolder/roc_hatchling.txt deleted file mode 100644 index beb90528cda..00000000000 --- a/res/cardsfolder/roc_hatchling.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Roc Hatchling -ManaCost:R -Types:Creature Bird -Text:no text -PT:0/1 -K:etbCounter:SHELL:4 -K:stPumpSelf:Creature:3/2/Flying:isValid Permanent.countersEQ0SHELL:As long as Roc Hatchling has no shell counters on it, it gets +3/+2 and has flying. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ At the beginning of your upkeep, remove a shell counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ SHELL | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/roc_hatchling.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roc_of_kher_ridges.txt b/res/cardsfolder/roc_of_kher_ridges.txt deleted file mode 100644 index 36f6a352e35..00000000000 --- a/res/cardsfolder/roc_of_kher_ridges.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Roc of Kher Ridges -ManaCost:3 R -Types:Creature Bird -Text:no text -PT:3/3 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/3e/en-us/card1313.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/171.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/172.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/171.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rock_badger.txt b/res/cardsfolder/rock_badger.txt deleted file mode 100644 index 41f8d50e2ff..00000000000 --- a/res/cardsfolder/rock_badger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rock Badger -ManaCost:4 R -Types:Creature Badger Beast -Text:no text -PT:3/3 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129715.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/210.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rock_basilisk.txt b/res/cardsfolder/rock_basilisk.txt deleted file mode 100644 index 4067ac49c03..00000000000 --- a/res/cardsfolder/rock_basilisk.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Rock Basilisk -ManaCost:4 R G -Types:Creature Basilisk -Text:no text -PT:4/5 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.nonWall | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonWall | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rock_basilisk.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/339.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rockcaster_platoon.txt b/res/cardsfolder/rockcaster_platoon.txt deleted file mode 100644 index 6952b4076ca..00000000000 --- a/res/cardsfolder/rockcaster_platoon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rockcaster Platoon -ManaCost:5 W W -Types:Creature Rhino Soldier -Text:no text -PT:5/7 -A:AB$ DamageAll | Cost$ 4 G | ValidCards$ Creature.withFlying | ValidPlayers$ Each | NumDmg$ 2 | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature with flying and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rockcaster_platoon.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rockshard_elemental.txt b/res/cardsfolder/rockshard_elemental.txt deleted file mode 100644 index a7321f3ff95..00000000000 --- a/res/cardsfolder/rockshard_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rockshard Elemental -ManaCost:5 R R -Types:Creature Elemental -Text:no text -PT:4/3 -K:Double Strike -K:Morph:4 R R -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rockshard_elemental.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rockslide_ambush.txt b/res/cardsfolder/rockslide_ambush.txt deleted file mode 100644 index 70e42d1760b..00000000000 --- a/res/cardsfolder/rockslide_ambush.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rockslide Ambush -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of Mountains you control to target creature. -SVar:X:Count$TypeYouCtrl.Mountain -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rockslide_ambush.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rockslide_elemental.txt b/res/cardsfolder/rockslide_elemental.txt deleted file mode 100644 index 5214b1d15ea..00000000000 --- a/res/cardsfolder/rockslide_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rockslide Elemental -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:1/1 -K:First Strike -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Creature.Other | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rockslide_elemental.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rocky_tar_pit.txt b/res/cardsfolder/rocky_tar_pit.txt deleted file mode 100644 index 85499ffac55..00000000000 --- a/res/cardsfolder/rocky_tar_pit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rocky Tar Pit -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Swamp,Mountain | ChangeNum$ 1 | SpellDescription$ Search your library for a Swamp or Mountain card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rocky_tar_pit.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rod_of_ruin.txt b/res/cardsfolder/rod_of_ruin.txt deleted file mode 100644 index d667522b90a..00000000000 --- a/res/cardsfolder/rod_of_ruin.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Rod of Ruin -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 3 T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rod_of_ruin.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/312.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/268.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/270.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/314.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/396.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/362.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/307.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/341.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/219.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/308.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/273.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rofellos_llanowar_emissary.txt b/res/cardsfolder/rofellos_llanowar_emissary.txt deleted file mode 100644 index b8824f960a5..00000000000 --- a/res/cardsfolder/rofellos_llanowar_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rofellos, Llanowar Emissary -ManaCost:G G -Types:Legendary Creature Elf Druid -Text:no text -PT:2/1 -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Forest you control. -SVar:X:Count$Valid Forest.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rofellos_llanowar_emissary.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rogue_kavu.txt b/res/cardsfolder/rogue_kavu.txt deleted file mode 100644 index e7f1eb15591..00000000000 --- a/res/cardsfolder/rogue_kavu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rogue Kavu -ManaCost:1 R -Types:Creature Kavu -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rogue_kavu.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/160.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roil_elemental.txt b/res/cardsfolder/roil_elemental.txt deleted file mode 100755 index ef0d743af3c..00000000000 --- a/res/cardsfolder/roil_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Roil Elemental -ManaCost:3 U U U -Types:Creature Elemental -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigGainControl | TriggerZones$ Battlefield | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may gain control of target creature for as long as you control CARDNAME. -SVar:TrigGainControl:AB$GainControl | Cost$ 0 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | LoseControl$ LeavesPlay,LoseControl | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. -SVar:BuffedBy:Land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/roil_elemental.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roiling_terrain.txt b/res/cardsfolder/roiling_terrain.txt deleted file mode 100644 index 9b416cdb17b..00000000000 --- a/res/cardsfolder/roiling_terrain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Roiling Terrain -ManaCost:2 R R -Types:Sorcery -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/roiling_terrain.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rolling_earthquake.txt b/res/cardsfolder/rolling_earthquake.txt deleted file mode 100644 index 2b07d913583..00000000000 --- a/res/cardsfolder/rolling_earthquake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rolling Earthquake -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X R | ValidCards$ Creature.withoutHorsemanship | ValidPlayers$ Each | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature without horsemanship and each player. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rolling_earthquake.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rolling_stones.txt b/res/cardsfolder/rolling_stones.txt deleted file mode 100644 index 413eda260fc..00000000000 --- a/res/cardsfolder/rolling_stones.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rolling Stones -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Wall:0/0/HIDDEN CARDNAME can attack as though it didn't have defender.:No Condition:Wall creatures can attack as though they didn't have defender. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rolling_stones.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/38.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/111.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ronin_cavekeeper.txt b/res/cardsfolder/ronin_cavekeeper.txt deleted file mode 100644 index ac4b5b47080..00000000000 --- a/res/cardsfolder/ronin_cavekeeper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ronin Cavekeeper -ManaCost:5 R -Types:Creature Human Samurai -Text:no text -PT:4/3 -K:Bushido 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ronin_cavekeeper.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ronin_cliffrider.txt b/res/cardsfolder/ronin_cliffrider.txt deleted file mode 100644 index 26a14a57559..00000000000 --- a/res/cardsfolder/ronin_cliffrider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ronin Cliffrider -ManaCost:3 R R -Types:Creature Human Samurai -Text:no text -PT:2/2 -K:Bushido 1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You| TriggerDescription$ Whenever CARDNAME attacks, you may have it deal 1 damage to each creature defending player controls. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.YouDontCtrl | NumDmg$ 1| ValidDescription$ each creature defending player controls. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ronin_cliffrider.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ronin_houndmaster.txt b/res/cardsfolder/ronin_houndmaster.txt deleted file mode 100644 index e0427108ecf..00000000000 --- a/res/cardsfolder/ronin_houndmaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ronin Houndmaster -ManaCost:2 R -Types:Creature Human Samurai -Text:no text -PT:2/2 -K:Haste -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ronin_houndmaster.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ronom_hulk.txt b/res/cardsfolder/ronom_hulk.txt deleted file mode 100644 index 6c3143b96b5..00000000000 --- a/res/cardsfolder/ronom_hulk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ronom Hulk -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:5/6 -K:Protection:Snow:Protection from snow -K:Cumulative upkeep:1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ronom_hulk.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ronom_unicorn.txt b/res/cardsfolder/ronom_unicorn.txt deleted file mode 100644 index d7208f1124e..00000000000 --- a/res/cardsfolder/ronom_unicorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ronom Unicorn -ManaCost:1 W -Types:Creature Unicorn -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ronom_unicorn.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/16.jpg -End diff --git a/res/cardsfolder/roofstalker_wight.txt b/res/cardsfolder/roofstalker_wight.txt deleted file mode 100644 index 746eef43a18..00000000000 --- a/res/cardsfolder/roofstalker_wight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Roofstalker Wight -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 1 U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/roofstalker_wight.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/102.jpg -End diff --git a/res/cardsfolder/root_cage.txt b/res/cardsfolder/root_cage.txt deleted file mode 100644 index ea201396ba8..00000000000 --- a/res/cardsfolder/root_cage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Root Cage -ManaCost:1 G -Types:Enchantment -Text:Mercenaries don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Mercenary -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/root_cage.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/root_elemental.txt b/res/cardsfolder/root_elemental.txt deleted file mode 100644 index 47a76d32a5c..00000000000 --- a/res/cardsfolder/root_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Root Elemental -ManaCost:4 G G -Types:Creature Elemental -Text:no text -PT:6/5 -K:Morph:5 G G -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is turned face up, you may put a creature card from your hand onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/root_elemental.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/root_maze.txt b/res/cardsfolder/root_maze.txt deleted file mode 100644 index 1d38058b967..00000000000 --- a/res/cardsfolder/root_maze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Root Maze -ManaCost:G -Types:Enchantment -Text:Artifacts and lands enter the battlefield tapped. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/root_maze.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/144.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/root_sliver.txt b/res/cardsfolder/root_sliver.txt deleted file mode 100644 index 1e44b6e0a43..00000000000 --- a/res/cardsfolder/root_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Root Sliver -ManaCost:3 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:CARDNAME can't be countered. -K:stPumpAll:Sliver:0/0/HIDDEN CARDNAME can't be countered.:No Condition:Sliver spells can't be countered by spells or abilities. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/root_sliver.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/root_spider.txt b/res/cardsfolder/root_spider.txt deleted file mode 100644 index aca1053227f..00000000000 --- a/res/cardsfolder/root_spider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Root Spider -ManaCost:3 G -Types:Creature Spider -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +1/+0 and gains first strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | KW$ First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/root_spider.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/67.jpg -End diff --git a/res/cardsfolder/rootbound_crag.txt b/res/cardsfolder/rootbound_crag.txt deleted file mode 100644 index 21db8afe155..00000000000 --- a/res/cardsfolder/rootbound_crag.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rootbound Crag -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped unless you control a Mountain or a Forest. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootbound_crag.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/227.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootbreaker_wurm.txt b/res/cardsfolder/rootbreaker_wurm.txt deleted file mode 100644 index 9e84d4c07a4..00000000000 --- a/res/cardsfolder/rootbreaker_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootbreaker Wurm -ManaCost:5 G G -Types:Creature Wurm -Text:no text -PT:6/6 -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/te/en-us/card4785.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/145.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootgrapple.txt b/res/cardsfolder/rootgrapple.txt deleted file mode 100644 index 10008814ae5..00000000000 --- a/res/cardsfolder/rootgrapple.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootgrapple -ManaCost:4 G -Types:Tribal Instant Treefolk -Text:no text -A:SP$ Destroy | Cost$ 4 G | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select target noncreature permanent | SpellDescription$ Destroy target noncreature permanent. If you control a Treefolk, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Treefolk.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Treefolk, -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootgrapple.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootrunner.txt b/res/cardsfolder/rootrunner.txt deleted file mode 100644 index 4fefd9cbc78..00000000000 --- a/res/cardsfolder/rootrunner.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rootrunner -ManaCost:2 G G -Types:Creature Spirit -Text:no text -PT:3/3 -A:AB$ ChangeZone | Cost$ G G Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target Land | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target land on top of its owner's library. -K:Soulshift:3 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootrunner.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roots.txt b/res/cardsfolder/roots.txt deleted file mode 100644 index 447c0c9e13c..00000000000 --- a/res/cardsfolder/roots.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Roots -ManaCost:3 G -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Enchant creature without flying -K:When CARDNAME enters the battlefield, tap enchanted creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/roots.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwalla.txt b/res/cardsfolder/rootwalla.txt deleted file mode 100644 index 019112b7867..00000000000 --- a/res/cardsfolder/rootwalla.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rootwalla -ManaCost:2 G -Types:Creature Lizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 G | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwalla.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/146.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/268.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_alligator.txt b/res/cardsfolder/rootwater_alligator.txt deleted file mode 100644 index 3c5bad9e149..00000000000 --- a/res/cardsfolder/rootwater_alligator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootwater Alligator -ManaCost:3 G -Types:Creature Crocodile -Text:no text -PT:3/2 -A:AB$ Regenerate | Cost$ Sac<1/Forest> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_alligator.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_commando.txt b/res/cardsfolder/rootwater_commando.txt deleted file mode 100644 index f1ee7a0becb..00000000000 --- a/res/cardsfolder/rootwater_commando.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootwater Commando -ManaCost:2 U -Types:Creature Merfolk -Text:no text -PT:2/2 -K:Islandwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129733.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/39.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_depths.txt b/res/cardsfolder/rootwater_depths.txt deleted file mode 100644 index 76f2b9d387f..00000000000 --- a/res/cardsfolder/rootwater_depths.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rootwater Depths -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://magiccards.info/scans/en/tp/329.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_diver.txt b/res/cardsfolder/rootwater_diver.txt deleted file mode 100644 index c2d687d425e..00000000000 --- a/res/cardsfolder/rootwater_diver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootwater Diver -ManaCost:U -Types:Creature Merfolk -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_diver.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_hunter.txt b/res/cardsfolder/rootwater_hunter.txt deleted file mode 100644 index 9485c9a66fe..00000000000 --- a/res/cardsfolder/rootwater_hunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rootwater Hunter -ManaCost:2 U -Types:Creature Merfolk -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_hunter.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_mystic.txt b/res/cardsfolder/rootwater_mystic.txt deleted file mode 100644 index 7df68d821e2..00000000000 --- a/res/cardsfolder/rootwater_mystic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rootwater Mystic -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Dig | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 1 | DestinationZone$ Library | LibraryPosition$ 0 | SpellDescription$ Look at the top card of target player's library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_mystic.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rootwater_thief.txt b/res/cardsfolder/rootwater_thief.txt deleted file mode 100644 index 08ac07d3e4c..00000000000 --- a/res/cardsfolder/rootwater_thief.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rootwater Thief -ManaCost:1 U -Types:Creature Merfolk Rogue -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigChangeZone | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 2 | Origin$ Library | Destination$ Exile | Defined$ Opponent | ChangeType$ Card | ChangeNum$ 1 | Chooser$ You | Shuffle$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rootwater_thief.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rorix_bladewing.txt b/res/cardsfolder/rorix_bladewing.txt deleted file mode 100644 index e5b7c3f5180..00000000000 --- a/res/cardsfolder/rorix_bladewing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rorix Bladewing -ManaCost:3 R R R -Types:Legendary Creature Dragon -Text:no text -PT:6/5 -K:Flying -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39859.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rot_wolf.txt b/res/cardsfolder/rot_wolf.txt deleted file mode 100644 index c51f758e315..00000000000 --- a/res/cardsfolder/rot_wolf.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rot Wolf -ManaCost:2 G -Types:Creature Wolf -Text:no text -PT:2/2 -K:Infect -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.DamagedBy | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rot_wolf.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roterothopter.txt b/res/cardsfolder/roterothopter.txt deleted file mode 100644 index 8b0a22e304e..00000000000 --- a/res/cardsfolder/roterothopter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Roterothopter -ManaCost:1 -Types:Artifact Creature Thopter -Text:no text -PT:0/2 -K:Flying -A:AB$ Pump | Cost$ 2 | NumAtt$ +1 | ActivationLimit$ 2 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/roterothopter.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rotlung_reanimator.txt b/res/cardsfolder/rotlung_reanimator.txt deleted file mode 100644 index e2aed4bd949..00000000000 --- a/res/cardsfolder/rotlung_reanimator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rotlung Reanimator -ManaCost:2 B -Types:Creature Zombie Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Cleric.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another Cleric is put into a graveyard from the battlefield, -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ put a 2/2 black Zombie creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ B 2 2 Zombie | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenColors$ Black | TokenOwner$ You | TokenAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rotlung_reanimator.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rotted_hystrix.txt b/res/cardsfolder/rotted_hystrix.txt deleted file mode 100644 index c1d49382878..00000000000 --- a/res/cardsfolder/rotted_hystrix.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rotted Hystrix -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:3/6 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rotted_hystrix.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rotting_legion.txt b/res/cardsfolder/rotting_legion.txt deleted file mode 100644 index 3a107050060..00000000000 --- a/res/cardsfolder/rotting_legion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rotting Legion -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:4/5 -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rotting_legion.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rotting_rats.txt b/res/cardsfolder/rotting_rats.txt deleted file mode 100644 index b4f8a3e3f40..00000000000 --- a/res/cardsfolder/rotting_rats.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rotting Rats -ManaCost:1 B -Types:Creature Zombie Rat -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, each player discards a card. -K:Unearth:1 B -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rotting_rats.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/roughshod_mentor.txt b/res/cardsfolder/roughshod_mentor.txt deleted file mode 100644 index ba731b46c89..00000000000 --- a/res/cardsfolder/roughshod_mentor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Roughshod Mentor -ManaCost:5 G -Types:Creature Giant Warrior -Text:no text -PT:5/4 -K:stPumpAll:Creature.Green+YouCtrl:0/0/Trample:No Condition:Green creatures you control have trample. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/roughshod_mentor.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rouse.txt b/res/cardsfolder/rouse.txt deleted file mode 100644 index cf2b496c88d..00000000000 --- a/res/cardsfolder/rouse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rouse -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | NumAtt$ +2 | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets +2/+0 until end of turn. -A:SP$ Pump | Cost$ PayLife<2> | ValidTgts$ Creature | NumAtt$ +2 | TgtPrompt$ Select target creature | isPresent$ Swamp.YouCtrl | SpellDescription$ If you control a Swamp, you may pay 2 life rather than pay Rouse's mana cost. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rouse.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rowan_treefolk.txt b/res/cardsfolder/rowan_treefolk.txt deleted file mode 100644 index c92eebc6977..00000000000 --- a/res/cardsfolder/rowan_treefolk.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Rowan Treefolk -ManaCost:3 G -Types:Creature Treefolk -Text:no text -PT:3/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4316.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/royal_assassin.txt b/res/cardsfolder/royal_assassin.txt deleted file mode 100644 index 73233a3040b..00000000000 --- a/res/cardsfolder/royal_assassin.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Royal Assassin -ManaCost:1 B B -Types:Creature Human Assassin -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | SpellDescription$ Destroy target tapped creature. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83235.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/159.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/32.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/32.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/41.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/159.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/174.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/116.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/110.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/33.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/royal_decree.txt b/res/cardsfolder/royal_decree.txt deleted file mode 100644 index b5d4ffdb7d2..00000000000 --- a/res/cardsfolder/royal_decree.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Royal Decree -ManaCost:2 W W -Types:Enchantment -Text:no text -K:Cumulative upkeep:W -T:Mode$ Taps | ValidCard$ Swamp,Mountain,Permanent.Black,Permanent.Red | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a Swamp, Mountain, black permanent, or red permanent becomes tapped, CARDNAME deals 1 damage to that permanent's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/royal_decree.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/royal_falcon.txt b/res/cardsfolder/royal_falcon.txt deleted file mode 100644 index 5f2d2c218d0..00000000000 --- a/res/cardsfolder/royal_falcon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Royal Falcon -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Starter_1999/royal_falcon.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/24.jpg -SetInfo:S00|Common|http://magiccards.info/scans/en/st2k/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/royal_herbalist.txt b/res/cardsfolder/royal_herbalist.txt deleted file mode 100644 index c0bbfcfd6ec..00000000000 --- a/res/cardsfolder/royal_herbalist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Royal Herbalist -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ 2 ExileFromTop<1/Card> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/royal_herbalist.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/147.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/royal_trooper.txt b/res/cardsfolder/royal_trooper.txt deleted file mode 100644 index ee0ba48ffed..00000000000 --- a/res/cardsfolder/royal_trooper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Royal Trooper -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://magiccards.info/scans/en/st/25.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rubinia_soulsinger.txt b/res/cardsfolder/rubinia_soulsinger.txt deleted file mode 100644 index 43dec19634c..00000000000 --- a/res/cardsfolder/rubinia_soulsinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rubinia Soulsinger -ManaCost:2 G W U -Types:Legendary Creature Faerie -Text:no text -PT:2/3 -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target creature for as long as you control Rubinia and Rubinia remains tapped. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rubinia_soulsinger.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruby_leech.txt b/res/cardsfolder/ruby_leech.txt deleted file mode 100644 index 0701c5c9478..00000000000 --- a/res/cardsfolder/ruby_leech.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ruby Leech -ManaCost:1 R -Types:Creature Leech -Text:Red spells you cast cost R more to cast. -PT:2/2 -K:First Strike -K:CostChange:Player:More:R:Spell:red:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruby_leech.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruby_medallion.txt b/res/cardsfolder/ruby_medallion.txt deleted file mode 100644 index ded051ebea3..00000000000 --- a/res/cardsfolder/ruby_medallion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ruby Medallion -ManaCost:2 -Types:Artifact -Text:Red spells you cast cost 1 less to cast. -K:CostChange:Player:Less:1:Spell:red:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruby_medallion.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rugged_prairie.txt b/res/cardsfolder/rugged_prairie.txt deleted file mode 100644 index afb98ec4291..00000000000 --- a/res/cardsfolder/rugged_prairie.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rugged Prairie -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ RW T | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ RW T | Produced$ W R | SpellDescription$ Add W R to your mana pool. -A:AB$ Mana | Cost$ RW T | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rugged_prairie.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruin_ghost.txt b/res/cardsfolder/ruin_ghost.txt deleted file mode 100644 index d0f196675da..00000000000 --- a/res/cardsfolder/ruin_ghost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ruin Ghost -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ W T | TargetMin$ 1 | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile | SubAbility$ SVar=DBReturn | SpellDescription$ Exile target land you control, then return it to the battlefield under your control. -SVar:DBReturn:DB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruin_ghost.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruination.txt b/res/cardsfolder/ruination.txt deleted file mode 100644 index c2a53babd5c..00000000000 --- a/res/cardsfolder/ruination.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Ruination -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 R | ValidCards$ Land.nonBasic | SpellDescription$ Destroy all nonbasic lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruination.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/95.jpg -End diff --git a/res/cardsfolder/ruinous_minotaur.txt b/res/cardsfolder/ruinous_minotaur.txt deleted file mode 100644 index 184fa346232..00000000000 --- a/res/cardsfolder/ruinous_minotaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ruinous Minotaur -ManaCost:1 R R -Types:Creature Minotaur Warrior -Text:no text -PT:5/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, sacrifice a land. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ You -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruinous_minotaur.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruins_of_trokair.txt b/res/cardsfolder/ruins_of_trokair.txt deleted file mode 100644 index b5674981321..00000000000 --- a/res/cardsfolder/ruins_of_trokair.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ruins of Trokair -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruins_of_trokair.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/438.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/327.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rukh_egg.txt b/res/cardsfolder/rukh_egg.txt deleted file mode 100644 index ecdf7c8423a..00000000000 --- a/res/cardsfolder/rukh_egg.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Rukh Egg -ManaCost:3 R -Types:Creature Bird -Text:no text -PT:0/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | DelayedTrigger$ DelTrigLeaves | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 4/4 red Bird creature token with flying onto the battlefield at the beginning of the next end step. -SVar:DelTrigLeaves:Mode$ Phase | Phase$ End of Turn | Execute$ TrigToken | TriggerDescription$ Put a 4/4 red Bird creature token with flying onto the battlefield at the beginning of the next end step. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenOwner$ You | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ Red | TokenKeywords$ Flying | TokenPower$ 4 | TokenToughness$ 4 | TokenAmount$ 1 -SVar:SacMe:4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rukh_egg.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/216.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/214.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/52.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/rumbling_crescendo.txt b/res/cardsfolder/rumbling_crescendo.txt deleted file mode 100644 index 8b964ef6ab7..00000000000 --- a/res/cardsfolder/rumbling_crescendo.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Rumbling Crescendo -ManaCost:3 R R -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ R Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy up to X target lands, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rumbling_crescendo.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rumbling_slum.txt b/res/cardsfolder/rumbling_slum.txt deleted file mode 100644 index f3708218e95..00000000000 --- a/res/cardsfolder/rumbling_slum.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rumbling Slum -ManaCost:1 R G G -Types:Creature Elemental -Text:no text -PT:5/5 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to each player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ Each | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rumbling_slum.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rummaging_wizard.txt b/res/cardsfolder/rummaging_wizard.txt deleted file mode 100644 index 6be1c6c7bdf..00000000000 --- a/res/cardsfolder/rummaging_wizard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rummaging Wizard -ManaCost:3 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Dig | Cost$ 2 U | DigNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. You may put that card into your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rummaging_wizard.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rune_cervin_rider.txt b/res/cardsfolder/rune_cervin_rider.txt deleted file mode 100644 index df74864d873..00000000000 --- a/res/cardsfolder/rune_cervin_rider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rune-Cervin Rider -ManaCost:3 W -Types:Creature Elf Knight -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ GW GW | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rune_cervin_rider.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/20.jpg -End diff --git a/res/cardsfolder/runeboggle.txt b/res/cardsfolder/runeboggle.txt deleted file mode 100644 index 84c4d325942..00000000000 --- a/res/cardsfolder/runeboggle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Runeboggle -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell unless its controller pays 1. Draw a card -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/runeboggle.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/runeclaw_bear.txt b/res/cardsfolder/runeclaw_bear.txt deleted file mode 100644 index 6626711a7ed..00000000000 --- a/res/cardsfolder/runeclaw_bear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Runeclaw Bear -ManaCost:1 G -Types:Creature Bear -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/runeclaw_bear.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/195.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/runed_arch.txt b/res/cardsfolder/runed_arch.txt deleted file mode 100644 index bb73737cece..00000000000 --- a/res/cardsfolder/runed_arch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Runed Arch -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ X T Sac<1/CARDNAME> | KW$ HIDDEN Unblockable | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | SpellDescription$ X target creatures with power 2 or less are unblockable this turn. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature.powerLE2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/runed_arch.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/309.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/runed_servitor.txt b/res/cardsfolder/runed_servitor.txt deleted file mode 100644 index db73f6aecf7..00000000000 --- a/res/cardsfolder/runed_servitor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Runed Servitor -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player draws a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ Each | NumCards$ 1 | SpellDescription$ Each player draws a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/runed_servitor.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/runed_stalactite.txt b/res/cardsfolder/runed_stalactite.txt deleted file mode 100644 index a3d794964f9..00000000000 --- a/res/cardsfolder/runed_stalactite.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Runed Stalactite -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1 and is every creature type. -K:eqPump 2:+1/+1/Changeling -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/runed_stalactite.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/runes_of_the_deus.txt b/res/cardsfolder/runes_of_the_deus.txt deleted file mode 100644 index 51b87a4e59b..00000000000 --- a/res/cardsfolder/runes_of_the_deus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Runes of the Deus -ManaCost:4 RG -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Red:1/1/Double Strike:No Condition:As long as enchanted creature is red, it gets +1/+1 and has double strike. (It deals both first-strike and regular combat damage.) -K:stPumpEnchanted:Creature.Green:1/1/Trample:No Condition:As long as enchanted creature is green, it gets +1/+1 and has trample. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/runes_of_the_deus.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rupture.txt b/res/cardsfolder/rupture.txt deleted file mode 100644 index 214a2761f02..00000000000 --- a/res/cardsfolder/rupture.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rupture -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 R Sac<1/Creature> | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to that creature's power to each creature without flying and each player. -SVar:X:Sacrificed$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rupture.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rush_of_knowledge.txt b/res/cardsfolder/rush_of_knowledge.txt deleted file mode 100644 index 1fefcc9ef3a..00000000000 --- a/res/cardsfolder/rush_of_knowledge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rush of Knowledge -ManaCost:4 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 4 U | Defined$ You | NumCards$ X | SpellDescription$ Draw cards equal to the highest converted mana cost among permanents you control. -SVar:X:Count$MaxCMCYouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rush_of_knowledge.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rushwood_dryad.txt b/res/cardsfolder/rushwood_dryad.txt deleted file mode 100644 index 7ec830125de..00000000000 --- a/res/cardsfolder/rushwood_dryad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rushwood Dryad -ManaCost:1 G -Types:Creature Dryad -Text:no text -PT:2/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card136285.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/278.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/263.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/294.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rushwood_elemental.txt b/res/cardsfolder/rushwood_elemental.txt deleted file mode 100644 index 35b2852d54a..00000000000 --- a/res/cardsfolder/rushwood_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Rushwood Elemental -ManaCost:G G G G G -Types:Creature Elemental -Text:no text -PT:4/4 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_elemental.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rushwood_herbalist.txt b/res/cardsfolder/rushwood_herbalist.txt deleted file mode 100644 index 1766e0170ca..00000000000 --- a/res/cardsfolder/rushwood_herbalist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rushwood Herbalist -ManaCost:2 G -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ G T Discard<1/Card> | SpellDescription$ Regenerate target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rushwood_herbalist.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rusted_slasher.txt b/res/cardsfolder/rusted_slasher.txt deleted file mode 100644 index 32d722326e8..00000000000 --- a/res/cardsfolder/rusted_slasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rusted Slasher -ManaCost:4 -Types:Artifact Creature Horror -Text:no text -PT:4/1 -A:AB$ Regenerate | Cost$ Sac<1/Artifact> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rusted_slasher.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rustic_clachan.txt b/res/cardsfolder/rustic_clachan.txt deleted file mode 100644 index 7cc85966563..00000000000 --- a/res/cardsfolder/rustic_clachan.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Rustic Clachan -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal a Kithkin card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ PutCounter | Cost$ 1 W Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | ActivatingZone$ Hand | PrecostDesc$ Reinforce 1 - | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/rustic_clachan.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rusting_golem.txt b/res/cardsfolder/rusting_golem.txt deleted file mode 100644 index a054d681116..00000000000 --- a/res/cardsfolder/rusting_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rusting Golem -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:*/* -K:Fading:5 -K:stSetPT:Count$CardCounters.FADE:Count$CardCounters.FADE:CARDNAME's power and toughness are each equal to the number of fade counters on CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rusting_golem.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rustrazor_butcher.txt b/res/cardsfolder/rustrazor_butcher.txt deleted file mode 100644 index 3e2c73e25e4..00000000000 --- a/res/cardsfolder/rustrazor_butcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rustrazor Butcher -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:1/2 -K:First Strike -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/rustrazor_butcher.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/rustspore_ram.txt b/res/cardsfolder/rustspore_ram.txt deleted file mode 100644 index 79fc04efbbd..00000000000 --- a/res/cardsfolder/rustspore_ram.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Rustspore Ram -ManaCost:4 -Types:Artifact Creature Sheep -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target Equipment. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Equipment | TgtPrompt$ Select target Equipment. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/rustspore_ram.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruthless_cullblade.txt b/res/cardsfolder/ruthless_cullblade.txt deleted file mode 100644 index 61e77908cab..00000000000 --- a/res/cardsfolder/ruthless_cullblade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ruthless Cullblade -ManaCost:1 B -Types:Creature Vampire Warrior -Text:no text -PT:2/1 -K:stPumpSelf:Creature:2/1:OppLifeLE/10:CARDNAME gets +2/+1 as long as an opponent has 10 or less life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruthless_cullblade.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ruthless_invasion.txt b/res/cardsfolder/ruthless_invasion.txt deleted file mode 100644 index 0ac165e2954..00000000000 --- a/res/cardsfolder/ruthless_invasion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ruthless Invasion -ManaCost:3 PR -Types:Sorcery -Text:no text -A:SP$ Effect | Cost$ 3 PR | Name$ Ruthless Invasion Effect | Keywords$ KWPump | SpellDescription$ Nonartifact creatures can't block this turn. -SVar:KWPump:stPumpAll:Creature.nonArtifact:0/0/CARDNAME can't block.:no Condition:Nonartifact creatures can't block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ruthless_invasion.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ryusei_the_falling_star.txt b/res/cardsfolder/ryusei_the_falling_star.txt deleted file mode 100644 index 8c73912fa4f..00000000000 --- a/res/cardsfolder/ryusei_the_falling_star.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Ryusei, the Falling Star -ManaCost:5 R -Types:Legendary Creature Dragon Spirit -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals 5 damage to each creature without flying. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.withoutFlying | NumDmg$ 5 | ValidDescription$ each creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79242.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saber_ants.txt b/res/cardsfolder/saber_ants.txt deleted file mode 100644 index 09ad6bf6ec2..00000000000 --- a/res/cardsfolder/saber_ants.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Saber Ants -ManaCost:3 G -Types:Creature Insect -Text:no text -PT:2/3 -T:Mode$ DamageDone | Execute$ TrigToken | ValidTarget$ Card.Self | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME is dealt damage, you may put that many 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/saber_ants.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saberclaw_golem.txt b/res/cardsfolder/saberclaw_golem.txt deleted file mode 100644 index 5db21cc2b7f..00000000000 --- a/res/cardsfolder/saberclaw_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Saberclaw Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:4/2 -A:AB$ Pump | Cost$ R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/saberclaw_golem.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/200.jpg -End diff --git a/res/cardsfolder/sabertooth_alley_cat.txt b/res/cardsfolder/sabertooth_alley_cat.txt deleted file mode 100644 index 5db678156ff..00000000000 --- a/res/cardsfolder/sabertooth_alley_cat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sabertooth Alley Cat -ManaCost:1 R R -Types:Creature Cat -Text:no text -PT:2/1 -K:CARDNAME attacks each turn if able. -A:AB$ Pump | Cost$ 1 R | KW$ CantBeBlockedBy Creature.withoutDefender | SpellDescription$ Creatures without defender can't block CARDNAME this turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/sabertooth_alley_cat.jpg -SVar:Rarity:Common -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/140.jpg -End diff --git a/res/cardsfolder/sabertooth_nishoba.txt b/res/cardsfolder/sabertooth_nishoba.txt deleted file mode 100644 index afdb458a0ce..00000000000 --- a/res/cardsfolder/sabertooth_nishoba.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sabertooth Nishoba -ManaCost:4 G W -Types:Creature Cat Beast Warrior -Text:no text -PT:5/5 -K:Trample -K:Protection from blue -K:Protection from red -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sabertooth_nishoba.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sabertooth_wyvern.txt b/res/cardsfolder/sabertooth_wyvern.txt deleted file mode 100644 index 79767a38ee1..00000000000 --- a/res/cardsfolder/sabertooth_wyvern.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sabertooth Wyvern -ManaCost:4 R -Types:Creature Drake -Text:no text -PT:3/2 -K:Flying -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sabertooth_wyvern.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sabretooth_tiger.txt b/res/cardsfolder/sabretooth_tiger.txt deleted file mode 100644 index 2edd3d712bf..00000000000 --- a/res/cardsfolder/sabretooth_tiger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sabretooth Tiger -ManaCost:2 R -Types:Creature Cat -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sabretooth_tiger.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/217.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/264.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/203.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/215.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacellum_archers.txt b/res/cardsfolder/sacellum_archers.txt deleted file mode 100644 index 2eafeeeda19..00000000000 --- a/res/cardsfolder/sacellum_archers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sacellum Archers -ManaCost:2 G -Types:Creature Elf Archer -Text:no text -PT:2/3 -A:AB$ DealDamage | Cost$ R W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacellum_archers.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sachi_daughter_of_seshiro.txt b/res/cardsfolder/sachi_daughter_of_seshiro.txt deleted file mode 100644 index b5c1763cdb6..00000000000 --- a/res/cardsfolder/sachi_daughter_of_seshiro.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sachi, Daughter of Seshiro -ManaCost:2 G G -Types:Legendary Creature Snake Shaman -Text:no text -PT:1/3 -K:stPumpAll:Snake.Other+YouCtrl:0/1:no Condition:Other Snake creatures you control get +0/+1. -K:stPumpAll:Shaman.YouCtrl:0/0/SVar=Mana:no Condition:Shamans you control have "Tap: Add G G to your mana pool." -SVar:Mana:AB$Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sachi_daughter_of_seshiro.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacred_foundry.txt b/res/cardsfolder/sacred_foundry.txt deleted file mode 100644 index dddb6abbafb..00000000000 --- a/res/cardsfolder/sacred_foundry.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Sacred Foundry -ManaCost:no cost -Types:Land Mountain Plains -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89066.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacred_knight.txt b/res/cardsfolder/sacred_knight.txt deleted file mode 100644 index fa619aa1e4e..00000000000 --- a/res/cardsfolder/sacred_knight.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sacred Knight -ManaCost:3 W -Types:Creature Human Knight -Text:CARDNAME can't be blocked by black and/or red creatures. -PT:3/2 -K:CantBeBlockedBy Creature.Black,Creature.Red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_knight.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacred_nectar.txt b/res/cardsfolder/sacred_nectar.txt deleted file mode 100644 index 10aa82a811e..00000000000 --- a/res/cardsfolder/sacred_nectar.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sacred Nectar -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_nectar.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/40.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/26.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/187.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/38.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/37.jpg -End diff --git a/res/cardsfolder/sacred_prey.txt b/res/cardsfolder/sacred_prey.txt deleted file mode 100644 index 5eb7c83eff3..00000000000 --- a/res/cardsfolder/sacred_prey.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sacred Prey -ManaCost:G -Types:Creature Horse -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigGain | TriggerDescription$ Whenever CARDNAME becomes blocked, you gain 2 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_prey.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacred_wolf.txt b/res/cardsfolder/sacred_wolf.txt deleted file mode 100644 index 3b25147a341..00000000000 --- a/res/cardsfolder/sacred_wolf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sacred Wolf -ManaCost:2 G -Types:Creature Wolf -Text:no text -PT:3/1 -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_wolf.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sacrifice.txt b/res/cardsfolder/sacrifice.txt deleted file mode 100644 index 9f413c68610..00000000000 --- a/res/cardsfolder/sacrifice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sacrifice -ManaCost:B -Types:Instant -Text:no text -A:SP$ Mana | Cost$ B Sac<1/Creature> | Produced$ B | Amount$ X | SpellDescription$ Add to your mana pool an amount of black mana equal to the sacrificed creature's converted mana cost. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacrifice.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/33.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/33.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/34.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sadistic_augermage.txt b/res/cardsfolder/sadistic_augermage.txt deleted file mode 100644 index 2ff28a61287..00000000000 --- a/res/cardsfolder/sadistic_augermage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sadistic Augermage -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player puts a card from his or her hand on top of his or her library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | Mandatory$ True | ChangeType$ Card | ChangeNum$ 1 | Defined$ Each -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sadistic_augermage.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sadistic_glee.txt b/res/cardsfolder/sadistic_glee.txt deleted file mode 100644 index ffc42387305..00000000000 --- a/res/cardsfolder/sadistic_glee.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sadistic Glee -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, put a +1/+1 counter on enchanted creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sadistic_glee.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sadistic_hypnotist.txt b/res/cardsfolder/sadistic_hypnotist.txt deleted file mode 100644 index fed267f8a3b..00000000000 --- a/res/cardsfolder/sadistic_hypnotist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sadistic Hypnotist -ManaCost:3 B B -Types:Creature Human Minion -Text:no text -PT:2/2 -A:AB$ Discard | Cost$ Sac<1/Creature> | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SorcerySpeed$ True | SpellDescription$ Target player discards two cards. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sadistic_hypnotist.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/safehold_duo.txt b/res/cardsfolder/safehold_duo.txt deleted file mode 100644 index 1a58606e2db..00000000000 --- a/res/cardsfolder/safehold_duo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Safehold Duo -ManaCost:3 GW -Types:Creature Elf Warrior Shaman -Text:no text -PT:2/4 -T:Mode$ SpellCast | ValidCard$ Card.Green+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump11 | TriggerDescription$ Whenever you cast a green spell, CARDNAME gets +1/+1 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpKW | TriggerDescription$ Whenever you cast a white spell, CARDNAME gains vigilance until end of turn. -SVar:TrigPump11:AB$Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ +1 | Defined$ Self -SVar:TrigPumpKW:AB$Pump | Cost$ 0 | KW$ Vigilance | Defined$ Self -SVar:BuffedBy:Card.Green,Card.White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/safehold_duo.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/safehold_elite.txt b/res/cardsfolder/safehold_elite.txt deleted file mode 100644 index e6ec9db07b3..00000000000 --- a/res/cardsfolder/safehold_elite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Safehold Elite -ManaCost:1 GW -Types:Creature Elf Scout -Text:no text -PT:2/2 -K:Persist -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/safehold_elite.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/safehold_sentry.txt b/res/cardsfolder/safehold_sentry.txt deleted file mode 100644 index ff960d314ed..00000000000 --- a/res/cardsfolder/safehold_sentry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Safehold Sentry -ManaCost:1 W -Types:Creature Elf Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 2 W Untap | NumDef$ +2 | SpellDescription$ CARDNAME gets +0/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/safehold_sentry.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/22.jpg -End diff --git a/res/cardsfolder/safewright_quest.txt b/res/cardsfolder/safewright_quest.txt deleted file mode 100644 index d5330b8aa88..00000000000 --- a/res/cardsfolder/safewright_quest.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Safewright Quest -ManaCost:GW -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ GW | Origin$ Library | Destination$ Hand | ChangeType$ Forest,Plains | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest or Plains card, reveal it, and put it into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/safewright_quest.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sage_aven.txt b/res/cardsfolder/sage_aven.txt deleted file mode 100644 index b89b6a29a2d..00000000000 --- a/res/cardsfolder/sage_aven.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sage Aven -ManaCost:3 U -Types:Creature Bird Wizard -Text:no text -PT:1/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_aven.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/111.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sage_of_epityr.txt b/res/cardsfolder/sage_of_epityr.txt deleted file mode 100644 index 88af112f261..00000000000 --- a/res/cardsfolder/sage_of_epityr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sage of Epityr -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_epityr.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sage_of_lat_nam.txt b/res/cardsfolder/sage_of_lat_nam.txt deleted file mode 100644 index e76e08f93cd..00000000000 --- a/res/cardsfolder/sage_of_lat_nam.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sage of Lat-Nam -ManaCost:1 U -Types:Creature Human Artificer -Text:no text -PT:1/2 -A:AB$ Draw | Cost$ T Sac<1/Artifact> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_lat_nam.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/97.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/57.jpg -End diff --git a/res/cardsfolder/sage_owl.txt b/res/cardsfolder/sage_owl.txt deleted file mode 100644 index bdb1db5f1eb..00000000000 --- a/res/cardsfolder/sage_owl.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Sage Owl -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_owl.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/98.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/96.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/104.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/69.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/95.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sages_dousing.txt b/res/cardsfolder/sages_dousing.txt deleted file mode 100644 index ffb401ab1ed..00000000000 --- a/res/cardsfolder/sages_dousing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sage's Dousing -ManaCost:2 U -Types:Tribal Instant Wizard -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell unless its controller pays 3. If you control a Wizard, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Wizard.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Wizard, -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sages_dousing.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sages_knowledge.txt b/res/cardsfolder/sages_knowledge.txt deleted file mode 100644 index 5b667e6289d..00000000000 --- a/res/cardsfolder/sages_knowledge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sage's Knowledge -ManaCost:2 U -Types:Sorcery -Text: -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target sorcery card in your graveyard | ValidTgts$ Sorcery.YouCtrl | SpellDescription$ Return target sorcery card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sages_knowledge.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sailmonger.txt b/res/cardsfolder/sailmonger.txt deleted file mode 100644 index 76277276f62..00000000000 --- a/res/cardsfolder/sailmonger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sailmonger -ManaCost:3 U -Types:Creature Human Monger -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 | AnyPlayer$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. Any player may activate this ability. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sailmonger.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sakura_tribe_elder.txt b/res/cardsfolder/sakura_tribe_elder.txt deleted file mode 100644 index 7beccec5b98..00000000000 --- a/res/cardsfolder/sakura_tribe_elder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sakura-Tribe Elder -ManaCost:1 G -Types:Creature Snake Shaman -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50510.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sakura_tribe_scout.txt b/res/cardsfolder/sakura_tribe_scout.txt deleted file mode 100644 index d5ad0d7eefa..00000000000 --- a/res/cardsfolder/sakura_tribe_scout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sakura-Tribe Scout -ManaCost:G -Types:Creature Snake Shaman Scout -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ You may put a land card from your hand onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sakura_tribe_scout.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salt_flats.txt b/res/cardsfolder/salt_flats.txt deleted file mode 100644 index 95d234a838f..00000000000 --- a/res/cardsfolder/salt_flats.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Salt Flats -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/salt_flats.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salt_marsh.txt b/res/cardsfolder/salt_marsh.txt deleted file mode 100644 index ff44c227f8d..00000000000 --- a/res/cardsfolder/salt_marsh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Salt Marsh -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/salt_marsh.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/325.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saltblast.txt b/res/cardsfolder/saltblast.txt deleted file mode 100644 index 68c8f50bd4a..00000000000 --- a/res/cardsfolder/saltblast.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Saltblast -ManaCost:3 W W -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 W W | ValidTgts$ Permanent.nonWhite | TgtPrompt$ Select target nonwhite permanent | SpellDescription$ Destroy target nonwhite permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122435.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/15.jpg -End diff --git a/res/cardsfolder/saltcrusted_steppe.txt b/res/cardsfolder/saltcrusted_steppe.txt deleted file mode 100644 index eb2e2866ce0..00000000000 --- a/res/cardsfolder/saltcrusted_steppe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Saltcrusted Steppe -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ PutCounter | Cost$ 1 T | CounterType$ STORAGE | CounterNum$ 1 | SpellDescription$ Put a storage counter on CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/saltcrusted_steppe.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saltfield_recluse.txt b/res/cardsfolder/saltfield_recluse.txt deleted file mode 100644 index 34353eaea92..00000000000 --- a/res/cardsfolder/saltfield_recluse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Saltfield Recluse -ManaCost:2 W -Types:Creature Human Rebel Cleric -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | NumAtt$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/saltfield_recluse.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salvage.txt b/res/cardsfolder/salvage.txt deleted file mode 100644 index 5a8c7b705d4..00000000000 --- a/res/cardsfolder/salvage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Salvage -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | TgtPrompt$ Choose target card in your graveyard | ValidTgts$ Card.YouCtrl | SpellDescription$ Put target card from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/salvage.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salvage_scout.txt b/res/cardsfolder/salvage_scout.txt deleted file mode 100644 index f63ab0f538d..00000000000 --- a/res/cardsfolder/salvage_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Salvage Scout -ManaCost:W -Types:Creature Human Scout -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ W Sac<1/CARDNAME> | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target artifact card from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_scout.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salvage_slasher.txt b/res/cardsfolder/salvage_slasher.txt deleted file mode 100644 index 4ea8de67546..00000000000 --- a/res/cardsfolder/salvage_slasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Salvage Slasher -ManaCost:1 B -Types:Artifact Creature Human Rogue -Text:no text -PT:1/1 -K:stPumpSelf:Creature:X/0:no Condition:Salvage Slasher gets +1/+0 for each artifact card in your graveyard. -SVar:X:Count$TypeInYourYard.Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_slasher.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/salvage_titan.txt b/res/cardsfolder/salvage_titan.txt deleted file mode 100644 index 6f93ca0f99c..00000000000 --- a/res/cardsfolder/salvage_titan.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Salvage Titan -ManaCost:4 B B -Types:Artifact Creature Golem -Text:no text -PT:6/4 -SVar:AltCost:Sac<3/Artifact>$You may sacrifice three artifacts creatures rather than pay CARDNAME's mana cost. -A:AB$ ChangeZone | Cost$ ExileFromGrave<3/Artifact> | Origin$ Graveyard | Destination$ Hand | Defined$ Self | ActivatingZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/salvage_titan.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/84.jpg -End diff --git a/res/cardsfolder/samite_archer.txt b/res/cardsfolder/samite_archer.txt deleted file mode 100644 index 1e124b770eb..00000000000 --- a/res/cardsfolder/samite_archer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Samite Archer -ManaCost:1 W U -Types:Creature Human Cleric Archer -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/samite_archer.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/samite_healer.txt b/res/cardsfolder/samite_healer.txt deleted file mode 100644 index b3c75055c13..00000000000 --- a/res/cardsfolder/samite_healer.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Samite Healer -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/samite_healer.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/41.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/221.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/223.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/38.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/334.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/297.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/39.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/38.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/40.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/222.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/samurai_enforcers.txt b/res/cardsfolder/samurai_enforcers.txt deleted file mode 100644 index ff84bcf3ec9..00000000000 --- a/res/cardsfolder/samurai_enforcers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Samurai Enforcers -ManaCost:4 W W -Types:Creature Human Samurai -Text:no text -PT:4/4 -K:Bushido 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/samurai_enforcers.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanctimony.txt b/res/cardsfolder/sanctimony.txt deleted file mode 100644 index 1bf53325cf9..00000000000 --- a/res/cardsfolder/sanctimony.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sanctimony -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Mountain.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever an opponent taps a Mountain for mana, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctimony.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/42.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/16.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanctum_custodian.txt b/res/cardsfolder/sanctum_custodian.txt deleted file mode 100644 index 76e81336148..00000000000 --- a/res/cardsfolder/sanctum_custodian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sanctum Custodian -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ PreventDamage | Cost$ T | Tgt$ TgtCP | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctum_custodian.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanctum_gargoyle.txt b/res/cardsfolder/sanctum_gargoyle.txt deleted file mode 100644 index 354786a9b8c..00000000000 --- a/res/cardsfolder/sanctum_gargoyle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sanctum Gargoyle -ManaCost:3 W -Types:Artifact Creature Gargoyle -Text:no text -PT:2/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target artifact card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctum_gargoyle.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanctum_plowbeast.txt b/res/cardsfolder/sanctum_plowbeast.txt deleted file mode 100644 index b92fb200fa9..00000000000 --- a/res/cardsfolder/sanctum_plowbeast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sanctum Plowbeast -ManaCost:4 W U -Types:Artifact Creature Beast -Text:no text -PT:3/6 -K:Defender -K:TypeCycling:Island:2 -K:TypeCycling:Plains:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanctum_plowbeast.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sand_silos.txt b/res/cardsfolder/sand_silos.txt deleted file mode 100644 index a09f77acb9b..00000000000 --- a/res/cardsfolder/sand_silos.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sand Silos -ManaCost:no cost -Types:Land -Text:At the beginning of your upkeep, if CARDNAME is tapped, put a storage counter on it. -K:CARDNAME enters the battlefield tapped. -K:You may choose not to untap CARDNAME during your untap step. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sand_silos.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/439.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandbar_merfolk.txt b/res/cardsfolder/sandbar_merfolk.txt deleted file mode 100644 index fc96416911a..00000000000 --- a/res/cardsfolder/sandbar_merfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sandbar Merfolk -ManaCost:U -Types:Creature Merfolk -Text:no text -PT:1/1 -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandbar_merfolk.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandbar_serpent.txt b/res/cardsfolder/sandbar_serpent.txt deleted file mode 100644 index 9e76817dcbc..00000000000 --- a/res/cardsfolder/sandbar_serpent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sandbar Serpent -ManaCost:4 U -Types:Creature Serpent -Text:no text -PT:3/4 -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandbar_serpent.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandskin.txt b/res/cardsfolder/sandskin.txt deleted file mode 100644 index ab4210cb429..00000000000 --- a/res/cardsfolder/sandskin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sandskin -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME.:Prevent all combat damage that would be dealt to and dealt by enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandskin.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandsower.txt b/res/cardsfolder/sandsower.txt deleted file mode 100644 index 1e4e9cbce77..00000000000 --- a/res/cardsfolder/sandsower.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sandsower -ManaCost:3 W -Types:Creature Spirit -Text:no text -PT:1/3 -A:AB$ Tap | Cost$ tapXType<3/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandsower.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/28.jpg -End diff --git a/res/cardsfolder/sandstone_needle.txt b/res/cardsfolder/sandstone_needle.txt deleted file mode 100644 index 33dac71e8c1..00000000000 --- a/res/cardsfolder/sandstone_needle.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sandstone Needle -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:DEPLETION:2 -A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ R | Deplete$ DEPLETION | Amount$ 2 | SpellDescription$ Add R R to your mana pool. If there are no depletion counters on CARDNAME, sacrifice it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://wizards.com/global/images/magic/general/sandstone_needle.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandstone_warrior.txt b/res/cardsfolder/sandstone_warrior.txt deleted file mode 100644 index dab295f476d..00000000000 --- a/res/cardsfolder/sandstone_warrior.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sandstone Warrior -ManaCost:2 R R -Types:Creature Human Soldier Warrior -Text:no text -PT:1/3 -K:First Strike -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandstone_warrior.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/199.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/215.jpg -End diff --git a/res/cardsfolder/sandstorm.txt b/res/cardsfolder/sandstorm.txt deleted file mode 100644 index bc9c52e5d10..00000000000 --- a/res/cardsfolder/sandstorm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sandstorm -ManaCost:G -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ G | NumDmg$ 1 | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | SpellDescription$ CARDNAME deals 1 damage to each attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandstorm.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/137.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/153.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sandstorm_eidolon.txt b/res/cardsfolder/sandstorm_eidolon.txt deleted file mode 100644 index ddb96b92e07..00000000000 --- a/res/cardsfolder/sandstorm_eidolon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sandstorm Eidolon -ManaCost:3 R -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sandstorm_eidolon.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sangrite_backlash.txt b/res/cardsfolder/sangrite_backlash.txt deleted file mode 100644 index 5cbf8a33dcd..00000000000 --- a/res/cardsfolder/sangrite_backlash.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sangrite Backlash -ManaCost:BG R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/-3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sangrite_backlash.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sangrite_surge.txt b/res/cardsfolder/sangrite_surge.txt deleted file mode 100644 index fcd2e95622a..00000000000 --- a/res/cardsfolder/sangrite_surge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sangrite Surge -ManaCost:4 R G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 4 R G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | KW$ Double Strike | SpellDescription$ Target creature gets +3/+3 and gains double strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sangrite_surge.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/190.jpg -End diff --git a/res/cardsfolder/sangromancer.txt b/res/cardsfolder/sangromancer.txt deleted file mode 100644 index 29d04c3ee49..00000000000 --- a/res/cardsfolder/sangromancer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sangromancer -ManaCost:2 B B -Types:Creature Vampire Shaman -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may gain 3 life. -T:Mode$ Discarded | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever an opponent discards a card, you may gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 | Defined$ You -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sangromancer.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sangrophage.txt b/res/cardsfolder/sangrophage.txt deleted file mode 100644 index ac078e0b41a..00000000000 --- a/res/cardsfolder/sangrophage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sangrophage -ManaCost:B B -Types:Creature Zombie -Text:At the beginning of your upkeep, tap Sangrophage unless you pay 2 life -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sangrophage.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanguine_bond.txt b/res/cardsfolder/sanguine_bond.txt deleted file mode 100644 index 5c3b32bc128..00000000000 --- a/res/cardsfolder/sanguine_bond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sanguine Bond -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever you gain life, target opponent loses that much life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | TgtPromp$ Select target opponent | LifeAmount$ X -SVar:X:TriggerCount$LifeAmount -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguine_bond.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanguine_guard.txt b/res/cardsfolder/sanguine_guard.txt deleted file mode 100644 index 45010b52993..00000000000 --- a/res/cardsfolder/sanguine_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sanguine Guard -ManaCost:1 B B -Types:Creature Zombie Knight -Text:no text -PT:2/2 -K:First Strike -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguine_guard.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanguine_praetor.txt b/res/cardsfolder/sanguine_praetor.txt deleted file mode 100644 index cdff0f9f3bb..00000000000 --- a/res/cardsfolder/sanguine_praetor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sanguine Praetor -ManaCost:6 B B -Types:Creature Avatar -Text:no text -PT:7/5 -A:AB$ DestroyAll | Cost$ B Sac<1/Creature> | ValidCards$ Creature.cmcEQX | SpellDescription$ Destroy each creature with the same converted mana cost as the sacrificed creature. -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanguine_praetor.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sanity_gnawers.txt b/res/cardsfolder/sanity_gnawers.txt deleted file mode 100644 index 234924c9cee..00000000000 --- a/res/cardsfolder/sanity_gnawers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sanity Gnawers -ManaCost:1 B R -Types:Creature Rat -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards a card at random. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | Mode$ Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanity_gnawers.jpg -SVar:Rarity:Uncommon -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/44.jpg -End diff --git a/res/cardsfolder/sanity_grinding.txt b/res/cardsfolder/sanity_grinding.txt deleted file mode 100644 index 550df56b3b0..00000000000 --- a/res/cardsfolder/sanity_grinding.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Sanity Grinding -ManaCost:U U U -Types:Sorcery -Text: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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sanity_grinding.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sapling_of_colfenor.txt b/res/cardsfolder/sapling_of_colfenor.txt deleted file mode 100644 index 18074fed627..00000000000 --- a/res/cardsfolder/sapling_of_colfenor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sapling of Colfenor -ManaCost:3 BG BG -Types:Legendary Creature Treefolk Shaman -Text: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. -PT:2/5 -K:Indestructible -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/Sapling_of_Colfenor.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sapphire_leech.txt b/res/cardsfolder/sapphire_leech.txt deleted file mode 100644 index 2b934fb7424..00000000000 --- a/res/cardsfolder/sapphire_leech.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sapphire Leech -ManaCost:1 U -Types:Creature Leech -Text:Blue spells you cast cost Blue more to cast. -PT:2/2 -K:Flying -K:CostChange:Player:More:U:Spell:blue:All:NoSpecial -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sapphire_leech.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sapphire_medallion.txt b/res/cardsfolder/sapphire_medallion.txt deleted file mode 100644 index 39afb6ab8ed..00000000000 --- a/res/cardsfolder/sapphire_medallion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sapphire Medallion -ManaCost:2 -Types:Artifact -Text:Blue spells you cast cost 1 less to cast. -K:CostChange:Player:Less:1:Spell:blue:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sapphire_medallion.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saprazzan_bailiff.txt b/res/cardsfolder/saprazzan_bailiff.txt deleted file mode 100644 index 993c7300c64..00000000000 --- a/res/cardsfolder/saprazzan_bailiff.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Saprazzan Bailiff -ManaCost:3 U U -Types:Creature Merfolk -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile all artifact and enchantment cards from all graveyards. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return all artifact and enchantment cards from all graveyards to their owners' hands. -SVar:TrigExile:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Artifact,Enchantment | Origin$ Graveyard | Destination$ Exile -SVar:TrigReturn:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Artifact,Enchantment | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_bailiff.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saprazzan_heir.txt b/res/cardsfolder/saprazzan_heir.txt deleted file mode 100644 index 83bbe026e9d..00000000000 --- a/res/cardsfolder/saprazzan_heir.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Saprazzan Heir -ManaCost:1 U -Types:Creature Merfolk -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, you may draw three cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_heir.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saprazzan_raider.txt b/res/cardsfolder/saprazzan_raider.txt deleted file mode 100644 index bd090805edf..00000000000 --- a/res/cardsfolder/saprazzan_raider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Saprazzan Raider -ManaCost:2 U -Types:Creature Merfolk -Text:no text -PT:1/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME becomes blocked, return it to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/saprazzan_raider.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/saprazzan_skerry.txt b/res/cardsfolder/saprazzan_skerry.txt deleted file mode 100644 index d8cb3afc173..00000000000 --- a/res/cardsfolder/saprazzan_skerry.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Saprazzan Skerry -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:DEPLETION:2 -A:AB$ Mana | Cost$ T SubCounter<1/DEPLETION> | Produced$ U | Deplete$ DEPLETION | Amount$ 2 | SpellDescription$ Add U U to your mana pool. If there are no depletion counters on CARDNAME, sacrifice it. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://wizards.com/global/images/magic/general/saprazzan_skerry.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sapseep_forest.txt b/res/cardsfolder/sapseep_forest.txt deleted file mode 100644 index 54356b2e50f..00000000000 --- a/res/cardsfolder/sapseep_forest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sapseep Forest -ManaCost:no cost -Types:Land Forest -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ GainLife | Cost$ G T | LifeAmount$ 1 | IsPresent$ Permanent.Green+YouCtrl | PresentCompare$ GE2 | SpellDescription$ You gain 1 life. Activate this ability only if you control two or more green permanents. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sapseep_forest.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarcatog.txt b/res/cardsfolder/sarcatog.txt deleted file mode 100644 index 76e2f95807b..00000000000 --- a/res/cardsfolder/sarcatog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sarcatog -ManaCost:1 B R -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ ExileFromGrave<2/card> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ Sac<1/Artifact> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sarcatog.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarcomancy.txt b/res/cardsfolder/sarcomancy.txt deleted file mode 100644 index 968be97c0fd..00000000000 --- a/res/cardsfolder/sarcomancy.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sarcomancy -ManaCost:B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 2/2 black Zombie creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ B 2 2 Zombie | TokenName$ Zombie | TokenColors$ Black | TokenTypes$ Creature,Zombie | TokenPower$ 2 | TokenToughness$ 2 | TokenOwner$ You | TokenAmount$ 1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Zombie | PresentCompare$ EQ0 | Execute$ TrigNoZombies | TriggerDescription$ At the beginning of your upkeep, if there are no Zombies on the battlefield, CARDNAME deals 1 damage to you. -SVar:TrigNoZombies:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:BuffedBy:Zombie -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sarcomancy.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarcomite_myr.txt b/res/cardsfolder/sarcomite_myr.txt deleted file mode 100644 index 759a9c815c4..00000000000 --- a/res/cardsfolder/sarcomite_myr.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sarcomite Myr -ManaCost:2 U -Types:Artifact Creature Myr -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Draw | Cost$ Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136212.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarkhan_the_mad.txt b/res/cardsfolder/sarkhan_the_mad.txt deleted file mode 100644 index 3a97947d9f0..00000000000 --- a/res/cardsfolder/sarkhan_the_mad.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sarkhan the Mad -ManaCost:3 B R -Types:Planeswalker Sarkhan -Text:no text -Loyalty:7 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sarkhan_the_mad.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarkhan_vol.txt b/res/cardsfolder/sarkhan_vol.txt deleted file mode 100644 index 5ec28ed0101..00000000000 --- a/res/cardsfolder/sarkhan_vol.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sarkhan Vol -ManaCost:2 R G -Types:Planeswalker Sarkhan -Text:no text -Loyalty:4 -A:AB$ PumpAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Haste | SpellDescription$ Creatures you control get +1/+1 and gain haste until end of turn. -A:AB$ GainControl | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -A:AB$ Token | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | TokenAmount$ 5 | TokenName$ Dragon | TokenTypes$ Creature,Dragon | TokenOwner$ You | TokenColors$ Red | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Flying | SpellDescription$ Put five 4/4 red Dragon creature tokens with flying onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sarkhan_vol.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sarpadian_empires_vol_vii.txt b/res/cardsfolder/sarpadian_empires_vol_vii.txt deleted file mode 100644 index 4366337d030..00000000000 --- a/res/cardsfolder/sarpadian_empires_vol_vii.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Sarpadian Empires, Vol. VII -ManaCost:3 -Types:Artifact -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sarpadian_empires_vol_vii.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/263.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_conception.txt b/res/cardsfolder/savage_conception.txt deleted file mode 100644 index a073bcc322d..00000000000 --- a/res/cardsfolder/savage_conception.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Savage Conception -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G G | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 green Beast creature token onto the battlefield. -A:SP$ Token | Cost$ 3 G G Discard<1/Land> | ActivatingZone$ Graveyard | CostDesc$ Retrace | TokenAmount$ 1 | TokenName$ Beast | TokenTypes$ Creature,Beast | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3| TokenToughness$ 3 | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_conception.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_firecat.txt b/res/cardsfolder/savage_firecat.txt deleted file mode 100644 index d50273ba0b1..00000000000 --- a/res/cardsfolder/savage_firecat.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Savage Firecat -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:0/0 -K:etbCounter:P1P1:7 -K:Trample -T:Mode$ TapsForMana | ValidCard$ Land.YouCtrl | Execute$ TrigRemoveCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you tap a land for mana, remove a +1/+1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_firecat.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_gorilla.txt b/res/cardsfolder/savage_gorilla.txt deleted file mode 100644 index 1e44f87c0a6..00000000000 --- a/res/cardsfolder/savage_gorilla.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Savage Gorilla -ManaCost:4 G -Types:Creature Ape -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ U B T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature gets -3/-3 until end of turn. Draw a card. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_gorilla.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_hunger.txt b/res/cardsfolder/savage_hunger.txt deleted file mode 100644 index d62769620df..00000000000 --- a/res/cardsfolder/savage_hunger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Savage Hunger -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+0/Trample -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_hunger.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_lands.txt b/res/cardsfolder/savage_lands.txt deleted file mode 100644 index 9f6399a089a..00000000000 --- a/res/cardsfolder/savage_lands.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Savage Lands -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_lands.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_silhouette.txt b/res/cardsfolder/savage_silhouette.txt deleted file mode 100644 index c43179bc6a4..00000000000 --- a/res/cardsfolder/savage_silhouette.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Savage Silhouette -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2 -K:stPumpEnchanted:Creature:0/0/SVar=ABRegen:no Condition:Enchanted creature gets +2/+2 and has "1 G: Regenerate this creature." -SVar:ABRegen:AB$Regenerate | Cost$ 1 G | SpellDescription$ Regenerate this creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_silhouette.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_thallid.txt b/res/cardsfolder/savage_thallid.txt deleted file mode 100644 index 3dbecb64e29..00000000000 --- a/res/cardsfolder/savage_thallid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Savage Thallid -ManaCost:3 G G -Types:Creature Fungus -Text:no text -PT:5/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Regenerate | Cost$ Sac<1/Saproling> | ValidTgts$ Fungus | TgtPrompt$ Select target fungus. | SpellDescription$ Regenerate target Fungus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_thallid.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savage_twister.txt b/res/cardsfolder/savage_twister.txt deleted file mode 100644 index 3a9a4cf8e30..00000000000 --- a/res/cardsfolder/savage_twister.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Savage Twister -ManaCost:X R G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X R G | ValidCards$ Creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/savage_twister.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/127.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/340.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savannah.txt b/res/cardsfolder/savannah.txt deleted file mode 100644 index 5a24ea3b20b..00000000000 --- a/res/cardsfolder/savannah.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Savannah -ManaCost:no cost -Types:Land Forest Plains -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/savannah.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/288.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/293.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/297.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savannah_lions.txt b/res/cardsfolder/savannah_lions.txt deleted file mode 100644 index 9b6f794d6da..00000000000 --- a/res/cardsfolder/savannah_lions.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Savannah Lions -ManaCost:W -Types:Creature Cat -Text:no text -PT:2/1 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83246.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/43.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/222.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/224.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/298.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/41.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/223.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/savra_queen_of_the_golgari.txt b/res/cardsfolder/savra_queen_of_the_golgari.txt deleted file mode 100644 index 1598d79f056..00000000000 --- a/res/cardsfolder/savra_queen_of_the_golgari.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Savra, Queen of the Golgari -ManaCost:2 B G -Types:Legendary Creature Elf Shaman -Text:no text -PT:2/2 -T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature.Black | TriggerZones$ Battlefield | Execute$ TrigSacrifice | OptionalDecider$ You | TriggerDescription$ Whenever you sacrifice a black creature, you may pay 2 life. If you do, each other player sacrifices a creature. -T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Creature.Green | TriggerZones$ Battlefield | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ Whenever you sacrifice a green creature, you may gain 2 life. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ PayLife<2> | Defined$ Opponent | SacValid$ Creature | SacMessage$ Creature -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/savra_queen_of_the_golgari.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sawback_manticore.txt b/res/cardsfolder/sawback_manticore.txt deleted file mode 100644 index 9cd7a7f2920..00000000000 --- a/res/cardsfolder/sawback_manticore.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sawback Manticore -ManaCost:3 R G -Types:Creature Manticore -Text:no text -PT:2/4 -A:AB$ Pump | Cost$ 4 | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ DealDamage | Cost$ 1 | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | IsPresent$ Card.Self+attacking,Card.Self+blocking | PresentCompare$ EQ1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. Activate this ability only if CARDNAME is attacking or blocking and only once each turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sawback_manticore.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/341.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sawtooth_loon.txt b/res/cardsfolder/sawtooth_loon.txt deleted file mode 100644 index a6552e4cdd7..00000000000 --- a/res/cardsfolder/sawtooth_loon.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Sawtooth Loon -ManaCost:2 W U -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a white or blue creature you control to its owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw two cards, then put two cards from your hand on the bottom of your library. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.White+YouCtrl,Creature.Blue+YouCtrl -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 2 | SubAbility$ SVar=DBChangeZone -SVar:DBChangeZone:DB$ChangeZone | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | ChangeNum$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sawtooth_loon.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sawtooth_thresher.txt b/res/cardsfolder/sawtooth_thresher.txt deleted file mode 100644 index 8e80d176a37..00000000000 --- a/res/cardsfolder/sawtooth_thresher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sawtooth Thresher -ManaCost:6 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -K:Sunburst -A:AB$ Pump | Cost$ SubCounter<2/P1P1> | NumAtt$ 4 | NumDef$ 4 | SpellDescription$ CARDNAME gets +4/+4 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sawtooth_thresher.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scab_clan_mauler.txt b/res/cardsfolder/scab_clan_mauler.txt deleted file mode 100644 index 24edcf40b74..00000000000 --- a/res/cardsfolder/scab_clan_mauler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scab-Clan Mauler -ManaCost:R G -Types:Creature Human Berserker -Text:no text -PT:1/1 -K:Bloodthirst 2 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scab_clan_mauler.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scabland.txt b/res/cardsfolder/scabland.txt deleted file mode 100644 index 4f3ec8c1080..00000000000 --- a/res/cardsfolder/scabland.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Scabland -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -K:CARDNAME enters the battlefield tapped. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scabland.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/331.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scald.txt b/res/cardsfolder/scald.txt deleted file mode 100644 index d3bafaa65b7..00000000000 --- a/res/cardsfolder/scald.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scald -ManaCost:1 R -Types:Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Island | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever a player taps an Island for mana, CARDNAME deals 1 damage to that player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scald.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scalding_salamander.txt b/res/cardsfolder/scalding_salamander.txt deleted file mode 100644 index 873af19969b..00000000000 --- a/res/cardsfolder/scalding_salamander.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scalding Salamander -ManaCost:2 R -Types:Creature Salamander -Text:no text -PT:2/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may have it deal 1 damage to each creature without flying defending player controls. -SVar:TrigDamage:AB$DamageAll | Cost$ 0 | NumDmg$ 1 | ValidCards$ Creature.withoutFlying+YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scalding_salamander.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/100.jpg -End diff --git a/res/cardsfolder/scalding_tarn.txt b/res/cardsfolder/scalding_tarn.txt deleted file mode 100644 index 84e0dbb51ff..00000000000 --- a/res/cardsfolder/scalding_tarn.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scalding Tarn -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Island,Mountain | ChangeNum$ 1 | SpellDescription$ Search your library for a Island or Mountain card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scalding_tarn.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scale_of_chiss_goria.txt b/res/cardsfolder/scale_of_chiss_goria.txt deleted file mode 100644 index e129a246ab6..00000000000 --- a/res/cardsfolder/scale_of_chiss_goria.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scale of Chiss-Goria -ManaCost:3 -Types:Artifact -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -K:Flash -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ +1 | SpellDescription$ Target creature gets +0/+1 until end of turn. -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scale_of_chiss_goria.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/236.jpg -End diff --git a/res/cardsfolder/scalebanes_elite.txt b/res/cardsfolder/scalebanes_elite.txt deleted file mode 100644 index 209eb03e989..00000000000 --- a/res/cardsfolder/scalebanes_elite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scalebane's Elite -ManaCost:3 G W -Types:Creature Human Soldier -Text:no text -PT:4/4 -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scalebanes_elite.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scaled_hulk.txt b/res/cardsfolder/scaled_hulk.txt deleted file mode 100644 index 95fd10f48ae..00000000000 --- a/res/cardsfolder/scaled_hulk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scaled Hulk -ManaCost:5 G -Types:Creature Spirit -Text:no text -PT:4/4 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:BuffedBy:Arcane,Spirit -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scaled_hulk.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scaled_wurm.txt b/res/cardsfolder/scaled_wurm.txt deleted file mode 100644 index 18d3b0f2728..00000000000 --- a/res/cardsfolder/scaled_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scaled Wurm -ManaCost:7 G -Types:Creature Wurm -Text:no text -PT:7/6 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83272.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/184.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/251.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/269.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scalpelexis.txt b/res/cardsfolder/scalpelexis.txt deleted file mode 100644 index 443854d06ef..00000000000 --- a/res/cardsfolder/scalpelexis.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scalpelexis -ManaCost:4 U -Types:Creature Beast -Text:Whenever CARDNAME 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. -PT:1/5 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scalpelexis.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/50.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scandalmonger.txt b/res/cardsfolder/scandalmonger.txt deleted file mode 100755 index 19aca9eee9b..00000000000 --- a/res/cardsfolder/scandalmonger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scandalmonger -ManaCost:3 B -Types:Creature Boar Monger -Text:no text -PT:3/3 -A:AB$ Discard | Cost$ 2 | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SorcerySpeed$ True | AnyPlayer$ True | IsCurse$ True | SpellDescription$ Target player discards a card. Any player may activate this ability but only any time he or she could cast a sorcery. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scandalmonger.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scapegoat.txt b/res/cardsfolder/scapegoat.txt deleted file mode 100644 index 2c01a7f4ba1..00000000000 --- a/res/cardsfolder/scapegoat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scapegoat -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W Sac<1/Creature> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ X | Origin$ Battlefield | Destination$ Hand | CostDesc$ As an additional cost to cast CARDNAME, sacrifice a creature. | SpellDescription$ Return any number of target creatures you control to their owner's hand. -SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scapegoat.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scar.txt b/res/cardsfolder/scar.txt deleted file mode 100644 index 0d913953c4a..00000000000 --- a/res/cardsfolder/scar.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scar -ManaCost:BR -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ BR | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scar.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarblade_elite.txt b/res/cardsfolder/scarblade_elite.txt deleted file mode 100644 index b0445b5e2c4..00000000000 --- a/res/cardsfolder/scarblade_elite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scarblade Elite -ManaCost:B B -Types:Creature Elf Assassin -Text:no text -PT:2/2 -A:AB$ Destroy | Cost$ T ExileFromGrave<1/Assassin> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarblade_elite.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scare_tactics.txt b/res/cardsfolder/scare_tactics.txt deleted file mode 100644 index cc0e562f2f4..00000000000 --- a/res/cardsfolder/scare_tactics.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scare Tactics -ManaCost:B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ B | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ex/en-us/card6086.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarecrone.txt b/res/cardsfolder/scarecrone.txt deleted file mode 100644 index b9e90d90c51..00000000000 --- a/res/cardsfolder/scarecrone.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scarecrone -ManaCost:3 -Types:Artifact Creature Scarecrow -Text:no text -PT:1/2 -A:AB$ Draw | Cost$ 1 T Sac<1/Scarecrow> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ ChangeZone | Cost$ 4 T | TgtPrompt$ Choose target artifact creature card in your graveyard | ValidTgts$ Artifact.Creature+YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target artifact creature card from your graveyard to the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarecrone.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/172.jpg -End diff --git a/res/cardsfolder/scarland_thrinax.txt b/res/cardsfolder/scarland_thrinax.txt deleted file mode 100644 index e73159cd1b0..00000000000 --- a/res/cardsfolder/scarland_thrinax.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scarland Thrinax -ManaCost:B R G -Types:Creature Lizard -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ Sac<1/Creature> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarland_thrinax.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarred_vinebreeder.txt b/res/cardsfolder/scarred_vinebreeder.txt deleted file mode 100644 index 400d4bc660e..00000000000 --- a/res/cardsfolder/scarred_vinebreeder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scarred Vinebreeder -ManaCost:1 B -Types:Creature Elf Shaman -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 2 B ExileFromGrave<1/Elf> | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ CARDNAME gets +3/+3 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarred_vinebreeder.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/138.jpg -End - diff --git a/res/cardsfolder/scarscale_ritual.txt b/res/cardsfolder/scarscale_ritual.txt deleted file mode 100644 index 0f2bc34cd91..00000000000 --- a/res/cardsfolder/scarscale_ritual.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scarscale Ritual -ManaCost:1 UB -Types:Sorcery -Text:no text -A:SP$ PutCounter | Cost$ 1 UB | CounterType$ M1M1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ SVar=DBDraw | SpellDescription$ As an additional cost to cast CARDNAME, put a -1/-1 counter on a creature you control. Draw two cards. -SVar:DBDraw:DB$Draw | NumCards$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarscale_ritual.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarwood_bandits.txt b/res/cardsfolder/scarwood_bandits.txt deleted file mode 100644 index 679ddf2b238..00000000000 --- a/res/cardsfolder/scarwood_bandits.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scarwood Bandits -ManaCost:2 G G -Types:Creature Human Rogue -Text:no text -PT:2/2 -K:Forestwalk -A:AB$ GainControl | Cost$ 2 G T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | LoseControl$ LeavesPlay | UnlessCost$ 2 | UnlessPayer$ Opponent | SpellDescription$ Unless an opponent pays 2, gain control of target artifact for as long as CARDNAME remains on the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarwood_bandits.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarwood_goblins.txt b/res/cardsfolder/scarwood_goblins.txt deleted file mode 100644 index 44eda5c95f4..00000000000 --- a/res/cardsfolder/scarwood_goblins.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scarwood Goblins -ManaCost:R G -Types:Creature Goblin -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dk/en-us/card1822.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarwood_hag.txt b/res/cardsfolder/scarwood_hag.txt deleted file mode 100644 index a62c6e376c2..00000000000 --- a/res/cardsfolder/scarwood_hag.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scarwood Hag -ManaCost:1 G -Types:Creature Hag -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ G G G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Forestwalk | SpellDescription$ Target creature gains forestwalk until end of turn. -A:AB$ Debuff | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Keywords$ Forestwalk | SpellDescription$ Target creature loses forestwalk until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarwood_hag.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scarwood_treefolk.txt b/res/cardsfolder/scarwood_treefolk.txt deleted file mode 100644 index 7e297c5ecdc..00000000000 --- a/res/cardsfolder/scarwood_treefolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scarwood Treefolk -ManaCost:3 G -Types:Creature Treefolk -Text:no text -PT:3/5 -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scarwood_treefolk.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scathe_zombies.txt b/res/cardsfolder/scathe_zombies.txt deleted file mode 100644 index 302d17d025f..00000000000 --- a/res/cardsfolder/scathe_zombies.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Scathe Zombies -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83247.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/160.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/34.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/34.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/161.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/54.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/42.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/160.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/175.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/154.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/35.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scattershot.txt b/res/cardsfolder/scattershot.txt deleted file mode 100644 index fbbaf538931..00000000000 --- a/res/cardsfolder/scattershot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scattershot -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scattershot.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scattershot_archer.txt b/res/cardsfolder/scattershot_archer.txt deleted file mode 100644 index cfe8ac91f9a..00000000000 --- a/res/cardsfolder/scattershot_archer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scattershot Archer -ManaCost:G -Types:Creature Elf Archer -Text:no text -PT:1/1 -A:AB$ DamageAll | Cost$ T | ValidCards$ Creature.withFlying | NumDmg$ 1 | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scattershot_archer.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scavenged_weaponry.txt b/res/cardsfolder/scavenged_weaponry.txt deleted file mode 100644 index 09a39d509f2..00000000000 --- a/res/cardsfolder/scavenged_weaponry.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scavenged Weaponry -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenged_weaponry.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scavenger_drake.txt b/res/cardsfolder/scavenger_drake.txt deleted file mode 100644 index a4ff2ba765c..00000000000 --- a/res/cardsfolder/scavenger_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scavenger Drake -ManaCost:3 B -Types:Creature Drake -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Creature.Other | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenger_drake.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scavenger_folk.txt b/res/cardsfolder/scavenger_folk.txt deleted file mode 100644 index fbb5ca47c12..00000000000 --- a/res/cardsfolder/scavenger_folk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scavenger Folk -ManaCost:G -Types:Creature Human -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ G T Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenger_folk.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/185.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/50.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/267.jpg -End diff --git a/res/cardsfolder/scavenging_ghoul.txt b/res/cardsfolder/scavenging_ghoul.txt deleted file mode 100644 index 28b8c64e334..00000000000 --- a/res/cardsfolder/scavenging_ghoul.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Scavenging Ghoul -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of each end step, put a corpse counter on CARDNAME for each creature put into a graveyard from the battlefield this turn. -A:AB$ Regenerate | Cost$ SubCounter<1/CORPSE> | SpellDescription$ Regenerate CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CORPSE | CounterNum$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scavenging_ghoul.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/35.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/35.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/36.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/43.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scavenging_scarab.txt b/res/cardsfolder/scavenging_scarab.txt deleted file mode 100644 index 032f9e653bf..00000000000 --- a/res/cardsfolder/scavenging_scarab.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scavenging Scarab -ManaCost:3 B -Types:Creature Insect -Text:no text -PT:3/3 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card46093.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scepter_of_dominance.txt b/res/cardsfolder/scepter_of_dominance.txt deleted file mode 100644 index dee5e15cf21..00000000000 --- a/res/cardsfolder/scepter_of_dominance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scepter of Dominance -ManaCost:1 W W -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ W T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Tap target permanent. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scepter_of_dominance.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/17.jpg -End diff --git a/res/cardsfolder/scepter_of_fugue.txt b/res/cardsfolder/scepter_of_fugue.txt deleted file mode 100644 index 007312b8968..00000000000 --- a/res/cardsfolder/scepter_of_fugue.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scepter of Fugue -ManaCost:B B -Types:Artifact -Text:no text -A:AB$ Discard | Cost$ 1 B T | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | PlayerTurn$ True | SpellDescription$ Target player discards a card. Activate this ability only during your turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scepter_of_fugue.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scepter_of_insight.txt b/res/cardsfolder/scepter_of_insight.txt deleted file mode 100644 index 2f3193564ad..00000000000 --- a/res/cardsfolder/scepter_of_insight.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scepter of Insight -ManaCost:1 U U -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 3 U T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scepter_of_insight.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/school_of_piranha.txt b/res/cardsfolder/school_of_piranha.txt deleted file mode 100644 index 2fe392272b3..00000000000 --- a/res/cardsfolder/school_of_piranha.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:School of Piranha -ManaCost:1 U -Types:Creature Fish -Text:no text -PT:3/3 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/school_of_piranha.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/school_of_the_unseen.txt b/res/cardsfolder/school_of_the_unseen.txt deleted file mode 100644 index 97c32d2f7db..00000000000 --- a/res/cardsfolder/school_of_the_unseen.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:School of the Unseen -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/school_of_the_unseen.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scion_of_darkness.txt b/res/cardsfolder/scion_of_darkness.txt deleted file mode 100644 index 8ff5f0f66cb..00000000000 --- a/res/cardsfolder/scion_of_darkness.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Scion of Darkness -ManaCost:5 B B B -Types:Creature Avatar -Text:no text -PT:6/6 -K:Trample -K:Cycling:3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigGainControl | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may put target creature card from that player's graveyard onto the battlefield under your control. -SVar:TrigGainControl:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature in opponent's graveyard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_darkness.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scion_of_oona.txt b/res/cardsfolder/scion_of_oona.txt deleted file mode 100644 index b1497a971fa..00000000000 --- a/res/cardsfolder/scion_of_oona.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Scion of Oona -ManaCost:2 U -Types:Creature Faerie Soldier -Text:no text -PT:1/1 -K:Flash -K:Flying -K:stPumpAll:Faerie.Other+YouCtrl:1/1/Shroud:No Condition:Other Faerie creatures you control get +1/+1. Other Faeries you control have shroud. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_oona.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scion_of_the_wild.txt b/res/cardsfolder/scion_of_the_wild.txt deleted file mode 100644 index 61ef3572a38..00000000000 --- a/res/cardsfolder/scion_of_the_wild.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scion of the Wild -ManaCost:1 G G -Types:Creature Avatar -Text:no text -PT:*/* -K:stSetPT:Count$NumTypeYouCtrl.Creature:Count$NumTypeYouCtrl.Creature:Scion of the Wild's power and toughness are each equal to the number of creatures you control. -SVar:BuffedBy:Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_the_wild.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/182.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scorched_ruins.txt b/res/cardsfolder/scorched_ruins.txt deleted file mode 100644 index f59279cecfd..00000000000 --- a/res/cardsfolder/scorched_ruins.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scorched Ruins -Types:Land -Text:If CARDNAME would enter the battlefield, sacrifice two untapped lands instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 4 | SpellDescription$ Add 4 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scorched_ruins.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scorched_rusalka.txt b/res/cardsfolder/scorched_rusalka.txt deleted file mode 100644 index 7e4582ba47e..00000000000 --- a/res/cardsfolder/scorched_rusalka.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scorched Rusalka -ManaCost:R -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ R Sac<1/Creature> | Tgt$ TgtP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scorched_rusalka.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scorching_missile.txt b/res/cardsfolder/scorching_missile.txt deleted file mode 100644 index d8a2ccf2605..00000000000 --- a/res/cardsfolder/scorching_missile.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scorching Missile -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target player. -A:SP$ DealDamage | Cost$ 9 R | Tgt$ TgtP | NumDmg$ 4 | Flashback$ True | CostDesc$ Flashback 9 R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scorching_missile.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scorching_spear.txt b/res/cardsfolder/scorching_spear.txt deleted file mode 100644 index 20454e4371d..00000000000 --- a/res/cardsfolder/scorching_spear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scorching Spear -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Scorching Spear deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/scorching_spear.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/116.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/154.jpg -End diff --git a/res/cardsfolder/scorching_winds.txt b/res/cardsfolder/scorching_winds.txt deleted file mode 100644 index de6a4c22951..00000000000 --- a/res/cardsfolder/scorching_winds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scorching Winds -ManaCost:R -Types:Instant -Text:Cast CARDNAME only during the declare attackers step and only if you've been attacked this step.\r\n -A:SP$ DamageAll | Cost$ R | NumDmg$ 1 | ValidCards$ Creature.attacking | ValidDescription$ each attacking creature. | OpponentTurn$ True | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | SpellDescription$ CARDNAME deals 1 damage to each attacking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/scorching_winds.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scoria_cat.txt b/res/cardsfolder/scoria_cat.txt deleted file mode 100644 index 9e5b9a3f17d..00000000000 --- a/res/cardsfolder/scoria_cat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scoria Cat -ManaCost:3 R R -Types:Creature Cat -Text:no text -PT:3/3 -K:stPumpSelf:Creature:3/3:isNotPresent Land.untapped+YouCtrl:Scoria Cat gets +3/+3 as long as you control no untapped lands. -SVar:BuffedBy:Spell -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scoria_cat.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scoria_elemental.txt b/res/cardsfolder/scoria_elemental.txt deleted file mode 100644 index d2cd075aee2..00000000000 --- a/res/cardsfolder/scoria_elemental.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scoria Elemental -ManaCost:4 R -Types:Creature Elemental -Text:no text -PT:6/1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scoria_elemental.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scoria_wurm.txt b/res/cardsfolder/scoria_wurm.txt deleted file mode 100644 index 859fe4e4f5d..00000000000 --- a/res/cardsfolder/scoria_wurm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Scoria Wurm -ManaCost:4 R -Types:Creature Wurm -Text:no text -PT:7/7 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigFlipACoin | TriggerDescription$ At the beginning of your upkeep, flip a coin. If you lose the flip, return CARDNAME to its owner's hand. -SVar:TrigFlipACoin:AB$FlipACoin | Cost$ 0 | LoseSubAbility$ DBChange -SVar:DBChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scoria_wurm.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/212.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scornful_aether_lich.txt b/res/cardsfolder/scornful_aether_lich.txt deleted file mode 100644 index 601cba5fb89..00000000000 --- a/res/cardsfolder/scornful_aether_lich.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scornful AEther-Lich -ManaCost:3 U -Types:Artifact Creature Zombie Wizard -Text:no text -PT:2/4 -A:AB$ Pump | Cost$ W B | KW$ Fear & Vigilance | SpellDescription$ CARDNAME gains fear and vigilance until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scornful_aether_lich.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/34.jpg -End diff --git a/res/cardsfolder/scornful_egotist.txt b/res/cardsfolder/scornful_egotist.txt deleted file mode 100644 index 88f236890c7..00000000000 --- a/res/cardsfolder/scornful_egotist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scornful Egotist -ManaCost:7 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -K:Morph:U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scornful_egotist.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scourge_devil.txt b/res/cardsfolder/scourge_devil.txt deleted file mode 100644 index 251ee10c32a..00000000000 --- a/res/cardsfolder/scourge_devil.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Scourge Devil -ManaCost:4 R -Types:Creature Devil -Text:no text -PT:3/3 -K:Unearth:2 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control get +1/+0 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_devil.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/113.jpg -End diff --git a/res/cardsfolder/scourge_of_kher_ridges.txt b/res/cardsfolder/scourge_of_kher_ridges.txt deleted file mode 100644 index 40fe1f66f74..00000000000 --- a/res/cardsfolder/scourge_of_kher_ridges.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scourge of Kher Ridges -ManaCost:6 R R -Types:Creature Dragon -Text:no text -PT:6/6 -A:AB$ DamageAll | Cost$ 1 R | NumDmg$ 2 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature and without flying. | SpellDescription$ CARDNAME deals 2 damage to each creature without flying. -A:AB$ DamageAll | Cost$ 5 R | NumDmg$ 6 | ValidCards$ Creature.withFlying+Other | ValidDescription$ each other creature with flying. | SpellDescription$ CARDNAME deals 6 damage to each other creature with flying. -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_of_kher_ridges.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scourge_of_numai.txt b/res/cardsfolder/scourge_of_numai.txt deleted file mode 100644 index cf383acadd3..00000000000 --- a/res/cardsfolder/scourge_of_numai.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scourge of Numai -ManaCost:3 B -Types:Creature Demon Spirit -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigLoseLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you lose 2 life if you don't control an Ogre. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_of_numai.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scourge_of_the_nobilis.txt b/res/cardsfolder/scourge_of_the_nobilis.txt deleted file mode 100644 index 36b1b7cc5da..00000000000 --- a/res/cardsfolder/scourge_of_the_nobilis.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Scourge of the Nobilis -ManaCost:2 RW -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature.Red:1/1/SVar=Pump:No Condition:As long as enchanted creature is red, it gets +1/+1 and has "RW: This creature gets +1/+0 until end of turn." -SVar:Pump:AB$Pump | Cost$ RW | Defined$ Self | NumAtt$ +1 | SpellDescription$ This creature gets +1/+0 until end of turn. -K:stPumpEnchanted:Creature.White:1/1/Lifelink:No Condition: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.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_of_the_nobilis.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scourge_servant.txt b/res/cardsfolder/scourge_servant.txt deleted file mode 100644 index 74497d2579f..00000000000 --- a/res/cardsfolder/scourge_servant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scourge Servant -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:3/3 -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourge_servant.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scourglass.txt b/res/cardsfolder/scourglass.txt deleted file mode 100644 index 1140d526cc1..00000000000 --- a/res/cardsfolder/scourglass.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scourglass -ManaCost:3 W W -Types:Artifact -Text:no text -A:AB$ DestroyAll | Cost$ T Sac<1/CARDNAME> | ValidCards$ Permanent.nonArtifact+nonLand | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ Destroy all permanents except for artifacts and lands. Activate this ability only during your upkeep. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scourglass.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scragnoth.txt b/res/cardsfolder/scragnoth.txt deleted file mode 100644 index 63c9dfda3bc..00000000000 --- a/res/cardsfolder/scragnoth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scragnoth -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:3/4 -K:Protection from blue -K:CARDNAME can't be countered. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/scragnoth.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/147.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrap.txt b/res/cardsfolder/scrap.txt deleted file mode 100644 index 6aab0a26979..00000000000 --- a/res/cardsfolder/scrap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scrap -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrap.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/213.jpg -End diff --git a/res/cardsfolder/scrapbasket.txt b/res/cardsfolder/scrapbasket.txt deleted file mode 100644 index 4419754e2cb..00000000000 --- a/res/cardsfolder/scrapbasket.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scrapbasket -ManaCost:4 -Types:Artifact Creature Scarecrow -Text:no text -PT:3/2 -A:AB$ Animate | Cost$ 1 | Defined$ Self | Colors$ White,Blue,Black,Red,Green | SpellDescription$ CARDNAME becomes all colors until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapbasket.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrapdiver_serpent.txt b/res/cardsfolder/scrapdiver_serpent.txt deleted file mode 100644 index 192cbc07754..00000000000 --- a/res/cardsfolder/scrapdiver_serpent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scrapdiver Serpent -ManaCost:5 U U -Types:Creature Serpent -Text:no text -PT:5/5 -K:stPumpSelf:Creature:0/0/HIDDEN Unblockable:isPresent Artifact.YouDontCtrl:Scrapdiver Serpent is unblockable as long as defending player controls an artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapdiver_serpent.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrapheap.txt b/res/cardsfolder/scrapheap.txt deleted file mode 100644 index 89731eaea79..00000000000 --- a/res/cardsfolder/scrapheap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scrapheap -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.YouCtrl,Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever an artifact or enchantment is put into your graveyard from the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapheap.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrapyard_salvo.txt b/res/cardsfolder/scrapyard_salvo.txt deleted file mode 100644 index 78ff046f45f..00000000000 --- a/res/cardsfolder/scrapyard_salvo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scrapyard Salvo -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R R | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target player equal to the number of artifact cards in your graveyard. -SVar:X:Count$TypeInYourYard.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapyard_salvo.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/screaming_fury.txt b/res/cardsfolder/screaming_fury.txt deleted file mode 100644 index ed841e73c27..00000000000 --- a/res/cardsfolder/screaming_fury.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Screaming Fury -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +5 | KW$ Haste | SpellDescription$ Target creature gets +5/+0 and gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/screaming_fury.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/78.jpg -End diff --git a/res/cardsfolder/screaming_seahawk.txt b/res/cardsfolder/screaming_seahawk.txt deleted file mode 100644 index cb5fc7084a3..00000000000 --- a/res/cardsfolder/screaming_seahawk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Screaming Seahawk -ManaCost:4 U -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a card named CARDNAME, reveal it, and put it into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedScreaming Seahawk | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/screaming_seahawk.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/112.jpg -End diff --git a/res/cardsfolder/screams_of_the_damned.txt b/res/cardsfolder/screams_of_the_damned.txt deleted file mode 100644 index b9e7b28bb71..00000000000 --- a/res/cardsfolder/screams_of_the_damned.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Screams of the Damned -ManaCost:3 B B -Types:Enchantment -Text:no text -A:AB$ DamageAll | Cost$ 1 B ExileFromGrave<1/Card> | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/screams_of_the_damned.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/160.jpg -End diff --git a/res/cardsfolder/screeching_buzzard.txt b/res/cardsfolder/screeching_buzzard.txt deleted file mode 100644 index 892bb3e96c3..00000000000 --- a/res/cardsfolder/screeching_buzzard.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Screeching Buzzard -ManaCost:3 B -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_buzzard.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/screeching_drake.txt b/res/cardsfolder/screeching_drake.txt deleted file mode 100644 index b194a9e83d4..00000000000 --- a/res/cardsfolder/screeching_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Screeching Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card, then discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/screeching_drake.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/screeching_harpy.txt b/res/cardsfolder/screeching_harpy.txt deleted file mode 100644 index 8ce986cb434..00000000000 --- a/res/cardsfolder/screeching_harpy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Screeching Harpy -ManaCost:2 B B -Types:Creature Harpy Beast -Text:no text -PT:2/2 -K:Flying -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_harpy.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/screeching_silcaw.txt b/res/cardsfolder/screeching_silcaw.txt deleted file mode 100644 index 8652e154f5a..00000000000 --- a/res/cardsfolder/screeching_silcaw.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Screeching Silcaw -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Metalcraft$ True | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Metalcraft - Whenever CARDNAME 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. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ Opponent | NumCards$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_silcaw.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/screeching_sliver.txt b/res/cardsfolder/screeching_sliver.txt deleted file mode 100644 index 4c7299b018f..00000000000 --- a/res/cardsfolder/screeching_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Screeching Sliver -ManaCost:U -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Sliver:0/0/SVar=Mill:no Condition:All Slivers have "Tap: Target player puts the top card of his or her library into his or her graveyard." -SVar:Mill:AB$Mill | Cost$ T | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 1 | SpellDescription$ Target player puts the top card of his or her library into his or her graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrivener.txt b/res/cardsfolder/scrivener.txt deleted file mode 100644 index d2692183878..00000000000 --- a/res/cardsfolder/scrivener.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scrivener -ManaCost:4 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target instant card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrivener.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/46.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scroll_rack.txt b/res/cardsfolder/scroll_rack.txt deleted file mode 100644 index 8e657561494..00000000000 --- a/res/cardsfolder/scroll_rack.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Scroll Rack -ManaCost:2 -Types:Artifact -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_rack.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scroll_thief.txt b/res/cardsfolder/scroll_thief.txt deleted file mode 100644 index 42242b6c19c..00000000000 --- a/res/cardsfolder/scroll_thief.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scroll Thief -ManaCost:2 U -Types:Creature Merfolk Rogue -Text:no text -PT:1/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scroll_thief.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrubland.txt b/res/cardsfolder/scrubland.txt deleted file mode 100644 index d54fab28603..00000000000 --- a/res/cardsfolder/scrubland.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scrubland -ManaCost:no cost -Types:Land Plains Swamp -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrubland.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/289.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/294.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/298.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/294.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scryb_ranger.txt b/res/cardsfolder/scryb_ranger.txt deleted file mode 100644 index 3c24ad132d2..00000000000 --- a/res/cardsfolder/scryb_ranger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Scryb Ranger -ManaCost:1 G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flash -K:Flying -K:Protection from blue -A:AB$ Untap | Cost$ Return<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/scryb_ranger.jpg -SVar:Rarity:Uncommon -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/215.jpg -End diff --git a/res/cardsfolder/scryb_sprites.txt b/res/cardsfolder/scryb_sprites.txt deleted file mode 100644 index 5c38f3ff40e..00000000000 --- a/res/cardsfolder/scryb_sprites.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Scryb Sprites -ManaCost:G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scryb_sprites.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/124.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/124.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/186.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/154.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/122.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scrying_sheets.txt b/res/cardsfolder/scrying_sheets.txt deleted file mode 100644 index b1a28647f98..00000000000 --- a/res/cardsfolder/scrying_sheets.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Scrying Sheets -ManaCost:no cost -Types:Snow Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Dig | Cost$ 1 S T | DigNum$ 1 | ChangeNum$ 1 | ChangeValid$ Card.Snow | Optional$ True | LibraryPosition2$ 0 | SpellDescription$ 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.) -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrying_sheets.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sculpting_steel.txt b/res/cardsfolder/sculpting_steel.txt deleted file mode 100644 index ca8a70da841..00000000000 --- a/res/cardsfolder/sculpting_steel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sculpting Steel -ManaCost:3 -Types:Artifact -Text:You may have CARDNAME enter the battlefield as a copy of any artifact on the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sculpting_steel.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/238.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/342.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scute_mob.txt b/res/cardsfolder/scute_mob.txt deleted file mode 100644 index 2b02d0dafd4..00000000000 --- a/res/cardsfolder/scute_mob.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scute Mob -ManaCost:G -Types:Creature Insect -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Land.YouCtrl | PresentCompare$ GE5 | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, if you control five or more lands, put four +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/scute_mob.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scuttling_death.txt b/res/cardsfolder/scuttling_death.txt deleted file mode 100644 index 2e21be4d989..00000000000 --- a/res/cardsfolder/scuttling_death.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scuttling Death -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:4/2 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -K:Soulshift:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scuttling_death.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scuzzback_marauders.txt b/res/cardsfolder/scuzzback_marauders.txt deleted file mode 100644 index 50314a36e8d..00000000000 --- a/res/cardsfolder/scuzzback_marauders.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Scuzzback Marauders -ManaCost:4 RG -Types:Creature Goblin Warrior -Text:no text -PT:5/2 -K:Trample -K:Persist -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scuzzback_marauders.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/scuzzback_scrapper.txt b/res/cardsfolder/scuzzback_scrapper.txt deleted file mode 100644 index 99e7bf77dc1..00000000000 --- a/res/cardsfolder/scuzzback_scrapper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Scuzzback Scrapper -ManaCost:RG -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/scuzzback_scrapper.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_drake.txt b/res/cardsfolder/sea_drake.txt deleted file mode 100644 index 64ddae46cfb..00000000000 --- a/res/cardsfolder/sea_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sea Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:4/3 -K:Flying -T:Mode$ ChangesZone$ | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, return two target lands you control to their owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | TargetMin$ 2 | TargetMax$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_drake.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_eagle.txt b/res/cardsfolder/sea_eagle.txt deleted file mode 100644 index b5c842538cb..00000000000 --- a/res/cardsfolder/sea_eagle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sea Eagle -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_eagle.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/50.jpg -SetInfo:S00|Common|http://magiccards.info/scans/en/st2k/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_gate_loremaster.txt b/res/cardsfolder/sea_gate_loremaster.txt deleted file mode 100644 index 556e563377e..00000000000 --- a/res/cardsfolder/sea_gate_loremaster.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sea Gate Loremaster -ManaCost:4 U -Types:Creature Merfolk Wizard Ally -Text:no text -PT:1/3 -A:AB$ Draw | Cost$ T | NumCards$ X | SpellDescription$ Draw a card for each Ally you control. -SVar:X:Count$TypeYouCtrl.Ally -SVar:BuffedBy:Ally -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_gate_loremaster.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/63.jpg -End diff --git a/res/cardsfolder/sea_gate_oracle.txt b/res/cardsfolder/sea_gate_oracle.txt deleted file mode 100644 index 45663a549a5..00000000000 --- a/res/cardsfolder/sea_gate_oracle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sea Gate Oracle -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_gate_oracle.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_kings_blessing.txt b/res/cardsfolder/sea_kings_blessing.txt deleted file mode 100644 index 125dd1dd701..00000000000 --- a/res/cardsfolder/sea_kings_blessing.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sea Kings' Blessing -ManaCost:U -Types:Instant -Text:no text -A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Any number of target creatures become blue until end of turn. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_kings_blessing.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_monster.txt b/res/cardsfolder/sea_monster.txt deleted file mode 100644 index e63896219b8..00000000000 --- a/res/cardsfolder/sea_monster.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sea Monster -ManaCost:4 U U -Types:Creature Serpent -Text:no text -PT:6/6 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_monster.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/99.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/85.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/97.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/96.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/106.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_scryer.txt b/res/cardsfolder/sea_scryer.txt deleted file mode 100644 index 360bc1781d9..00000000000 --- a/res/cardsfolder/sea_scryer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sea Scryer -ManaCost:1 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_scryer.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_serpent.txt b/res/cardsfolder/sea_serpent.txt deleted file mode 100644 index 340cdd03dc7..00000000000 --- a/res/cardsfolder/sea_serpent.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Sea Serpent -ManaCost:5 U -Types:Creature Serpent -Text:no text -PT:5/5 -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_serpent.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/77.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/77.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/118.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/98.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/78.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sea_spirit.txt b/res/cardsfolder/sea_spirit.txt deleted file mode 100644 index 0b6fbf985ec..00000000000 --- a/res/cardsfolder/sea_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sea Spirit -ManaCost:4 U -Types:Creature Elemental Spirit -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ U | NumAtt$ +1 | SpellDescription$ Sea Spirit gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_spirit.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/119.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/95.jpg -End diff --git a/res/cardsfolder/sea_sprite.txt b/res/cardsfolder/sea_sprite.txt deleted file mode 100644 index 8a069c45e6f..00000000000 --- a/res/cardsfolder/sea_sprite.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sea Sprite -ManaCost:1 U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_sprite.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/48.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seachrome_coast.txt b/res/cardsfolder/seachrome_coast.txt deleted file mode 100644 index af264c3a0fa..00000000000 --- a/res/cardsfolder/seachrome_coast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seachrome Coast -ManaCost:no cost -Types:Land -text:Seachrome Coast enters the battlefield tapped unless you control two or fewer other lands. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:CARDNAME enters the battlefield tapped unless you control two or fewer other lands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seachrome_coast.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seafloor_debris.txt b/res/cardsfolder/seafloor_debris.txt deleted file mode 100644 index 6bd794a0055..00000000000 --- a/res/cardsfolder/seafloor_debris.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Seafloor Debris -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seafloor_debris.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seahunter.txt b/res/cardsfolder/seahunter.txt deleted file mode 100644 index 19b29aeb79f..00000000000 --- a/res/cardsfolder/seahunter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seahunter -ManaCost:2 U U -Types:Creature Human Mercenary -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Merfolk | ChangeNum$ 1 | SpellDescription$ Search your library for a Merfolk permanent card and put it onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seahunter.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seal_of_cleansing.txt b/res/cardsfolder/seal_of_cleansing.txt deleted file mode 100644 index 2be5b58cafd..00000000000 --- a/res/cardsfolder/seal_of_cleansing.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seal of Cleansing -ManaCost:1 W -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_cleansing.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seal_of_doom.txt b/res/cardsfolder/seal_of_doom.txt deleted file mode 100644 index 1f87987340c..00000000000 --- a/res/cardsfolder/seal_of_doom.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seal of Doom -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_doom.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/70.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/53.jpg -End diff --git a/res/cardsfolder/seal_of_fire.txt b/res/cardsfolder/seal_of_fire.txt deleted file mode 100644 index 066ea186373..00000000000 --- a/res/cardsfolder/seal_of_fire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seal of Fire -ManaCost:R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_fire.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/98.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seal_of_primordium.txt b/res/cardsfolder/seal_of_primordium.txt deleted file mode 100644 index 5f73d29821f..00000000000 --- a/res/cardsfolder/seal_of_primordium.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seal of Primordium -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_primordium.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seal_of_removal.txt b/res/cardsfolder/seal_of_removal.txt deleted file mode 100644 index 10f8e14b252..00000000000 --- a/res/cardsfolder/seal_of_removal.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seal of Removal -ManaCost:U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_removal.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seal_of_strength.txt b/res/cardsfolder/seal_of_strength.txt deleted file mode 100644 index fa6f41a341c..00000000000 --- a/res/cardsfolder/seal_of_strength.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seal of Strength -ManaCost:G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ 0 Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_strength.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/115.jpg -End diff --git a/res/cardsfolder/search_for_tomorrow.txt b/res/cardsfolder/search_for_tomorrow.txt deleted file mode 100644 index 91e01c133d6..00000000000 --- a/res/cardsfolder/search_for_tomorrow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Search for Tomorrow -ManaCost:2 G -Types:Sorcery -Text:no text -K:Suspend:2:G -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put them onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/search_for_tomorrow.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/searing_flesh.txt b/res/cardsfolder/searing_flesh.txt deleted file mode 100644 index 27e81c1ca47..00000000000 --- a/res/cardsfolder/searing_flesh.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Searing Flesh -ManaCost:6 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 6 R | ValidTgts$ Opponent | NumDmg$ 7 | SpellDescription$ CARDNAME deals 7 damage to target opponent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_flesh.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/searing_meditation.txt b/res/cardsfolder/searing_meditation.txt deleted file mode 100644 index ff14965e17e..00000000000 --- a/res/cardsfolder/searing_meditation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Searing Meditation -ManaCost:1 R W -Types:Enchantment -Text:no text -T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever you gain life, you may pay 2. If you do, CARDNAME deals 2 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 2 | NumDmg$ 2 | Tgt$ TgtCP -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_meditation.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/searing_touch.txt b/res/cardsfolder/searing_touch.txt deleted file mode 100644 index 321f24f23ca..00000000000 --- a/res/cardsfolder/searing_touch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Searing Touch -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Buyback:4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_touch.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/searing_wind.txt b/res/cardsfolder/searing_wind.txt deleted file mode 100644 index 64911e175b6..00000000000 --- a/res/cardsfolder/searing_wind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Searing Wind -ManaCost:8 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 8 R | Tgt$ TgtCP | NumDmg$ 10 | SpellDescription$ CARDNAME deals 10 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/searing_wind.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/218.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/103.jpg -End diff --git a/res/cardsfolder/seas_claim.txt b/res/cardsfolder/seas_claim.txt deleted file mode 100644 index 32f43dddb41..00000000000 --- a/res/cardsfolder/seas_claim.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sea's Claim -ManaCost:U -Types:Enchantment Aura -Text:Enchanted land is an Island. -K:Enchant land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seas_claim.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/113.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seascape_aerialist.txt b/res/cardsfolder/seascape_aerialist.txt deleted file mode 100644 index 949db536720..00000000000 --- a/res/cardsfolder/seascape_aerialist.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Seascape Aerialist -ManaCost:4 U -Types:Creature Merfolk Wizard Ally -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain flying until end of turn. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have Ally creatures you control gain flying until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Ally.YouCtrl | KW$ Flying -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seascape_aerialist.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seashell_cameo.txt b/res/cardsfolder/seashell_cameo.txt deleted file mode 100644 index d9a4f9d2b5b..00000000000 --- a/res/cardsfolder/seashell_cameo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seashell Cameo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seashell_cameo.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seaside_citadel.txt b/res/cardsfolder/seaside_citadel.txt deleted file mode 100644 index ced614f1f28..00000000000 --- a/res/cardsfolder/seaside_citadel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seaside Citadel -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seaside_citadel.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seaside_haven.txt b/res/cardsfolder/seaside_haven.txt deleted file mode 100644 index 495aca3a5b4..00000000000 --- a/res/cardsfolder/seaside_haven.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seaside Haven -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Draw | Cost$ W U T Sac<1/Bird> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seaside_haven.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/323.jpg -End diff --git a/res/cardsfolder/seasinger.txt b/res/cardsfolder/seasinger.txt deleted file mode 100644 index 1ea9c4127c9..00000000000 --- a/res/cardsfolder/seasinger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Seasinger -ManaCost:1 U U -Types:Creature Merfolk -Text:no text -PT:0/1 -K:You may choose not to untap CARDNAME during your untap step. -K:When you control no Islands, sacrifice CARDNAME. -A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.ControllerControlsIsland | TgtPrompt$ Select target creature whose controller controls an Island | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target creature whose controller controls an Island for as long as you control Seasinger and Seasinger remains tapped. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seasinger.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/121.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seasoned_marshal.txt b/res/cardsfolder/seasoned_marshal.txt deleted file mode 100644 index 33b424add9f..00000000000 --- a/res/cardsfolder/seasoned_marshal.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Seasoned Marshal -ManaCost:2 W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME attacks, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seasoned_marshal.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/44.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/44.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/188.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/42.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seat_of_the_synod.txt b/res/cardsfolder/seat_of_the_synod.txt deleted file mode 100644 index b25af5fb5ba..00000000000 --- a/res/cardsfolder/seat_of_the_synod.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seat of the Synod -ManaCost:no cost -Types:Artifact Land -Text:(Seat of the Synod isn't a spell.) -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seat_of_the_synod.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/secluded_glen.txt b/res/cardsfolder/secluded_glen.txt deleted file mode 100644 index 65c90468fe2..00000000000 --- a/res/cardsfolder/secluded_glen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Secluded Glen -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal a Faerie card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/secluded_glen.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/secluded_steppe.txt b/res/cardsfolder/secluded_steppe.txt deleted file mode 100644 index 10cccfe3bf5..00000000000 --- a/res/cardsfolder/secluded_steppe.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Secluded Steppe -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:Cycling:W -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/secluded_steppe.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/second_chance.txt b/res/cardsfolder/second_chance.txt deleted file mode 100644 index 21566f3865d..00000000000 --- a/res/cardsfolder/second_chance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Second Chance -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | LifeTotal$ You | LifeAmount$ LE5 | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, if you have 5 or less life, sacrifice CARDNAME and take an extra turn after this one. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | SubAbility$ SVar=DBAddTurn -SVar:DBAddTurn:DB$AddTurn | Defined$ You | NumTurns$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/second_chance.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/second_sight.txt b/res/cardsfolder/second_sight.txt deleted file mode 100644 index 8a412bb1924..00000000000 --- a/res/cardsfolder/second_sight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Second Sight -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ RearrangeTopOfLibrary | Cost$ 2 U | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent. | NumCards$ 5 | SpellDescription$ Choose one - Look at the top five cards of target opponent's library, then put them back in any order; -A:SP$ RearrangeTopOfLibrary | Cost$ 2 U | Defined$ You | NumCards$ 5 | SpellDescription$ or look at the top five cards of your library, then put them back in any order. -A:SP$ RearrangeTopOfLibrary | Cost$ 2 U U | Defined$ Each | NumCards$ 5 | SpellDescription$ Entwine U (Choose both if you pay the entwine cost.) -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/second_sight.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/second_thoughts.txt b/res/cardsfolder/second_thoughts.txt deleted file mode 100644 index 0c3a1b989f8..00000000000 --- a/res/cardsfolder/second_thoughts.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Second Thoughts -ManaCost:4 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 4 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target attacking creature. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/second_thoughts.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/second_wind.txt b/res/cardsfolder/second_wind.txt deleted file mode 100644 index ecbd9734d47..00000000000 --- a/res/cardsfolder/second_wind.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Second Wind -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Tap | Cost$ T | Defined$ Enchanted | SpellDescription$ Tap enchanted creature. -A:AB$ Untap | Cost$ T | Defined$ Enchanted | SpellDescription$ Untap enchanted creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/second_wind.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/security_detail.txt b/res/cardsfolder/security_detail.txt deleted file mode 100755 index ae5da94d4a5..00000000000 --- a/res/cardsfolder/security_detail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Security Detail -ManaCost:3 W -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ W W | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | IsPresent$ Creature.YouCtrl | PresentCompare$ EQ0 | ActivationLimit$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/security_detail.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sedge_troll.txt b/res/cardsfolder/sedge_troll.txt deleted file mode 100644 index f2c86fc6258..00000000000 --- a/res/cardsfolder/sedge_troll.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sedge Troll -ManaCost:2 R -Types:Creature Troll -Text:no text -PT:2/2 -K:stPumpSelf:Creature:1/1:isPresent Swamp.YouCtrl:CARDNAME gets +1/+1 as long as you control a Swamp. -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sedge_troll.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/173.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/174.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/173.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sedraxis_alchemist.txt b/res/cardsfolder/sedraxis_alchemist.txt deleted file mode 100644 index 927534c982a..00000000000 --- a/res/cardsfolder/sedraxis_alchemist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sedraxis Alchemist -ManaCost:2 B -Types:Creature Zombie Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Permanent.Blue+YouCtrl | Execute$ TrigBounce | TriggerDescription$ When CARDNAME enters the battlefield, if you control a blue permanent, return target nonland permanent to its owner's hand. -SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sedraxis_alchemist.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/54.jpg -End diff --git a/res/cardsfolder/sedraxis_specter.txt b/res/cardsfolder/sedraxis_specter.txt deleted file mode 100644 index cedd34f0e88..00000000000 --- a/res/cardsfolder/sedraxis_specter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sedraxis Specter -ManaCost:U B R -Types:Creature Specter -Text:no text -PT:3/2 -K:Flying -K:Unearth:1 B -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sedraxis_specter.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/see_beyond.txt b/res/cardsfolder/see_beyond.txt deleted file mode 100644 index 6f9bb16645a..00000000000 --- a/res/cardsfolder/see_beyond.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:See Beyond -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 1 U | NumCards$ 2 | SubAbility$ SVar=DBShuffle | SpellDescription$ Draw two cards, then shuffle a card from your hand into your library. -SVar:DBShuffle:DB$ChangeZone | Origin$ Hand | Destination$ Library | Shuffle$ True | ChangeType$ Card.YouOwn | ChangeNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/see_beyond.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seed_the_land.txt b/res/cardsfolder/seed_the_land.txt deleted file mode 100644 index 9f06e71fd16..00000000000 --- a/res/cardsfolder/seed_the_land.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seed the Land -ManaCost:2 G G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever a land enters the battlefield, its controller puts a 1/1 green Snake creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seed_the_land.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seedborn_muse.txt b/res/cardsfolder/seedborn_muse.txt deleted file mode 100644 index f183057b8e6..00000000000 --- a/res/cardsfolder/seedborn_muse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seedborn Muse -ManaCost:3 G G -Types:Creature Spirit -Text:no text -PT:2/4 -K:stPumpAll:Permanent.YouCtrl:0/0/HIDDEN CARDNAME untaps during each other player's untap step.:No Condition:Untap all permanents you control during each other player's untap step. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seedborn_muse.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/138.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/270.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seedcradle_witch.txt b/res/cardsfolder/seedcradle_witch.txt deleted file mode 100644 index 150dd111a03..00000000000 --- a/res/cardsfolder/seedcradle_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seedcradle Witch -ManaCost:GW -Types:Creature Elf Shaman -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 2 G W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SubAbility$ SVar=DBUntap | SpellDescription$ Target creature gets +3/+3 until end of turn. Untap that creature. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seedcradle_witch.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/241.jpg -End diff --git a/res/cardsfolder/seedguide_ash.txt b/res/cardsfolder/seedguide_ash.txt deleted file mode 100644 index a7d18206a85..00000000000 --- a/res/cardsfolder/seedguide_ash.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seedguide Ash -ManaCost:4 G -Types:Creature Treefolk Druid -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may search your library for up to three Forest cards and put them onto the battlefield tapped. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | Tapped$ True | ChangeNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seedguide_ash.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seeds_of_strength.txt b/res/cardsfolder/seeds_of_strength.txt deleted file mode 100644 index 5663ce9af5b..00000000000 --- a/res/cardsfolder/seeds_of_strength.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seeds of Strength -ManaCost:G W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 | SubAbility$ SVar=DBPump1 | SpellDescription$ 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. -SVar:DBPump1:DB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 | SubAbility$ SVar=DBPump2 -SVar:DBPump2:DB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seeds_of_strength.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seek_the_horizon.txt b/res/cardsfolder/seek_the_horizon.txt deleted file mode 100644 index 8d1a0d06775..00000000000 --- a/res/cardsfolder/seek_the_horizon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seek the Horizon -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 3 | SpellDescription$ Search your library for up to three basic land cards, reveal them, and put them into your hand. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/seek_the_horizon.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seeker.txt b/res/cardsfolder/seeker.txt deleted file mode 100644 index dccd317e033..00000000000 --- a/res/cardsfolder/seeker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seeker -ManaCost:2 W W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN CantBeBlockedBy Creature.nonArtifact+nonWhite:Enchanted creature can't be blocked except by artifact creatures and/or white creatures. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seeker.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/299.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seeker_of_skybreak.txt b/res/cardsfolder/seeker_of_skybreak.txt deleted file mode 100644 index aded5fc221e..00000000000 --- a/res/cardsfolder/seeker_of_skybreak.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seeker of Skybreak -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:2/1 -A:AB$ Untap | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seeker_of_skybreak.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/148.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/268.jpg -End diff --git a/res/cardsfolder/seers_sundial.txt b/res/cardsfolder/seers_sundial.txt deleted file mode 100644 index 64901b09f64..00000000000 --- a/res/cardsfolder/seers_sundial.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seer's Sundial -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may pay 2. If you do, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 2 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seers_sundial.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seething_anger.txt b/res/cardsfolder/seething_anger.txt deleted file mode 100644 index 3f4975b4cde..00000000000 --- a/res/cardsfolder/seething_anger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seething Anger -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | SpellDescription$ Target creature gets +3/+0 until end of turn. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seething_anger.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seething_pathblazer.txt b/res/cardsfolder/seething_pathblazer.txt deleted file mode 100644 index 40a6689760b..00000000000 --- a/res/cardsfolder/seething_pathblazer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seething Pathblazer -ManaCost:2 R -Types:Creature Elemental Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 0 Sac<1/Elemental> | NumAtt$ +2 | KW$ First Strike | SpellDescription$ Seething Pathblazer gets +2/+0 and gains first strike until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seething_pathblazer.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seething_song.txt b/res/cardsfolder/seething_song.txt deleted file mode 100644 index 79d8df7e9bf..00000000000 --- a/res/cardsfolder/seething_song.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seething Song -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Mana | Cost$ 2 R | Produced$ R | Amount$ 5 | SpellDescription$ Add R R R R R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seething_song.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/104.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/segmented_wurm.txt b/res/cardsfolder/segmented_wurm.txt deleted file mode 100644 index 20324ed17c6..00000000000 --- a/res/cardsfolder/segmented_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Segmented Wurm -ManaCost:3 R G -Types:Creature Wurm -Text:no text -PT:5/5 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, put a -1/-1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterNum$ 1 | CounterType$ M1M1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/segmented_wurm.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/344.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/segovian_leviathan.txt b/res/cardsfolder/segovian_leviathan.txt deleted file mode 100644 index 7f273463ff8..00000000000 --- a/res/cardsfolder/segovian_leviathan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Segovian Leviathan -ManaCost:4 U -Types:Creature Leviathan -Text:no text -PT:3/3 -K:Islandwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14538.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/122.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/97.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/99.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seismic_assault.txt b/res/cardsfolder/seismic_assault.txt deleted file mode 100644 index 8870b030069..00000000000 --- a/res/cardsfolder/seismic_assault.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seismic Assault -ManaCost:R R R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ Discard<1/Land> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_assault.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/219.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/101.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/228.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seismic_mage.txt b/res/cardsfolder/seismic_mage.txt deleted file mode 100644 index 0013bdb0385..00000000000 --- a/res/cardsfolder/seismic_mage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seismic Mage -ManaCost:3 R -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Destroy | Cost$ 2 R T Discard<1/Card> | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_mage.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/211.jpg -End diff --git a/res/cardsfolder/seismic_shudder.txt b/res/cardsfolder/seismic_shudder.txt deleted file mode 100644 index 65db44854e8..00000000000 --- a/res/cardsfolder/seismic_shudder.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seismic Shudder -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_shudder.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seismic_spike.txt b/res/cardsfolder/seismic_spike.txt deleted file mode 100644 index bb6212be002..00000000000 --- a/res/cardsfolder/seismic_spike.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seismic Spike -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBMana | SpellDescription$ Destroy target land. Add R R to your mana pool. -SVar:DBMana:DB$Mana | Produced$ R | Amount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_spike.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seismic_strike.txt b/res/cardsfolder/seismic_strike.txt deleted file mode 100644 index 078057fcce6..00000000000 --- a/res/cardsfolder/seismic_strike.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seismic Strike -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature equal to the number of Mountains you control. -SVar:X:Count$TypeYouCtrl.Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seismic_strike.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/154.jpg -End diff --git a/res/cardsfolder/seizan_perverter_of_truth.txt b/res/cardsfolder/seizan_perverter_of_truth.txt deleted file mode 100644 index bfde639ea87..00000000000 --- a/res/cardsfolder/seizan_perverter_of_truth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seizan, Perverter of Truth -ManaCost:3 B B -Types:Legendary Creature Demon Spirit -Text:no text -PT:6/5 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of each player's upkeep, that player loses 2 life and draws two cards. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ TriggeredPlayer | LifeAmount$ 2 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Defined$ TriggeredPlayer | NumCards$ 2 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card78965.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seize_the_initiative.txt b/res/cardsfolder/seize_the_initiative.txt deleted file mode 100644 index d48c3a61488..00000000000 --- a/res/cardsfolder/seize_the_initiative.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Seize the Initiative -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ First Strike | SpellDescription$ Target creature gets +1/+1 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seize_the_initiative.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/20.jpg -End diff --git a/res/cardsfolder/seizures.txt b/res/cardsfolder/seizures.txt deleted file mode 100644 index 2c0de20d9ce..00000000000 --- a/res/cardsfolder/seizures.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seizures -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 3 damage to that creature's controller unless that player pays 3. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 3 | UnlessCost$ 3 | UnlessPayer$ TriggeredCardController -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/seizures.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sejiri_merfolk.txt b/res/cardsfolder/sejiri_merfolk.txt deleted file mode 100644 index 031d5f1b9ab..00000000000 --- a/res/cardsfolder/sejiri_merfolk.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sejiri Merfolk -ManaCost:1 U -Types:Creature Merfolk Soldier -Text:no text -PT:2/1 -K:stPumpSelf:Creature:0/0/First Strike & Lifelink:isPresent Plains.YouCtrl:As long as you control a Plains, CARDNAME has first strike and lifelink. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sejiri_merfolk.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sejiri_refuge.txt b/res/cardsfolder/sejiri_refuge.txt deleted file mode 100644 index ffae2aa355e..00000000000 --- a/res/cardsfolder/sejiri_refuge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sejiri Refuge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sejiri_refuge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sejiri_steppe.txt b/res/cardsfolder/sejiri_steppe.txt deleted file mode 100644 index d99a6e592e6..00000000000 --- a/res/cardsfolder/sejiri_steppe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sejiri Steppe -ManaCost:no cost -Types:Land -Text:When Sejiri Steppe enters the battlefield, target creature you control gains protection from the color of your choice until end of turn. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sejiri_steppe.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sekkuar_deathkeeper.txt b/res/cardsfolder/sekkuar_deathkeeper.txt deleted file mode 100644 index a5540ca150c..00000000000 --- a/res/cardsfolder/sekkuar_deathkeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sek'Kuar, Deathkeeper -ManaCost:2 B R G -Types:Legendary Creature Orc Shaman -Text:no text -PT:4/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever another nontoken creature you control is put into a graveyard from the battlefield, put a 3/1 black and red Graveborn creature token with haste onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Graveborn | TokenTypes$ Creature,Graveborn | TokenOwner$ You | TokenColors$ Black,Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sekkuar_deathkeeper.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selenia_dark_angel.txt b/res/cardsfolder/selenia_dark_angel.txt deleted file mode 100644 index 427fd9e6558..00000000000 --- a/res/cardsfolder/selenia_dark_angel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Selenia, Dark Angel -ManaCost:3 W B -Types:Legendary Creature Angel -Text:no text -PT:3/3 -K:Flying -A:AB$ ChangeZone | Cost$ PayLife<2> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/selenia_dark_angel.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/345.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selesnya_evangel.txt b/res/cardsfolder/selesnya_evangel.txt deleted file mode 100644 index ea41f09da19..00000000000 --- a/res/cardsfolder/selesnya_evangel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Selesnya Evangel -ManaCost:G W -Types:Creature Elf Shaman -Text:no text -PT:1/2 -A:AB$ Token | Cost$ 1 T tapXType<1/Creature> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_evangel.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selesnya_guildmage.txt b/res/cardsfolder/selesnya_guildmage.txt deleted file mode 100644 index 0acda94e727..00000000000 --- a/res/cardsfolder/selesnya_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Selesnya Guildmage -ManaCost:GW GW -Types:Creature Elf Wizard -Text:no text -PT:2/2 -A:AB$ Token | Cost$ 3 G | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_guildmage.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selesnya_sanctuary.txt b/res/cardsfolder/selesnya_sanctuary.txt deleted file mode 100644 index dbcb3625791..00000000000 --- a/res/cardsfolder/selesnya_sanctuary.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Selesnya Sanctuary -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G W | SpellDescription$ Add G W to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_sanctuary.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selesnya_signet.txt b/res/cardsfolder/selesnya_signet.txt deleted file mode 100644 index 28c196d0096..00000000000 --- a/res/cardsfolder/selesnya_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Selesnya Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W G | SpellDescription$ Add W G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/selesnya_signet.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selfless_exorcist.txt b/res/cardsfolder/selfless_exorcist.txt deleted file mode 100644 index 907498204e1..00000000000 --- a/res/cardsfolder/selfless_exorcist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Selfless Exorcist -ManaCost:3 W W -Types:Creature Human Cleric -Text:no text -PT:3/4 -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Graveyard | Destination$ Exile | SubAbility$ SVar=DBDealDamage | SpellDescription$ Exile target creature card from a graveyard. That card deals damage equal to its power to CARDNAME. -SVar:DBDealDamage:DB$DealDamage | Defined$ Self | NumDmg$ X -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/selfless_exorcist.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/selkie_hedge_mage.txt b/res/cardsfolder/selkie_hedge_mage.txt deleted file mode 100644 index caba03956c0..00000000000 --- a/res/cardsfolder/selkie_hedge_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Selkie Hedge-Mage -ManaCost:2 GU -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Forest.YouCtrl | PresentCompare$ GE2 | Execute$ TrigGainLife | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Forests, you may gain 3 life. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Island.YouCtrl | PresentCompare$ GE2 | Execute$ TrigBounce | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, if you control two or more Islands, you may return target tapped creature to its owner's hand. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:TrigBounce:DB$ChangeZone | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/selkie_hedge_mage.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sell_sword_brute.txt b/res/cardsfolder/sell_sword_brute.txt deleted file mode 100644 index cd6c2d9a4ba..00000000000 --- a/res/cardsfolder/sell_sword_brute.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sell-Sword Brute -ManaCost:1 R -Types:Creature Human Mercenary -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, it deals 2 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sell_sword_brute.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sengir_autocrat.txt b/res/cardsfolder/sengir_autocrat.txt deleted file mode 100644 index 5760283dc07..00000000000 --- a/res/cardsfolder/sengir_autocrat.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Sengir Autocrat -ManaCost:3 B -Types:Creature Human -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 0/1 black Serf creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Serf | TokenTypes$ Creature,Serf | TokenOwner$ You | TokenColors$ Black | TokenPower$ 0 | TokenToughness$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigExileAllSerfs | TriggerDescription$ When CARDNAME leaves the battlefield, exile all Serf tokens. -SVar:TrigExileAllSerfs:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Creature.Serf+token | Origin$ Battlefield | Destination$ Exile -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card106638.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/19.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/55.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/155.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sengir_bats.txt b/res/cardsfolder/sengir_bats.txt deleted file mode 100644 index 5d1705b0caf..00000000000 --- a/res/cardsfolder/sengir_bats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sengir Bats -ManaCost:1 B B -Types:Creature Bat -Text:no text -PT:1/2 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sengir_bats.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/20.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/sengir_vampire.txt b/res/cardsfolder/sengir_vampire.txt deleted file mode 100644 index e24cbc0946e..00000000000 --- a/res/cardsfolder/sengir_vampire.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Sengir Vampire -ManaCost:3 B B -Types:Creature Vampire -Text:no text -PT:4/4 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tor/en-us/card35086.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/36.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/36.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/80.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/44.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/161.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/176.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/37.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sensation_gorger.txt b/res/cardsfolder/sensation_gorger.txt deleted file mode 100644 index c5502f880a3..00000000000 --- a/res/cardsfolder/sensation_gorger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sensation Gorger -ManaCost:1 R R -Types:Creature Goblin Shaman -Text: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. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sensation_gorger.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sensei_golden_tail.txt b/res/cardsfolder/sensei_golden_tail.txt deleted file mode 100644 index 5b7807333bf..00000000000 --- a/res/cardsfolder/sensei_golden_tail.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sensei Golden-Tail -ManaCost:1 W -Types:Legendary Creature Fox Samurai -Text:no text -PT:2/1 -K:Bushido 1 -A:AB$ PutCounter | Cost$ 1 W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ TRAINING | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ SVar=DBAnimate | SpellDescription$ 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. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Samurai | Keywords$ Bushido 1 | Permanent$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sensei_golden_tail.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/senseis_divining_top.txt b/res/cardsfolder/senseis_divining_top.txt deleted file mode 100644 index d39a8758fce..00000000000 --- a/res/cardsfolder/senseis_divining_top.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sensei's Divining Top -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ RearrangeTopOfLibrary | Cost$ 1 | Defined$ You | NumCards$ 3 | SpellDescription$ Look at the top three cards of your library, then put them back in any order. -A:AB$ Draw | Cost$ T | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBChangeZone | SpellDescription$ Draw a card, then put CARDNAME on top of it's owner's library. -SVar:DBChangeZone:DB$ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/senseis_divining_top.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sensor_splicer.txt b/res/cardsfolder/sensor_splicer.txt deleted file mode 100644 index 0caad71dd79..00000000000 --- a/res/cardsfolder/sensor_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sensor Splicer -ManaCost:4 W -Types:Creature Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -K:stPumpAll:Creature.Golem+YouCtrl:0/0/Vigilance:No Condition:Golem creatures you control have vigilance. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sensor_splicer.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sentinels_of_glen_elendra.txt b/res/cardsfolder/sentinels_of_glen_elendra.txt deleted file mode 100644 index c902151f888..00000000000 --- a/res/cardsfolder/sentinels_of_glen_elendra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sentinels of Glen Elendra -ManaCost:3 U -Types:Creature Faerie Soldier -Text:no text -PT:2/3 -K:Flash -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card139426.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/septic_rats.txt b/res/cardsfolder/septic_rats.txt deleted file mode 100644 index 6fbfb4f3908..00000000000 --- a/res/cardsfolder/septic_rats.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Septic Rats -ManaCost:1 B B -Types:Creature Rat -Text:no text -PT:2/2 -K:Infect -T:Mode$ Attacks | ValidCard$ Creature.Self | TriggerZones$ Battlefield | PlayersPoisoned$ Opponent | Execute$ TrigPump | TriggerDescription$ When CARDNAME attacks, if defending player is poisoned, it gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | NumAtt$ 1 | NumDef$ 1 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/septic_rats.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serendib_efreet.txt b/res/cardsfolder/serendib_efreet.txt deleted file mode 100644 index 034db82c604..00000000000 --- a/res/cardsfolder/serendib_efreet.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Serendib Efreet -ManaCost:2 U -Types:Creature Efreet -Text:no text -PT:3/4 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 1 damage to you. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/an/en-us/card939.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/79.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serendib_sorcerer.txt b/res/cardsfolder/serendib_sorcerer.txt deleted file mode 100644 index d682230aeda..00000000000 --- a/res/cardsfolder/serendib_sorcerer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Serendib Sorcerer -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serendib_sorcerer.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serene_heart.txt b/res/cardsfolder/serene_heart.txt deleted file mode 100644 index f58eefea39d..00000000000 --- a/res/cardsfolder/serene_heart.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Serene Heart -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 1 G | ValidCards$ Aura | SpellDescription$ Destroy all Auras. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_heart.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/140.jpg -End diff --git a/res/cardsfolder/serene_offering.txt b/res/cardsfolder/serene_offering.txt deleted file mode 100644 index 5a953ba3183..00000000000 --- a/res/cardsfolder/serene_offering.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serene Offering -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target enchantment. You gain life equal to its converted mana cost. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_offering.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/252.jpg -End diff --git a/res/cardsfolder/serene_sunset.txt b/res/cardsfolder/serene_sunset.txt deleted file mode 100644 index 2758c92d7ec..00000000000 --- a/res/cardsfolder/serene_sunset.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serene Sunset -ManaCost:X G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X G | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ MaxTgts | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | IsCurse$ True | SpellDescription$ Prevent all combat damage X target creatures would deal this turn. -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_sunset.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serenity.txt b/res/cardsfolder/serenity.txt deleted file mode 100644 index 3296cc7f3e2..00000000000 --- a/res/cardsfolder/serenity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Serenity -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ At the beginning of your upkeep, destroy all artifacts and enchantments. They can't be regenerated. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Artifact,Enchantment | NoRegen$ True -SVar:NeedsToPlay:Artifact.YouDontCtrl,Enchantment.YouDontCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serenity.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/140.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpent_assassin.txt b/res/cardsfolder/serpent_assassin.txt deleted file mode 100644 index 856f960ea94..00000000000 --- a/res/cardsfolder/serpent_assassin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serpent Assassin -ManaCost:3 B B -Types:Creature Snake Assassin -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may destroy target nonblack creature. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature. -SVar:Rarity:Rare -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/serpent_assassin.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpent_generator.txt b/res/cardsfolder/serpent_generator.txt deleted file mode 100644 index d80f15717d0..00000000000 --- a/res/cardsfolder/serpent_generator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serpent Generator -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 4 T | TokenAmount$ 1 | TokenName$ Snake | TokenTypes$ Artifact,Creature,Snake | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenTriggers$ TrigTokenPoison | SpellDescription$ Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature 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.) -SVar:TrigTokenPoison:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigPoison | TriggerZones$ Battlefield | TriggerDescription$ Whenever this creature deals damage to a player, that player gets a poison counter. -SVar:TrigPoison:AB$ Poison | Cost$ 0 | Defined$ TriggeredTarget | Num$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serpent_generator.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/397.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpent_of_the_endless_sea.txt b/res/cardsfolder/serpent_of_the_endless_sea.txt deleted file mode 100644 index 1275b0f42a8..00000000000 --- a/res/cardsfolder/serpent_of_the_endless_sea.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serpent of the Endless Sea -ManaCost:4 U -Types:Creature Serpent -Text:no text -PT:*/* -K:CARDNAME can't attack unless defending player controls an Island. -K:stSetPT:Count$Valid Island.YouCtrl:Count$Valid Island.YouCtrl:Serpent of the Endless Sea's power and toughness are each equal to the number of Islands you control. -SVar:BuffedBy:Island -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serpent_of_the_endless_sea.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpent_skin.txt b/res/cardsfolder/serpent_skin.txt deleted file mode 100644 index db05da2eba0..00000000000 --- a/res/cardsfolder/serpent_skin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serpent Skin -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+1 -A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serpent_skin.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpent_warrior.txt b/res/cardsfolder/serpent_warrior.txt deleted file mode 100644 index 839d474d40e..00000000000 --- a/res/cardsfolder/serpent_warrior.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Serpent Warrior -ManaCost:2 B -Types:Creature Snake Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 3 life. -SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83364.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/161.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/162.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/32.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/19.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/162.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpentine_basilisk.txt b/res/cardsfolder/serpentine_basilisk.txt deleted file mode 100644 index 8f14b3bfa58..00000000000 --- a/res/cardsfolder/serpentine_basilisk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Serpentine Basilisk -ManaCost:2 G G -Types:Creature Basilisk -Text:no text -PT:2/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy damaged creature at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -K:Morph:1 G G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serpentine_basilisk.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serpentine_kavu.txt b/res/cardsfolder/serpentine_kavu.txt deleted file mode 100644 index 1e28b303a7d..00000000000 --- a/res/cardsfolder/serpentine_kavu.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Serpentine Kavu -ManaCost:4 G -Types:Creature Kavu -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ R | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serpentine_kavu.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/211.jpg -End diff --git a/res/cardsfolder/serra_advocate.txt b/res/cardsfolder/serra_advocate.txt deleted file mode 100644 index 43abd753f39..00000000000 --- a/res/cardsfolder/serra_advocate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra Advocate -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target attacking or blocking creature gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_advocate.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/19.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_angel.txt b/res/cardsfolder/serra_angel.txt deleted file mode 100644 index bf71bd92c73..00000000000 --- a/res/cardsfolder/serra_angel.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Serra Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83254.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/45.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/223.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/225.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/42.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/300.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/43.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/39.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/27.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/29.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/224.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_ascendant.txt b/res/cardsfolder/serra_ascendant.txt deleted file mode 100644 index 8de01c8a967..00000000000 --- a/res/cardsfolder/serra_ascendant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra Ascendant -ManaCost:W -Types:Creature Human Monk -Text:no text -PT:1/1 -K:Lifelink -K:stPumpSelf:Creature:5/5/Flying:LifeGE/30:As long as you have 30 or more life, Serra Ascendant gets +5/+5 and has flying. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_ascendant.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_avatar.txt b/res/cardsfolder/serra_avatar.txt deleted file mode 100644 index 39ed5db1c65..00000000000 --- a/res/cardsfolder/serra_avatar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra Avatar -ManaCost:4 W W W -Types:Creature Avatar -Text:no text -PT:*/* -K:stSetPT:Count$YourLifeTotal:Count$YourLifeTotal:CARDNAME's power and toughness are each equal to your life total. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigShuffle | TriggerDescription$ When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library. -SVar:TrigShuffle:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_avatar.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_avenger.txt b/res/cardsfolder/serra_avenger.txt deleted file mode 100644 index 835851327fc..00000000000 --- a/res/cardsfolder/serra_avenger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serra Avenger -ManaCost:W W -Types:Creature Angel -Text:You can't play Serra Avenger during your first, second, or third turns of the game. -PT:3/3 -K:Flying -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card113519.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_aviary.txt b/res/cardsfolder/serra_aviary.txt deleted file mode 100644 index 6c55aaa67e5..00000000000 --- a/res/cardsfolder/serra_aviary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serra Aviary -ManaCost:3 W -Types:World Enchantment -Text:no text -K:stPumpAll:Creature.withFlying:1/1:No Condition:Creatures with flying get +1/+1. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_aviary.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_inquisitors.txt b/res/cardsfolder/serra_inquisitors.txt deleted file mode 100644 index da25a8eae65..00000000000 --- a/res/cardsfolder/serra_inquisitors.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra Inquisitors -ManaCost:4 W -Types:Creature Human Cleric -Text:no text -PT:3/3 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.Black | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more black creatures, CARDNAME gets +2/+0 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.Black | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by one or more black creatures, CARDNAME gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_inquisitors.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_sphinx.txt b/res/cardsfolder/serra_sphinx.txt deleted file mode 100644 index 2a56c089098..00000000000 --- a/res/cardsfolder/serra_sphinx.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serra Sphinx -ManaCost:3 U U -Types:Creature Sphinx -Text:no text -PT:4/4 -K:Flying -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card125873.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serra_zealot.txt b/res/cardsfolder/serra_zealot.txt deleted file mode 100644 index e273de6ee2e..00000000000 --- a/res/cardsfolder/serra_zealot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Serra Zealot -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_zealot.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serras_blessing.txt b/res/cardsfolder/serras_blessing.txt deleted file mode 100644 index 32f6a893ac2..00000000000 --- a/res/cardsfolder/serras_blessing.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra's Blessing -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Vigilance:No Condition:Creatures you control have vigilance. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_blessing.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/141.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/42.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serras_boon.txt b/res/cardsfolder/serras_boon.txt deleted file mode 100644 index 762fb013350..00000000000 --- a/res/cardsfolder/serras_boon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Serra's Boon -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.White:1/2:No Condition:Enchanted creature gets +1/+2 as long as it's white. Otherwise, it gets -2/-1. -K:stPumpEnchanted:Creature.nonWhite:-2/-1:No Condition:no text -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_boon.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serras_embrace.txt b/res/cardsfolder/serras_embrace.txt deleted file mode 100644 index df488a2cdbe..00000000000 --- a/res/cardsfolder/serras_embrace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra's Embrace -ManaCost:2 W W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Flying & Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_embrace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/47.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/40.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serras_liturgy.txt b/res/cardsfolder/serras_liturgy.txt deleted file mode 100644 index 87db706a177..00000000000 --- a/res/cardsfolder/serras_liturgy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serra's Liturgy -ManaCost:2 W W -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ W Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy up to X target artifacts and/or enchantments, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_liturgy.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serras_sanctum.txt b/res/cardsfolder/serras_sanctum.txt deleted file mode 100644 index 38e649c4eeb..00000000000 --- a/res/cardsfolder/serras_sanctum.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serra's Sanctum -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ X | SpellDescription$ Add W to your mana pool for each Enchantment you control. -SVar:X:Count$Valid Enchantment.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_sanctum.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serrated_arrows.txt b/res/cardsfolder/serrated_arrows.txt deleted file mode 100644 index 5a2816087c6..00000000000 --- a/res/cardsfolder/serrated_arrows.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serrated Arrows -ManaCost:4 -Types:Artifact -Text:no text -K:etbCounter:ARROWHEAD:3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.Self+countersGE1ARROWHEAD | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of your upkeep, if there are no arrowhead counters on CARDNAME, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -A:AB$ PutCounter | Cost$ T SubCounter<1/ARROWHEAD> | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serrated_arrows.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/135.jpg -End diff --git a/res/cardsfolder/serrated_biskelion.txt b/res/cardsfolder/serrated_biskelion.txt deleted file mode 100644 index 9d1e9230c26..00000000000 --- a/res/cardsfolder/serrated_biskelion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Serrated Biskelion -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | SubAbility$ SVar=DBPutCounter | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature and a -1/-1 counter on CARDNAME. -SVar:DBPutCounter:DB$PutCounter | Cost$ 0 | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serrated_biskelion.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serum_raker.txt b/res/cardsfolder/serum_raker.txt deleted file mode 100644 index 942d3295e74..00000000000 --- a/res/cardsfolder/serum_raker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Serum Raker -ManaCost:2 U U -Types:Creature Drake -Text:no text -PT:3/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, each player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | NumCards$ 1 | Defined$ Each | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serum_raker.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serum_tank.txt b/res/cardsfolder/serum_tank.txt deleted file mode 100644 index ae2146fa2a0..00000000000 --- a/res/cardsfolder/serum_tank.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Serum Tank -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another artifact enters the battlefield, -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Battlefield | ValidCard$ Artifact.Other | Execute$ TrigPutCounter | TriggerDescription$ put a charge counter on CARDNAME. -A:AB$ Draw | Cost$ 3 T SubCounter<1/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/serum_tank.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/serum_visions.txt b/res/cardsfolder/serum_visions.txt deleted file mode 100644 index d0c71fcf8e5..00000000000 --- a/res/cardsfolder/serum_visions.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Serum Visions -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ U | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/serum_visions.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/servant_of_volrath.txt b/res/cardsfolder/servant_of_volrath.txt deleted file mode 100644 index 565877a25e1..00000000000 --- a/res/cardsfolder/servant_of_volrath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Servant of Volrath -ManaCost:2 B -Types:Creature Minion -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME leaves the battlefield, sacrifice a creature. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | SacValid$ Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/servant_of_volrath.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seshiro_the_anointed.txt b/res/cardsfolder/seshiro_the_anointed.txt deleted file mode 100644 index 75ebed8cc73..00000000000 --- a/res/cardsfolder/seshiro_the_anointed.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Seshiro the Anointed -ManaCost:4 G G -Types:Legendary Creature Snake Monk -Text:no text -PT:3/4 -K:stPumpAll:Creature.Snake+Other+YouCtrl:2/2:No Condition:Other Snake creatures you control get +2/+2. -T:Mode$ DamageDone | ValidSource$ Snake.YouCtrl | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever a Snake you control deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seshiro_the_anointed.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/seton_krosan_protector.txt b/res/cardsfolder/seton_krosan_protector.txt deleted file mode 100644 index 7e501757aae..00000000000 --- a/res/cardsfolder/seton_krosan_protector.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Seton, Krosan Protector -ManaCost:G G G -Types:Legendary Creature Centaur Druid -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ tapXType<1/Druid> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/seton_krosan_protector.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/setons_desire.txt b/res/cardsfolder/setons_desire.txt deleted file mode 100644 index 39d79d02c02..00000000000 --- a/res/cardsfolder/setons_desire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seton's Desire -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2 -K:stPumpEnchanted:Creature:0/0/HIDDEN All creatures able to block CARDNAME do so.:Threshold:Threshold - As long as seven or more cards are in your graveyard, all creatures able to block enchanted creature do so. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/setons_desire.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/setons_scout.txt b/res/cardsfolder/setons_scout.txt deleted file mode 100644 index a70a4a5edf5..00000000000 --- a/res/cardsfolder/setons_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Seton's Scout -ManaCost:1 G -Types:Creature Centaur Druid Scout Archer -Text:no text -PT:2/1 -K:Reach -K:stPumpSelf:Creature:2/2:Threshold:Threshold - Seton's Scout gets +2/+2 as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/setons_scout.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sever_soul.txt b/res/cardsfolder/sever_soul.txt deleted file mode 100644 index 65876fb1ce1..00000000000 --- a/res/cardsfolder/sever_soul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sever Soul -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. You gain life equal to its toughness. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sever_soul.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/162.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/severed_legion.txt b/res/cardsfolder/severed_legion.txt deleted file mode 100644 index b2c345f17e5..00000000000 --- a/res/cardsfolder/severed_legion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Severed Legion -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/2 -K:Fear -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129693.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/163.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/166.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sewer_rats.txt b/res/cardsfolder/sewer_rats.txt deleted file mode 100644 index f67e87ec310..00000000000 --- a/res/cardsfolder/sewer_rats.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sewer Rats -ManaCost:B -Types:Creature Rat -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B PayLife<1> | Defined$ Self | NumAtt$ +1 | ActivationLimit$ 3 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than three times each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sewer_rats.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sewerdreg.txt b/res/cardsfolder/sewerdreg.txt deleted file mode 100644 index 0c027ced6a7..00000000000 --- a/res/cardsfolder/sewerdreg.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sewerdreg -ManaCost:3 B B -Types:Creature Spirit -Text:no text -PT:3/3 -K:Swampwalk -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sewerdreg.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sewn_eye_drake.txt b/res/cardsfolder/sewn_eye_drake.txt deleted file mode 100644 index 7b11f3ed88c..00000000000 --- a/res/cardsfolder/sewn_eye_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sewn-Eye Drake -ManaCost:2 UR B -Types:Creature Zombie Drake -Text:no text -PT:3/1 -K:Flying -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sewn_eye_drake.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shackles.txt b/res/cardsfolder/shackles.txt deleted file mode 100644 index 58702a72dca..00000000000 --- a/res/cardsfolder/shackles.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shackles -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -A:AB$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shackles.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shade_of_trokair.txt b/res/cardsfolder/shade_of_trokair.txt deleted file mode 100644 index 0b232bd8cb7..00000000000 --- a/res/cardsfolder/shade_of_trokair.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shade of Trokair -ManaCost:3 W -Types:Creature Shade -Text:no text -PT:1/2 -K:Suspend:3:W -A:AB$ Pump | Cost$ W | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shade_of_trokair.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/18.jpg -End diff --git a/res/cardsfolder/shades_form.txt b/res/cardsfolder/shades_form.txt deleted file mode 100644 index 3ebfb38ddd4..00000000000 --- a/res/cardsfolder/shades_form.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Shade's Form -ManaCost:1 B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=Pump:No Condition:Enchanted creature has "B: This creature gets +1/+1 until end of turn." -T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When enchanted creature is put into a graveyard, return that card to the battlefield under your control. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True -SVar:Pump:AB$Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shades_form.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadow_guildmage.txt b/res/cardsfolder/shadow_guildmage.txt deleted file mode 100644 index 4e74671d60e..00000000000 --- a/res/cardsfolder/shadow_guildmage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shadow Guildmage -ManaCost:B -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature you control on top of its owner's library. -A:AB$ DealDamage | Cost$ R T | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals 1 damage to target creature or player and 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_guildmage.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/38.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadow_lance.txt b/res/cardsfolder/shadow_lance.txt deleted file mode 100644 index 55e94bb2b2d..00000000000 --- a/res/cardsfolder/shadow_lance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shadow Lance -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:First Strike -A:AB$ Pump | Cost$ 1 B | Defined$ Enchanted | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Enchanted creature gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_lance.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadow_rider.txt b/res/cardsfolder/shadow_rider.txt deleted file mode 100644 index 3134b6674d6..00000000000 --- a/res/cardsfolder/shadow_rider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shadow Rider -ManaCost:2 B B -Types:Creature Zombie Knight -Text:no text -PT:3/3 -K:Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_rider.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadow_rift.txt b/res/cardsfolder/shadow_rift.txt deleted file mode 100644 index d7b9f74499c..00000000000 --- a/res/cardsfolder/shadow_rift.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shadow Rift -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Shadow | SpellDescription$ Target creature gains shadow until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_rift.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/86.jpg -End diff --git a/res/cardsfolder/shadow_sliver.txt b/res/cardsfolder/shadow_sliver.txt deleted file mode 100644 index 8dac846fee0..00000000000 --- a/res/cardsfolder/shadow_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shadow Sliver -ManaCost:2 U -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/Shadow:No Condition:All Sliver creatures have shadow. (They can block or be blocked by only creatures with shadow.) -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadow_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadowblood_egg.txt b/res/cardsfolder/shadowblood_egg.txt deleted file mode 100644 index 0c8953f324c..00000000000 --- a/res/cardsfolder/shadowblood_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shadowblood Egg -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ B R | SubAbility$ SVar=DBDraw | SpellDescription$ Add B R to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowblood_egg.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/308.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadowblood_ridge.txt b/res/cardsfolder/shadowblood_ridge.txt deleted file mode 100644 index 61c32a08ce3..00000000000 --- a/res/cardsfolder/shadowblood_ridge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shadowblood Ridge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ B R | SpellDescription$ Add B R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowblood_ridge.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadowfeed.txt b/res/cardsfolder/shadowfeed.txt deleted file mode 100644 index b36e73b3688..00000000000 --- a/res/cardsfolder/shadowfeed.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shadowfeed -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SubAbility$ SVar=DBGainLife | SpellDescription$ Exile target card from a graveyard. You gain 3 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowfeed.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadowmage_infiltrator.txt b/res/cardsfolder/shadowmage_infiltrator.txt deleted file mode 100644 index d8fcb1210ec..00000000000 --- a/res/cardsfolder/shadowmage_infiltrator.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shadowmage Infiltrator -ManaCost:1 U B -Types:Creature Human Wizard -Text:no text -PT:1/3 -K:Fear -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowmage_infiltrator.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/294.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shadowstorm.txt b/res/cardsfolder/shadowstorm.txt deleted file mode 100644 index a88d05d6dfc..00000000000 --- a/res/cardsfolder/shadowstorm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shadowstorm -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ R | NumDmg$ 2 | ValidCards$ Creature.withShadow | ValidDescription$ each creature with shadow. | SpellDescription$ CARDNAME deals 2 damage to each creature with shadow. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shadowstorm.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shaleskin_bruiser.txt b/res/cardsfolder/shaleskin_bruiser.txt deleted file mode 100644 index fc79a50bd41..00000000000 --- a/res/cardsfolder/shaleskin_bruiser.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shaleskin Bruiser -ManaCost:6 R -Types:Creature Beast -Text:no text -PT:4/4 -K:Trample -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +3/+0 until end of turn for each other attacking Beast. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X -SVar:X:Count$Valid Creature.Beast+Other+attacking/Times.3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shaleskin_bruiser.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shaleskin_plower.txt b/res/cardsfolder/shaleskin_plower.txt deleted file mode 100644 index 8d788e178ec..00000000000 --- a/res/cardsfolder/shaleskin_plower.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shaleskin Plower -ManaCost:3 R -Types:Creature Beast -Text:no text -PT:3/2 -K:Morph:4 R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is turned face up, destroy target land. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shaleskin_plower.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shambling_remains.txt b/res/cardsfolder/shambling_remains.txt deleted file mode 100644 index 53e3c8d21e2..00000000000 --- a/res/cardsfolder/shambling_remains.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shambling Remains -ManaCost:1 B R -Types:Creature Zombie Horror -Text:no text -PT:4/3 -K:CARDNAME can't block. -K:Unearth:B R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shambling_remains.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shambling_shell.txt b/res/cardsfolder/shambling_shell.txt deleted file mode 100644 index 5a358c5a56f..00000000000 --- a/res/cardsfolder/shambling_shell.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shambling Shell -ManaCost:1 B G -Types:Creature Plant Zombie -Text:no text -PT:3/1 -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -K:Dredge 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shambling_shell.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shambling_strider.txt b/res/cardsfolder/shambling_strider.txt deleted file mode 100644 index e6ba604e2df..00000000000 --- a/res/cardsfolder/shambling_strider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shambling Strider -ManaCost:4 G G -Types:Creature Yeti -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ R G | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shambling_strider.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/151.jpg -End diff --git a/res/cardsfolder/shanodin_dryads.txt b/res/cardsfolder/shanodin_dryads.txt deleted file mode 100644 index a5769f36ed8..00000000000 --- a/res/cardsfolder/shanodin_dryads.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Shanodin Dryads -ManaCost:G -Types:Creature Dryad -Text:no text -PT:1/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card11494.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/125.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/125.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/269.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/187.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/155.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/252.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/123.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shaper_guildmage.txt b/res/cardsfolder/shaper_guildmage.txt deleted file mode 100644 index e6e0bb7f19a..00000000000 --- a/res/cardsfolder/shaper_guildmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shaper Guildmage -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -A:AB$ Pump | Cost$ B T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shaper_guildmage.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/91.jpg -End diff --git a/res/cardsfolder/shapeshifter.txt b/res/cardsfolder/shapeshifter.txt deleted file mode 100644 index 9a7fef4d4a4..00000000000 --- a/res/cardsfolder/shapeshifter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shapeshifter -ManaCost:6 -Types:Artifact Creature Shapeshifter -Text:As Shapeshifter enters the battlefield, choose a number between 0 and 7.\r\nAt the beginning of your upkeep, you may choose a number between 0 and 7.\r\nShapeshifter's power is equal to the last chosen number and its toughness is equal to 7 minus that number. -PT:*/7-* -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shapeshifter.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/398.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/363.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shard_convergence.txt b/res/cardsfolder/shard_convergence.txt deleted file mode 100644 index e4a7b4f3824..00000000000 --- a/res/cardsfolder/shard_convergence.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shard Convergence -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Hand | ChangeType$ Plains | ChangeNum$ 1 | SubAbility$ SVar=DBIsland | SpellDescription$ 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. -SVar:DBIsland:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Island | ChangeNum$ 1 | SubAbility$ SVar=DBSwamp -SVar:DBSwamp:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Swamp | ChangeNum$ 1 | SubAbility$ SVar=DBMountain -SVar:DBMountain:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Mountain | ChangeNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shard_convergence.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shard_phoenix.txt b/res/cardsfolder/shard_phoenix.txt deleted file mode 100644 index 1912dec24d7..00000000000 --- a/res/cardsfolder/shard_phoenix.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Shard Phoenix -ManaCost:4 R -Types:Creature Phoenix -Text:no text -PT:2/2 -K:Flying -A:AB$ ChangeZone | Cost$ R R R | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Play this ability only during your upkeep. -A:AB$ DamageAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.withoutFlying | NumDmg$ 2 | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 2 damage to each creature without flying. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shard_phoenix.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/97.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shard_volley.txt b/res/cardsfolder/shard_volley.txt deleted file mode 100644 index 1b2e7082194..00000000000 --- a/res/cardsfolder/shard_volley.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shard Volley -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R Sac<1/Land> | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shard_volley.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sharding_sphinx.txt b/res/cardsfolder/sharding_sphinx.txt deleted file mode 100644 index 10dacd73c74..00000000000 --- a/res/cardsfolder/sharding_sphinx.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sharding Sphinx -ManaCost:4 U U -Types:Artifact Creature Sphinx -Text:no text -PT:4/4 -K:Flying -T:Mode$ DamageDone | ValidSource$ Creature.Artifact+YouCtrl | TriggerZones$ Battlefield | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sharding_sphinx.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/55.jpg -End diff --git a/res/cardsfolder/shared_discovery.txt b/res/cardsfolder/shared_discovery.txt deleted file mode 100644 index 8eea1357cfe..00000000000 --- a/res/cardsfolder/shared_discovery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shared Discovery -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ U tapXType<4/Creature> | NumCards$ 3 | SpellDescription$ As additional cost to cast CARDNAME tap four untapped creatures you control. Draw three cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_discovery.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shared_triumph.txt b/res/cardsfolder/shared_triumph.txt deleted file mode 100644 index f3b0b228cc1..00000000000 --- a/res/cardsfolder/shared_triumph.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shared Triumph -ManaCost:1 W -Types:Enchantment -Text:As CARDNAME enters the battlefield, choose a creature type. -K:stPumpAll:Creature.ChosenType:1/1:No Condition:Creatures of the chosen type get +1/+1. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shared_triumph.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sharuum_the_hegemon.txt b/res/cardsfolder/sharuum_the_hegemon.txt deleted file mode 100644 index 20c5825c6c2..00000000000 --- a/res/cardsfolder/sharuum_the_hegemon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sharuum the Hegemon -ManaCost:3 W U B -Types:Legendary Artifact Creature Sphinx -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target artifact card from your graveyard to the battlefield. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.YouCtrl -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sharuum_the_hegemon.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shatter.txt b/res/cardsfolder/shatter.txt deleted file mode 100644 index 87accf187ba..00000000000 --- a/res/cardsfolder/shatter.txt +++ /dev/null @@ -1,23 +0,0 @@ -Name:Shatter -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shatter.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/220.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/203.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/175.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/217.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/103.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/237.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/218.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/216.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/155.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/204.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/174.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/265.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/105.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/174.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shattered_angel.txt b/res/cardsfolder/shattered_angel.txt deleted file mode 100644 index 2c36e96265b..00000000000 --- a/res/cardsfolder/shattered_angel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shattered Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGain | OptionalDecider$ You | TriggerDescription$ Whenever a land enters the battlefield under an opponent's control, you may gain 3 life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shattered_angel.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shattered_crypt.txt b/res/cardsfolder/shattered_crypt.txt deleted file mode 100644 index 42ed71e150d..00000000000 --- a/res/cardsfolder/shattered_crypt.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shattered Crypt -ManaCost:X B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ X B B | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ MaxTgts | SubAbility$ SVar=DBLoseLife | SpellDescription$ Return X target creature cards from your graveyard to your hand. You lose X life. -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shattered_crypt.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shattered_dreams.txt b/res/cardsfolder/shattered_dreams.txt deleted file mode 100644 index 43feb9ea366..00000000000 --- a/res/cardsfolder/shattered_dreams.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shattered Dreams -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Opponent | NumCards$ 1 | DiscardValid$ Artifact | Mode$ RevealYouChoose | SpellDescription$ Target opponent reveals his or her hand. You choose an artifact card from it. That player discards that card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shattered_dreams.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shattering_pulse.txt b/res/cardsfolder/shattering_pulse.txt deleted file mode 100644 index 4bd8bf63be8..00000000000 --- a/res/cardsfolder/shattering_pulse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shattering Pulse -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Buyback:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shattering_pulse.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/102.jpg -End diff --git a/res/cardsfolder/shattering_spree.txt b/res/cardsfolder/shattering_spree.txt deleted file mode 100644 index 91d2fc0d894..00000000000 --- a/res/cardsfolder/shattering_spree.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shattering Spree -ManaCost:R -Types:Sorcery -Text:no text -K:Replicate R -A:SP$ Destroy | Cost$ R | ValidTgts$ Artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shattering_spree.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shatterskull_giant.txt b/res/cardsfolder/shatterskull_giant.txt deleted file mode 100644 index ef81461d8af..00000000000 --- a/res/cardsfolder/shatterskull_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shatterskull Giant -ManaCost:2 R R -Types:Creature Giant Warrior -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shatterskull_giant.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shatterstorm.txt b/res/cardsfolder/shatterstorm.txt deleted file mode 100644 index fcd43fcf464..00000000000 --- a/res/cardsfolder/shatterstorm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shatterstorm -ManaCost:2 R R -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 R R | ValidCards$ Artifact | NoRegen$ True | SpellDescription$ Destroy all artifacts. They can't be regenerated. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shatterstorm.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/266.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/205.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/175.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/229.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/93.jpg -End diff --git a/res/cardsfolder/shauku_endbringer.txt b/res/cardsfolder/shauku_endbringer.txt deleted file mode 100644 index 18a1da085e2..00000000000 --- a/res/cardsfolder/shauku_endbringer.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Shauku, Endbringer -ManaCost:5 B B -Types:Legendary Creature Vampire -Text:no text -PT:5/5 -K:Flying -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack.:isPresent Creature.Other:CARDNAME can't attack if another creature is on the battlefield. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your upkeep, you lose 3 life. -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target creature | SubAbility$ SVar=DBCounter | SpellDescription$ Exile target creature and put a +1/+1 counter on CARDNAME. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:DBCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shauku_endbringer.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shaukus_minion.txt b/res/cardsfolder/shaukus_minion.txt deleted file mode 100644 index 61a3d63f6b3..00000000000 --- a/res/cardsfolder/shaukus_minion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shauku's Minion -ManaCost:1 B R -Types:Creature Human Minion -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ B R T | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target white creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shaukus_minion.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/343.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shell_skulkin.txt b/res/cardsfolder/shell_skulkin.txt deleted file mode 100644 index 87e08cf1035..00000000000 --- a/res/cardsfolder/shell_skulkin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shell Skulkin -ManaCost:4 -Types:Artifact Creature Scarecrow -Text:no text -PT:3/2 -A:AB$ Pump | Cost$ 3 | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | KW$ Shroud | SpellDescription$ Target blue creature gains shroud until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shell_skulkin.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sheltered_valley.txt b/res/cardsfolder/sheltered_valley.txt deleted file mode 100644 index 5c1e4407855..00000000000 --- a/res/cardsfolder/sheltered_valley.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sheltered Valley -ManaCost:no cost -Types:Land -Text:If CARDNAME would enter the battlefield, instead sacrifice each other permanent named CARDNAME you control, then put CARDNAME onto the battlefield. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Land.YouCtrl | PresentCompare$ LE3 | Execute$ TrigGainLife | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, if you control three or fewer lands, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://wizards.com/global/images/magic/general/sheltered_valley.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sheltering_prayers.txt b/res/cardsfolder/sheltering_prayers.txt deleted file mode 100644 index a20dc3b7b6d..00000000000 --- a/res/cardsfolder/sheltering_prayers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sheltering Prayers -ManaCost:W -Types:Enchantment -Text:no text -K:stPumpAll:Land.Basic+YouCtrl:0/0/Shroud:LandYouCtrlLE/3:Basic lands you control have shroud as long as you control three or fewer lands. -K:stPumpAll:Land.Basic+YouDontCtrl:0/0/Shroud:LandOppCtrlLE/3:Basic lands your opponent controls have shroud as long as your opponent controls three or fewer lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sheltering_prayers.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sheoldred_whispering_one.txt b/res/cardsfolder/sheoldred_whispering_one.txt deleted file mode 100644 index 3998d91b574..00000000000 --- a/res/cardsfolder/sheoldred_whispering_one.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sheoldred, Whispering One -ManaCost:5 B B -Types:Legendary Creature Praetor -Text:no text -PT:6/6 -K:Swampwalk -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, return target creature card from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of each opponent's upkeep, that player sacrifices a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | SacValid$ Creature | Defined$ Opponent -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sheoldred_whispering_one.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shepherd_of_rot.txt b/res/cardsfolder/shepherd_of_rot.txt deleted file mode 100644 index b63235af131..00000000000 --- a/res/cardsfolder/shepherd_of_rot.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shepherd of Rot -ManaCost:1 B -Types:Creature Zombie Cleric -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ T | Defined$ Each | LifeAmount$ X | SpellDescription$ Each player loses 1 life for each Zombie on the battlefield. -SVar:X:Count$TypeOnBattlefield.Zombie -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shepherd_of_rot.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shepherd_of_the_lost.txt b/res/cardsfolder/shepherd_of_the_lost.txt deleted file mode 100644 index 8af4378e410..00000000000 --- a/res/cardsfolder/shepherd_of_the_lost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shepherd of the Lost -ManaCost:4 W -Types:Creature Angel -Text:no text -PT:3/3 -K:Flying -K:First Strike -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shepherd_of_the_lost.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_mate.txt b/res/cardsfolder/shield_mate.txt deleted file mode 100644 index ad289ff9c91..00000000000 --- a/res/cardsfolder/shield_mate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shield Mate -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDef$ 4 | SpellDescription$ Target creature gets +0/+4 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_mate.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_of_duty_and_reason.txt b/res/cardsfolder/shield_of_duty_and_reason.txt deleted file mode 100644 index 518499b7298..00000000000 --- a/res/cardsfolder/shield_of_duty_and_reason.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shield of Duty and Reason -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from green & Protection from blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_duty_and_reason.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_of_kaldra.txt b/res/cardsfolder/shield_of_kaldra.txt deleted file mode 100644 index e8d283f4288..00000000000 --- a/res/cardsfolder/shield_of_kaldra.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shield of Kaldra -ManaCost:4 -Types:Legendary Artifact Equipment -Text:Equipped creature is indestructible. -K:stPumpAll:Equipment.namedSword of Kaldra,Equipment.namedShield of Kaldra,Equipment.namedHelm of Kaldra:0/0/HIDDEN Indestructible:No Condition:Equipment named Sword of Kaldra, Shield of Kaldra, and Helm of Kaldra are indestructible. -K:eqPump 4:HIDDEN Indestructible -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_kaldra.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_of_the_ages.txt b/res/cardsfolder/shield_of_the_ages.txt deleted file mode 100644 index e970abf8f39..00000000000 --- a/res/cardsfolder/shield_of_the_ages.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shield of the Ages -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PreventDamage | Cost$ 2 | Defined$ You | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to you this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_the_ages.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_of_the_oversoul.txt b/res/cardsfolder/shield_of_the_oversoul.txt deleted file mode 100644 index c6457b664ec..00000000000 --- a/res/cardsfolder/shield_of_the_oversoul.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shield of the Oversoul -ManaCost:2 GW -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.Green:1/1/HIDDEN Indestructible:No Condition: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.) -K:stPumpEnchanted:Creature.White:1/1/Flying:No Condition:As long as enchanted creature is white, it gets +1/+1 and has flying. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_the_oversoul.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_sphere.txt b/res/cardsfolder/shield_sphere.txt deleted file mode 100644 index f02ba1b1bd0..00000000000 --- a/res/cardsfolder/shield_sphere.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shield Sphere -ManaCost:0 -Types:Artifact Creature Wall -Text:no text -PT:0/6 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME blocks, put a -0/-1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ M0M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_sphere.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shield_wall.txt b/res/cardsfolder/shield_wall.txt deleted file mode 100644 index 2630b4e79bc..00000000000 --- a/res/cardsfolder/shield_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shield Wall -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumDef$ +2 | SpellDescription$ Creatures you control get +0/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/7e/en-us/card11499.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/339.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/205.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shielding_plax.txt b/res/cardsfolder/shielding_plax.txt deleted file mode 100644 index c18b7bc8646..00000000000 --- a/res/cardsfolder/shielding_plax.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shielding Plax -ManaCost:2 GU -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN CARDNAME can't be the target of spells or abilities your opponents control.:Enchanted creature can't be the target of spells or abilities your opponents control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shielding_plax.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shieldmates_blessing.txt b/res/cardsfolder/shieldmates_blessing.txt deleted file mode 100644 index e8bb8452f46..00000000000 --- a/res/cardsfolder/shieldmates_blessing.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shieldmate's Blessing -ManaCost:W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ W | Tgt$ TgtCP | Amount$ 3 | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shieldmates_blessing.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shifting_sliver.txt b/res/cardsfolder/shifting_sliver.txt deleted file mode 100644 index 2511b0baa10..00000000000 --- a/res/cardsfolder/shifting_sliver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shifting Sliver -ManaCost:3 U -Types:Creature Sliver -Text:Slivers can't be blocked except by Slivers. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shifting_sliver.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shifting_wall.txt b/res/cardsfolder/shifting_wall.txt deleted file mode 100644 index e60c1dfa97c..00000000000 --- a/res/cardsfolder/shifting_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shifting Wall -ManaCost:X -Types:Artifact Creature Wall -Text:no text -PT:0/0 -K:Defender -K:etbCounter:P1P1:X -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shifting_wall.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shimmer_myr.txt b/res/cardsfolder/shimmer_myr.txt deleted file mode 100644 index 8606df9c07c..00000000000 --- a/res/cardsfolder/shimmer_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shimmer Myr -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:2/2 -K:Flash -K:stPumpAll:Artifact.YouCtrl:0/0/HIDDEN Flash:No Condition:You may cast artifact cards as though they had flash. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmer_myr.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shimmering_barrier.txt b/res/cardsfolder/shimmering_barrier.txt deleted file mode 100644 index 7faf21d528f..00000000000 --- a/res/cardsfolder/shimmering_barrier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shimmering Barrier -ManaCost:1 W -Types:Creature Wall -Text:no text -PT:1/3 -K:Defender -K:First Strike -K:Cycling:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_barrier.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shimmering_grotto.txt b/res/cardsfolder/shimmering_grotto.txt deleted file mode 100644 index 1d78b25ad55..00000000000 --- a/res/cardsfolder/shimmering_grotto.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Shimmering Grotto -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_grotto.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shimmering_wings.txt b/res/cardsfolder/shimmering_wings.txt deleted file mode 100644 index d2f57b670ff..00000000000 --- a/res/cardsfolder/shimmering_wings.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shimmering Wings -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shimmering_wings.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shinen_of_fears_chill.txt b/res/cardsfolder/shinen_of_fears_chill.txt deleted file mode 100644 index e83e837f7c3..00000000000 --- a/res/cardsfolder/shinen_of_fears_chill.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shinen of Fear's Chill -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:3/2 -K:CARDNAME can't block. -A:AB$ Pump | Cost$ 1 B Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Channel - | KW$ HIDDEN CARDNAME can't block. | ActivatingZone$ Hand | IsCurse$ True | SpellDescription$ Target creature can't block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shinen_of_fears_chill.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shinen_of_lifes_roar.txt b/res/cardsfolder/shinen_of_lifes_roar.txt deleted file mode 100644 index 109e63a003a..00000000000 --- a/res/cardsfolder/shinen_of_lifes_roar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shinen of Life's Roar -ManaCost:1 G -Types:Creature Spirit -Text:no text -PT:1/2 -K:All creatures able to block CARDNAME do so. -A:AB$ Pump | Cost$ 2 G G Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Channel - | KW$ HIDDEN All creatures able to block CARDNAME do so. | ActivatingZone$ Hand | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shinen_of_lifes_roar.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shinen_of_stars_light.txt b/res/cardsfolder/shinen_of_stars_light.txt deleted file mode 100644 index ce58696b1fd..00000000000 --- a/res/cardsfolder/shinen_of_stars_light.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shinen of Stars' Light -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:2/1 -K:First Strike -A:AB$ Pump | Cost$ 1 W Discard<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | PrecostDesc$ Channel - | KW$ First Strike | ActivatingZone$ Hand | SpellDescription$ Target creature gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shinen_of_stars_light.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shinka_gatekeeper.txt b/res/cardsfolder/shinka_gatekeeper.txt deleted file mode 100644 index 3c702a6f9af..00000000000 --- a/res/cardsfolder/shinka_gatekeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shinka Gatekeeper -ManaCost:2 R -Types:Creature Ogre Warrior -Text:no text -PT:3/2 -T:Mode$ DamageDone | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to you. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | NumDmg$ X | Defined$ You -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shinka_gatekeeper.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shinka_the_bloodsoaked_keep.txt b/res/cardsfolder/shinka_the_bloodsoaked_keep.txt deleted file mode 100644 index b00f5574cb8..00000000000 --- a/res/cardsfolder/shinka_the_bloodsoaked_keep.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shinka, the Bloodsoaked Keep -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | KW$ First Strike | SpellDescription$ Target legendary creature gains first strike until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shinka_the_bloodsoaked_keep.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_dragon.txt b/res/cardsfolder/shivan_dragon.txt deleted file mode 100644 index b2e4d93ab26..00000000000 --- a/res/cardsfolder/shivan_dragon.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Shivan Dragon -ManaCost:4 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4088.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/221.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/175.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/176.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/218.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/267.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/238.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/219.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/230.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/156.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/176.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/175.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_emissary.txt b/res/cardsfolder/shivan_emissary.txt deleted file mode 100644 index 09d02a726c4..00000000000 --- a/res/cardsfolder/shivan_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shivan Emissary -ManaCost:2 R -Types:Creature Human Wizard -Text:no text -PT:1/1 -K:Kicker:1 B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target nonblack creature. It can't be regenerated. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_emissary.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_gorge.txt b/res/cardsfolder/shivan_gorge.txt deleted file mode 100644 index 55ccf779313..00000000000 --- a/res/cardsfolder/shivan_gorge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shivan Gorge -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ DealDamage | Cost$ 2 R T | NumDmg$ 1 | Defined$ Opponent | SpellDescription$ CARDNAME deals 1 damage to each opponent. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_gorge.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_harvest.txt b/res/cardsfolder/shivan_harvest.txt deleted file mode 100644 index 5ac0a44a8d7..00000000000 --- a/res/cardsfolder/shivan_harvest.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shivan Harvest -ManaCost:1 R -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ 1 R Sac<1/Creature> | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_harvest.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/167.jpg -End diff --git a/res/cardsfolder/shivan_hellkite.txt b/res/cardsfolder/shivan_hellkite.txt deleted file mode 100644 index 6bbf9e09120..00000000000 --- a/res/cardsfolder/shivan_hellkite.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shivan Hellkite -ManaCost:5 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -A:AB$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_hellkite.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/214.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/231.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_meteor.txt b/res/cardsfolder/shivan_meteor.txt deleted file mode 100644 index f2cf090f242..00000000000 --- a/res/cardsfolder/shivan_meteor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shivan Meteor -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 13 | SpellDescription$ CARDNAME deals 13 damage to target creature. -K:Suspend:2:1 R R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_meteor.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/106.jpg -End diff --git a/res/cardsfolder/shivan_oasis.txt b/res/cardsfolder/shivan_oasis.txt deleted file mode 100644 index f92ec11e8ed..00000000000 --- a/res/cardsfolder/shivan_oasis.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shivan Oasis -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_oasis.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/326.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_phoenix.txt b/res/cardsfolder/shivan_phoenix.txt deleted file mode 100644 index 27570fc0a44..00000000000 --- a/res/cardsfolder/shivan_phoenix.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shivan Phoenix -ManaCost:4 R R -Types:Creature Phoenix -Text:no text -PT:3/4 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_phoenix.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_raptor.txt b/res/cardsfolder/shivan_raptor.txt deleted file mode 100644 index 1e4782a1945..00000000000 --- a/res/cardsfolder/shivan_raptor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shivan Raptor -ManaCost:2 R -Types:Creature Lizard -Text:no text -PT:3/1 -K:First Strike -K:Haste -K:Echo:2 R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_raptor.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_reef.txt b/res/cardsfolder/shivan_reef.txt deleted file mode 100644 index 850e182d622..00000000000 --- a/res/cardsfolder/shivan_reef.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Shivan Reef -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_reef.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/142.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/324.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/357.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_wurm.txt b/res/cardsfolder/shivan_wurm.txt deleted file mode 100644 index f8c4d8702e6..00000000000 --- a/res/cardsfolder/shivan_wurm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shivan Wurm -ManaCost:3 R G -Types:Creature Wurm -Text:no text -PT:7/7 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a red or green creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.Red+YouCtrl,Creature.Green+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_wurm.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivan_zombie.txt b/res/cardsfolder/shivan_zombie.txt deleted file mode 100644 index b053a63fdc8..00000000000 --- a/res/cardsfolder/shivan_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shivan Zombie -ManaCost:B R -Types:Creature Barbarian Zombie -Text:no text -PT:2/2 -K:Protection from white -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivan_zombie.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shivs_embrace.txt b/res/cardsfolder/shivs_embrace.txt deleted file mode 100644 index 6a035d1b4df..00000000000 --- a/res/cardsfolder/shivs_embrace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shiv's Embrace -ManaCost:2 R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Flying -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shivs_embrace.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/156.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shizo_deaths_storehouse.txt b/res/cardsfolder/shizo_deaths_storehouse.txt deleted file mode 100644 index f2b6d5587f4..00000000000 --- a/res/cardsfolder/shizo_deaths_storehouse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shizo, Death's Storehouse -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Pump | Cost$ B T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | KW$Fear | SpellDescription$ Target legendary creature gains fear until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shizo_deaths_storehouse.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shock.txt b/res/cardsfolder/shock.txt deleted file mode 100644 index 09c9422fc06..00000000000 --- a/res/cardsfolder/shock.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Shock -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shock.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/222.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/219.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/98.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/220.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/232.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/206.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shock_troops.txt b/res/cardsfolder/shock_troops.txt deleted file mode 100644 index 60304101e36..00000000000 --- a/res/cardsfolder/shock_troops.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shock Troops -ManaCost:3 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shock_troops.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/223.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shore_snapper.txt b/res/cardsfolder/shore_snapper.txt deleted file mode 100644 index df6db0dca67..00000000000 --- a/res/cardsfolder/shore_snapper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shore Snapper -ManaCost:2 B -Types:Creature Beast -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ U | KW$ Islandwalk | SpellDescription$ CARDNAME gains islandwalk until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shore_snapper.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/87.jpg -End diff --git a/res/cardsfolder/shorecrasher_mimic.txt b/res/cardsfolder/shorecrasher_mimic.txt deleted file mode 100644 index 5bb371678b3..00000000000 --- a/res/cardsfolder/shorecrasher_mimic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shorecrasher Mimic -ManaCost:1 GU -Types:Creature Shapeshifter -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.Green+Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a spell that's both green and blue, CARDNAME becomes 5/3 and gains trample until end of turn. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 5 | Toughness$ 3 | Keywords$ Trample -SVar:BuffedBy:Spell.Blue+Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shorecrasher_mimic.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shoreline_raider.txt b/res/cardsfolder/shoreline_raider.txt deleted file mode 100644 index 302f116183f..00000000000 --- a/res/cardsfolder/shoreline_raider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shoreline Raider -ManaCost:2 U -Types:Creature Merfolk -Text:no text -PT:2/2 -K:Protection:Kavu:Protection from Kavu -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shoreline_raider.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shoreline_ranger.txt b/res/cardsfolder/shoreline_ranger.txt deleted file mode 100644 index 6a14162a3ba..00000000000 --- a/res/cardsfolder/shoreline_ranger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shoreline Ranger -ManaCost:5 U -Types:Creature Bird Soldier -Text:no text -PT:3/4 -K:Flying -K:TypeCycling:Island:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shoreline_ranger.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shoreline_salvager.txt b/res/cardsfolder/shoreline_salvager.txt deleted file mode 100644 index 21641ff9125..00000000000 --- a/res/cardsfolder/shoreline_salvager.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shoreline Salvager -ManaCost:3 B -Types:Creature Surrakar -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | IsPresent$ Island.YouCtrl | CombatDamage$ True | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, if you control an Island, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Shoreline_Salvager.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/show_and_tell.txt b/res/cardsfolder/show_and_tell.txt deleted file mode 100644 index b0240fd4fb6..00000000000 --- a/res/cardsfolder/show_and_tell.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Show and Tell -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature,Artifact,Enchantment.nonAura,Land | Defined$ Each | ChangeNum$ 1 | SpellDescription$ Each player may put an artifact, creature, enchantment, or land card from his or her hand onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/show_and_tell.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/96.jpg -End diff --git a/res/cardsfolder/shower_of_sparks.txt b/res/cardsfolder/shower_of_sparks.txt deleted file mode 100644 index f50e0d571f5..00000000000 --- a/res/cardsfolder/shower_of_sparks.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shower of Sparks -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBDamage | SpellDescription$ CARDNAME deals 1 damage to target creature -SVar:DBDamage:DB$DealDamage | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ 1 | SpellDescription$ and 1 damage to target player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shower_of_sparks.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrapnel_blast.txt b/res/cardsfolder/shrapnel_blast.txt deleted file mode 100644 index babea64b7bd..00000000000 --- a/res/cardsfolder/shrapnel_blast.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shrapnel Blast -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R Sac<1/Artifact> | Tgt$ TgtCP | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrapnel_blast.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shriek_of_dread.txt b/res/cardsfolder/shriek_of_dread.txt deleted file mode 100644 index d4c1ea419be..00000000000 --- a/res/cardsfolder/shriek_of_dread.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shriek of Dread -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear | SpellDescription$ Target creature gains fear until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shriek_of_dread.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/53.jpg -End diff --git a/res/cardsfolder/shriek_raptor.txt b/res/cardsfolder/shriek_raptor.txt deleted file mode 100644 index 5b00c1cc519..00000000000 --- a/res/cardsfolder/shriek_raptor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shriek Raptor -ManaCost:3 W W -Types:Creature Bird -Text:no text -PT:2/3 -K:Flying -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shriek_raptor.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shriekhorn.txt b/res/cardsfolder/shriekhorn.txt deleted file mode 100644 index d4308284d64..00000000000 --- a/res/cardsfolder/shriekhorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shriekhorn -ManaCost:1 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ Mill | Cost$ T SubCounter<1/CHARGE> | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of his or her library into his or her graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shriekhorn.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrieking_drake.txt b/res/cardsfolder/shrieking_drake.txt deleted file mode 100644 index 2f9efd6deb9..00000000000 --- a/res/cardsfolder/shrieking_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shrieking Drake -ManaCost:U -Types:Creature Drake -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrieking_drake.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrieking_mogg.txt b/res/cardsfolder/shrieking_mogg.txt deleted file mode 100644 index 817913d6fa6..00000000000 --- a/res/cardsfolder/shrieking_mogg.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shrieking Mogg -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Haste -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all other creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.Other -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrieking_mogg.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrieking_specter.txt b/res/cardsfolder/shrieking_specter.txt deleted file mode 100644 index cfd05e4403e..00000000000 --- a/res/cardsfolder/shrieking_specter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Shrieking Specter -ManaCost:5 B -Types:Creature Specter -Text:no text -PT:2/2 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME attacks, defending player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrieking_specter.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shriekmaw.txt b/res/cardsfolder/shriekmaw.txt deleted file mode 100644 index 3f2e23e6ce8..00000000000 --- a/res/cardsfolder/shriekmaw.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Shriekmaw -ManaCost:4 B -Types:Creature Elemental -Text:no text -PT:3/2 -K:Fear -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonartifact, nonblack creature. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Creature.nonBlack+nonArtifact | TgtPrompt$ Select target nonartifact, nonblack creature. -K:Evoke:1 B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shriekmaw.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrine_of_boundless_growth.txt b/res/cardsfolder/shrine_of_boundless_growth.txt deleted file mode 100644 index ac877e094bc..00000000000 --- a/res/cardsfolder/shrine_of_boundless_growth.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Shrine of Boundless Growth -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ At the beginning of your upkeep or whenever you cast a green spell, put a charge counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | Secondary$ True | TriggerDescription$ At the beginning of your upkeep or whenever you cast a green spell, put a charge counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -A:AB$Mana | Cost$ T Sac<1/CARDNAME> | Produced$ 1 | Amount$ X | SpellDescription$ Add 1 to your mana pool for each charge counter on CARDNAME. -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_boundless_growth.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrine_of_burning_rage.txt b/res/cardsfolder/shrine_of_burning_rage.txt deleted file mode 100644 index 2b211c829b9..00000000000 --- a/res/cardsfolder/shrine_of_burning_rage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shrine of Burning Rage -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ At the beginning of your upkeep or whenever you cast a red spell, put a charge counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | Secondary$ True | TriggerDescription$ At the beginning of your upkeep or whenever you cast a red spell, put a charge counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -A:AB$ DealDamage | Cost$ 3 T Sac<1/CARDNAME> | Tgt$TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of charge counters on it to target creature or player. -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_burning_rage.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrine_of_limitless_power.txt b/res/cardsfolder/shrine_of_limitless_power.txt deleted file mode 100644 index 380a0f5e6f0..00000000000 --- a/res/cardsfolder/shrine_of_limitless_power.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Shrine of Limitless Power -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ At the beginning of your upkeep or whenever you cast a black spell, put a charge counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | Secondary$ True | TriggerDescription$ At the beginning of your upkeep or whenever you cast a black spell, put a charge counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -A:AB$Discard | Cost$ 4 T Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | SpellDescription$ Target player discards a card for each charge counter on CARDNAME. -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_limitless_power.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrine_of_loyal_legions.txt b/res/cardsfolder/shrine_of_loyal_legions.txt deleted file mode 100644 index 26b3032b0f9..00000000000 --- a/res/cardsfolder/shrine_of_loyal_legions.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Shrine of Loyal Legions -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ At the beginning of your upkeep or whenever you cast a white spell, put a charge counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | Secondary$ True | TriggerDescription$ At the beginning of your upkeep or whenever you cast a white spell, put a charge counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -A:AB$ Token | Cost$ 3 T Sac<1/CARDNAME> | TokenAmount$ X | TokenName$ Myr | TokenTypes$ Artifact,Creature,Myr | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Put a 1/1 colorless Myr artifact creature token onto the battlefield for each charge counter on CARDNAME. -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_loyal_legions.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrine_of_piercing_vision.txt b/res/cardsfolder/shrine_of_piercing_vision.txt deleted file mode 100644 index 2757501ea7c..00000000000 --- a/res/cardsfolder/shrine_of_piercing_vision.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Shrine of Piercing Vision -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | TriggerDescription$ At the beginning of your upkeep or whenever you cast a blue spell, put a charge counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddCounter | Secondary$ True | TriggerDescription$ At the beginning of your upkeep or whenever you cast a blue spell, put a charge counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 -A:AB$ Dig | Cost$ T Sac<1/CARDNAME> | DigNum$ X | SpellDescription$ Look at the top X cards of your library, where X is the number of charge counters on CARDNAME. Put one of those cards into your hand and the rest on the bottom of your library in any order. -SVar:X:Count$CardCounters.CHARGE -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrine_of_piercing_vision.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shrink.txt b/res/cardsfolder/shrink.txt deleted file mode 100644 index 091e53cc38a..00000000000 --- a/res/cardsfolder/shrink.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shrink -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -5 | IsCurse$ True | SpellDescription$ Target creature gets -5/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrink.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/70.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/188.jpg -End diff --git a/res/cardsfolder/shrivel.txt b/res/cardsfolder/shrivel.txt deleted file mode 100644 index a0c532fa2a0..00000000000 --- a/res/cardsfolder/shrivel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shrivel -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 B | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ All creatures get -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrivel.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shriveling_rot.txt b/res/cardsfolder/shriveling_rot.txt deleted file mode 100644 index 947d25d2bda..00000000000 --- a/res/cardsfolder/shriveling_rot.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Shriveling Rot -ManaCost:2 B B -Types:Instant -Text:Choose one - -A:SP$ Effect | Cost$ 2 B B | Name$ Shriveling Rot Effect | Triggers$ Trig1 | SVars$ SVar1 | CostDesc$ Until end of turn, | SpellDescription$ whenever a creature is dealt damage, destroy it; -A:SP$ Effect | Cost$ 2 B B | Name$ Shriveling Rot Effect | Triggers$ Trig2 | SVars$ SVar2,X | CostDesc$ or until end of turn, | SpellDescription$ whenever a creature is put into a graveyard from the battlefield, that creature's controller loses life equal to its toughness. -A:SP$ Effect | Cost$ 4 B B B | Name$ Shriveling Rot Effect | Triggers$ Trig1,Trig2 | SVars$ SVar1,SVar2,X | CostDesc$ Entwine 2B | SpellDescription$ (Choose both if you pay the entwine cost.) -SVar:Trig1:Mode$ DamageDone | ValidTarget$ Creature | Execute$ SVar1 | TriggerDescription$ Whenever a creature is dealt damage, destroy it. -SVar:SVar1:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -SVar:Trig2:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | Execute$ SVar2 | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, that creature's controller loses life equal to its toughness. -SVar:SVar2:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ X -SVar:X:TriggeredCard$CardToughness -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/shriveling_rot.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_cavalry.txt b/res/cardsfolder/shu_cavalry.txt deleted file mode 100644 index 91649d4fd0a..00000000000 --- a/res/cardsfolder/shu_cavalry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shu Cavalry -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Horsemanship -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shu_cavalry.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_elite_companions.txt b/res/cardsfolder/shu_elite_companions.txt deleted file mode 100644 index 6df44b3963c..00000000000 --- a/res/cardsfolder/shu_elite_companions.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shu Elite Companions -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:Horsemanship -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shu_elite_companions.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_elite_infantry.txt b/res/cardsfolder/shu_elite_infantry.txt deleted file mode 100644 index 1eca4cef419..00000000000 --- a/res/cardsfolder/shu_elite_infantry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shu Elite Infantry -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10627.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_farmer.txt b/res/cardsfolder/shu_farmer.txt deleted file mode 100644 index 10a6772f609..00000000000 --- a/res/cardsfolder/shu_farmer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Shu Farmer -ManaCost:1 W -Types:Creature Human -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ You gain 1 life. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shu_farmer.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_foot_soldiers.txt b/res/cardsfolder/shu_foot_soldiers.txt deleted file mode 100644 index e0b57088f00..00000000000 --- a/res/cardsfolder/shu_foot_soldiers.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shu Foot Soldiers -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10489.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_general.txt b/res/cardsfolder/shu_general.txt deleted file mode 100644 index 9044836a09e..00000000000 --- a/res/cardsfolder/shu_general.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shu General -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Vigilance -K:Horsemanship -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shu_general.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_grain_caravan.txt b/res/cardsfolder/shu_grain_caravan.txt deleted file mode 100644 index 4b51eafe143..00000000000 --- a/res/cardsfolder/shu_grain_caravan.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shu Grain Caravan -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/shu_grain_caravan.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shu_soldier_farmers.txt b/res/cardsfolder/shu_soldier_farmers.txt deleted file mode 100644 index d7ef4066701..00000000000 --- a/res/cardsfolder/shu_soldier_farmers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Shu Soldier-Farmers -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal_Three_Kingdoms/shu_soldier_farmers.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/shuko.txt b/res/cardsfolder/shuko.txt deleted file mode 100644 index 5131c6b4857..00000000000 --- a/res/cardsfolder/shuko.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Shuko -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0. -K:eqPump 0:+1/+0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/shuko.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sibilant_spirit.txt b/res/cardsfolder/sibilant_spirit.txt deleted file mode 100644 index 712c3785215..00000000000 --- a/res/cardsfolder/sibilant_spirit.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sibilant Spirit -ManaCost:5 U -Types:Creature Spirit -Text:no text -PT:5/6 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ Opponent | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, defending player may draw a card. -SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sibilant_spirit.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/123.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/98.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sick_and_tired.txt b/res/cardsfolder/sick_and_tired.txt deleted file mode 100644 index b2890c896d9..00000000000 --- a/res/cardsfolder/sick_and_tired.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sick and Tired -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Two target creatures each get -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sick_and_tired.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sicken.txt b/res/cardsfolder/sicken.txt deleted file mode 100644 index 649f79c46c8..00000000000 --- a/res/cardsfolder/sicken.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sicken -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-1/-1 -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sicken.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sickening_shoal.txt b/res/cardsfolder/sickening_shoal.txt deleted file mode 100644 index ed0b84709f4..00000000000 --- a/res/cardsfolder/sickening_shoal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sickening Shoal -ManaCost:X B B -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ X B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn. -A:SP$ Pump | Cost$ ExileFromHand<1/Card.Black> | CostDesc$ You may exile a black card from your hand rather than pay Sickening Shoal's mana cost. | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -Y | NumDef$ -Y | IsCurse$ True | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the exiled card's converted mana cost. -SVar:X:Count$xPaid -SVar:Y:Exiled$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sickening_shoal.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sickle_ripper.txt b/res/cardsfolder/sickle_ripper.txt deleted file mode 100644 index c0aacace149..00000000000 --- a/res/cardsfolder/sickle_ripper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sickle Ripper -ManaCost:1 B -Types:Creature Elemental Warrior -Text:no text -PT:2/1 -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sickle_ripper.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sickleslicer.txt b/res/cardsfolder/sickleslicer.txt deleted file mode 100644 index d8900d32842..00000000000 --- a/res/cardsfolder/sickleslicer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sickleslicer -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2. -K:eqPump 4:+2/+2 -K:Living Weapon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sickleslicer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sidar_jabari.txt b/res/cardsfolder/sidar_jabari.txt deleted file mode 100644 index 5fcc5af41d6..00000000000 --- a/res/cardsfolder/sidar_jabari.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sidar Jabari -ManaCost:3 W -Types:Legendary Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, tap target creature defending player controls. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature defending player controls -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sidar_jabari.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sidewinder_sliver.txt b/res/cardsfolder/sidewinder_sliver.txt deleted file mode 100644 index 9b8e813fa06..00000000000 --- a/res/cardsfolder/sidewinder_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sidewinder Sliver -ManaCost:W -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/Flanking:no Condition:All Sliver creatures have flanking. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sidewinder_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/siege_gang_commander.txt b/res/cardsfolder/siege_gang_commander.txt deleted file mode 100644 index 4337f405eda..00000000000 --- a/res/cardsfolder/siege_gang_commander.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Siege-Gang Commander -ManaCost:3 R R -Types:Creature Goblin -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 1 R Sac<1/Goblin> | Tgt$ CP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put three 1/1 red Goblin creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_gang_commander.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/103.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/siege_mastodon.txt b/res/cardsfolder/siege_mastodon.txt deleted file mode 100644 index 5d60c46409b..00000000000 --- a/res/cardsfolder/siege_mastodon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Siege Mastodon -ManaCost:4 W -Types:Creature Elephant -Text:no text -PT:3/5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_mastodon.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/29.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/siege_of_towers.txt b/res/cardsfolder/siege_of_towers.txt deleted file mode 100644 index 89cb5b6c5fb..00000000000 --- a/res/cardsfolder/siege_of_towers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Siege of Towers -ManaCost:1 R -Types:Sorcery -Text:no text -K:Replicate 1 R -A:SP$ Animate | Cost$ 1 R | ValidTgts$ Mountain | Power$ 3 | Toughness$ 1 | Types$ Creature | SpellDescription$ Target Mountain becomes a 3/1 creature. It's still a land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_of_towers.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sift.txt b/res/cardsfolder/sift.txt deleted file mode 100644 index 96f2711a673..00000000000 --- a/res/cardsfolder/sift.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sift -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U | NumCards$ 3 | SpellDescription$ Draw three cards, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sift.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/42.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sighted_caste_sorcerer.txt b/res/cardsfolder/sighted_caste_sorcerer.txt deleted file mode 100644 index 77bf92dbd0a..00000000000 --- a/res/cardsfolder/sighted_caste_sorcerer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sighted-Caste Sorcerer -ManaCost:1 W -Types:Creature Human Wizard -Text:no text -PT:1/1 -K:Exalted -A:AB$ Pump | Cost$ U | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sighted_caste_sorcerer.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/26.jpg -End diff --git a/res/cardsfolder/sigil_blessing.txt b/res/cardsfolder/sigil_blessing.txt deleted file mode 100644 index 0b529d9cec7..00000000000 --- a/res/cardsfolder/sigil_blessing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sigil Blessing -ManaCost:W G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ +2 | NumDef$ +2 | SubAbility$ SVar=DBPumpAll | SpellDescription$ Until end of turn, target creature you control gets +3/+3 and other creatures you control get +1/+1. -SVar:DBPumpAll:DB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_blessing.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/195.jpg -End diff --git a/res/cardsfolder/sigil_captain.txt b/res/cardsfolder/sigil_captain.txt deleted file mode 100644 index 902cb87db02..00000000000 --- a/res/cardsfolder/sigil_captain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sigil Captain -ManaCost:1 G W W -Types:Creature Rhino Soldier -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerEQ1+toughnessEQ1+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature enters the battlefield under your control, if that creature is 1/1, put two +1/+1 counters on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ TriggeredCard | CounterType$ P1P1 | CounterNum$ 2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_captain.jpg -SVar:Rarity:Uncommon -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/77.jpg -End diff --git a/res/cardsfolder/sigil_of_the_empty_throne.txt b/res/cardsfolder/sigil_of_the_empty_throne.txt deleted file mode 100644 index 1becb266ff1..00000000000 --- a/res/cardsfolder/sigil_of_the_empty_throne.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Sigil of the Empty Throne -ManaCost:3 W W -Types:Enchantment -Text:Whenever you cast an enchantment spell, put a 4/4 white Angel creature token with flying onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_of_the_empty_throne.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sigil_of_the_nayan_gods.txt b/res/cardsfolder/sigil_of_the_nayan_gods.txt deleted file mode 100644 index e2b76294385..00000000000 --- a/res/cardsfolder/sigil_of_the_nayan_gods.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sigil of the Nayan Gods -ManaCost:1 W G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0:Enchanted creature gets +1/+1 for each creature you control. -K:stPumpEnchanted:Creature:X/X:no Condition:no text -K:Cycling:GW -SVar:X:Count$Valid Creature.YouCtrl -SVar:BuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_of_the_nayan_gods.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sigil_of_the_new_dawn.txt b/res/cardsfolder/sigil_of_the_new_dawn.txt deleted file mode 100644 index 233489c1a99..00000000000 --- a/res/cardsfolder/sigil_of_the_new_dawn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sigil of the New Dawn -ManaCost:3 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouOwn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ 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. -SVar:TrigReturn:AB$ChangeZone | Cost$ 1 W | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_of_the_new_dawn.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sigil_tracer.txt b/res/cardsfolder/sigil_tracer.txt deleted file mode 100644 index 010a0cbb337..00000000000 --- a/res/cardsfolder/sigil_tracer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sigil Tracer -ManaCost:1 U U -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -A:AB$CopySpell | Cost$ 1 U tapXType<2/Wizard> | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigil_tracer.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sigiled_behemoth.txt b/res/cardsfolder/sigiled_behemoth.txt deleted file mode 100644 index ba05fab8116..00000000000 --- a/res/cardsfolder/sigiled_behemoth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sigiled Behemoth -ManaCost:4 G W -Types:Creature Beast -Text:no text -PT:5/4 -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigiled_behemoth.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sigiled_paladin.txt b/res/cardsfolder/sigiled_paladin.txt deleted file mode 100644 index 87d7039c374..00000000000 --- a/res/cardsfolder/sigiled_paladin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sigiled Paladin -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Exalted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sigiled_paladin.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sign_in_blood.txt b/res/cardsfolder/sign_in_blood.txt deleted file mode 100644 index 103286777b7..00000000000 --- a/res/cardsfolder/sign_in_blood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sign in Blood -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ B B | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ SVar=DBLoseLife | SpellDescription$ Target player draws two cards and loses 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sign_in_blood.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/signal_pest.txt b/res/cardsfolder/signal_pest.txt deleted file mode 100644 index fad7fb6a0b1..00000000000 --- a/res/cardsfolder/signal_pest.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Signal Pest -ManaCost:1 -Types:Artifact Creature Pest -Text:CARDNAME can't be blocked except by creatures with flying or reach. -PT:0/1 -K:CantBeBlockedBy Creature.withoutFlying+withoutReach -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBattleCry | TriggerDescription$ Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.) -SVar:TrigBattleCry:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | NumAtt$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/signal_pest.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/131.jpg -End diff --git a/res/cardsfolder/silent_arbiter.txt b/res/cardsfolder/silent_arbiter.txt deleted file mode 100644 index ccd94626d41..00000000000 --- a/res/cardsfolder/silent_arbiter.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Silent Arbiter -ManaCost:4 -Types:Artifact Creature Construct -Text:No more than one creature can attack each combat. No more than one creature can block each combat. -PT:1/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/silent_arbiter.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silent_attendant.txt b/res/cardsfolder/silent_attendant.txt deleted file mode 100644 index 5472b8ef11c..00000000000 --- a/res/cardsfolder/silent_attendant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Silent Attendant -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:0/2 -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silent_attendant.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/51.jpg -End diff --git a/res/cardsfolder/silent_chant_zubera.txt b/res/cardsfolder/silent_chant_zubera.txt deleted file mode 100644 index b16b98727c4..00000000000 --- a/res/cardsfolder/silent_chant_zubera.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Silent-Chant Zubera -ManaCost:1 W -Types:Creature Zubera Spirit -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 2 life for each Zubera put into a graveyard from the battlefield this turn. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Card.Zubera/Double -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80510.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silent_specter.txt b/res/cardsfolder/silent_specter.txt deleted file mode 100644 index 9ad7d68aa5d..00000000000 --- a/res/cardsfolder/silent_specter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Silent Specter -ManaCost:4 B B -Types:Creature Specter -Text:no text -PT:4/4 -K:Flying -K:Morph:3 B B -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player discards two cards. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/silent_specter.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silhana_ledgewalker.txt b/res/cardsfolder/silhana_ledgewalker.txt deleted file mode 100644 index 92de9d7c41c..00000000000 --- a/res/cardsfolder/silhana_ledgewalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silhana Ledgewalker -ManaCost:1 G -Types:Creature Elf Rogue -Text:CARDNAME can't be blocked except by creatures with flying. -PT:1/1 -K:CantBeBlockedBy Creature.withoutFlying -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silhana_ledgewalker.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silk_net.txt b/res/cardsfolder/silk_net.txt deleted file mode 100644 index f3b11fd5272..00000000000 --- a/res/cardsfolder/silk_net.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Silk Net -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ Reach | SpellDescription$ Target creature gets +1/+1 and gains reach until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silk_net.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/112.jpg -End diff --git a/res/cardsfolder/silkbind_faerie.txt b/res/cardsfolder/silkbind_faerie.txt deleted file mode 100644 index e84054d0022..00000000000 --- a/res/cardsfolder/silkbind_faerie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silkbind Faerie -ManaCost:2 WU -Types:Creature Faerie Rogue -Text:no text -PT:1/3 -K:Flying -A:AB$ Tap | Cost$ 1 WU Untap | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silkbind_faerie.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/148.jpg -End diff --git a/res/cardsfolder/silkenfist_fighter.txt b/res/cardsfolder/silkenfist_fighter.txt deleted file mode 100644 index fb77b33df35..00000000000 --- a/res/cardsfolder/silkenfist_fighter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silkenfist Fighter -ManaCost:1 W -Types:Creature Kor Soldier -Text:no text -PT:1/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME becomes blocked, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silkenfist_fighter.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silkenfist_order.txt b/res/cardsfolder/silkenfist_order.txt deleted file mode 100644 index 006b903004d..00000000000 --- a/res/cardsfolder/silkenfist_order.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silkenfist Order -ManaCost:3 W W -Types:Creature Kor Soldier -Text:no text -PT:3/5 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ Whenever CARDNAME becomes blocked, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/silkenfist_order.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silklash_spider.txt b/res/cardsfolder/silklash_spider.txt deleted file mode 100644 index aa0b80a7d59..00000000000 --- a/res/cardsfolder/silklash_spider.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Silklash Spider -ManaCost:3 G G -Types:Creature Spider -Text:no text -PT:2/7 -K:Reach -A:AB$ DamageAll | Cost$ X G G | ValidCards$ Creature.withFlying | NumDmg$ X | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals X damage to each creature with flying. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/silklash_spider.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/281.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silkwing_scout.txt b/res/cardsfolder/silkwing_scout.txt deleted file mode 100644 index 7ba69523c72..00000000000 --- a/res/cardsfolder/silkwing_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silkwing Scout -ManaCost:2 U -Types:Creature Faerie Scout -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ G Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silkwing_scout.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silt_crawler.txt b/res/cardsfolder/silt_crawler.txt deleted file mode 100644 index 7252e742ac5..00000000000 --- a/res/cardsfolder/silt_crawler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silt Crawler -ManaCost:2 G -Types:Creature Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all lands you control. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Land.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silt_crawler.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/123.jpg -End diff --git a/res/cardsfolder/silver_drake.txt b/res/cardsfolder/silver_drake.txt deleted file mode 100644 index ec0e1e51e40..00000000000 --- a/res/cardsfolder/silver_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Silver Drake -ManaCost:1 U W -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a white or blue creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.White+YouCtrl,Creature.Blue+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silver_drake.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silver_erne.txt b/res/cardsfolder/silver_erne.txt deleted file mode 100644 index 7ff950a633a..00000000000 --- a/res/cardsfolder/silver_erne.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silver Erne -ManaCost:3 U -Types:Creature Bird -Text:no text -PT:2/2 -K:Flying -K:Trample -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2534.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silver_knight.txt b/res/cardsfolder/silver_knight.txt deleted file mode 100644 index 9af79cad4ed..00000000000 --- a/res/cardsfolder/silver_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silver Knight -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/silver_knight.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silver_myr.txt b/res/cardsfolder/silver_myr.txt deleted file mode 100644 index 1109cf05699..00000000000 --- a/res/cardsfolder/silver_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silver Myr -ManaCost:2 -Types:Artifact Creature Myr -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silver_myr.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/241.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silver_seraph.txt b/res/cardsfolder/silver_seraph.txt deleted file mode 100644 index fdb275b9483..00000000000 --- a/res/cardsfolder/silver_seraph.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silver Seraph -ManaCost:5 W W W -Types:Creature Angel -Text:no text -PT:6/6 -K:Flying -K:stPumpAll:Creature.Other+YouCtrl:2/2:Threshold:Threshold - Other creatures you control get +2/+2 as long as seven or more cards are in your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/silver_seraph.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silverback_ape.txt b/res/cardsfolder/silverback_ape.txt deleted file mode 100644 index 6ffb70798bc..00000000000 --- a/res/cardsfolder/silverback_ape.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Silverback Ape -ManaCost:3 G G -Types:Creature Ape -Text:no text -PT:5/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card49056.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silvercoat_lion.txt b/res/cardsfolder/silvercoat_lion.txt deleted file mode 100644 index 0debc327ea2..00000000000 --- a/res/cardsfolder/silvercoat_lion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Silvercoat Lion -ManaCost:1 W -Types:Creature Cat -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silvercoat_lion.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/31.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silverglade_elemental.txt b/res/cardsfolder/silverglade_elemental.txt deleted file mode 100755 index 3e6a40d0462..00000000000 --- a/res/cardsfolder/silverglade_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silverglade Elemental -ManaCost:4 G -Types:Creature Elemental -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Forest | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silverglade_elemental.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/269.jpg -End diff --git a/res/cardsfolder/silverglade_pathfinder.txt b/res/cardsfolder/silverglade_pathfinder.txt deleted file mode 100755 index 6342b5b4909..00000000000 --- a/res/cardsfolder/silverglade_pathfinder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silverglade Pathfinder -ManaCost:1 G -Types:Creature Dryad Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 G T Discard<1/Card> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/silverglade_pathfinder.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silverskin_armor.txt b/res/cardsfolder/silverskin_armor.txt deleted file mode 100644 index 23c45617cba..00000000000 --- a/res/cardsfolder/silverskin_armor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Silverskin Armor -ManaCost:2 -Types:Artifact Equipment -Text:no text -K:eqPump 2:+1/+1 -K:stPumpEquipped:Creature:0/0/Types=Artifact:no Condition:Equipped creature gets +1/+1 and is an artifact in addition to its other types. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/silverskin_armor.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silverstorm_samurai.txt b/res/cardsfolder/silverstorm_samurai.txt deleted file mode 100644 index 9f311eea078..00000000000 --- a/res/cardsfolder/silverstorm_samurai.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silverstorm Samurai -ManaCost:4 W W -Types:Creature Fox Samurai -Text:no text -PT:3/3 -K:Flash -K:Bushido 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/silverstorm_samurai.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/silvos_rogue_elemental.txt b/res/cardsfolder/silvos_rogue_elemental.txt deleted file mode 100644 index fc2e1dd749f..00000000000 --- a/res/cardsfolder/silvos_rogue_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Silvos, Rogue Elemental -ManaCost:3 G G G -Types:Legendary Creature Elemental -Text:no text -PT:8/5 -K:Trample -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39860.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sima_yi_wei_field_marshal.txt b/res/cardsfolder/sima_yi_wei_field_marshal.txt deleted file mode 100644 index e4059345e57..00000000000 --- a/res/cardsfolder/sima_yi_wei_field_marshal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sima Yi, Wei Field Marshal -ManaCost:5 B -Types:Legendary Creature Human Soldier -Text:no text -PT:*/4 -K:stSetPT:Count$Valid Swamp.YouCtrl:4:CARDNAME's power is equal to the number of Swamps you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sima_yi_wei_field_marshal.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simian_grunts.txt b/res/cardsfolder/simian_grunts.txt deleted file mode 100644 index d20d93b69b6..00000000000 --- a/res/cardsfolder/simian_grunts.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Simian Grunts -ManaCost:2 G -Types:Creature Ape -Text:no text -PT:3/4 -K:Flash -K:Echo:2 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simian_grunts.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simian_spirit_guide.txt b/res/cardsfolder/simian_spirit_guide.txt deleted file mode 100644 index 023e6fa36db..00000000000 --- a/res/cardsfolder/simian_spirit_guide.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Simian Spirit Guide -ManaCost:2 R -Types:Creature Ape Spirit -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ ExileFromHand<1/CARDNAME> | Produced$ R | ActivatingZone$ Hand | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simian_spirit_guide.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simic_growth_chamber.txt b/res/cardsfolder/simic_growth_chamber.txt deleted file mode 100644 index a17b0f7a29d..00000000000 --- a/res/cardsfolder/simic_growth_chamber.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Simic Growth Chamber -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G U | SpellDescription$ Add G U to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return a land you control to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Land.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_growth_chamber.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simic_ragworm.txt b/res/cardsfolder/simic_ragworm.txt deleted file mode 100644 index b43367cdda9..00000000000 --- a/res/cardsfolder/simic_ragworm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Simic Ragworm -ManaCost:3 G -Types:Creature Worm -Text:no text -PT:3/3 -A:AB$ Untap | Cost$ U | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_ragworm.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/93.jpg -End diff --git a/res/cardsfolder/simic_signet.txt b/res/cardsfolder/simic_signet.txt deleted file mode 100644 index 79a35e5e09f..00000000000 --- a/res/cardsfolder/simic_signet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Simic Signet -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ U G | SpellDescription$ Add U G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simic_signet.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simic_sky_swallower.txt b/res/cardsfolder/simic_sky_swallower.txt deleted file mode 100644 index ed40450ffb0..00000000000 --- a/res/cardsfolder/simic_sky_swallower.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Simic Sky Swallower -ManaCost:5 G U -Types:Creature Leviathan -Text:no text -PT:6/6 -K:Flying -K:Trample -K:Shroud -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card111204.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/simplify.txt b/res/cardsfolder/simplify.txt deleted file mode 100644 index f2caf01c5ac..00000000000 --- a/res/cardsfolder/simplify.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Simplify -ManaCost:G -Types:Sorcery -A:SP$ Sacrifice | Cost$ G | SacValid$ Enchantment | Defined$ Each | SpellDescription$ Each player sacrifices an enchantment. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/simplify.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sinew_sliver.txt b/res/cardsfolder/sinew_sliver.txt deleted file mode 100644 index 63b68595f1e..00000000000 --- a/res/cardsfolder/sinew_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sinew Sliver -ManaCost:1 W -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:1/1:no Condition:All Sliver creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sinew_sliver.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/singe_mind_ogre.txt b/res/cardsfolder/singe_mind_ogre.txt deleted file mode 100644 index fd57710201b..00000000000 --- a/res/cardsfolder/singe_mind_ogre.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Singe-Mind Ogre -ManaCost:2 B R -Types:Creature Ogre Mutant -Text: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. -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://magic.tcgplayer.com/db/cards/17138.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/singing_tree.txt b/res/cardsfolder/singing_tree.txt deleted file mode 100644 index 67724390fe4..00000000000 --- a/res/cardsfolder/singing_tree.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Singing Tree -ManaCost:3 G -Types:Creature Plant -Text:no text -PT:0/3 -A:AB$ Animate | Cost$ T | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Power$ 0 | SpellDescription$ Target attacking creature's power becomes 0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/singing_tree.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sinkhole.txt b/res/cardsfolder/sinkhole.txt deleted file mode 100644 index acf2e763075..00000000000 --- a/res/cardsfolder/sinkhole.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sinkhole -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ B B | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sinkhole.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/38.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/38.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sinking_feeling.txt b/res/cardsfolder/sinking_feeling.txt deleted file mode 100644 index 4919cefdfb0..00000000000 --- a/res/cardsfolder/sinking_feeling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sinking Feeling -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -K:stPumpEnchanted:Creature:0/0/SVar=Untap:No Condition:Enchanted creature has "1, Put a -1/-1 counter on this creature: Untap this creature." -SVar:Untap:AB$ Untap | Cost$ 1 AddCounter<1/M1M1> | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sinking_feeling.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sir_shandlar_of_eberyn.txt b/res/cardsfolder/sir_shandlar_of_eberyn.txt deleted file mode 100644 index 4240c284242..00000000000 --- a/res/cardsfolder/sir_shandlar_of_eberyn.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sir Shandlar of Eberyn -ManaCost:4 W G -Types:Legendary Creature Human Knight -Text:no text -PT:4/7 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1683.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/297.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sire_of_the_storm.txt b/res/cardsfolder/sire_of_the_storm.txt deleted file mode 100644 index 373f33e76ef..00000000000 --- a/res/cardsfolder/sire_of_the_storm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sire of the Storm -ManaCost:4 U U -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sire_of_the_storm.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sirens_call.txt b/res/cardsfolder/sirens_call.txt deleted file mode 100644 index 27478859877..00000000000 --- a/res/cardsfolder/sirens_call.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Siren's Call -ManaCost:U -Types:Instant -Text:Cast CARDNAME only during an opponent's turn, before attackers are declared.\r\nCreatures the active player controls attack this turn if able.\r\nAt 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sirens_call.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/78.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/78.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/80.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/101.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sisays_ring.txt b/res/cardsfolder/sisays_ring.txt deleted file mode 100644 index 55b4ec3c45c..00000000000 --- a/res/cardsfolder/sisays_ring.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sisay's Ring -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sisays_ring.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/154.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sisters_of_the_flame.txt b/res/cardsfolder/sisters_of_the_flame.txt deleted file mode 100644 index accc6098725..00000000000 --- a/res/cardsfolder/sisters_of_the_flame.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sisters of the Flame -ManaCost:1 R R -Types:Creature Human Shaman -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dk/en-us/card1800.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/73.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sivitri_scarzam.txt b/res/cardsfolder/sivitri_scarzam.txt deleted file mode 100644 index 5bc8b29aa5a..00000000000 --- a/res/cardsfolder/sivitri_scarzam.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sivitri Scarzam -ManaCost:5 U B -Types:Legendary Creature Human -Text:no text -PT:6/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ch/en-us/card2879.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sizzle.txt b/res/cardsfolder/sizzle.txt deleted file mode 100644 index ee38fa3c67c..00000000000 --- a/res/cardsfolder/sizzle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sizzle -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Defined$ Opponent | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to each opponent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sizzle.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/224.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skarrg_the_rage_pits.txt b/res/cardsfolder/skarrg_the_rage_pits.txt deleted file mode 100644 index 7767bcb6ea9..00000000000 --- a/res/cardsfolder/skarrg_the_rage_pits.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skarrg, the Rage Pits -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ R G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ Trample | SpellDescription$ Target creature gets +1/+1 and gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skarrg_the_rage_pits.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skarrgan_pit_skulk.txt b/res/cardsfolder/skarrgan_pit_skulk.txt deleted file mode 100644 index 417d5639235..00000000000 --- a/res/cardsfolder/skarrgan_pit_skulk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skarrgan Pit-Skulk -ManaCost:G -Types:Creature Human Warrior -Text:no text -PT:1/1 -K:Bloodthirst 1 -K:Creatures with power less than CARDNAME's power can't block it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skarrgan_pit_skulk.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skarrgan_skybreaker.txt b/res/cardsfolder/skarrgan_skybreaker.txt deleted file mode 100644 index 2e85e9900b3..00000000000 --- a/res/cardsfolder/skarrgan_skybreaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skarrgan Skybreaker -ManaCost:4 R R G -Types:Creature Giant Shaman -Text:no text -PT:3/3 -K:Bloodthirst 3 -A:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature or player. -SVar:X:Count$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skarrgan_skybreaker.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeletal_changeling.txt b/res/cardsfolder/skeletal_changeling.txt deleted file mode 100644 index 036c4cbc95a..00000000000 --- a/res/cardsfolder/skeletal_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skeletal Changeling -ManaCost:1 B -Types:Creature Shapeshifter -Text:no text -PT:1/1 -K:Changeling -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skeletal_changeling.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeletal_crocodile.txt b/res/cardsfolder/skeletal_crocodile.txt deleted file mode 100644 index 8a4a368535c..00000000000 --- a/res/cardsfolder/skeletal_crocodile.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Skeletal Crocodile -ManaCost:3 B -Types:Creature Crocodile Skeleton -Text:no text -PT:5/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4239.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeletal_kathari.txt b/res/cardsfolder/skeletal_kathari.txt deleted file mode 100644 index 9514253976e..00000000000 --- a/res/cardsfolder/skeletal_kathari.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skeletal Kathari -ManaCost:4 B -Types:Creature Bird Skeleton -Text:no text -PT:3/2 -K:Flying -A:AB$ Regenerate | Cost$ B Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/skeletal_kathari.jpg -SVar:Rarity:Common -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/88.jpg -End diff --git a/res/cardsfolder/skeletal_snake.txt b/res/cardsfolder/skeletal_snake.txt deleted file mode 100644 index 72f14be1ce5..00000000000 --- a/res/cardsfolder/skeletal_snake.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Skeletal Snake -ManaCost:1 B -Types:Creature Snake Skeleton -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4240.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeletal_vampire.txt b/res/cardsfolder/skeletal_vampire.txt deleted file mode 100644 index cd15a28086f..00000000000 --- a/res/cardsfolder/skeletal_vampire.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Skeletal Vampire -ManaCost:4 B B -Types:Creature Vampire Skeleton -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put two 1/1 black Bat creature tokens with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ B 1 1 Bat | TokenName$ Bat | TokenColors$ Black | TokenTypes$ Creature,Bat | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenOwner$ You | TokenAmount$ 2 -A:AB$ Token | Cost$ 3 B B Sac<1/Bat> | TokenAmount$ 2 | TokenImage$ B 1 1 Bat | TokenName$ Bat | TokenColors$ Black | TokenTypes$ Creature,Bat | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenOwner$ You | SpellDescription$ Put two 1/1 black Bat creature tokens with flying onto the battlefield. -A:AB$ Regenerate | Cost$ Sac<1/Bat> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skeletal_vampire.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeletal_wurm.txt b/res/cardsfolder/skeletal_wurm.txt deleted file mode 100644 index e2598742d3e..00000000000 --- a/res/cardsfolder/skeletal_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skeletal Wurm -ManaCost:7 B -Types:Creature Skeleton Wurm -Text:no text -PT:7/6 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skeletal_wurm.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skeleton_ship.txt b/res/cardsfolder/skeleton_ship.txt deleted file mode 100644 index 44c0760cce1..00000000000 --- a/res/cardsfolder/skeleton_ship.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skeleton Ship -ManaCost:3 U B -Types:Legendary Creature Skeleton -Text:no text -PT:0/3 -K:When you control no Islands, sacrifice CARDNAME. -A:AB$ PutCounter | Cost$ T | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skeleton_ship.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/379.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skinrender.txt b/res/cardsfolder/skinrender.txt deleted file mode 100644 index 56fda220671..00000000000 --- a/res/cardsfolder/skinrender.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skinrender -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put three -1/-1 counters on target creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | IsCurse$ True | CounterNum$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skinrender.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skinthinner.txt b/res/cardsfolder/skinthinner.txt deleted file mode 100644 index 62fc96b9017..00000000000 --- a/res/cardsfolder/skinthinner.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skinthinner -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/1 -K:Morph:3 B B -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME is turned face up, destroy target nonblack creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skinthinner.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skinwing.txt b/res/cardsfolder/skinwing.txt deleted file mode 100644 index 5d50b350dee..00000000000 --- a/res/cardsfolder/skinwing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skinwing -ManaCost:4 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has flying. -K:eqPump 6:+2/+2/Flying -K:Living Weapon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skinwing.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirge_familiar.txt b/res/cardsfolder/skirge_familiar.txt deleted file mode 100644 index dee9fd65f6c..00000000000 --- a/res/cardsfolder/skirge_familiar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skirge Familiar -ManaCost:4 B -Types:Creature Imp -Text:no text -PT:3/2 -K:Flying -A:AB$ Mana | Cost$ Discard<1/Card> | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirge_familiar.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_fire_marshal.txt b/res/cardsfolder/skirk_fire_marshal.txt deleted file mode 100644 index f97ee58f2d9..00000000000 --- a/res/cardsfolder/skirk_fire_marshal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skirk Fire Marshal -ManaCost:3 R R -Types:Creature Goblin -Text:no text -PT:2/2 -A:AB$ DamageAll | Cost$ tapXType<5/Goblin> | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 10 | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 10 damage to each creature and each player. -K:Protection from red -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_fire_marshal.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_marauder.txt b/res/cardsfolder/skirk_marauder.txt deleted file mode 100644 index 73173ba6416..00000000000 --- a/res/cardsfolder/skirk_marauder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skirk Marauder -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:2/1 -K:Morph:2 R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME is turned face up, it deals 2 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_marauder.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_outrider.txt b/res/cardsfolder/skirk_outrider.txt deleted file mode 100644 index 074b9195202..00000000000 --- a/res/cardsfolder/skirk_outrider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skirk Outrider -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:2/2 -K:stPumpSelf:Creature:2/2/Trample:isPresent Beast.YouCtrl:As long as you control a Beast, Skirk Outrider gets +2/+2 and has trample. -SVar:RemRandomDeck:True -SVar:BuffedBy:Beast -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_outrider.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_prospector.txt b/res/cardsfolder/skirk_prospector.txt deleted file mode 100644 index 6f5ea182a4d..00000000000 --- a/res/cardsfolder/skirk_prospector.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skirk Prospector -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ Sac<1/Goblin> | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_prospector.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_ridge_exhumer.txt b/res/cardsfolder/skirk_ridge_exhumer.txt deleted file mode 100644 index f105e3adc2f..00000000000 --- a/res/cardsfolder/skirk_ridge_exhumer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skirk Ridge Exhumer -ManaCost:1 B -Types:Creature Zombie Spellshaper -Text:no text -PT:1/1 -A:AB$ Token | Cost$ B T Discard<1/Card> | TokenName$ Festering Goblin | TokenTypes$ Creature,Zombie,Goblin | TokenColors$ Black | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenAmount$ 1 | TokenTriggers$ TriggerJunior | TokenSVars$ TrigTokenPump | SpellDescription$ Put a 1/1 black Zombie Goblin creature token named Festering Goblin onto the battlefield. It has "When Festering Goblin is put into a graveyard from the battlefield, target creature gets -1/-1 until end of turn." -SVar:TriggerJunior:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigTokenPump | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, target creature gets -1/-1 until end of turn. -SVar:TrigTokenPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_ridge_exhumer.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/77.jpg -End diff --git a/res/cardsfolder/skirk_shaman.txt b/res/cardsfolder/skirk_shaman.txt deleted file mode 100644 index 41daf036090..00000000000 --- a/res/cardsfolder/skirk_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skirk Shaman -ManaCost:1 R R -Types:Creature Goblin Shaman -Text:Skirk Shaman can't be blocked except by artifact creatures and/or red creatures. -PT:2/2 -K:CantBeBlockedBy Creature.nonArtifact+nonRed -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card131011.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skirk_volcanist.txt b/res/cardsfolder/skirk_volcanist.txt deleted file mode 100644 index 26595922d6d..00000000000 --- a/res/cardsfolder/skirk_volcanist.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Skirk Volcanist -ManaCost:3 R -Types:Creature Goblin -Text:no text -PT:3/1 -K:Morph:Sac<2/Mountain> -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME is turned face up, it deals 3 damage divided as you choose among one, two, or three target creatures. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature (1) | NumDmg$ 1 | SubAbility$ SVar=DBDamage2 -SVar:DBDamage2:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ target creature (2) | NumDmg$ 1 | SubAbility$ SVar=DBDamage3 -SVar:DBDamage3:DB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ target creature (3) | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skirk_volcanist.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skithiryx_the_blight_dragon.txt b/res/cardsfolder/skithiryx_the_blight_dragon.txt deleted file mode 100644 index c20b1f359de..00000000000 --- a/res/cardsfolder/skithiryx_the_blight_dragon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skithiryx, the Blight Dragon -ManaCost:3 B B -Types:Legendary Creature Dragon Skeleton -Text:no text -PT:4/4 -K:Flying -K:Infect -A:AB$ Regenerate | Cost$ B B | SpellDescription$ Regenerate CARDNAME. -A:AB$ Pump | Cost$ B | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/skithiryx_the_blight_dragon.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/79.jpg -End diff --git a/res/cardsfolder/skitter_of_lizards.txt b/res/cardsfolder/skitter_of_lizards.txt deleted file mode 100644 index e3d935d074c..00000000000 --- a/res/cardsfolder/skitter_of_lizards.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skitter of Lizards -ManaCost:R -Types:Creature Lizard -Text:Skitter of Lizards enters the battlefield with a +1/+1 counter on it for each time it was kicked. -PT:1/1 -K:Haste -K:Multikicker 1 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skitter_of_lizards.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skittering_horror.txt b/res/cardsfolder/skittering_horror.txt deleted file mode 100644 index 5cc2e9a0b9d..00000000000 --- a/res/cardsfolder/skittering_horror.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skittering Horror -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:4/3 -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When you cast a creature spell, sacrifice CARDNAME. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_horror.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skittering_invasion.txt b/res/cardsfolder/skittering_invasion.txt deleted file mode 100644 index 5ee9f613411..00000000000 --- a/res/cardsfolder/skittering_invasion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skittering Invasion -ManaCost:7 -Types:Tribal Sorcery Eldrazi -Text:Put five 0/1 colorless Eldrazi Spawn creature tokens onto the battlefield. They have "Sacrifice this creature: Add 1 to your mana pool." -A:SP$ Token | Cost$ 7 | TokenAmount$ 5 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_invasion.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/10.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skittering_skirge.txt b/res/cardsfolder/skittering_skirge.txt deleted file mode 100644 index aacdf98c082..00000000000 --- a/res/cardsfolder/skittering_skirge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skittering Skirge -ManaCost:B B -Types:Creature Imp -Text:no text -PT:3/2 -K:Flying -T:Mode$ SpellCast | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When you cast a creature spell, sacrifice CARDNAME. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skittering_skirge.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skittish_kavu.txt b/res/cardsfolder/skittish_kavu.txt deleted file mode 100644 index 8f9b5216358..00000000000 --- a/res/cardsfolder/skittish_kavu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skittish Kavu -ManaCost:1 R -Types:Creature Kavu -Text:no text -PT:1/1 -K:stPumpSelf:Creature:1/1:isNotPresent Creature.White+YouDontCtrl,Creature.Blue+YouDontCtrl:Skittish Kavu gets +1/+1 as long as no opponent controls a white or blue creature. -SVar:AntiBuffedBy:Creature.White,Creature.Blue -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skittish_kavu.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skizzik.txt b/res/cardsfolder/skizzik.txt deleted file mode 100644 index 0a51074d674..00000000000 --- a/res/cardsfolder/skizzik.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Skizzik -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:5/3 -K:Haste -K:Trample -K:Kicker:R -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | IsPresent$ Card.Self+notkicked | Execute$ TrigNotKicked | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME unless it was kicked. -SVar:TrigNotKicked:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skizzik.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skred.txt b/res/cardsfolder/skred.txt deleted file mode 100644 index f62534352c2..00000000000 --- a/res/cardsfolder/skred.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skred -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ Skred deals damage to target creature equal to the number of snow permanents you control. -SVar:X:Count$TypeYouCtrl.Snow -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skred.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/97.jpg -End diff --git a/res/cardsfolder/skulking_fugitive.txt b/res/cardsfolder/skulking_fugitive.txt deleted file mode 100644 index 301a31c68c9..00000000000 --- a/res/cardsfolder/skulking_fugitive.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skulking Fugitive -ManaCost:2 B -Types:Creature Horror Mercenary -Text:no text -PT:3/4 -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skulking_fugitive.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skulking_ghost.txt b/res/cardsfolder/skulking_ghost.txt deleted file mode 100644 index 794b33a916c..00000000000 --- a/res/cardsfolder/skulking_ghost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skulking Ghost -ManaCost:1 B -Types:Creature Ghost -Text:no text -PT:2/1 -K:Flying -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skulking_ghost.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skulking_knight.txt b/res/cardsfolder/skulking_knight.txt deleted file mode 100644 index eb41af5d9c1..00000000000 --- a/res/cardsfolder/skulking_knight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skulking Knight -ManaCost:2 B -Types:Creature Zombie Knight -Text:no text -PT:3/3 -K:Flanking -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skulking_knight.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skull_catapult.txt b/res/cardsfolder/skull_catapult.txt deleted file mode 100644 index a65c1a41ade..00000000000 --- a/res/cardsfolder/skull_catapult.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skull Catapult -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 1 T Sac<1/Creature> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_catapult.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/399.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/309.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skull_collector.txt b/res/cardsfolder/skull_collector.txt deleted file mode 100644 index 635f498d11c..00000000000 --- a/res/cardsfolder/skull_collector.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skull Collector -ManaCost:1 B B -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a black creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target black creature | Mandatory$ True | ValidTgts$ Creature.Black+YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_collector.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skull_fracture.txt b/res/cardsfolder/skull_fracture.txt deleted file mode 100644 index 070049cac5c..00000000000 --- a/res/cardsfolder/skull_fracture.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skull Fracture -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | Flashback$ True | CostDesc$ Flashback 3 B | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_fracture.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skull_of_orm.txt b/res/cardsfolder/skull_of_orm.txt deleted file mode 100644 index 2486c82789d..00000000000 --- a/res/cardsfolder/skull_of_orm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skull of Orm -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$5 T | TgtPrompt$ Choose target enchantment in your graveyard | ValidTgts$ Enchantment.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target enchantment card from your graveyard to your hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_of_orm.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/313.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skull_of_ramos.txt b/res/cardsfolder/skull_of_ramos.txt deleted file mode 100644 index 69ad343e4e7..00000000000 --- a/res/cardsfolder/skull_of_ramos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skull of Ramos -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skull_of_ramos.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skullclamp.txt b/res/cardsfolder/skullclamp.txt deleted file mode 100644 index 68550c3fffb..00000000000 --- a/res/cardsfolder/skullclamp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skullclamp -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/-1. -K:eqPump 1:+1/-1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigDraw | TriggerDescription$ Whenever equipped creature is put into a graveyard, draw two cards. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skullclamp.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skullmead_cauldron.txt b/res/cardsfolder/skullmead_cauldron.txt deleted file mode 100644 index 31111ed2831..00000000000 --- a/res/cardsfolder/skullmead_cauldron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skullmead Cauldron -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -A:AB$ GainLife | Cost$ T Discard<1/Card>| LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skullmead_cauldron.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skullmulcher.txt b/res/cardsfolder/skullmulcher.txt deleted file mode 100644 index b04e77a8ca3..00000000000 --- a/res/cardsfolder/skullmulcher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skullmulcher -ManaCost:4 G -Types:Creature Elemental -Text:When CARDNAME enters the battlefield, draw a card for each creature it devoured. -PT:3/3 -K:Devour:1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skullmulcher.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skullsnatcher.txt b/res/cardsfolder/skullsnatcher.txt deleted file mode 100644 index 4493a740488..00000000000 --- a/res/cardsfolder/skullsnatcher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skullsnatcher -ManaCost:1 B -Types:Creature Rat Ninja -Text:no text -PT:2/1 -A:AB$ ChangeZone | Cost$ B Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu B | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (B, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile up to two target cards from that player's graveyard. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | ValidTgts$ Card.YouDontOwn | TgtPrompt$ Select target card | TargetMin$ 0 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Exile | IsCurse$ True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skullsnatcher.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skulltap.txt b/res/cardsfolder/skulltap.txt deleted file mode 100644 index 15333c56ba4..00000000000 --- a/res/cardsfolder/skulltap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skulltap -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 B Sac<1/Creature> | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skulltap.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_diamond.txt b/res/cardsfolder/sky_diamond.txt deleted file mode 100644 index 1171b7bc7fe..00000000000 --- a/res/cardsfolder/sky_diamond.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sky Diamond -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_diamond.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/310.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/284.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_eel_school.txt b/res/cardsfolder/sky_eel_school.txt deleted file mode 100644 index 6bd9bf1a10e..00000000000 --- a/res/cardsfolder/sky_eel_school.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sky-Eel School -ManaCost:3 U U -Types:Creature Fish -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoot | TriggerDescription$ When CARDNAME enters the battlefield, draw a card, then discard a card. -SVar:TrigLoot:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_eel_school.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_hussar.txt b/res/cardsfolder/sky_hussar.txt deleted file mode 100644 index d6fa0d877d3..00000000000 --- a/res/cardsfolder/sky_hussar.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sky Hussar -ManaCost:3 W U -Types:Creature Human Knight -Text:no text -PT:4/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntapAll | TriggerDescription$ When CARDNAME enters the battlefield, untap all creatures you control. -SVar:TrigUntapAll:AB$UntapAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | SpellDescription$ untap all creatures you control. -A:AB$ Draw | Cost$ tapXType<2/Creature.White;Creature.Blue> | NumCards$ 1 | ActivatingZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | CostDesc$ Tap two untapped white and/or blue creatures you control, Reveal CARDNAME from your hand: | SpellDescription$ Draw a card. (Activate this ability only during your upkeep and only once each turn.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_hussar.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_ruin_drake.txt b/res/cardsfolder/sky_ruin_drake.txt deleted file mode 100644 index 85637c42c61..00000000000 --- a/res/cardsfolder/sky_ruin_drake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sky Ruin Drake -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:2/5 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_ruin_drake.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_spirit.txt b/res/cardsfolder/sky_spirit.txt deleted file mode 100644 index 84e69556ad7..00000000000 --- a/res/cardsfolder/sky_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sky Spirit -ManaCost:1 W U -Types:Creature Spirit -Text:no text -PT:2/2 -K:Flying -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_spirit.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/346.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_swallower.txt b/res/cardsfolder/sky_swallower.txt deleted file mode 100644 index a580dec977d..00000000000 --- a/res/cardsfolder/sky_swallower.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sky Swallower -ManaCost:3 U U -Types:Creature Leviathan -Text:When CARDNAME enters the battlefield, target opponent gains control of all other permanents you control. -PT:8/8 -K:Flying -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96835.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sky_weaver.txt b/res/cardsfolder/sky_weaver.txt deleted file mode 100644 index 386e511870b..00000000000 --- a/res/cardsfolder/sky_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sky Weaver -ManaCost:1 U -Types:Creature Metathran Wizard -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.White,Creature.Black | KW$ Flying | SpellDescription$ Target white or black creature gains flying until end of turn. | TgtPrompt$ Select target white or black creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sky_weaver.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/74.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skycloud_egg.txt b/res/cardsfolder/skycloud_egg.txt deleted file mode 100644 index e5208d76892..00000000000 --- a/res/cardsfolder/skycloud_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skycloud Egg -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ W U | SubAbility$ SVar=DBDraw | SpellDescription$ Add W U to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skycloud_egg.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/309.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skycloud_expanse.txt b/res/cardsfolder/skycloud_expanse.txt deleted file mode 100644 index 893fa271cb5..00000000000 --- a/res/cardsfolder/skycloud_expanse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skycloud Expanse -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W U | SpellDescription$ Add W U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skycloud_expanse.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyhunter_cub.txt b/res/cardsfolder/skyhunter_cub.txt deleted file mode 100644 index ab7328975ac..00000000000 --- a/res/cardsfolder/skyhunter_cub.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyhunter Cub -ManaCost:2 W -Types:Creature Cat Knight -Text:no text -PT:2/2 -K:stPumpSelf:Permanent.equipped:1/1/Flying:No Condition:As long as Skyhunter Cub is equipped, it gets +1/+1 and has flying. -SVar:EquipMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyhunter_cub.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyhunter_patrol.txt b/res/cardsfolder/skyhunter_patrol.txt deleted file mode 100644 index 1ba0f098a6b..00000000000 --- a/res/cardsfolder/skyhunter_patrol.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyhunter Patrol -ManaCost:2 W W -Types:Creature Cat Knight -Text:no text -PT:2/3 -K:Flying -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyhunter_patrol.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/22.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyhunter_prowler.txt b/res/cardsfolder/skyhunter_prowler.txt deleted file mode 100644 index e8962021ee9..00000000000 --- a/res/cardsfolder/skyhunter_prowler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skyhunter Prowler -ManaCost:2 W -Types:Creature Cat Knight -Text:no text -PT:1/3 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83412.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/15.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/45.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyhunter_skirmisher.txt b/res/cardsfolder/skyhunter_skirmisher.txt deleted file mode 100644 index 61001e6e580..00000000000 --- a/res/cardsfolder/skyhunter_skirmisher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyhunter Skirmisher -ManaCost:1 W W -Types:Creature Cat Knight -Text:no text -PT:1/1 -K:Flying -K:Double Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyhunter_skirmisher.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/16.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyknight_legionnaire.txt b/res/cardsfolder/skyknight_legionnaire.txt deleted file mode 100644 index faaaee8e6de..00000000000 --- a/res/cardsfolder/skyknight_legionnaire.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyknight Legionnaire -ManaCost:1 W R -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flying -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card109082.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/232.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyreach_manta.txt b/res/cardsfolder/skyreach_manta.txt deleted file mode 100644 index b4d151191ab..00000000000 --- a/res/cardsfolder/skyreach_manta.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyreach Manta -ManaCost:5 -Types:Artifact Creature Fish -Text:no text -PT:0/0 -K:Flying -K:Sunburst -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyreach_manta.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyrider_trainee.txt b/res/cardsfolder/skyrider_trainee.txt deleted file mode 100644 index dcfc02d886b..00000000000 --- a/res/cardsfolder/skyrider_trainee.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyrider Trainee -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:stPumpSelf:Creature:0/0/Flying:isEnchanted:Skyrider Trainee has flying as long as it's enchanted. -SVar:EnchantMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyrider_trainee.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyscribing.txt b/res/cardsfolder/skyscribing.txt deleted file mode 100644 index 1c78ca44ac4..00000000000 --- a/res/cardsfolder/skyscribing.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyscribing -ManaCost:X U U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ X U U | Defined$ Each | NumCards$ X | SpellDescription$ Each player draws X cards. -A:AB$ Draw | Cost$ 2 U | NumCards$ 1 | Defined$ Each | ActivatingZone$ Hand | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | CostDesc$ 2 U Reveal CARDNAME from your hand: | SpellDescription$ Each player draws a card. (Activate this ability only during your upkeep and only once each turn.) -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyscribing.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshaper.txt b/res/cardsfolder/skyshaper.txt deleted file mode 100644 index e0ab329e0aa..00000000000 --- a/res/cardsfolder/skyshaper.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Skyshaper -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Flying | SpellDescription$ Creatures you control gain flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshaper.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshooter.txt b/res/cardsfolder/skyshooter.txt deleted file mode 100644 index ddc42ea4934..00000000000 --- a/res/cardsfolder/skyshooter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyshooter -ManaCost:3 W -Types:Creature Centaur Archer -Text:no text -PT:1/2 -K:Reach -A:AB$ Destroy | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.attacking+withFlying,Creature.blocking+withFlying | TgtPrompt$ Select target attacking or blocking creature with flying | SpellDescription$ Destroy target attacking or blocking creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshooter.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_archer.txt b/res/cardsfolder/skyshroud_archer.txt deleted file mode 100644 index 6475162b540..00000000000 --- a/res/cardsfolder/skyshroud_archer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skyshroud Archer -ManaCost:G -Types:Creature Elf Archer -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature with flying gets -1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_archer.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_behemoth.txt b/res/cardsfolder/skyshroud_behemoth.txt deleted file mode 100644 index 885016c4388..00000000000 --- a/res/cardsfolder/skyshroud_behemoth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyshroud Behemoth -ManaCost:5 G G -Types:Creature Beast -Text:no text -PT:10/10 -K:Fading:2 -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_behemoth.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_claim.txt b/res/cardsfolder/skyshroud_claim.txt deleted file mode 100644 index 319662d9856..00000000000 --- a/res/cardsfolder/skyshroud_claim.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Skyshroud Claim -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 2 | SpellDescription$ Search your library for up to two Forest cards and put them onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_claim.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_elf.txt b/res/cardsfolder/skyshroud_elf.txt deleted file mode 100644 index 1951caaa36e..00000000000 --- a/res/cardsfolder/skyshroud_elf.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skyshroud Elf -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ 1 | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_elf.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_elite.txt b/res/cardsfolder/skyshroud_elite.txt deleted file mode 100644 index 5f252fe0244..00000000000 --- a/res/cardsfolder/skyshroud_elite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skyshroud Elite -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -K:stPumpSelf:Creature:1/2:isPresent Land.nonBasic+YouDontCtrl:Skyshroud Elite gets +1/+2 as long as an opponent controls a nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_elite.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_falcon.txt b/res/cardsfolder/skyshroud_falcon.txt deleted file mode 100644 index a4d8308d9e7..00000000000 --- a/res/cardsfolder/skyshroud_falcon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyshroud Falcon -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5224.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/116.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_forest.txt b/res/cardsfolder/skyshroud_forest.txt deleted file mode 100644 index 7b20ea39d9e..00000000000 --- a/res/cardsfolder/skyshroud_forest.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Skyshroud Forest -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -K:CARDNAME enters the battlefield tapped. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_forest.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/332.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_poacher.txt b/res/cardsfolder/skyshroud_poacher.txt deleted file mode 100644 index 7f7e2a8928d..00000000000 --- a/res/cardsfolder/skyshroud_poacher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyshroud Poacher -ManaCost:2 G G -Types:Creature Human Rebel -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.Elf | ChangeNum$ 1 | SpellDescription$ Search your library for an Elf permanent card and put it onto the battlefield. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_poacher.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_ridgeback.txt b/res/cardsfolder/skyshroud_ridgeback.txt deleted file mode 100644 index 0af5318a342..00000000000 --- a/res/cardsfolder/skyshroud_ridgeback.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skyshroud Ridgeback -ManaCost:G -Types:Creature Beast -Text:no text -PT:2/3 -K:Fading:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_ridgeback.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_sentinel.txt b/res/cardsfolder/skyshroud_sentinel.txt deleted file mode 100644 index ecb5e554b68..00000000000 --- a/res/cardsfolder/skyshroud_sentinel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyshroud Sentinel -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for up to three cards named CARDNAME, reveal them, and put them into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedSkyshroud Sentinel | ChangeNum$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_sentinel.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_troll.txt b/res/cardsfolder/skyshroud_troll.txt deleted file mode 100644 index e664798754a..00000000000 --- a/res/cardsfolder/skyshroud_troll.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skyshroud Troll -ManaCost:2 G G -Types:Creature Troll Giant -Text:no text -PT:3/3 -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_troll.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_troopers.txt b/res/cardsfolder/skyshroud_troopers.txt deleted file mode 100644 index 3b8ff3f7321..00000000000 --- a/res/cardsfolder/skyshroud_troopers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Skyshroud Troopers -ManaCost:3 G -Types:Creature Elf Druid Warrior -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5230.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skyshroud_vampire.txt b/res/cardsfolder/skyshroud_vampire.txt deleted file mode 100644 index 93d99763417..00000000000 --- a/res/cardsfolder/skyshroud_vampire.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyshroud Vampire -ManaCost:3 B B -Types:Creature Vampire -Text:no text -PT:3/3 -K:Flying -A:AB$ Pump | Cost$ Discard<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Skyshroud Vampire gets +2/+2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_vampire.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/51.jpg -End diff --git a/res/cardsfolder/skyshroud_war_beast.txt b/res/cardsfolder/skyshroud_war_beast.txt deleted file mode 100644 index 947d8cd909e..00000000000 --- a/res/cardsfolder/skyshroud_war_beast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skyshroud War Beast -ManaCost:1 G -Types:Creature Beast -Text:no text -PT:*/* -K:Trample -K:stSetPT:Count$Valid Land.nonBasic+YouDontCtrl:Count$Valid Land.nonBasic+YouDontCtrl:CARDNAME's power and toughness are each equal to the number of nonbasic lands your opponent controls. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyshroud_war_beast.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/124.jpg -End diff --git a/res/cardsfolder/skyward_eye_prophets.txt b/res/cardsfolder/skyward_eye_prophets.txt deleted file mode 100644 index b23df7afaa5..00000000000 --- a/res/cardsfolder/skyward_eye_prophets.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Skyward Eye Prophets -ManaCost:3 G W U -Types:Creature Human Wizard -Text:no text -PT:3/3 -K:Vigilance -A:AB$ Dig | Cost$ T | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | DestinationZone2$ Hand | SpellDescription$ Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/skyward_eye_prophets.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skywatcher_adept.txt b/res/cardsfolder/skywatcher_adept.txt deleted file mode 100644 index 33aaf5f550d..00000000000 --- a/res/cardsfolder/skywatcher_adept.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Skywatcher Adept -ManaCost:U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:2:2:LevelGE3:4:2:LEVEL 1-2 2/2 Flying LEVEL 3+ 4/2 Flying -K:stPumpSelf:Creature.countersGE1LEVEL:0/0/Flying:No Condition:no text -K:Level up:3 -K:maxLevel:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skywatcher_adept.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/skywing_aven.txt b/res/cardsfolder/skywing_aven.txt deleted file mode 100644 index 234ac0c6862..00000000000 --- a/res/cardsfolder/skywing_aven.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Skywing Aven -ManaCost:2 U -Types:Creature Bird Soldier -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/skywing_aven.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slag_fiend.txt b/res/cardsfolder/slag_fiend.txt deleted file mode 100644 index 829c3ad4ea4..00000000000 --- a/res/cardsfolder/slag_fiend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slag Fiend -ManaCost:R -Types:Creature Construct -Text:no text -PT:*/* -K:stSetPT:Count$TypeInAllYards.Artifact:Count$TypeInAllYards.Artifact:CARDNAME's power and toughness are each equal to the number of artifact cards in all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slag_fiend.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slagstorm.txt b/res/cardsfolder/slagstorm.txt deleted file mode 100644 index 61b920202ca..00000000000 --- a/res/cardsfolder/slagstorm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slagstorm -ManaCost:1 R R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R R | NumDmg$ 3 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ Choose one - CARDNAME deals 3 damage to each creature; -A:SP$ DamageAll | Cost$ 1 R R | NumDmg$ 3 | ValidPlayers$ Each | ValidDescription$ each player. | SpellDescription$ or CARDNAME deals 3 damage to each player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slagstorm.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slagwurm_armor.txt b/res/cardsfolder/slagwurm_armor.txt deleted file mode 100644 index e0ace1c9aee..00000000000 --- a/res/cardsfolder/slagwurm_armor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Slagwurm Armor -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +0/+6. -K:eqPump 3:+0/+6 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slagwurm_armor.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slash_panther.txt b/res/cardsfolder/slash_panther.txt deleted file mode 100644 index 628f74b639c..00000000000 --- a/res/cardsfolder/slash_panther.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Slash Panther -ManaCost:4 PR -Types:Artifact Creature Cat -Text:no text -PT:4/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slash_panther.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slashing_tiger.txt b/res/cardsfolder/slashing_tiger.txt deleted file mode 100644 index 236e5e97579..00000000000 --- a/res/cardsfolder/slashing_tiger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slashing Tiger -ManaCost:2 G G -Types:Creature Cat -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slashing_tiger.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slate_of_ancestry.txt b/res/cardsfolder/slate_of_ancestry.txt deleted file mode 100644 index 84373d6c767..00000000000 --- a/res/cardsfolder/slate_of_ancestry.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slate of Ancestry -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 4 T Discard<1/Hand> | NumCards$ X | SpellDescription$ Draw a card for each creature you control. -SVar:X:Count$TypeYouCtrl.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slate_of_ancestry.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/310.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/308.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slaughter.txt b/res/cardsfolder/slaughter.txt deleted file mode 100644 index 421eecd9d63..00000000000 --- a/res/cardsfolder/slaughter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slaughter -ManaCost:2 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonartifact, nonblack creature. It can't be regenerated. -A:SP$ Destroy | Cost$ 2 B B PayLife<4> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ SVar=DBBuyback | SpellDescription$ Buyback - Pay 4 life. -SVar:DBBuyback:DB$ ChangeZone | Cost$ 0 | Origin$ Stack | Destination$ Hand | ValidCard$ Card.Self -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/74.jpg -End diff --git a/res/cardsfolder/slaughter_cry.txt b/res/cardsfolder/slaughter_cry.txt deleted file mode 100644 index 8647214bf29..00000000000 --- a/res/cardsfolder/slaughter_cry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Slaughter Cry -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | KW$ First Strike | SpellDescription$ Target creature gets +3/+0 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slaughter_cry.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/149.jpg -End diff --git a/res/cardsfolder/slaughterhouse_bouncer.txt b/res/cardsfolder/slaughterhouse_bouncer.txt deleted file mode 100644 index 7052a549610..00000000000 --- a/res/cardsfolder/slaughterhouse_bouncer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slaughterhouse Bouncer -ManaCost:4 B -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigPump | Hellbent$ True | TriggerDescription$ Hellbent - When CARDNAME is put into a graveyard from play, if you have no cards in hand, target creature gets -3/-3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97073.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slave_of_bolas.txt b/res/cardsfolder/slave_of_bolas.txt deleted file mode 100644 index f5ce240644f..00000000000 --- a/res/cardsfolder/slave_of_bolas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Slave of Bolas -ManaCost:3 UR B -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 3 UR B | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | AddKWs$ Haste & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slave_of_bolas.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slavering_nulls.txt b/res/cardsfolder/slavering_nulls.txt deleted file mode 100644 index 894971b2df7..00000000000 --- a/res/cardsfolder/slavering_nulls.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slavering Nulls -ManaCost:1 R -Types:Creature Goblin Zombie -Text:no text -PT:2/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | IsPresent$ Swamp.YouCtrl | CombatDamage$ True | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, if you control a Swamp, you may have that player discard a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slavering_nulls.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slay.txt b/res/cardsfolder/slay.txt deleted file mode 100644 index c3d1bf64fb0..00000000000 --- a/res/cardsfolder/slay.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slay -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | NoRegen$ True | SpellDescription$ Destroy target green creature. It can't be regenerated. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slay.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/164.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/55.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/163.jpg -End diff --git a/res/cardsfolder/sleeper_agent.txt b/res/cardsfolder/sleeper_agent.txt deleted file mode 100644 index 8a6b5dd5366..00000000000 --- a/res/cardsfolder/sleeper_agent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sleeper Agent -ManaCost:B -Types:Creature Minion -Text:When CARDNAME enters the battlefield, target opponent gains control of it.\r\nAt the beginning of your upkeep, CARDNAME deals 2 damage to you. -PT:3/3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sleeper_agent.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/159.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sleepers_guile.txt b/res/cardsfolder/sleepers_guile.txt deleted file mode 100644 index 3d26179636e..00000000000 --- a/res/cardsfolder/sleepers_guile.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sleeper's Guile -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Fear -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sleepers_guile.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sleepers_robe.txt b/res/cardsfolder/sleepers_robe.txt deleted file mode 100644 index 75af5cf9d2e..00000000000 --- a/res/cardsfolder/sleepers_robe.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sleeper's Robe -ManaCost:U B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Fear -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sleepers_robe.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sleeping_potion.txt b/res/cardsfolder/sleeping_potion.txt deleted file mode 100644 index a50e9598bd0..00000000000 --- a/res/cardsfolder/sleeping_potion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sleeping Potion -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap enchanted creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ Enchanted -K:enPumpCurse:HIDDEN CARDNAME doesn't untap during your untap step.:Enchanted creature doesn't untap during its controller's untap step. -T:Mode$ SpellAbilityCast | TargetsValid$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When enchanted creature becomes the target of a spell or ability, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sleeping_potion.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sleight_of_hand.txt b/res/cardsfolder/sleight_of_hand.txt deleted file mode 100644 index aeac8899c2c..00000000000 --- a/res/cardsfolder/sleight_of_hand.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sleight of Hand -ManaCost:U -Types:Sorcery -Text:no text -A:AB$ Dig | Cost$ U | DigNum$ 2 | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sleight_of_hand.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/46.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/51.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/99.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slice_and_dice.txt b/res/cardsfolder/slice_and_dice.txt deleted file mode 100644 index a591548e289..00000000000 --- a/res/cardsfolder/slice_and_dice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slice and Dice -ManaCost:4 R R -Types:Sorcery -Text:no text -K:Cycling:2 R -A:SP$ DamageAll | Cost$ 4 R R | NumDmg$ 4 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 4 damage to each creature. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDamageAll | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have it deal 1 damage to each creature. -SVar:TrigDamageAll:AB$ DamageAll | Cost$ 0 | NumDmg$ 1 | ValidCards$ Creature | ValidDescription$ each creature. -SVar:Picture:http://www.wizards.com/global/images/magic/general/slice_and_dice.jpg -SVar:Rarity:Uncommon -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/232.jpg -End diff --git a/res/cardsfolder/slice_in_twain.txt b/res/cardsfolder/slice_in_twain.txt deleted file mode 100644 index 484431bff28..00000000000 --- a/res/cardsfolder/slice_in_twain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Slice in Twain -ManaCost:2 G G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slice_in_twain.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/127.jpg -End diff --git a/res/cardsfolder/slingbow_trap.txt b/res/cardsfolder/slingbow_trap.txt deleted file mode 100644 index f0d0308abec..00000000000 --- a/res/cardsfolder/slingbow_trap.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slingbow Trap -ManaCost:3 G -Types:Instant Trap -Text:no text -A:SP$ Destroy | Cost$ G | ValidTgts$ Creature.attacking+withFlying | IsPresent$ Creature.attacking+Black+withFlying | OptionalDecider$ You | TgtPrompt$ Select target attacking creature with flying. | SpellDescription$ If a black creature with flying is attacking, you may pay G rather than pay CARDNAME's mana cost. -A:SP$ Destroy | Cost$ 3 G | ValidTgts$ Creature.attacking+withFlying | TgtPrompt$ Select target attacking creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Slingbow_Trap.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slingshot_goblin.txt b/res/cardsfolder/slingshot_goblin.txt deleted file mode 100644 index a1916c2b69a..00000000000 --- a/res/cardsfolder/slingshot_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slingshot Goblin -ManaCost:2 R -Types:Creature Goblin -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ R T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target blue creature. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slingshot_goblin.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slinking_giant.txt b/res/cardsfolder/slinking_giant.txt deleted file mode 100644 index fce6f929a69..00000000000 --- a/res/cardsfolder/slinking_giant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slinking Giant -ManaCost:2 R R -Types:Creature Giant Rogue -Text:no text -PT:4/4 -K:Wither -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -3/-0 until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked, it gets -3/-0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ -3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slinking_giant.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slinking_serpent.txt b/res/cardsfolder/slinking_serpent.txt deleted file mode 100644 index 51d5582e217..00000000000 --- a/res/cardsfolder/slinking_serpent.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Slinking Serpent -ManaCost:2 U B -Types:Creature Serpent -Text:no text -PT:2/3 -K:Forestwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23149.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slinking_skirge.txt b/res/cardsfolder/slinking_skirge.txt deleted file mode 100644 index 9f3b592d75b..00000000000 --- a/res/cardsfolder/slinking_skirge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slinking Skirge -ManaCost:3 B -Types:Creature Imp -Text:no text -PT:2/1 -K:Flying -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slinking_skirge.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slippery_bogle.txt b/res/cardsfolder/slippery_bogle.txt deleted file mode 100644 index 7fbade109e2..00000000000 --- a/res/cardsfolder/slippery_bogle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Slippery Bogle -ManaCost:GU -Types:Creature Beast -Text:no text -PT:1/1 -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slippery_bogle.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slippery_karst.txt b/res/cardsfolder/slippery_karst.txt deleted file mode 100644 index bf1504ed608..00000000000 --- a/res/cardsfolder/slippery_karst.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slippery Karst -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slippery_karst.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slipstream_eel.txt b/res/cardsfolder/slipstream_eel.txt deleted file mode 100644 index 3ab258be135..00000000000 --- a/res/cardsfolder/slipstream_eel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slipstream Eel -ManaCost:5 U U -Types:Creature Fish Beast -Text:no text -PT:6/6 -K:CARDNAME can't attack unless defending player controls an Island. -K:Cycling:1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slipstream_eel.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slipstream_serpent.txt b/res/cardsfolder/slipstream_serpent.txt deleted file mode 100644 index ffac72bc242..00000000000 --- a/res/cardsfolder/slipstream_serpent.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slipstream Serpent -ManaCost:7 U -Types:Creature Serpent -Text:no text -PT:6/6 -K:Morph:5 U -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slipstream_serpent.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sliptide_serpent.txt b/res/cardsfolder/sliptide_serpent.txt deleted file mode 100644 index c38e7601ebb..00000000000 --- a/res/cardsfolder/sliptide_serpent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sliptide Serpent -ManaCost:4 U U -Types:Creature Serpent -Text:no text -PT:4/4 -A:AB$ ChangeZone | Cost$ 3 U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sliptide_serpent.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slith_ascendant.txt b/res/cardsfolder/slith_ascendant.txt deleted file mode 100644 index 9ae4ca75acd..00000000000 --- a/res/cardsfolder/slith_ascendant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slith Ascendant -ManaCost:1 W W -Types:Creature Slith -Text:no text -PT:1/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_ascendant.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slith_bloodletter.txt b/res/cardsfolder/slith_bloodletter.txt deleted file mode 100644 index df3430d7da4..00000000000 --- a/res/cardsfolder/slith_bloodletter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slith Bloodletter -ManaCost:B B -Types:Creature Slith -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -A:AB$ Regenerate | Cost$ 1 B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_bloodletter.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slith_firewalker.txt b/res/cardsfolder/slith_firewalker.txt deleted file mode 100644 index f045c9bd2f7..00000000000 --- a/res/cardsfolder/slith_firewalker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slith Firewalker -ManaCost:R R -Types:Creature Slith -Text:no text -PT:1/1 -K:Haste -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_firewalker.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slith_predator.txt b/res/cardsfolder/slith_predator.txt deleted file mode 100644 index b2df1dff0da..00000000000 --- a/res/cardsfolder/slith_predator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slith Predator -ManaCost:G G -Types:Creature Slith -Text:no text -PT:1/1 -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_predator.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slith_strider.txt b/res/cardsfolder/slith_strider.txt deleted file mode 100644 index 01d145e3a3e..00000000000 --- a/res/cardsfolder/slith_strider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slith Strider -ManaCost:1 U U -Types:Creature Slith -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME becomes blocked, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slith_strider.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slithering_shade.txt b/res/cardsfolder/slithering_shade.txt deleted file mode 100644 index 25b6a375b9e..00000000000 --- a/res/cardsfolder/slithering_shade.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slithering Shade -ManaCost:B -Types:Creature Shade -Text:no text -PT:0/1 -K:Defender -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can attack as though it didn't have defender.:Hellbent:Hellbent - CARDNAME can attack as though it didn't have defender as long as you have no cards in hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/slithering_shade.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slithery_stalker.txt b/res/cardsfolder/slithery_stalker.txt deleted file mode 100644 index 32823cdfe9d..00000000000 --- a/res/cardsfolder/slithery_stalker.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Slithery Stalker -ManaCost:1 B B -Types:Creature Nightmare Horror -Text:no text -PT:1/1 -K:Swampwalk -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target green or white creature an opponent controls. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:DB$ChangeZone | Cost$ 0 | TargetMin$ 1 | TargetMax$ 1 | IsCurse$ True | ValidTgts$ Creature.Green+YouDontCtrl,Creature.White+YouDontCtrl | TgtPrompt$ Choose target green or white creature your opponent controls. | RememberTargets$ True | ForgetOtherTargets$ True | Origin$ Battlefield | Destination$ Exile -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slithery_stalker.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sliver_legion.txt b/res/cardsfolder/sliver_legion.txt deleted file mode 100644 index 4484fcbc7ed..00000000000 --- a/res/cardsfolder/sliver_legion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sliver Legion -ManaCost:W U B R G -Types:Legendary Creature Sliver -Text:no text -PT:7/7 -K:stPumpAll:Creature.Sliver:X/X:no Condition:All Sliver creatures get +1/+1 for each other Sliver on the battlefield. -SVar:X:Count$Valid Sliver.Other -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136146.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sliver_overlord.txt b/res/cardsfolder/sliver_overlord.txt deleted file mode 100644 index 8ce39b2b51d..00000000000 --- a/res/cardsfolder/sliver_overlord.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sliver Overlord -ManaCost:W U B R G -Types:Legendary Creature Sliver Mutant -Text:no text -PT:7/7 -A:AB$ ChangeZone | Cost$ 3 | Origin$ Library | Destination$ Hand | ChangeType$ Sliver | ChangeNum$ 1 | SpellDescription$ Search your library for a Sliver card, reveal that card, and put it into your hand. Then shuffle your library. -A:AB$ GainControl | Cost$ 3 | ValidTgts$ Creature.Sliver | TgtPrompt$ Select target Sliver | SpellDescription$ Gain control of target Sliver. (This effect lasts indefinitely.) -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sliver_overlord.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sliver_queen.txt b/res/cardsfolder/sliver_queen.txt deleted file mode 100644 index 40ec54f215f..00000000000 --- a/res/cardsfolder/sliver_queen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sliver Queen -ManaCost:W U B R G -Types:Legendary Creature Sliver -Text:no text -PT:7/7 -A:AB$ Token | Cost$ 2 | TokenAmount$ 1 | TokenName$ Sliver | TokenTypes$ Creature,Sliver | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 colorless Sliver creature token onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sliver_queen.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sliversmith.txt b/res/cardsfolder/sliversmith.txt deleted file mode 100644 index 741ea0e1e77..00000000000 --- a/res/cardsfolder/sliversmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sliversmith -ManaCost:2 -Types:Artifact Creature Spellshaper -Text:no text -PT:1/1 -A:AB$ Token | Cost$ 1 T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Metallic Sliver | TokenTypes$ Artifact,Creature,Sliver | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 colorless Sliver artifact creature token named Metallic Sliver onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130329.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slobad_goblin_tinkerer.txt b/res/cardsfolder/slobad_goblin_tinkerer.txt deleted file mode 100644 index 830d350aa31..00000000000 --- a/res/cardsfolder/slobad_goblin_tinkerer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Slobad, Goblin Tinkerer -ManaCost:1 R -Types:Legendary Creature Goblin Artificer -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Artifact> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | KW$ HIDDEN Indestructible | SpellDescription$ Target artifact is indestructible this turn. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slobad_goblin_tinkerer.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slow_motion.txt b/res/cardsfolder/slow_motion.txt deleted file mode 100644 index 0d7231ef357..00000000000 --- a/res/cardsfolder/slow_motion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Slow Motion -ManaCost:2 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN At the beginning of your upkeep, sacrifice CARDNAME unless you pay 2:At the beginning of the upkeep of enchanted creature's controller, that player sacrifices that creature unless he or she pays 2. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/slow_motion.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sludge_strider.txt b/res/cardsfolder/sludge_strider.txt deleted file mode 100644 index 813d25706b2..00000000000 --- a/res/cardsfolder/sludge_strider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sludge Strider -ManaCost:1 W U B -Types:Artifact Creature Insect -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigLoseLife | TriggerDescription$ 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. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Secondary$ True | Execute$ TrigLoseLife | TriggerDescription$ 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. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 1 | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/sludge_strider.jpg -SVar:Rarity:Uncommon -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/126.jpg -End diff --git a/res/cardsfolder/sluggishness.txt b/res/cardsfolder/sluggishness.txt deleted file mode 100644 index b63ad84fe9a..00000000000 --- a/res/cardsfolder/sluggishness.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sluggishness -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:HIDDEN CARDNAME can't block.:Enchanted creature can't block. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sluggishness.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/slumbering_tora.txt b/res/cardsfolder/slumbering_tora.txt deleted file mode 100644 index 91f9d9b0982..00000000000 --- a/res/cardsfolder/slumbering_tora.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Slumbering Tora -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ 2 Discard<1/Spirit;Arcane> | CostDesc$ 2, Discard a Spirit or Arcane card: | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Cat | SpellDescription$ CARDNAME becomes an X/X Cat artifact creature until end of turn, where X is the discarded card's converted mana cost. -SVar:X:Discarded$CardManaCost -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/slumbering_tora.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smallpox.txt b/res/cardsfolder/smallpox.txt deleted file mode 100644 index 0e35dd877aa..00000000000 --- a/res/cardsfolder/smallpox.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Smallpox -ManaCost:B B -Types:Sorcery -A:SP$ LoseLife | Cost$ B B | Defined$ Each | LifeAmount$ 1 | SpellDescription$ Each player loses 1 life, discards a card, sacrifices a creature, then sacrifices a land. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 1 | Mode$ TgtChoose | Defined$ Each | SubAbility$ SVar=DBSacCreature -SVar:DBSacCreature:DB$Sacrifice | SacValid$ Creature | Defined$ Each | SubAbility$ SVar=DBSacLand -SVar:DBSacLand:DB$Sacrifice | SacValid$ Land | Defined$ Each -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/smallpox.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smash.txt b/res/cardsfolder/smash.txt deleted file mode 100644 index c434ed223bc..00000000000 --- a/res/cardsfolder/smash.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Smash -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smash.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/143.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/69.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/235.jpg -End diff --git a/res/cardsfolder/smash_to_smithereens.txt b/res/cardsfolder/smash_to_smithereens.txt deleted file mode 100644 index c1605bf64c8..00000000000 --- a/res/cardsfolder/smash_to_smithereens.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Smash to Smithereens -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBDealDamage | SpellDescription$ Destroy target artifact. CARDNAME deals 3 damage to that artifact's controller. -SVar:DBDealDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smash_to_smithereens.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smite.txt b/res/cardsfolder/smite.txt deleted file mode 100644 index 0f62122aace..00000000000 --- a/res/cardsfolder/smite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Smite -ManaCost:W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ W | ValidTgts$ Creature.blocked | TgtPrompt$ Select target blocked creature | SpellDescription$ Destroy target blocked creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smite.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/117.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smogsteed_rider.txt b/res/cardsfolder/smogsteed_rider.txt deleted file mode 100644 index 098c96d163e..00000000000 --- a/res/cardsfolder/smogsteed_rider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Smogsteed Rider -ManaCost:2 B B -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, each other attacking creature gains fear until end of turn. (They can't be blocked except by artifact creatures and/or black creatures.) -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+Other | KW$ Fear -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/smogsteed_rider.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smoke.txt b/res/cardsfolder/smoke.txt deleted file mode 100644 index e56db01b64f..00000000000 --- a/res/cardsfolder/smoke.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Smoke -ManaCost:R R -Types:Enchantment -Text:Players can't untap more than one creature during their untap steps. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/smoke.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/176.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/177.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/268.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/240.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/177.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/176.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smokespew_invoker.txt b/res/cardsfolder/smokespew_invoker.txt deleted file mode 100644 index 79b11ba13df..00000000000 --- a/res/cardsfolder/smokespew_invoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Smokespew Invoker -ManaCost:2 B -Types:Creature Zombie Mutant -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ 7 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -3 | NumDef$ -3 | IsCurse$ True | SpellDescription$ Target creature gets -3/-3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smokespew_invoker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/81.jpg -End diff --git a/res/cardsfolder/smokestack.txt b/res/cardsfolder/smokestack.txt deleted file mode 100644 index c831eb63586..00000000000 --- a/res/cardsfolder/smokestack.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Smokestack -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ At the beginning of your upkeep . -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TriggerSacrifice | TriggerDescription$ that player sacrifices a Permanent for each soot counter on CARDNAME -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a soot counter on CARDNAME. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | Amount$ X | SacValid$ Permanent | SacMessage$ Permanent -SVar:TriggerSacrifice:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | Amount$ X | SacValid$ Permanent | SacMessage$ Permanent -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SOOT | CounterNum$ 1 -SVar:X:Count$CardCounters.SOOT -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/smokestack.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/309.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smolder_initiate.txt b/res/cardsfolder/smolder_initiate.txt deleted file mode 100644 index 1f258539243..00000000000 --- a/res/cardsfolder/smolder_initiate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Smolder Initiate -ManaCost:B -Types:Creature Elemental Shaman -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player casts a black spell, you may pay 1. If you do, target player loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smolder_initiate.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smoldering_butcher.txt b/res/cardsfolder/smoldering_butcher.txt deleted file mode 100644 index 2ce0c882308..00000000000 --- a/res/cardsfolder/smoldering_butcher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Smoldering Butcher -ManaCost:3 B -Types:Creature Elemental Warrior -Text:no text -PT:4/2 -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smoldering_butcher.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smoldering_crater.txt b/res/cardsfolder/smoldering_crater.txt deleted file mode 100644 index 01e76fd8618..00000000000 --- a/res/cardsfolder/smoldering_crater.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Smoldering Crater -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/smoldering_crater.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smoldering_spires.txt b/res/cardsfolder/smoldering_spires.txt deleted file mode 100644 index 4107bc3c956..00000000000 --- a/res/cardsfolder/smoldering_spires.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Smoldering Spires -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature can't block this turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | IsCurse$ True | KW$ HIDDEN CARDNAME can't block | TgtPrompt$ Select target creature. -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Smoldering_Spires.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/smother.txt b/res/cardsfolder/smother.txt deleted file mode 100644 index 5493cc9b732..00000000000 --- a/res/cardsfolder/smother.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Smother -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.cmcLE3 | TgtPrompt$ Select target creature with converted mana cost 3 or less | NoRegen$ True | SpellDescription$ Destroy target creature with converted mana cost 3 or less. It can't be regenerated. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/smother.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/170.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/68.jpg -End diff --git a/res/cardsfolder/snake_basket.txt b/res/cardsfolder/snake_basket.txt deleted file mode 100644 index d60faaba30b..00000000000 --- a/res/cardsfolder/snake_basket.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Snake Basket -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ X Sac<1/CARDNAME> | TokenOwner$ You | TokenAmount$ X | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SorcerySpeed$ True | SpellDescription$ Put X 1/1 green Snake creature tokens onto the battlefield. Activate this ability only any time you could cast a sorcery. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/snake_basket.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/155.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snake_cult_initiation.txt b/res/cardsfolder/snake_cult_initiation.txt deleted file mode 100644 index c53f25668c2..00000000000 --- a/res/cardsfolder/snake_cult_initiation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Snake Cult Initiation -ManaCost:3 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Poisonous 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/snake_cult_initiation.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snake_pit.txt b/res/cardsfolder/snake_pit.txt deleted file mode 100755 index 6338e049f4f..00000000000 --- a/res/cardsfolder/snake_pit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Snake Pit -ManaCost:2 G -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Blue+YouDontCtrl,Card.Black+YouDontCtrl | Execute$ TrigToken | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a blue or black spell, you may put a 1/1 green Snake creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/snake_pit.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snake_umbra.txt b/res/cardsfolder/snake_umbra.txt deleted file mode 100644 index 8ec289f5c30..00000000000 --- a/res/cardsfolder/snake_umbra.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Snake Umbra -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever enchanted creature deals damage to an opponent, you may draw a card. -K:Totem armor -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snake_umbra.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snap.txt b/res/cardsfolder/snap.txt deleted file mode 100644 index a2b55e9ac79..00000000000 --- a/res/cardsfolder/snap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Snap -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. Untap up to two lands. | SubAbility$ SVar=DBUntap -SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snap.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snapback.txt b/res/cardsfolder/snapback.txt deleted file mode 100755 index fb6351ae920..00000000000 --- a/res/cardsfolder/snapback.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Snapback -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -A:SP$ ChangeZone | Cost$ ExileFromHand<1/Card.Blue> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | CostDesc$ You may exile a blue card from your hand | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snapback.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snapping_creeper.txt b/res/cardsfolder/snapping_creeper.txt deleted file mode 100644 index c54a377e3bd..00000000000 --- a/res/cardsfolder/snapping_creeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Snapping Creeper -ManaCost:2 G -Types:Creature Plant -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gains vigilance until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Snapping_Creeper.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snapping_drake.txt b/res/cardsfolder/snapping_drake.txt deleted file mode 100644 index a2da7d9ece0..00000000000 --- a/res/cardsfolder/snapping_drake.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Snapping Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:3/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87986.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/64.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/72.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/52.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snapsail_glider.txt b/res/cardsfolder/snapsail_glider.txt deleted file mode 100644 index ee28c6d916e..00000000000 --- a/res/cardsfolder/snapsail_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Snapsail Glider -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/Flying:Metalcraft:Metalcraft - Snapsail Glider has flying as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snapsail_glider.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snarling_undorak.txt b/res/cardsfolder/snarling_undorak.txt deleted file mode 100644 index 84a835b4896..00000000000 --- a/res/cardsfolder/snarling_undorak.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Snarling Undorak -ManaCost:2 G G -Types:Creature Beast -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 2 G | ValidTgts$ Creature.Beast | NumAtt$ +1 | NumDef$ +1 | TgtPrompt$ Select target Beast creature | SpellDescription$ Target Beast creature gets +1/+1 until end of turn. -K:Morph:1 G G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snarling_undorak.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sneaky_homunculus.txt b/res/cardsfolder/sneaky_homunculus.txt deleted file mode 100644 index 6156070a3ab..00000000000 --- a/res/cardsfolder/sneaky_homunculus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sneaky Homunculus -ManaCost:1 U -Types:Creature Homunculus Illusion -Text:no text -PT:1/1 -K:CARDNAME can't be blocked by creatures with power 2 or greater. -K:CARDNAME can't block creatures with power 2 or greater. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sneaky_homunculus.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/101.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snorting_gahr.txt b/res/cardsfolder/snorting_gahr.txt deleted file mode 100644 index e4fd5481d9f..00000000000 --- a/res/cardsfolder/snorting_gahr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Snorting Gahr -ManaCost:2 G G -Types:Creature Rhino Beast -Text:no text -PT:3/3 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snorting_gahr.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_covered_forest.txt b/res/cardsfolder/snow_covered_forest.txt deleted file mode 100644 index 1fb1fb0ce55..00000000000 --- a/res/cardsfolder/snow_covered_forest.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Snow-Covered Forest -ManaCost:no cost -Types:Basic Snow Land Forest -Text:no text -SVar:Rarity:Land -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_covered_forest.jpg\http://www.wizards.com/global/images/magic/general/snow_covered_forest.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_forest.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_forest.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/155.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/347.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_covered_island.txt b/res/cardsfolder/snow_covered_island.txt deleted file mode 100644 index d11bb89216b..00000000000 --- a/res/cardsfolder/snow_covered_island.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Snow-Covered Island -ManaCost:no cost -Types:Basic Snow Land Island -Text:no text -SVar:Rarity:Land -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_covered_island.jpg\http://www.wizards.com/global/images/magic/general/snow_covered_island.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_island.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_island.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/152.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/348.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_covered_mountain.txt b/res/cardsfolder/snow_covered_mountain.txt deleted file mode 100644 index 00c794b80c8..00000000000 --- a/res/cardsfolder/snow_covered_mountain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Snow-Covered Mountain -ManaCost:no cost -Types:Basic Snow Land Mountain -Text:no text -SVar:Rarity:Land -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_covered_mountain.jpg\http://www.wizards.com/global/images/magic/general/snow_covered_mountain.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_mountain.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/154.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/349.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_covered_plains.txt b/res/cardsfolder/snow_covered_plains.txt deleted file mode 100644 index ca8d7ab42ba..00000000000 --- a/res/cardsfolder/snow_covered_plains.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Snow-Covered Plains -ManaCost:no cost -Types:Basic Snow Land Plains -Text:no text -SVar:Rarity:Land -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_covered_plains.jpg\http://www.wizards.com/global/images/magic/general/snow_covered_plains.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_plains.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_plains.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/151.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/350.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_covered_swamp.txt b/res/cardsfolder/snow_covered_swamp.txt deleted file mode 100644 index c182b3cba7e..00000000000 --- a/res/cardsfolder/snow_covered_swamp.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Snow-Covered Swamp -ManaCost:no cost -Types:Basic Snow Land Swamp -Text:no text -SVar:Rarity:Land -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_covered_swamp.jpg\http://www.wizards.com/global/images/magic/general/snow_covered_swamp.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_swamp.jpg\http://www.magickartenmarkt.de/img/cards/Ice_Age/snow_covered_swamp.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/153.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/351.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_devil.txt b/res/cardsfolder/snow_devil.txt deleted file mode 100644 index 2fa49bf76b5..00000000000 --- a/res/cardsfolder/snow_devil.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Snow Devil -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -K:stPumpEnchanted:Creature.blocking:0/0/First Strike:isPresent Land.Snow+YouCtrl:Enchanted creature has first strike as long as it's blocking and you control a snow land. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_devil.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_fortress.txt b/res/cardsfolder/snow_fortress.txt deleted file mode 100644 index 1d8d12bd195..00000000000 --- a/res/cardsfolder/snow_fortress.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Snow Fortress -ManaCost:5 -Types:Artifact Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ 1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -A:AB$ DealDamage | Cost$ 3 | ValidTgts$ Creature.withoutFlying+attacking+YouDontCtrl | TgtPrompt$ Select target target creature without flying that's attacking you | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature without flying that's attacking you. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_fortress.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snow_hound.txt b/res/cardsfolder/snow_hound.txt deleted file mode 100644 index 068754504c9..00000000000 --- a/res/cardsfolder/snow_hound.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Snow Hound -ManaCost:2 W -Types:Creature Hound -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ 1 T | ValidTgts$ Creature.Blue+YouCtrl,Creature.Green+YouCtrl | TgtPrompt$ Select target blue or green creature you control | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=Return | SpellDescription$ Return CARDNAME and target green or blue creature you control to their owner's hand. -SVar:Return:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/snow_hound.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/snuff_out.txt b/res/cardsfolder/snuff_out.txt deleted file mode 100755 index e292e42a3cd..00000000000 --- a/res/cardsfolder/snuff_out.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Snuff Out -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 3 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. -A:SP$ Destroy | Cost$ PayLife<4> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | IsPresent$ Swamp.YouCtrl | CostDesc$ If you control a Swamp, you may pay 4 life rather than pay CARDNAME's mana cost. | SpellDescription$   -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/snuff_out.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/162.jpg -End diff --git a/res/cardsfolder/soaring_hope.txt b/res/cardsfolder/soaring_hope.txt deleted file mode 100644 index b403ba06a7c..00000000000 --- a/res/cardsfolder/soaring_hope.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soaring Hope -ManaCost:4 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Flying -A:AB$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put CARDNAME on top of its owner's library. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soaring_hope.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soaring_seacliff.txt b/res/cardsfolder/soaring_seacliff.txt deleted file mode 100644 index 720d25680a9..00000000000 --- a/res/cardsfolder/soaring_seacliff.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soaring Seacliff -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soaring_seacliff.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soilshaper.txt b/res/cardsfolder/soilshaper.txt deleted file mode 100644 index b821e5934ee..00000000000 --- a/res/cardsfolder/soilshaper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soilshaper -ManaCost:1 G -Types:Creature Spirit -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target land becomes a 3/3 creature until end of turn. It's still a land. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature -SVar:BuffedBy:Arcane,Spirit -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soilshaper.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sokenzan_bruiser.txt b/res/cardsfolder/sokenzan_bruiser.txt deleted file mode 100644 index 44fbf9012fa..00000000000 --- a/res/cardsfolder/sokenzan_bruiser.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sokenzan Bruiser -ManaCost:4 R -Types:Creature Ogre Warrior -Text:no text -PT:3/3 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card79140.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sol_ring.txt b/res/cardsfolder/sol_ring.txt deleted file mode 100644 index e4322f9026a..00000000000 --- a/res/cardsfolder/sol_ring.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sol Ring -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sol_ring.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/269.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/271.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/274.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/solar_blast.txt b/res/cardsfolder/solar_blast.txt deleted file mode 100644 index bc0dcc896e4..00000000000 --- a/res/cardsfolder/solar_blast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Solar Blast -ManaCost:3 R -Types:Instant -Text:no text -K:Cycling:1 R R -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may have it deal 1 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/solar_blast.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/solar_tide.txt b/res/cardsfolder/solar_tide.txt deleted file mode 100644 index 889bc23db38..00000000000 --- a/res/cardsfolder/solar_tide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Solar Tide -ManaCost:4 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature.powerLE2 | PrecostDesc$ Chose one - | SpellDescription$ Destroy all creatures with power 2 or less; -A:SP$ DestroyAll | Cost$ 4 W W | ValidCards$ Creature.powerGE3 | SpellDescription$ or destroy all creatures with power 3 or greater. -A:SP$ DestroyAll | Cost$ 4 W W Sac<2/Land> | CostDesc$ Sacrifice two lands. | ValidCards$ Creature | PrecostDesc$ Entwine - | SpellDescription$ (Choose both if you pay the entwine cost.) -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/solar_tide.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/solarion.txt b/res/cardsfolder/solarion.txt deleted file mode 100644 index 6c3e915e675..00000000000 --- a/res/cardsfolder/solarion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Solarion -ManaCost:7 -Types:Artifact Creature Construct -Text:no text -K:Sunburst -A:AB$PutCounter | Cost$ T | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SpellDescription$ Double the number of +1/+1 counters on CARDNAME. -SVar:X:Count$CardCounters.P1P1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/solarion.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_adnate.txt b/res/cardsfolder/soldevi_adnate.txt deleted file mode 100644 index 72562bfe0d0..00000000000 --- a/res/cardsfolder/soldevi_adnate.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soldevi Adnate -ManaCost:1 B -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T Sac<1/Creature.Black;Creature.Artifact> | Produced$ B | Amount$ X | SpellDescription$ Add to your mana pool an amount of black mana equal to the sacrificed creature's converted mana cost. | CostDesc$ Tap, sacrifice a black or artifact creature: -SVar:X:Sacrificed$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_adnate.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/25.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_digger.txt b/res/cardsfolder/soldevi_digger.txt deleted file mode 100644 index b89428d3d3b..00000000000 --- a/res/cardsfolder/soldevi_digger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soldevi Digger -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 | Defined$ Top | SpellDescription$ Put the top card of your graveyard on the bottom of your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_digger.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/174.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_excavations.txt b/res/cardsfolder/soldevi_excavations.txt deleted file mode 100644 index fa4ed38d849..00000000000 --- a/res/cardsfolder/soldevi_excavations.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soldevi Excavations -ManaCost:no cost -Types:Land -Text:If CARDNAME would enter the battlefield, sacrifice an untapped Island instead. If you do, put CARDNAME onto the battlefield. If you don't, put it into its owner's graveyard. -A:AB$ Mana | Cost$ T | Produced$ 1 U | SpellDescription$ Add 1 U to your mana pool. -A:AB$ Dig | Cost$ 1 T | DigNum$ 1 | DestinationZone$ Library | Optional$ True | LibraryPosition$ -1 | LibraryPosition2$ 0 | SpellDescription$ Look at the top card of your library. You may put that card on the bottom of your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_excavations.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_heretic.txt b/res/cardsfolder/soldevi_heretic.txt deleted file mode 100644 index 2c26e5cfed0..00000000000 --- a/res/cardsfolder/soldevi_heretic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soldevi Heretic -ManaCost:2 U -Types:Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ PreventDamage | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature this turn. Target opponent may draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | OptionalDecider$ Opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_heretic.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/49.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_sage.txt b/res/cardsfolder/soldevi_sage.txt deleted file mode 100644 index c3be3a36b81..00000000000 --- a/res/cardsfolder/soldevi_sage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soldevi Sage -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ T Sac<2/Land> | NumCards$ 3 | SpellDescription$ Draw three cards, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_sage.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/99.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/51.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/soldevi_simulacrum.txt b/res/cardsfolder/soldevi_simulacrum.txt deleted file mode 100644 index 4d6e3bb07f7..00000000000 --- a/res/cardsfolder/soldevi_simulacrum.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soldevi Simulacrum -ManaCost:4 -Types:Artifact Creature Soldier -Text:no text -PT:2/4 -K:Cumulative upkeep:1 -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_simulacrum.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/314.jpg -End diff --git a/res/cardsfolder/soldevi_steam_beast.txt b/res/cardsfolder/soldevi_steam_beast.txt deleted file mode 100644 index fa07259c991..00000000000 --- a/res/cardsfolder/soldevi_steam_beast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soldevi Steam Beast -ManaCost:5 -Types:Artifact Creature Beast -Text:no text -PT:4/2 -T:Mode$ Taps | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME becomes tapped, target opponent gains 2 life. -A:AB$ Regenerate | Cost$ 2 | SpellDescription$ Regenerate CARDNAME. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Choose target opponent | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldevi_steam_beast.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/177.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/soldier_of_fortune.txt b/res/cardsfolder/soldier_of_fortune.txt deleted file mode 100644 index f6dbd2558de..00000000000 --- a/res/cardsfolder/soldier_of_fortune.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soldier of Fortune -ManaCost:R -Types:Creature Human Mercenary -Text:no text -PT:1/1 -A:AB$ Shuffle | Cost$ R T | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player shuffles his or her library. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldier_of_fortune.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soldier_replica.txt b/res/cardsfolder/soldier_replica.txt deleted file mode 100644 index 875ccc5eda4..00000000000 --- a/res/cardsfolder/soldier_replica.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soldier Replica -ManaCost:3 -Types:Artifact Creature Soldier -Text:no text -PT:1/3 -A:AB$ DealDamage | Cost$ 1 W Sac<1/CARDNAME> | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soldier_replica.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/solemn_offering.txt b/res/cardsfolder/solemn_offering.txt deleted file mode 100644 index 98d367c8dff..00000000000 --- a/res/cardsfolder/solemn_offering.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Solemn Offering -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target artifact or enchantment. You gain 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/solemn_offering.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/32.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/33.jpg -End diff --git a/res/cardsfolder/solemn_simulacrum.txt b/res/cardsfolder/solemn_simulacrum.txt deleted file mode 100644 index 9da8110819e..00000000000 --- a/res/cardsfolder/solemn_simulacrum.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Solemn Simulacrum -ManaCost:4 -Types:Artifact Creature Golem -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDraw | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredCardController | NumCards$ 1 -SVar:SacMe:1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/solemn_simulacrum.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/solidarity.txt b/res/cardsfolder/solidarity.txt deleted file mode 100644 index 5b132c0f6bd..00000000000 --- a/res/cardsfolder/solidarity.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Solidarity -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 3 W | ValidCards$ Creature.YouCtrl | NumDef$ +5 | SpellDescription$ Creatures you control get +0/+5 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/8ed/en-us/card45188.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/46.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/20.jpg -End - - - diff --git a/res/cardsfolder/soliton.txt b/res/cardsfolder/soliton.txt deleted file mode 100644 index 086015232c9..00000000000 --- a/res/cardsfolder/soliton.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soliton -ManaCost:5 -Types:Artifact Creature Construct -Text:no text -PT:3/4 -A:AB$ Untap | Cost$ U | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soliton.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/204.jpg -End diff --git a/res/cardsfolder/solkanar_the_swamp_king.txt b/res/cardsfolder/solkanar_the_swamp_king.txt deleted file mode 100644 index cfd91516385..00000000000 --- a/res/cardsfolder/solkanar_the_swamp_king.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sol'kanar the Swamp King -ManaCost:2 U B R -Types:Legendary Creature Demon -Text:no text -PT:5/5 -K:Swampwalk -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a black spell, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/solkanar_the_swamp_king.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/100.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_champion.txt b/res/cardsfolder/soltari_champion.txt deleted file mode 100644 index c72a7738ff8..00000000000 --- a/res/cardsfolder/soltari_champion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soltari Champion -ManaCost:2 W -Types:Creature Soltari Soldier -Text:no text -PT:2/2 -K:Shadow -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, all other creatures you control get +1/+1 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_champion.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_crusader.txt b/res/cardsfolder/soltari_crusader.txt deleted file mode 100644 index c9a2496c83e..00000000000 --- a/res/cardsfolder/soltari_crusader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soltari Crusader -ManaCost:2 W -Types:Creature Soltari Knight -Text:no text -PT:2/1 -K:Shadow -A:AB$ Pump | Cost$ 1 W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_crusader.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/253.jpg -End diff --git a/res/cardsfolder/soltari_emissary.txt b/res/cardsfolder/soltari_emissary.txt deleted file mode 100644 index 898a2340fb1..00000000000 --- a/res/cardsfolder/soltari_emissary.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soltari Emissary -ManaCost:1 W -Types:Creature Soltari Soldier -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ W | KW$ Shadow | SpellDescription$ CARDNAME gains shadow until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_emissary.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/254.jpg -End diff --git a/res/cardsfolder/soltari_foot_soldier.txt b/res/cardsfolder/soltari_foot_soldier.txt deleted file mode 100644 index 114b2908428..00000000000 --- a/res/cardsfolder/soltari_foot_soldier.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soltari Foot Soldier -ManaCost:W -Types:Creature Soltari Soldier -Text:no text -PT:1/1 -K:Shadow -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_foot_soldier.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_lancer.txt b/res/cardsfolder/soltari_lancer.txt deleted file mode 100644 index 4cbb487f749..00000000000 --- a/res/cardsfolder/soltari_lancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soltari Lancer -ManaCost:2 W -Types:Creature Soltari Knight -Text:no text -PT:2/2 -K:Shadow -K:stPumpSelf:Creature.attacking:0/0/First Strike:No Condition:Soltari Lancer has first strike as long as it's attacking. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_lancer.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_monk.txt b/res/cardsfolder/soltari_monk.txt deleted file mode 100644 index 6cf07532524..00000000000 --- a/res/cardsfolder/soltari_monk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soltari Monk -ManaCost:W W -Types:Creature Soltari Monk Cleric -Text:no text -PT:2/1 -K:Protection from black -K:Shadow -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_monk.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_priest.txt b/res/cardsfolder/soltari_priest.txt deleted file mode 100644 index 40067600d03..00000000000 --- a/res/cardsfolder/soltari_priest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soltari Priest -ManaCost:W W -Types:Creature Soltari Cleric -Text:no text -PT:2/1 -K:Protection from red -K:Shadow -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_priest.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/258.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soltari_trooper.txt b/res/cardsfolder/soltari_trooper.txt deleted file mode 100644 index 18fd151be4b..00000000000 --- a/res/cardsfolder/soltari_trooper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soltari Trooper -ManaCost:1 W -Types:Creature Soltari Soldier -Text:no text -PT:1/1 -K:Shadow -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soltari_trooper.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/somber_hoverguard.txt b/res/cardsfolder/somber_hoverguard.txt deleted file mode 100644 index 6851f5d1cf9..00000000000 --- a/res/cardsfolder/somber_hoverguard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Somber Hoverguard -ManaCost:5 U -Types:Creature Drone -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -PT:3/2 -K:Flying -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/somber_hoverguard.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/somnomancer.txt b/res/cardsfolder/somnomancer.txt deleted file mode 100644 index d08fc92352e..00000000000 --- a/res/cardsfolder/somnomancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Somnomancer -ManaCost:1 WU -Types:Creature Kithkin Wizard -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, you may tap target creature. -SVar:TrigTap:AB$Tap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/somnomancer.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/song_of_serenity.txt b/res/cardsfolder/song_of_serenity.txt deleted file mode 100644 index 284964897b1..00000000000 --- a/res/cardsfolder/song_of_serenity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Song of Serenity -ManaCost:1 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.enchanted:0/0/HIDDEN CARDNAME can't attack or block.:No Condition:Creatures that are enchanted can't attack or block. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/song_of_serenity.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/songs_of_the_damned.txt b/res/cardsfolder/songs_of_the_damned.txt deleted file mode 100644 index bcea7c7ffba..00000000000 --- a/res/cardsfolder/songs_of_the_damned.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Songs of the Damned -ManaCost:B -Types:Instant -Text:no text -A:SP$ Mana | Cost$ B | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each creature card in your graveyard. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/songs_of_the_damned.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/songstitcher.txt b/res/cardsfolder/songstitcher.txt deleted file mode 100644 index 3957e7b7b88..00000000000 --- a/res/cardsfolder/songstitcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Songstitcher -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.attacking+withFlying | TgtPrompt$ Select target attacking creature with flying | IsCurse$ True | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Target attacking creature with flying deals no combat damage this turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/songstitcher.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sonic_burst.txt b/res/cardsfolder/sonic_burst.txt deleted file mode 100644 index 3811f4a5938..00000000000 --- a/res/cardsfolder/sonic_burst.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sonic Burst -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sonic_burst.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sonic_seizure.txt b/res/cardsfolder/sonic_seizure.txt deleted file mode 100644 index fbd5360fa61..00000000000 --- a/res/cardsfolder/sonic_seizure.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sonic Seizure -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sonic_seizure.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soot_imp.txt b/res/cardsfolder/soot_imp.txt deleted file mode 100644 index 2abc2aa64de..00000000000 --- a/res/cardsfolder/soot_imp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soot Imp -ManaCost:1 B B -Types:Creature Imp -Text:no text -PT:1/2 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.nonBlack | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever a player casts a nonblack spell, that player loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soot_imp.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sootfeather_flock.txt b/res/cardsfolder/sootfeather_flock.txt deleted file mode 100644 index 1651d8c2545..00000000000 --- a/res/cardsfolder/sootfeather_flock.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sootfeather Flock -ManaCost:4 B -Types:Creature Bird -Text:no text -PT:3/2 -K:Flying -K:Morph:3 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sootfeather_flock.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soothing_balm.txt b/res/cardsfolder/soothing_balm.txt deleted file mode 100644 index de41e3129e7..00000000000 --- a/res/cardsfolder/soothing_balm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Soothing Balm -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 5 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 5 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soothing_balm.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/48.jpg -End diff --git a/res/cardsfolder/sootstoke_kindler.txt b/res/cardsfolder/sootstoke_kindler.txt deleted file mode 100644 index c5d0606794d..00000000000 --- a/res/cardsfolder/sootstoke_kindler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sootstoke Kindler -ManaCost:1 BR -Types:Creature Elemental Shaman -Text:no text -PT:1/1 -K:Haste -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Black,Creature.Red | TgtPrompt$ Select target black or red creature | KW$ Haste | SpellDescription$ Target black or red creature gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sootstoke_kindler.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sootwalkers.txt b/res/cardsfolder/sootwalkers.txt deleted file mode 100644 index 42e869bfea5..00000000000 --- a/res/cardsfolder/sootwalkers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sootwalkers -ManaCost:2 BR BR -Types:Creature Elemental Rogue -Text:CARDNAME can't be blocked by white creatures. -PT:3/3 -K:CantBeBlockedBy Creature.White -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sootwalkers.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soratami_cloudskater.txt b/res/cardsfolder/soratami_cloudskater.txt deleted file mode 100644 index 46fd223d67d..00000000000 --- a/res/cardsfolder/soratami_cloudskater.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soratami Cloudskater -ManaCost:1 U -Types:Creature Moonfolk Rogue -Text:no text -PT:1/1 -K:Flying -A:AB$ Draw | Cost$ 2 Return<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_cloudskater.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/86.jpg -End diff --git a/res/cardsfolder/soratami_mindsweeper.txt b/res/cardsfolder/soratami_mindsweeper.txt deleted file mode 100644 index da9a1552b06..00000000000 --- a/res/cardsfolder/soratami_mindsweeper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soratami Mindsweeper -ManaCost:3 U -Types:Creature Moonfolk Wizard -Text:no text -PT:1/4 -K:Flying -A:AB$ Mill | Cost$ 2 Return<1/Land> | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of his or her library into his or her graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mindsweeper.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soratami_mirror_guard.txt b/res/cardsfolder/soratami_mirror_guard.txt deleted file mode 100644 index a62198ccef9..00000000000 --- a/res/cardsfolder/soratami_mirror_guard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soratami Mirror-Guard -ManaCost:3 U -Types:Creature Moonfolk Wizard -Text:no text -PT:3/1 -K:Flying -A:AB$ Pump | Cost$ 2 Return<1/Land> | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mirror_guard.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soratami_mirror_mage.txt b/res/cardsfolder/soratami_mirror_mage.txt deleted file mode 100644 index f91ec7bf582..00000000000 --- a/res/cardsfolder/soratami_mirror_mage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soratami Mirror-Mage -ManaCost:3 U -Types:Creature Moonfolk Wizard -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ 3 Return<3/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_mirror_mage.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soratami_rainshaper.txt b/res/cardsfolder/soratami_rainshaper.txt deleted file mode 100644 index f05c77afd7b..00000000000 --- a/res/cardsfolder/soratami_rainshaper.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soratami Rainshaper -ManaCost:2 U -Types:Creature Moonfolk Wizard -Text:no text -PT:2/1 -K:Flying -A:AB$ Pump | Cost$ 3 Return<1/Land> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Shroud | SpellDescription$ Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_rainshaper.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soratami_savant.txt b/res/cardsfolder/soratami_savant.txt deleted file mode 100644 index b8c7fe5d50e..00000000000 --- a/res/cardsfolder/soratami_savant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soratami Savant -ManaCost:2 U U -Types:Creature Moonfolk Wizard -Text:no text -PT:2/2 -A:AB$ Counter | Cost$ 3 Return<1/Land> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | SpellDescription$ Counter target spell unless its controller pays 3. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soratami_savant.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sorcerers_strongbox.txt b/res/cardsfolder/sorcerers_strongbox.txt deleted file mode 100644 index b08fe6d2ffb..00000000000 --- a/res/cardsfolder/sorcerers_strongbox.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sorcerer's Strongbox -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ FlipACoin | Cost$ 2 T | WinSubAbility$ DBSac | SpellDescription$ Flip a coin. If you win the flip, sacrifice CARDNAME and draw three cards. -SVar:DBSac:DB$Sacrifice | Defined$ Self | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sorcerers_strongbox.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sorceress_queen.txt b/res/cardsfolder/sorceress_queen.txt deleted file mode 100644 index 4ded0d52f6f..00000000000 --- a/res/cardsfolder/sorceress_queen.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sorceress Queen -ManaCost:1 B B -Types:Creature Sorceress -Text:no text -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2129.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/56.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/39.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/46.jpg -SetInfo:ARN|Uncommon|http://magiccards.info/scans/en/an/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sorcerous_sight.txt b/res/cardsfolder/sorcerous_sight.txt deleted file mode 100644 index b3765ad813b..00000000000 --- a/res/cardsfolder/sorcerous_sight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sorcerous Sight -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ RevealHand | Cost$ U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ SVar=DBDraw | SpellDescription$ Look at target opponent's hand. -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sorcerous_sight.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sosuke_son_of_seshiro.txt b/res/cardsfolder/sosuke_son_of_seshiro.txt deleted file mode 100644 index ec00b9fee30..00000000000 --- a/res/cardsfolder/sosuke_son_of_seshiro.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sosuke, Son of Seshiro -ManaCost:2 G G -Types:Legendary Creature Snake Warrior -Text:no text -PT:3/4 -K:stPumpAll:Creature.Snake+Other+YouCtrl:1/0:No Condition:Other Snake creatures you control get +1/+0. -T:Mode$ DamageDone | ValidSource$ Warrior.YouCtrl | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever a Warrior you control deals combat damage to a creature, destroy that creature at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy damaged creature at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sosuke_son_of_seshiro.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sosukes_summons.txt b/res/cardsfolder/sosukes_summons.txt deleted file mode 100644 index 059ae0acccf..00000000000 --- a/res/cardsfolder/sosukes_summons.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sosuke's Summons -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2 G | TokenAmount$ 2 | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 green Snake creature tokens onto the battlefield. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Snake+nonToken+YouCtrl | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Whenever a nontoken Snake enters the battlefield under your control, you may return CARDNAME from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sosukes_summons.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_barrier.txt b/res/cardsfolder/soul_barrier.txt deleted file mode 100644 index b6fa0b2fb58..00000000000 --- a/res/cardsfolder/soul_barrier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soul Barrier -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDamage | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a creature spell, Soul Barrier deals 2 damage to that player unless he or she pays 2. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | UnlessCost$ 2 | UnlessPayer$ TriggeredPlayer | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_barrier.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/125.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_bleed.txt b/res/cardsfolder/soul_bleed.txt deleted file mode 100644 index 4255453ee59..00000000000 --- a/res/cardsfolder/soul_bleed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soul Bleed -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, that player loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ EnchantedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_bleed.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_channeling.txt b/res/cardsfolder/soul_channeling.txt deleted file mode 100644 index c0d283c3ced..00000000000 --- a/res/cardsfolder/soul_channeling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Channeling -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -A:AB$ Regenerate | Cost$ PayLife<2> | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_channeling.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_collector.txt b/res/cardsfolder/soul_collector.txt deleted file mode 100644 index 3eadb2c416a..00000000000 --- a/res/cardsfolder/soul_collector.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Soul Collector -ManaCost:3 B B -Types:Creature Vampire -Text:no text -PT:3/4 -K:Flying -K:Morph:B B B -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.DamagedBy | Execute$ TrigBounce | TriggerDescription$ Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, return that card to the battlefield under your control. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredCard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_collector.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/74.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_exchange.txt b/res/cardsfolder/soul_exchange.txt deleted file mode 100644 index d914cc39e76..00000000000 --- a/res/cardsfolder/soul_exchange.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Exchange -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B B Exile<1/Creature> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Select target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SubAbility$ SVar=DBPutCounter | SpellDescription$ 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. -SVar:DBPutCounter:DB$PutCounter | CounterNum$ X | CounterType$ P2P2 | Defined$ Targeted -SVar:X:Exiled$Valid Thrull -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_exchange.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_feast.txt b/res/cardsfolder/soul_feast.txt deleted file mode 100644 index b14e84e13f0..00000000000 --- a/res/cardsfolder/soul_feast.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Soul Feast -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 3 B B | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 4 life and you gain 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_feast.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/165.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/72.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/163.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/164.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/179.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/90.jpg -End diff --git a/res/cardsfolder/soul_foundry.txt b/res/cardsfolder/soul_foundry.txt deleted file mode 100644 index 663e64fb0da..00000000000 --- a/res/cardsfolder/soul_foundry.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soul Foundry -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigExile | TriggerDescription$ Imprint - When CARDNAME enters the battlefield, you may exile a creature card from your hand. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Imprint$ True | Origin$ Hand | Destination$ Exile | ChangeType$ Creature | ChangeNum$ 1 -A:AB$CopyPermanent | Cost$ X T | Defined$ Imprinted | SpellDescription$ Put a token that's a copy of the exiled card onto the battlefield. X is the converted mana cost of that card. -SVar:X:Imprinted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_foundry.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_kiss.txt b/res/cardsfolder/soul_kiss.txt deleted file mode 100644 index 731a253fd69..00000000000 --- a/res/cardsfolder/soul_kiss.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Kiss -ManaCost:2 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -A:AB$ Pump | Cost$ B PayLife<1> | Defined$ Enchanted | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 3 | SpellDescription$ Enchanted creature gets +2/+2 until end of turn. Activate this ability no more than three times each turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_kiss.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_link.txt b/res/cardsfolder/soul_link.txt deleted file mode 100644 index d930752adc1..00000000000 --- a/res/cardsfolder/soul_link.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Soul Link -ManaCost:1 W B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life. -T:Mode$ DamageDone | ValidTarget$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature is dealt damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_link.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_manipulation.txt b/res/cardsfolder/soul_manipulation.txt deleted file mode 100644 index 9b6c62874e9..00000000000 --- a/res/cardsfolder/soul_manipulation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soul Manipulation -ManaCost:1 U B -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U B | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Choose one - counter target creature spell; -A:SP$ ChangeZone | Cost$ 1 U B | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ or return target creature card from your graveyard to your hand; -A:SP$ Counter | Cost$ 1 U B | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SubAbility$ SVar=DBChangeZone | SpellDescription$ or counter target creature spell and return target creature card from your graveyard to your hand. -SVar:DBChangeZone:DB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_manipulation.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_net.txt b/res/cardsfolder/soul_net.txt deleted file mode 100644 index c1ac8d395fd..00000000000 --- a/res/cardsfolder/soul_net.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Soul Net -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a creature is put into a graveyard from the battlefield, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_net.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/270.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/272.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/317.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/400.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/364.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/312.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/275.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_of_magma.txt b/res/cardsfolder/soul_of_magma.txt deleted file mode 100644 index db53359b48e..00000000000 --- a/res/cardsfolder/soul_of_magma.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soul of Magma -ManaCost:3 R R -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, CARDNAME deals 1 damage to target creature. -SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 -SVar:BuffedBy:Arcane,Spirit -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_of_magma.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_parry.txt b/res/cardsfolder/soul_parry.txt deleted file mode 100644 index 3647cd0b277..00000000000 --- a/res/cardsfolder/soul_parry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Soul Parry -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TargetMin$ 1 | TargetMax$ 2 | KW$ HIDDEN Prevent all damage that would be dealt by CARDNAME. | IsCurse$ True | TgtPrompt$ Select target creature | SpellDescription$ Prevent all damage one or two target creatures would deal this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_parry.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_rend.txt b/res/cardsfolder/soul_rend.txt deleted file mode 100644 index fdb216dd214..00000000000 --- a/res/cardsfolder/soul_rend.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Rend -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | ConditionDefined$ Targeted | ConditionPresent$ Creature.White | ConditionCompare$ EQ1 | NoRegen$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Destroy target creature if it's white. A creature destroyed this way can't be regenerated. -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_rend.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_scourge.txt b/res/cardsfolder/soul_scourge.txt deleted file mode 100644 index 142772159c7..00000000000 --- a/res/cardsfolder/soul_scourge.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Soul Scourge -ManaCost:4 B -Types:Creature Nightmare Horror -Text:no text -PT:3/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, target player loses 3 life. -SVar:TrigLoseLife:DB$LoseLife | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 3 | RememberTargets$ True | ForgetOtherTargets$ True -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME leaves the battlefield, that player gains 3 life. -SVar:TrigGainLife:DB$GainLife | Defined$ Remembered | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_scourge.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_shepherd.txt b/res/cardsfolder/soul_shepherd.txt deleted file mode 100644 index 1325ca5f03b..00000000000 --- a/res/cardsfolder/soul_shepherd.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soul Shepherd -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:2/1 -A:AB$ GainLife | Cost$ W ExileFromGrave<1/Creature> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_shepherd.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/142.jpg -End diff --git a/res/cardsfolder/soul_shred.txt b/res/cardsfolder/soul_shred.txt deleted file mode 100644 index d50065576f2..00000000000 --- a/res/cardsfolder/soul_shred.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Soul Shred -ManaCost:3 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 B B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NumDmg$ 3 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 3 damage to target nonblack creature. You gain 3 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal/soul_shred.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_snuffers.txt b/res/cardsfolder/soul_snuffers.txt deleted file mode 100644 index f145018087b..00000000000 --- a/res/cardsfolder/soul_snuffers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Snuffers -ManaCost:2 B B -Types:Creature Elemental Shaman -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigPutCounterAll | TriggerDescription$ When CARDNAME enters the battlefield, put a -1/-1 counter on each creature. -SVar:TrigPutCounterAll:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_snuffers.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_spike.txt b/res/cardsfolder/soul_spike.txt deleted file mode 100755 index 0676e50cd8c..00000000000 --- a/res/cardsfolder/soul_spike.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soul Spike -ManaCost:5 B B -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 5 B B | Tgt$ TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target creature or player and you gain 4 life. -A:SP$ DealDamage | Cost$ ExileFromHand<2/Card.Black> | Tgt$ TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBGainLife | CostDesc$ You may exile two black cards from your hand | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:DBGainLife:DB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_spike.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/70.jpg -End diff --git a/res/cardsfolder/soul_stair_expedition.txt b/res/cardsfolder/soul_stair_expedition.txt deleted file mode 100644 index 3a0053f08a6..00000000000 --- a/res/cardsfolder/soul_stair_expedition.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soul Stair Expedition -ManaCost:B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures from your graveyard. | SpellDescription$ Return up to two target creature cards from your graveyard to your hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Soul_Stair_Expedition.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soul_warden.txt b/res/cardsfolder/soul_warden.txt deleted file mode 100644 index 2f1e8be578e..00000000000 --- a/res/cardsfolder/soul_warden.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Soul Warden -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84112.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/34.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/44.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/46.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulbound_guardians.txt b/res/cardsfolder/soulbound_guardians.txt deleted file mode 100644 index 9eaa65aca2b..00000000000 --- a/res/cardsfolder/soulbound_guardians.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soulbound Guardians -ManaCost:4 W -Types:Creature Kor Spirit -Text:no text -PT:4/5 -K:Defender -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulbound_guardians.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulcatcher.txt b/res/cardsfolder/soulcatcher.txt deleted file mode 100644 index fc159d6bb80..00000000000 --- a/res/cardsfolder/soulcatcher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soulcatcher -ManaCost:1 W -Types:Creature Bird Soldier -Text:no text -PT:1/1 -T:Mode$ ChangesZone | ValidCard$ Creature.withFlying | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature with flying is put into a graveyard from the battlefield, put a +1/+1 counter on CARDNAME. -K:Flying -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulcatcher.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulcatchers_aerie.txt b/res/cardsfolder/soulcatchers_aerie.txt deleted file mode 100644 index baa89cd292e..00000000000 --- a/res/cardsfolder/soulcatchers_aerie.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soulcatchers' Aerie -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Bird | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a Bird is put into your graveyard from the battlefield, put a feather counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ FEATHER | CounterNum$ 1 -K:stPumpAll:Bird:X/X:no Condition:Bird creatures get +1/+1 for each feather counter on CARDNAME. -SVar:X:Count$CardCounters.FEATHER -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulcatchers_aerie.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/souldrinker.txt b/res/cardsfolder/souldrinker.txt deleted file mode 100644 index 5529654978a..00000000000 --- a/res/cardsfolder/souldrinker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Souldrinker -ManaCost:3 B -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ PutCounter | Cost$ PayLife<3> | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/souldrinker.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulless_one.txt b/res/cardsfolder/soulless_one.txt deleted file mode 100644 index 072a8836a3e..00000000000 --- a/res/cardsfolder/soulless_one.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soulless One -ManaCost:3 B -Types:Creature Zombie Avatar -Text:no text -PT:*/* -K:stSetPT:Count$TypeOnBattlefield.Zombie/Plus.Y:Count$TypeOnBattlefield.Zombie/Plus.Y:CARDNAME's power and toughness are each equal to the number of Zombies on the battlefield plus the number of Zombie cards in all graveyards. -#SVar:X:Count$TypeOnBattlefield.Zombie/Plus.Y -SVar:Y:Count$TypeInAllYards.Zombie -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulless_one.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulquake.txt b/res/cardsfolder/soulquake.txt deleted file mode 100644 index be5dd2770b9..00000000000 --- a/res/cardsfolder/soulquake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soulquake -ManaCost:3 U U B B -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U B B | ChangeType$ Creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBChangeZoneAll | SpellDescription$ Return all creatures on the battlefield and all creature cards in graveyards to their owners' hands. -SVar:DBChangeZoneAll:DB$ChangeZoneAll | ChangeType$ Creature | Origin$ Graveyard | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulquake.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/souls_attendant.txt b/res/cardsfolder/souls_attendant.txt deleted file mode 100644 index ef20e01b73c..00000000000 --- a/res/cardsfolder/souls_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soul's Attendant -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/souls_attendant.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/souls_might.txt b/res/cardsfolder/souls_might.txt deleted file mode 100644 index 334b7bd54f6..00000000000 --- a/res/cardsfolder/souls_might.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soul's Might -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ PutCounter | Cost$ 4 G | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ X | SpellDescription$ Put X +1/+1 counters on target creature, where X is that creature's power. -SVar:X:Targeted$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/souls_might.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/149.jpg -End diff --git a/res/cardsfolder/souls_of_the_faultless.txt b/res/cardsfolder/souls_of_the_faultless.txt deleted file mode 100644 index a16eaa321f2..00000000000 --- a/res/cardsfolder/souls_of_the_faultless.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Souls of the Faultless -ManaCost:W B B -Types:Creature Spirit -Text:no text -PT:0/4 -K:Defender -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigGain | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME is dealt combat damage, you gain that much life and attacking player loses that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X | SubAbility$ SVar=DBDrain -SVar:DBDrain:DB$LoseLife | Defined$ AttackingPlayer | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/souls_of_the_faultless.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulscour.txt b/res/cardsfolder/soulscour.txt deleted file mode 100644 index ef115c8ee7b..00000000000 --- a/res/cardsfolder/soulscour.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Soulscour -ManaCost:7 W W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 7 W W W | ValidCards$ Permanent.nonArtifact | SpellDescription$ Destroy all nonartifact permanents. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulscour.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/14.jpg -End diff --git a/res/cardsfolder/soulsurge_elemental.txt b/res/cardsfolder/soulsurge_elemental.txt deleted file mode 100644 index c7f0ea284e7..00000000000 --- a/res/cardsfolder/soulsurge_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Soulsurge Elemental -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:*/1 -K:First Strike -K:stSetPT:Count$Valid Creature.YouCtrl:1:Soulsurge Elemental's power is equal to the number of creatures you control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulsurge_elemental.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soulsworn_jury.txt b/res/cardsfolder/soulsworn_jury.txt deleted file mode 100644 index b3982c743a5..00000000000 --- a/res/cardsfolder/soulsworn_jury.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Soulsworn Jury -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:1/4 -K:Defender -A:AB$ Counter | Cost$ 1 U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/soulsworn_jury.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/soultether_golem.txt b/res/cardsfolder/soultether_golem.txt deleted file mode 100644 index 8493f809c89..00000000000 --- a/res/cardsfolder/soultether_golem.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Soultether Golem -ManaCost:2 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -K:Vanishing:1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature enters the battlefield under your control, put a time counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/soultether_golem.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sound_the_call.txt b/res/cardsfolder/sound_the_call.txt deleted file mode 100644 index 6f5020d6260..00000000000 --- a/res/cardsfolder/sound_the_call.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sound the Call -ManaCost:2 G -Types:Sorcery -Text: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." -A:SP$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ This creature gets +1/+1 for each card named Sound the Call in each graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sound_the_call.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/southern_elephant.txt b/res/cardsfolder/southern_elephant.txt deleted file mode 100644 index 7da1acfca18..00000000000 --- a/res/cardsfolder/southern_elephant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Southern Elephant -ManaCost:3 G -Types:Creature Elephant -Text:no text -PT:3/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21071.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/142.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/southern_paladin.txt b/res/cardsfolder/southern_paladin.txt deleted file mode 100644 index 62708d0668e..00000000000 --- a/res/cardsfolder/southern_paladin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Southern Paladin -ManaCost:2 W W -Types:Creature Human Knight -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ W W T | ValidTgts$ Permanent.Red | TgtPrompt$ Select target red permanent | SpellDescription$ Destroy target red permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/southern_paladin.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/143.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/46.jpg -End diff --git a/res/cardsfolder/sovereigns_of_lost_alara.txt b/res/cardsfolder/sovereigns_of_lost_alara.txt deleted file mode 100644 index 2337f7462ed..00000000000 --- a/res/cardsfolder/sovereigns_of_lost_alara.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sovereigns of Lost Alara -ManaCost:4 W U -Types:Creature Spirit -Text: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. -PT:4/5 -K:Exalted -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sovereigns_of_lost_alara.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sower_of_temptation.txt b/res/cardsfolder/sower_of_temptation.txt deleted file mode 100644 index aa9036536d3..00000000000 --- a/res/cardsfolder/sower_of_temptation.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sower of Temptation -ManaCost:2 U U -Types:Creature Faerie Wizard -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, gain control of target creature for as long as CARDNAME remains on the battlefield. -SVar:TrigChange:AB$GainControl | Cost$ 0 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sower_of_temptation.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spark_elemental.txt b/res/cardsfolder/spark_elemental.txt deleted file mode 100644 index 40ecfd24f6d..00000000000 --- a/res/cardsfolder/spark_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spark Elemental -ManaCost:R -Types:Creature Elemental -Text:no text -PT:3/1 -K:Trample -K:Haste -K:At the beginning of the end step, sacrifice CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card73579.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/79.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spark_spray.txt b/res/cardsfolder/spark_spray.txt deleted file mode 100644 index 5393aa23ece..00000000000 --- a/res/cardsfolder/spark_spray.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spark Spray -ManaCost:R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -K:Cycling:R -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/scg/en-us/card44484.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/105.jpg -End diff --git a/res/cardsfolder/sparkcaster.txt b/res/cardsfolder/sparkcaster.txt deleted file mode 100644 index d828884751b..00000000000 --- a/res/cardsfolder/sparkcaster.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sparkcaster -ManaCost:2 R G -Types:Creature Kavu -Text:no text -PT:5/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a red or green creature you control to its owner's hand. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target player. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | ChangeType$ Creature.Red+YouCtrl,Creature.Green+YouCtrl -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtP | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sparkcaster.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sparkmage_apprentice.txt b/res/cardsfolder/sparkmage_apprentice.txt deleted file mode 100644 index b6006efaa23..00000000000 --- a/res/cardsfolder/sparkmage_apprentice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sparkmage Apprentice -ManaCost:1 R -Types:Creature Human Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 1 damage to target creature or player. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sparkmage_apprentice.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/144.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sparksmith.txt b/res/cardsfolder/sparksmith.txt deleted file mode 100644 index c6a6604768b..00000000000 --- a/res/cardsfolder/sparksmith.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sparksmith -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals X damage to target creature and X damage to you, where X is the number of Goblins on the battlefield. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ X -SVar:X:Count$TypeOnBattlefield.Goblin -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39476.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/235.jpg -End diff --git a/res/cardsfolder/sparkspitter.txt b/res/cardsfolder/sparkspitter.txt deleted file mode 100644 index 8acd23dd46f..00000000000 --- a/res/cardsfolder/sparkspitter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sparkspitter -ManaCost:2 R -Types:Creature Elemental Spellshaper -Text:no text -PT:1/3 -A:AB$ Token | Cost$ R T Discard<1/Card> | TokenAmount$ 1 | TokenName$ Spark Elemental | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample<>At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ 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." -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130341.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sparring_golem.txt b/res/cardsfolder/sparring_golem.txt deleted file mode 100644 index d0e27984666..00000000000 --- a/res/cardsfolder/sparring_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sparring Golem -ManaCost:3 -Types:Artifact Creature Golem -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +X | NumDef$ +X -SVar:X:TriggerCount$NumBlockers -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sparring_golem.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/312.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spawning_breath.txt b/res/cardsfolder/spawning_breath.txt deleted file mode 100644 index e7230b5c226..00000000000 --- a/res/cardsfolder/spawning_breath.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spawning Breath -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 1 | SubAbility$ SVar=DBToken | SpellDescription$ CARDNAME 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 to your mana pool." -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Eldrazi Spawn | TokenTypes$ Creature,Eldrazi,Spawn | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 0 | TokenToughness$ 1 | TokenAbilities$ ABMana -SVar:ABMana:AB$Mana | Cost$ Sac<1/CARDNAME> | Produced$ 1 | Amount$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spawning_breath.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spawning_pit.txt b/res/cardsfolder/spawning_pit.txt deleted file mode 100644 index a91e62d8819..00000000000 --- a/res/cardsfolder/spawning_pit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spawning Pit -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ Sac<1/Creature> | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Token | Cost$ 1 SubCounter<2/CHARGE> | TokenAmount$ 1 | TokenController$ You | TokenName$ Spawn | TokenTypes$ Artifact,Creature,Spawn | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a 2/2 Spawn artifact creature token onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spawning_pit.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spawning_pool.txt b/res/cardsfolder/spawning_pool.txt deleted file mode 100644 index facbc9a3a60..00000000000 --- a/res/cardsfolder/spawning_pool.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spawning Pool -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Animate | Cost$ 1 B | Defined$ Self | Power$ 1 | Toughness$ 1 | Types$ Creature,Skeleton | Colors$ Black | Abilities$ ABRegen | SpellDescription$ CARDNAME 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.) -SVar:ABRegen:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spawning_pool.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/142.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/358.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spawnwrithe.txt b/res/cardsfolder/spawnwrithe.txt deleted file mode 100644 index 0d2c6a35026..00000000000 --- a/res/cardsfolder/spawnwrithe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spawnwrithe -ManaCost:2 G -Types:Creature Elemental -Text:Whenever CARDNAME deals combat damage to a player, put a token that's a copy of CARDNAME onto the battlefield. -PT:2/2 -K:Trample -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spawnwrithe.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spearbreaker_behemoth.txt b/res/cardsfolder/spearbreaker_behemoth.txt deleted file mode 100644 index 304f42e77d1..00000000000 --- a/res/cardsfolder/spearbreaker_behemoth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spearbreaker Behemoth -ManaCost:5 G G -Types:Creature Beast -Text:no text -PT:5/5 -K:Indestructible -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater | KW$ HIDDEN Indestructible | SpellDescription$ Target creature with power 5 or greater is indestructible until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spearbreaker_behemoth.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/150.jpg -End diff --git a/res/cardsfolder/specters_shroud.txt b/res/cardsfolder/specters_shroud.txt deleted file mode 100644 index a7e1bca8709..00000000000 --- a/res/cardsfolder/specters_shroud.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Specter's Shroud -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0. -K:eqPump 1:+1/+0 -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/specters_shroud.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/specters_wail.txt b/res/cardsfolder/specters_wail.txt deleted file mode 100644 index 8dd73c31ec5..00000000000 --- a/res/cardsfolder/specters_wail.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Specter's Wail -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | NumCards$ 1 | Mode$ Random | SpellDescription$ Target player discards a card at random. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/specters_wail.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_bears.txt b/res/cardsfolder/spectral_bears.txt deleted file mode 100644 index a46bcadd87f..00000000000 --- a/res/cardsfolder/spectral_bears.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spectral Bears -ManaCost:1 G -Types:Creature Bear Spirit -Text:Whenever Spectral Bears attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. -PT:3/3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_bears.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_cloak.txt b/res/cardsfolder/spectral_cloak.txt deleted file mode 100644 index 47e95c04431..00000000000 --- a/res/cardsfolder/spectral_cloak.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spectral Cloak -ManaCost:U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.untapped:0/0/Shroud:No Condition:Enchanted creature has shroud as long as it's untapped. (It can't be the target of spells or abilities.) -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_cloak.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_force.txt b/res/cardsfolder/spectral_force.txt deleted file mode 100644 index 09ff252de61..00000000000 --- a/res/cardsfolder/spectral_force.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spectral Force -ManaCost:3 G G -Types:Creature Elemental Spirit -Text:Whenever Spectral Force attacks, if defending player controls no black permanents, it doesn't untap during your next untap step. -PT:8/8 -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_force.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_guardian.txt b/res/cardsfolder/spectral_guardian.txt deleted file mode 100644 index 3f76319d5bc..00000000000 --- a/res/cardsfolder/spectral_guardian.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spectral Guardian -ManaCost:2 W W -Types:Creature Spirit -Text:no text -PT:2/3 -K:stPumpAll:Artifact.nonCreature:0/0/Shroud:isUntapped:As long as Spectral Guardian is untapped, noncreature artifacts have shroud. (They can't be the targets of spells or abilities.) -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_guardian.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_lynx.txt b/res/cardsfolder/spectral_lynx.txt deleted file mode 100644 index 1cc9eafbea7..00000000000 --- a/res/cardsfolder/spectral_lynx.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spectral Lynx -ManaCost:1 W -Types:Creature Cat Spirit -Text:no text -PT:2/1 -K:Protection from green -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_lynx.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_procession.txt b/res/cardsfolder/spectral_procession.txt deleted file mode 100644 index 0e698487ccb..00000000000 --- a/res/cardsfolder/spectral_procession.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spectral Procession -ManaCost:2/W 2/W 2/W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2/W 2/W 2/W | TokenAmount$ 3 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put three 1/1 white Spirit creature tokens with flying onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_procession.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_searchlight.txt b/res/cardsfolder/spectral_searchlight.txt deleted file mode 100644 index 96b42d324a0..00000000000 --- a/res/cardsfolder/spectral_searchlight.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spectral Searchlight -ManaCost:3 -Types:Artifact -Text:(NOTE: "Tap Choose a player. That player adds one mana of any color he or she chooses to his or her mana pool." not implemented.) -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_searchlight.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_shield.txt b/res/cardsfolder/spectral_shield.txt deleted file mode 100644 index 5727d40d837..00000000000 --- a/res/cardsfolder/spectral_shield.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spectral Shield -ManaCost:1 W U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+2/HIDDEN CARDNAME can't be the target of spells.:Enchanted creature gets +0/+2 and can't be the target of spells. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_shield.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/380.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spectral_sliver.txt b/res/cardsfolder/spectral_sliver.txt deleted file mode 100644 index 4f39c23a5b0..00000000000 --- a/res/cardsfolder/spectral_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spectral Sliver -ManaCost:2 B -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/SVar=Pump:no Condition:All Sliver creatures have "2: This creature gets +1/+1 until end of turn." -SVar:Pump:AB$Pump | Cost$ 2 | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_sliver.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_blast.txt b/res/cardsfolder/spell_blast.txt deleted file mode 100644 index 98591f7a168..00000000000 --- a/res/cardsfolder/spell_blast.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Spell Blast -ManaCost:X U -Types:Instant -Text:no text -A:SP$Counter | Cost$ X U | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell with converted mana cost X. -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_blast.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/89.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/80.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/126.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/103.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/100.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/82.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_burst.txt b/res/cardsfolder/spell_burst.txt deleted file mode 100644 index 30a3769b8ee..00000000000 --- a/res/cardsfolder/spell_burst.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spell Burst -ManaCost:X U -Types:Instant -Text:no text -A:SP$Counter | Cost$ X U | TargetType$ Spell | ValidTgts$ Card | SpellDescription$ Counter target spell with converted mana cost X. -SVar:X:Targeted$CardManaCost -SVar:Buyback:3 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_burst.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_contortion.txt b/res/cardsfolder/spell_contortion.txt deleted file mode 100644 index 09c2220cd99..00000000000 --- a/res/cardsfolder/spell_contortion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spell Contortion -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell unless its controller pays 2. Draw a card for each time CARDNAME was kicked. -K:Multikicker 1 U -SVar:DBDraw:DB$Draw | NumCards$ X -SVar:X:Count$TimesKicked -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_contortion.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_pierce.txt b/res/cardsfolder/spell_pierce.txt deleted file mode 100644 index 442c14af08a..00000000000 --- a/res/cardsfolder/spell_pierce.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spell Pierce -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature | UnlessCost$ 2 | SpellDescription$ Counter target noncreature spell unless its controller pays 2. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_pierce.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_snare.txt b/res/cardsfolder/spell_snare.txt deleted file mode 100644 index cf764f2e099..00000000000 --- a/res/cardsfolder/spell_snare.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spell Snare -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell with CMC 2 | ValidTgts$ Card.cmcEQ2 | SpellDescription$ Counter target spell with converted mana cost 2. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_snare.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_snip.txt b/res/cardsfolder/spell_snip.txt deleted file mode 100644 index 1d14c229e49..00000000000 --- a/res/cardsfolder/spell_snip.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spell Snip -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -K:Cycling:2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_snip.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spell_syphon.txt b/res/cardsfolder/spell_syphon.txt deleted file mode 100644 index e2ab7e73268..00000000000 --- a/res/cardsfolder/spell_syphon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spell Syphon -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ X | SpellDescription$ Counter target spell unless its controller pays 1 for each blue permanent you control. -SVar:X:Count$BlueYouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spell_syphon.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spellbane_centaur.txt b/res/cardsfolder/spellbane_centaur.txt deleted file mode 100644 index ebc7c2259e6..00000000000 --- a/res/cardsfolder/spellbane_centaur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spellbane Centaur -ManaCost:2 G -Types:Creature Centaur -Text:Creatures you control can't be the targets of blue spells or abilities from blue sources. -PT:3/2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellbane_centaur.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spellbook.txt b/res/cardsfolder/spellbook.txt deleted file mode 100644 index 2694e035ee5..00000000000 --- a/res/cardsfolder/spellbook.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Spellbook -ManaCost:0 -Types:Artifact -Text:You have no maximum hand size. -K:HandSize = INF Self -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellbook.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/314.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/318.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/138.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/309.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/343.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spellbreaker_behemoth.txt b/res/cardsfolder/spellbreaker_behemoth.txt deleted file mode 100644 index d52cabc317e..00000000000 --- a/res/cardsfolder/spellbreaker_behemoth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spellbreaker Behemoth -ManaCost:1 R G G -Types:Creature Beast -Text:no text -PT:5/5 -K:CARDNAME can't be countered. -K:stPumpAll:Creature.powerGE5+YouCtrl :0/0/HIDDEN CARDNAME can't be countered.:No Condition:Creature spells you control with power 5 or greater can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellbreaker_behemoth.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spellgorger_barbarian.txt b/res/cardsfolder/spellgorger_barbarian.txt deleted file mode 100644 index 514ddd5d109..00000000000 --- a/res/cardsfolder/spellgorger_barbarian.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spellgorger Barbarian -ManaCost:3 R -Types:Creature Human Nightmare Barbarian -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, discard a card at random. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME leaves the battlefield, draw a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ You | NumCards$ 1 | Mode$ Random -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellgorger_barbarian.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spellshock.txt b/res/cardsfolder/spellshock.txt deleted file mode 100644 index 15d4cf7b097..00000000000 --- a/res/cardsfolder/spellshock.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spellshock -ManaCost:2 R -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | Execute$ TrigDamageYou | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a spell, CARDNAME deals 2 damage to that player. -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | Execute$ TrigDamageOpp | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever a player casts a spell, CARDNAME deals 2 damage to that player. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 2 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellshock.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/104.jpg -End diff --git a/res/cardsfolder/spellstutter_sprite.txt b/res/cardsfolder/spellstutter_sprite.txt deleted file mode 100644 index eaac74a9e6b..00000000000 --- a/res/cardsfolder/spellstutter_sprite.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spellstutter Sprite -ManaCost:1 U -Types:Creature Faerie Wizard -Text:no text -PT:1/1 -K:Flash -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When CARDNAME enters the battlefield, counter target spell with converted mana cost X or less, where X is the number of Faeries you control. -SVar:TrigCounter:DB$Counter | Cost$ 0 | TargetType$ Spell | ValidTgts$ Card.cmcLEX | TgtPrompt$ Select target spell with CMC less than or equal to the number of Faeries you control -SVar:X:Count$Valid Faerie.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spellstutter_sprite.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_duty.txt b/res/cardsfolder/sphere_of_duty.txt deleted file mode 100644 index f18449514b0..00000000000 --- a/res/cardsfolder/sphere_of_duty.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Duty -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPreventDamage:You:Card.Green:2:If a green source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_duty.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_grace.txt b/res/cardsfolder/sphere_of_grace.txt deleted file mode 100644 index 6bf69058f9b..00000000000 --- a/res/cardsfolder/sphere_of_grace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Grace -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPreventDamage:You:Card.Black:2:If a black source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_grace.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_law.txt b/res/cardsfolder/sphere_of_law.txt deleted file mode 100644 index 3177bc06894..00000000000 --- a/res/cardsfolder/sphere_of_law.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Law -ManaCost:3 W -Types:Enchantment -Text: -K:stPreventDamage:You:Card.Red:2:If a red source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_law.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_purity.txt b/res/cardsfolder/sphere_of_purity.txt deleted file mode 100644 index 89901322d6a..00000000000 --- a/res/cardsfolder/sphere_of_purity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Purity -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPreventDamage:You:Artifact:1:If an artifact source would deal damage to you, prevent 1 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_purity.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_reason.txt b/res/cardsfolder/sphere_of_reason.txt deleted file mode 100644 index 46ba5cb7a3e..00000000000 --- a/res/cardsfolder/sphere_of_reason.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Reason -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPreventDamage:You:Card.Blue:2:If a blue source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_reason.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_resistance.txt b/res/cardsfolder/sphere_of_resistance.txt deleted file mode 100644 index 37949aedbd2..00000000000 --- a/res/cardsfolder/sphere_of_resistance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Resistance -ManaCost:2 -Types:Artifact -Text:Spells cost 1 more to cast. -K:CostChange:All:More:1:Spell:All:All:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_resistance.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_the_suns.txt b/res/cardsfolder/sphere_of_the_suns.txt deleted file mode 100644 index b53d96a0bc7..00000000000 --- a/res/cardsfolder/sphere_of_the_suns.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sphere of the Suns -ManaCost:2 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -K:etbCounter:CHARGE:3 -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_the_suns.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphere_of_truth.txt b/res/cardsfolder/sphere_of_truth.txt deleted file mode 100644 index 1b975a41610..00000000000 --- a/res/cardsfolder/sphere_of_truth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sphere of Truth -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPreventDamage:You:Card.White:2:If a white source would deal damage to you, prevent 2 of that damage. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_truth.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_bone_wand.txt b/res/cardsfolder/sphinx_bone_wand.txt deleted file mode 100644 index 6d010f5e04c..00000000000 --- a/res/cardsfolder/sphinx_bone_wand.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sphinx-Bone Wand -ManaCost:7 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Instant.YouCtrl,Sorcery.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may put a charge counter on CARDNAME. If you do, CARDNAME deals damage equal to the number of charge counters on it to target creature or player. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SubAbility$ SVar=DBDealDamage -SVar:DBDealDamage:DB$DealDamage | Tgt$ TgtCP | NumDmg$ X -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_bone_wand.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_of_jwar_isle.txt b/res/cardsfolder/sphinx_of_jwar_isle.txt deleted file mode 100644 index 8ca9e57546a..00000000000 --- a/res/cardsfolder/sphinx_of_jwar_isle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sphinx of Jwar Isle -ManaCost:4 U U -Types:Creature Sphinx -Text:no text -PT:5/5 -K:Flying -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_of_jwar_isle.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_of_lost_truths.txt b/res/cardsfolder/sphinx_of_lost_truths.txt deleted file mode 100644 index e8e776b14dd..00000000000 --- a/res/cardsfolder/sphinx_of_lost_truths.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Sphinx of Lost Truths -ManaCost:3 U U -Types:Creature Sphinx -Text:no text -PT:3/5 -K:Flying -K:Kicker:1 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+notkicked | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw three cards. Then if it wasn't kicked, discard three cards. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Secondary$ True | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, draw three cards. -SVar:TrigKicker:AB$Draw | Cost$ 0 | NumCards$ 3 -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 3 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_of_lost_truths.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_of_magosi.txt b/res/cardsfolder/sphinx_of_magosi.txt deleted file mode 100644 index d6f2e2afe2e..00000000000 --- a/res/cardsfolder/sphinx_of_magosi.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sphinx of Magosi -ManaCost:3 U U U -Types:Creature Sphinx -Text:no text -PT:6/6 -K:Flying -A:AB$ Draw | Cost$ 2 U | NumCards$ 1 | Defined$ You | SubAbility$ SVar=DBPutCounter | SpellDescription$ Draw a card, then put a +1/+1 counter on CARDNAME. -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_of_magosi.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_of_the_steel_wind.txt b/res/cardsfolder/sphinx_of_the_steel_wind.txt deleted file mode 100644 index 8ccfef76ee0..00000000000 --- a/res/cardsfolder/sphinx_of_the_steel_wind.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sphinx of the Steel Wind -ManaCost:5 W U B -Types:Artifact Creature Sphinx -Text:no text -PT:6/6 -K:Flying -K:First Strike -K:Vigilance -K:Lifelink -K:Protection from red -K:Protection from green -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_of_the_steel_wind.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sphinx_sovereign.txt b/res/cardsfolder/sphinx_sovereign.txt deleted file mode 100644 index 9530f724031..00000000000 --- a/res/cardsfolder/sphinx_sovereign.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sphinx Sovereign -ManaCost:4 W U U B -Types:Artifact Creature Sphinx -Text:no text -PT:6/6 -K:Flying -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ At the beginning of your end step, you gain 3 life if CARDNAME is untapped. Otherwise, each opponent loses 3 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 3 | ConditionPresent$ Card.Self+tapped | SubAbility$ SVar=DBGainLife | ConditionCompare$ EQ1 -SVar:DBGainLife:DB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 | ConditionPresent$ Card.Self+untapped | ConditionCompare$ EQ1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_sovereign.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/196.jpg -End diff --git a/res/cardsfolder/sphinx_summoner.txt b/res/cardsfolder/sphinx_summoner.txt deleted file mode 100644 index 033ba677988..00000000000 --- a/res/cardsfolder/sphinx_summoner.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sphinx Summoner -ManaCost:3 U B -Types:Artifact Creature Sphinx -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.Creature| ChangeNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphinx_summoner.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spider_umbra.txt b/res/cardsfolder/spider_umbra.txt deleted file mode 100644 index 3008981e2dc..00000000000 --- a/res/cardsfolder/spider_umbra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spider Umbra -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Totem armor -K:enPump:+1/+1/Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spider_umbra.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spidersilk_armor.txt b/res/cardsfolder/spidersilk_armor.txt deleted file mode 100644 index b0d600666e0..00000000000 --- a/res/cardsfolder/spidersilk_armor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spidersilk Armor -ManaCost:2 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/1/Reach:No Condition:Creatures you control get +0/+1 and have reach. (They can block creatures with flying.) -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spidersilk_armor.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spidersilk_net.txt b/res/cardsfolder/spidersilk_net.txt deleted file mode 100644 index 234f7a3cba9..00000000000 --- a/res/cardsfolder/spidersilk_net.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spidersilk Net -ManaCost:0 -Types:Artifact Equipment -Text:Equipped creature gets +0/+2 and has reach. -K:eqPump 2:+0/+2/Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spidersilk_net.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiderwig_boggart.txt b/res/cardsfolder/spiderwig_boggart.txt deleted file mode 100644 index 4cc4b29b347..00000000000 --- a/res/cardsfolder/spiderwig_boggart.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spiderwig Boggart -ManaCost:2 B -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gains fear until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Fear -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiderwig_boggart.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_breeder.txt b/res/cardsfolder/spike_breeder.txt deleted file mode 100644 index 1821d622b81..00000000000 --- a/res/cardsfolder/spike_breeder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spike Breeder -ManaCost:3 G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Token | Cost$ 2 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Spike | TokenTypes$ Creature,Spike | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Spike creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_breeder.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_colony.txt b/res/cardsfolder/spike_colony.txt deleted file mode 100644 index 708cc533809..00000000000 --- a/res/cardsfolder/spike_colony.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spike Colony -ManaCost:4 G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:4 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_colony.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_drone.txt b/res/cardsfolder/spike_drone.txt deleted file mode 100644 index de21a6f5277..00000000000 --- a/res/cardsfolder/spike_drone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spike Drone -ManaCost:G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:1 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_drone.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_feeder.txt b/res/cardsfolder/spike_feeder.txt deleted file mode 100644 index 766d6d2c575..00000000000 --- a/res/cardsfolder/spike_feeder.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spike Feeder -ManaCost:1 G G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ GainLife | Cost$ SubCounter<1/P1P1> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_feeder.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/68.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/84.jpg -End diff --git a/res/cardsfolder/spike_hatcher.txt b/res/cardsfolder/spike_hatcher.txt deleted file mode 100644 index e443f1614b0..00000000000 --- a/res/cardsfolder/spike_hatcher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spike Hatcher -ManaCost:6 G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:6 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Regenerate | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Regenerate Spike Hatcher. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_hatcher.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_soldier.txt b/res/cardsfolder/spike_soldier.txt deleted file mode 100644 index 83816164324..00000000000 --- a/res/cardsfolder/spike_soldier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spike Soldier -ManaCost:2 G G -Types:Creature Spike Soldier -Text:no text -PT:0/0 -K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Pump | Cost$ SubCounter<1/P1P1> | Defined$ Self | NumAtt$ 2 | NumDef$ 2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_soldier.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_tiller.txt b/res/cardsfolder/spike_tiller.txt deleted file mode 100644 index 8b3a1373cdc..00000000000 --- a/res/cardsfolder/spike_tiller.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spike Tiller -ManaCost:3 G G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounters:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SubAbility$ SVar=DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. -SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tiller.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_weaver.txt b/res/cardsfolder/spike_weaver.txt deleted file mode 100644 index d32b8c03a81..00000000000 --- a/res/cardsfolder/spike_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spike Weaver -ManaCost:2 G G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:3 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Fog | Cost$ 1 SubCounter<1/P1P1> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_weaver.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spike_worker.txt b/res/cardsfolder/spike_worker.txt deleted file mode 100644 index 8c238eff7ce..00000000000 --- a/res/cardsfolder/spike_worker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spike Worker -ManaCost:2 G -Types:Creature Spike -Text:no text -PT:0/0 -K:etbCounter:P1P1:2 -A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_worker.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spikeshot_elder.txt b/res/cardsfolder/spikeshot_elder.txt deleted file mode 100644 index eab0808feff..00000000000 --- a/res/cardsfolder/spikeshot_elder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spikeshot Elder -ManaCost:R -Types:Creature Goblin Shaman -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ 1 R R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature or player. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spikeshot_elder.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spikeshot_goblin.txt b/res/cardsfolder/spikeshot_goblin.txt deleted file mode 100644 index e9f1ac660dc..00000000000 --- a/res/cardsfolder/spikeshot_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spikeshot Goblin -ManaCost:2 R -Types:Creature Goblin Shaman -Text:no text -PT:1/2 -A:AB$ DealDamage | Cost$ R T | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to its power to target creature or player. -SVar:X:Count$CardPower -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spikeshot_goblin.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiketail_drake.txt b/res/cardsfolder/spiketail_drake.txt deleted file mode 100644 index dbff9d2623e..00000000000 --- a/res/cardsfolder/spiketail_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spiketail Drake -ManaCost:3 U U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 3 | SpellDescription$ Counter target spell unless its controller pays 3. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiketail_drake.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiketail_drakeling.txt b/res/cardsfolder/spiketail_drakeling.txt deleted file mode 100644 index d82b4a3bff7..00000000000 --- a/res/cardsfolder/spiketail_drakeling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spiketail Drakeling -ManaCost:1 U U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays 2. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiketail_drakeling.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiketail_hatchling.txt b/res/cardsfolder/spiketail_hatchling.txt deleted file mode 100644 index 9dc809647f8..00000000000 --- a/res/cardsfolder/spiketail_hatchling.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spiketail Hatchling -ManaCost:1 U -Types:Creature Drake -Text:no text -PT:1/1 -K:Flying -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiketail_hatchling.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/102.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/49.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spin_into_myth.txt b/res/cardsfolder/spin_into_myth.txt deleted file mode 100644 index 028ccd565d0..00000000000 --- a/res/cardsfolder/spin_into_myth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spin into Myth -ManaCost:4 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 4 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SubAbility$ SVar=DBDig | SpellDescription$ 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.) -SVar:DBDig:DB$Dig | Defined$ Opponent | DigNum$ 2 | AnyNumber$ True | DestinationZone$ Library | LibraryPosition$ -1 | LibraryPosition2$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spin_into_myth.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spinal_graft.txt b/res/cardsfolder/spinal_graft.txt deleted file mode 100644 index a0bff2d60b9..00000000000 --- a/res/cardsfolder/spinal_graft.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spinal Graft -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:enPump:+3/+3 -K:When enchanted creature becomes the target of a spell or ability, destroy that creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spinal_graft.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spinal_villain.txt b/res/cardsfolder/spinal_villain.txt deleted file mode 100644 index 819cbd8ced7..00000000000 --- a/res/cardsfolder/spinal_villain.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spinal Villain -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.Blue | TgtPrompt$ Select target blue creature | SpellDescription$ Destroy target blue creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spinal_villain.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/161.jpg -End diff --git a/res/cardsfolder/spincrusher.txt b/res/cardsfolder/spincrusher.txt deleted file mode 100644 index 86279386ed2..00000000000 --- a/res/cardsfolder/spincrusher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spincrusher -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:0/2 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME blocks, put a +1/+1 counter on it. -A:AB$ Pump | Cost$ SubCounter<1/P1P1> | KW$ Unblockable | SpellDescription$ CARDNAME is unblockable this turn. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spincrusher.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/144.jpg -End diff --git a/res/cardsfolder/spindrift_drake.txt b/res/cardsfolder/spindrift_drake.txt deleted file mode 100644 index 4d4899119cc..00000000000 --- a/res/cardsfolder/spindrift_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spindrift Drake -ManaCost:U -Types:Creature Drake -Text:no text -PT:2/1 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spindrift_drake.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spine_of_ish_sah.txt b/res/cardsfolder/spine_of_ish_sah.txt deleted file mode 100644 index 53264c4613b..00000000000 --- a/res/cardsfolder/spine_of_ish_sah.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spine of Ish Sah -ManaCost:7 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target permanent. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spine_of_ish_sah.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spined_basher.txt b/res/cardsfolder/spined_basher.txt deleted file mode 100644 index 54b3a3a7b65..00000000000 --- a/res/cardsfolder/spined_basher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spined Basher -ManaCost:2 B -Types:Creature Zombie Beast -Text:no text -PT:3/1 -K:Morph:2 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spined_basher.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/172.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spined_fluke.txt b/res/cardsfolder/spined_fluke.txt deleted file mode 100644 index 74df4d31f12..00000000000 --- a/res/cardsfolder/spined_fluke.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spined Fluke -ManaCost:2 B -Types:Creature Worm Horror -Text:no text -PT:5/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spined_fluke.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spined_sliver.txt b/res/cardsfolder/spined_sliver.txt deleted file mode 100644 index 445a279bf9f..00000000000 --- a/res/cardsfolder/spined_sliver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spined Sliver -ManaCost:R G -Types:Creature Sliver -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Sliver | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a Sliver becomes blocked, that Sliver gets +1/+1 until end of turn for each creature blocking it. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X -SVar:X:TriggerCount$NumBlockers -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spined_sliver.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/142.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spined_thopter.txt b/res/cardsfolder/spined_thopter.txt deleted file mode 100644 index 5318f92b859..00000000000 --- a/res/cardsfolder/spined_thopter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spined Thopter -ManaCost:2 PU -Types:Artifact Creature Thopter -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spined_thopter.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spined_wurm.txt b/res/cardsfolder/spined_wurm.txt deleted file mode 100644 index eb21cb277dc..00000000000 --- a/res/cardsfolder/spined_wurm.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Spined Wurm -ManaCost:4 G -Types:Creature Wurm -Text:no text -PT:5/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card94914.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/279.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/270.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/111.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/71.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9eb/10.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/298.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spineless_thug.txt b/res/cardsfolder/spineless_thug.txt deleted file mode 100644 index aff87c27e2a..00000000000 --- a/res/cardsfolder/spineless_thug.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spineless Thug -ManaCost:1 B -Types:Creature Zombie Mercenary -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129743.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/166.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/180.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/71.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/165.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spinneret_sliver.txt b/res/cardsfolder/spinneret_sliver.txt deleted file mode 100644 index 6fddf23975a..00000000000 --- a/res/cardsfolder/spinneret_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spinneret Sliver -ManaCost:1 G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/0/Reach:No Condition:All Sliver creatures have reach. (They can block creatures with flying.) -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spinneret_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiraling_duelist.txt b/res/cardsfolder/spiraling_duelist.txt deleted file mode 100644 index 46c7525d10e..00000000000 --- a/res/cardsfolder/spiraling_duelist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spiraling Duelist -ManaCost:2 R R -Types:Creature Human Berserker -Text:no text -PT:3/1 -K:stPumpSelf:Creature:0/0/Double Strike:Metalcraft:Metalcraft - Spiraling Duelist has double strike as long as you control three or more artifacts. -SVar:BuffedBy:Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiraling_duelist.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiraling_embers.txt b/res/cardsfolder/spiraling_embers.txt deleted file mode 100644 index a096e25af95..00000000000 --- a/res/cardsfolder/spiraling_embers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spiraling Embers -ManaCost:3 R -Types:Sorcery Arcane -Text:no text -A:SP$ DealDamage | Cost$ 3 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature or player equal to the number of cards in your hand. -SVar:X:Count$InYourHand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiraling_embers.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/116.jpg -End diff --git a/res/cardsfolder/spire_barrage.txt b/res/cardsfolder/spire_barrage.txt deleted file mode 100644 index fff4fca2932..00000000000 --- a/res/cardsfolder/spire_barrage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spire Barrage -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature or player equal to the number of Mountains you control. -SVar:X:Count$TypeYouCtrl.Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_barrage.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/150.jpg -End diff --git a/res/cardsfolder/spire_golem.txt b/res/cardsfolder/spire_golem.txt deleted file mode 100644 index a09ac041ba4..00000000000 --- a/res/cardsfolder/spire_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spire Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:Affinity for Islands (This spell costs 1 less to cast for each Island you control.) -PT:2/4 -K:Flying -K:CostChange:Player:Less:1:Self:All:All:Affinity/Island -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_golem.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spire_monitor.txt b/res/cardsfolder/spire_monitor.txt deleted file mode 100644 index 0b8133f7456..00000000000 --- a/res/cardsfolder/spire_monitor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spire Monitor -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flash -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_monitor.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spire_owl.txt b/res/cardsfolder/spire_owl.txt deleted file mode 100644 index 4f83decfd6c..00000000000 --- a/res/cardsfolder/spire_owl.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spire Owl -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRearrange | TriggerDescription$ When CARDNAME enters the battlefield, look at the top four cards of your library, then put them back in any order. -SVar:TrigRearrange:AB$RearrangeTopOfLibrary | Cost$ 0 | Defined$ You | NumCards$ 4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_owl.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spire_serpent.txt b/res/cardsfolder/spire_serpent.txt deleted file mode 100644 index 5eb6438b315..00000000000 --- a/res/cardsfolder/spire_serpent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spire Serpent -ManaCost:4 U -Types:Creature Serpent -Text:no text -PT:3/5 -K:Defender -K:stPumpSelf:Creature:2/2/HIDDEN CARDNAME can attack as though it didn't have defender.:Metalcraft: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. -SVar:BuffedBy:Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_serpent.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_cairn.txt b/res/cardsfolder/spirit_cairn.txt deleted file mode 100644 index 5b3fbe9374c..00000000000 --- a/res/cardsfolder/spirit_cairn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spirit Cairn -ManaCost:2 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card | Origin$ Hand | Destination$ Graveyard | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ W | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_cairn.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_en_dal.txt b/res/cardsfolder/spirit_en_dal.txt deleted file mode 100644 index a1fe13e80a6..00000000000 --- a/res/cardsfolder/spirit_en_dal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spirit en-Dal -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:2/1 -K:Shadow -A:AB$ Pump | Cost$ 1 W | ActivatingZone$ Hand | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Shadow | ActivationLimit$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep | PrecostDesc$ Forecast - | SpellDescription$ Target creature gains shadow until end of turn. (Activate this ability only during your upkeep and only once each turn.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_en_dal.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_link.txt b/res/cardsfolder/spirit_link.txt deleted file mode 100644 index ba76acc7bba..00000000000 --- a/res/cardsfolder/spirit_link.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Spirit Link -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_link.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/47.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/47.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/340.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/206.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/301.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/47.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/45.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_loop.txt b/res/cardsfolder/spirit_loop.txt deleted file mode 100644 index 12a55e1914c..00000000000 --- a/res/cardsfolder/spirit_loop.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Spirit Loop -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant Creature you control -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:SacMe:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_loop.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_of_resistance.txt b/res/cardsfolder/spirit_of_resistance.txt deleted file mode 100644 index 1574d8c840e..00000000000 --- a/res/cardsfolder/spirit_of_resistance.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spirit of Resistance -ManaCost:2 W -Types:Enchantment -Text:As long as you control a permanent of each color, prevent all damage that would be dealt to you. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_of_resistance.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_of_the_night.txt b/res/cardsfolder/spirit_of_the_night.txt deleted file mode 100644 index f4e2c497d98..00000000000 --- a/res/cardsfolder/spirit_of_the_night.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spirit of the Night -ManaCost:6 B B B -Types:Legendary Creature Demon Spirit -Text:no text -PT:6/5 -K:Flying -K:Trample -K:Haste -K:Protection from black -K:stPumpSelf:Creature.attacking:0/0/First Strike:No Condition:Spirit of the Night has first strike as long as it's attacking. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_of_the_night.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_shackle.txt b/res/cardsfolder/spirit_shackle.txt deleted file mode 100644 index dc75beeb940..00000000000 --- a/res/cardsfolder/spirit_shackle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spirit Shackle -ManaCost:B B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever enchanted creature becomes tapped, put a -0/-2 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ M0M2 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_shackle.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/47.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spirit_weaver.txt b/res/cardsfolder/spirit_weaver.txt deleted file mode 100644 index ffaddf309de..00000000000 --- a/res/cardsfolder/spirit_weaver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spirit Weaver -ManaCost:1 W -Types:Creature Human Wizard -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ 2 | ValidTgts$ Creature.Green,Creature.Blue | NumDef$ +1 | SpellDescription$ Target green or blue creature gets +0/+1 until end of turn. | TgtPrompt$ Select target green or blue creature. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_weaver.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/39.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiritmonger.txt b/res/cardsfolder/spiritmonger.txt deleted file mode 100644 index 271e00f091b..00000000000 --- a/res/cardsfolder/spiritmonger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spiritmonger -ManaCost:3 B G -Types:Creature Beast -Text:Whenever Spiritmonger deals damage to a creature, put a +1/+1 counter on Spiritmonger. -PT:6/6 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiritmonger.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiritual_asylum.txt b/res/cardsfolder/spiritual_asylum.txt deleted file mode 100644 index 844b5975e1a..00000000000 --- a/res/cardsfolder/spiritual_asylum.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spiritual Asylum -ManaCost:2 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl,Land.YouCtrl:0/0/Shroud:no Condition:Creatures and lands you control have shroud. -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When a creature you control attacks, sacrifice CARDNAME. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiritual_asylum.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiritual_guardian.txt b/res/cardsfolder/spiritual_guardian.txt deleted file mode 100644 index 4d8fad5e7fe..00000000000 --- a/res/cardsfolder/spiritual_guardian.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spiritual Guardian -ManaCost:3 W W -Types:Creature Spirit -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiritual_guardian.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitebellows.txt b/res/cardsfolder/spitebellows.txt deleted file mode 100644 index a52623d6aa4..00000000000 --- a/res/cardsfolder/spitebellows.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Spitebellows -ManaCost:5 R -Types:Creature Elemental -Text:no text -PT:6/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigDamageCreature | TriggerDescription$ When CARDNAME leaves the battlefield, it deals 6 damage to target creature. -K:Evoke:1 R R -SVar:TrigDamageCreature:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 6 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitebellows.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiteflame_witch.txt b/res/cardsfolder/spiteflame_witch.txt deleted file mode 100644 index f8a2d8c6fb5..00000000000 --- a/res/cardsfolder/spiteflame_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spiteflame Witch -ManaCost:1 BR -Types:Creature Elemental Shaman -Text:no text -PT:2/1 -A:AB$ LoseLife | Cost$ B R | Defined$ Each | LifeAmount$ 1 | SpellDescription$ Each player loses 1 life. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteflame_witch.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiteful_bully.txt b/res/cardsfolder/spiteful_bully.txt deleted file mode 100644 index 4be5211c8a7..00000000000 --- a/res/cardsfolder/spiteful_bully.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spiteful Bully -ManaCost:1 B -Types:Creature Zombie Mercenary -Text:no text -PT:3/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals 3 damage to target creature you control. -SVar:TrigDamage:AB$ DealDamage | Cost$ 0 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | NumDmg$ 3 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteful_bully.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spiteful_visions.txt b/res/cardsfolder/spiteful_visions.txt deleted file mode 100644 index 03e200cb191..00000000000 --- a/res/cardsfolder/spiteful_visions.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spiteful Visions -ManaCost:2 BR BR -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ At the beginning of each player's draw step, that player draws an additional card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | Defined$ TriggeredPlayer -T:Mode$ Drawn | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a player draws a card, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardOwner | NumDmg$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spiteful_visions.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitemare.txt b/res/cardsfolder/spitemare.txt deleted file mode 100644 index d04a81aee97..00000000000 --- a/res/cardsfolder/spitemare.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spitemare -ManaCost:2 RW RW -Types:Creature Elemental -Text:no text -PT:3/3 -T:Mode$ DamageDone | Execute$ TrigDamage | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME is dealt damage, it deals that much damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | NumDmg$ X | Tgt$ TgtCP -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitemare.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitfire_handler.txt b/res/cardsfolder/spitfire_handler.txt deleted file mode 100644 index 75012f01821..00000000000 --- a/res/cardsfolder/spitfire_handler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spitfire Handler -ManaCost:1 R -Types:Creature Goblin -Text:no text -PT:1/1 -K:CARDNAME can't block creatures with power greater than CARDNAME's power. -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitfire_handler.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/236.jpg -End diff --git a/res/cardsfolder/spitting_drake.txt b/res/cardsfolder/spitting_drake.txt deleted file mode 100644 index 6c6d5814ebf..00000000000 --- a/res/cardsfolder/spitting_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spitting Drake -ManaCost:3 R -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_drake.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/95.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_earth.txt b/res/cardsfolder/spitting_earth.txt deleted file mode 100644 index 81fbaeeb74b..00000000000 --- a/res/cardsfolder/spitting_earth.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Spitting Earth -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ Spitting Earth deals damage equal to the number of Mountains you control to target creature. -SVar:X:Count$TypeYouCtrl.Mountain -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_earth.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/220.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/156.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/238.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/116.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/208.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/117.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_gourna.txt b/res/cardsfolder/spitting_gourna.txt deleted file mode 100644 index f8cf2fa6a13..00000000000 --- a/res/cardsfolder/spitting_gourna.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spitting Gourna -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:3/4 -K:Reach -K:Morph:4 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_gourna.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_hydra.txt b/res/cardsfolder/spitting_hydra.txt deleted file mode 100644 index d3a3d73bdb7..00000000000 --- a/res/cardsfolder/spitting_hydra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spitting Hydra -ManaCost:3 R R -Types:Creature Hydra -Text:no text -PT:0/0 -K:etbCounter:P1P1:4 -A:AB$ DealDamage | Cost$ 1 R SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$CARDNAME deals 1 damage to target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_hydra.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_image.txt b/res/cardsfolder/spitting_image.txt deleted file mode 100644 index 776b3d4432b..00000000000 --- a/res/cardsfolder/spitting_image.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spitting Image -ManaCost:4 GU GU -Types:Sorcery -Text:no text -A:SP$CopyPermanent | Cost$ 4 GU GU | Tgt$ TgtC | SpellDescription$ Put a token that's a copy of target creature onto the battlefield. -A:SP$CopyPermanent | Cost$ 4 GU GU Discard<1/Land> | ActivatingZone$ Graveyard | Tgt$ TgtC | CostDesc$ Retrace | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_image.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_sliver.txt b/res/cardsfolder/spitting_sliver.txt deleted file mode 100644 index 9d82688eadb..00000000000 --- a/res/cardsfolder/spitting_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spitting Sliver -ManaCost:4 B -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Creature.Sliver:0/0/First Strike:No Condition:All Sliver creatures have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitting_sliver.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spitting_spider.txt b/res/cardsfolder/spitting_spider.txt deleted file mode 100644 index 7b3c691ebb1..00000000000 --- a/res/cardsfolder/spitting_spider.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Spitting Spider -ManaCost:3 G G -Types:Creature Spider -Text:no text -PT:3/5 -K:Reach -A:AB$ DamageAll | Cost$ Sac<1/Land> | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidDescription$ each creature and with flying. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24666.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/280.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/splinter_twin.txt b/res/cardsfolder/splinter_twin.txt deleted file mode 100644 index 9f370319af8..00000000000 --- a/res/cardsfolder/splinter_twin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Splinter Twin -ManaCost:2 R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:0/0/SVar=ABCopy:no Condition: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." -SVar:ABCopy:AB$CopyPermanent | Cost$ T | Defined$ Self | Keywords$ Haste | AtEOT$ Exile | SpellDescription$ 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. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/splinter_twin.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/split_tail_miko.txt b/res/cardsfolder/split_tail_miko.txt deleted file mode 100644 index 3c19bc56658..00000000000 --- a/res/cardsfolder/split_tail_miko.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Split-Tail Miko -ManaCost:1 W -Types:Creature Fox Cleric -Text:no text -PT:1/1 -A:AB$ PreventDamage | Cost$ W T | Tgt$ TgtCP | Amount$ 2 | SpellDescription$ Prevent the next 2 damage that would be dealt to target creature or player this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/split_tail_miko.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/splitting_headache.txt b/res/cardsfolder/splitting_headache.txt deleted file mode 100644 index 298d7ebd7d7..00000000000 --- a/res/cardsfolder/splitting_headache.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Splitting Headache -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Choose one - Target player discards two cards; -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | NumCards$ 1 | Mode$ RevealYouChoose | SpellDescription$ or target player reveals his or her hand, you choose a card from it, then that player discards that card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/splitting_headache.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spoils_of_victory.txt b/res/cardsfolder/spoils_of_victory.txt deleted file mode 100644 index f292485c2c8..00000000000 --- a/res/cardsfolder/spoils_of_victory.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spoils of Victory -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Plains,Island,Swamp,Mountain,Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Plains, Island, Swamp, Mountain, or Forest card and put that card onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spoils_of_victory.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spontaneous_combustion.txt b/res/cardsfolder/spontaneous_combustion.txt deleted file mode 100644 index 4b753076d11..00000000000 --- a/res/cardsfolder/spontaneous_combustion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spontaneous Combustion -ManaCost:1 B R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 1 B R Sac<1/Creature> | NumDmg$ 3 | ValidCards$ Creature | ValidDescription$ each creature. | SpellDescription$ CARDNAME deals 3 damage to each creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spontaneous_combustion.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/348.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spontaneous_generation.txt b/res/cardsfolder/spontaneous_generation.txt deleted file mode 100644 index 1ba58c7bb60..00000000000 --- a/res/cardsfolder/spontaneous_generation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spontaneous Generation -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield for each card in your hand. -SVar:X:Count$InYourHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/spontaneous_generation.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spore_burst.txt b/res/cardsfolder/spore_burst.txt deleted file mode 100644 index debcffdac00..00000000000 --- a/res/cardsfolder/spore_burst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spore Burst -ManaCost:3 G -Types:Sorcery -Text:Domain - Put a 1/1 green Saproling creature token onto the battlefield for each basic land type among lands you control. -A:SP$ Token | Cost$ 3 G | TokenAmount$ X | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spore_burst.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spore_cloud.txt b/res/cardsfolder/spore_cloud.txt deleted file mode 100644 index e7bd312f917..00000000000 --- a/res/cardsfolder/spore_cloud.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spore Cloud -ManaCost:1 G G -Types:Instant -Text:no text -A:SP$ TapAll | Cost$ 1 G G | ValidCards$ Creature.blocking | SubAbility$ SVar=DBFog | SpellDescription$ 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. -SVar:DBFog:DB$Fog | SubAbility$ SVar=DBPumpAll -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.attacking,Creature.blocking | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spore_cloud.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/83.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/spore_flower.txt b/res/cardsfolder/spore_flower.txt deleted file mode 100644 index f06dd6215bd..00000000000 --- a/res/cardsfolder/spore_flower.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Spore Flower -ManaCost:G G -Types:Creature Fungus -Text:no text -PT:0/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Fog | Cost$ SubCounter<3/SPORE> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spore_flower.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spore_frog.txt b/res/cardsfolder/spore_frog.txt deleted file mode 100644 index d7fb791f085..00000000000 --- a/res/cardsfolder/spore_frog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spore Frog -ManaCost:G -Types:Creature Frog -Text:no text -PT:1/1 -A:AB$ Fog | Cost$ Sac<1/CARDNAME> | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spore_frog.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sporecap_spider.txt b/res/cardsfolder/sporecap_spider.txt deleted file mode 100644 index 28f947574b4..00000000000 --- a/res/cardsfolder/sporecap_spider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sporecap Spider -ManaCost:2 G -Types:Creature Spider -Text:no text -PT:1/5 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sporecap_spider.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sporesower_thallid.txt b/res/cardsfolder/sporesower_thallid.txt deleted file mode 100644 index cac5152e8af..00000000000 --- a/res/cardsfolder/sporesower_thallid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sporesower Thallid -ManaCost:2 G G -Types:Creature Fungus -Text:no text -PT:4/4 -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounters | TriggerDescription$ At the beginning of your upkeep, put a spore counter on each Fungus you control. -SVar:TrigCounters:AB$PutCounterAll | Cost$ 0 | ValidCards$ Fungus.YouCtrl | CounterType$ SPORE | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sporesower_thallid.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sporoloth_ancient.txt b/res/cardsfolder/sporoloth_ancient.txt deleted file mode 100644 index 3e1c975a7e7..00000000000 --- a/res/cardsfolder/sporoloth_ancient.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sporoloth Ancient -ManaCost:3 G G -Types:Creature Fungus -Text:no text -PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -K:stPumpAll:Creature.YouCtrl:0/0/SVar=MakeSaproling:no Condition:Creatures you control have "Remove two spore counters from this creature: Put a 1/1 green Saproling creature token onto the battlefield." -SVar:MakeSaproling:AB$Token | Cost$ SubCounter<2/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sporoloth_ancient.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spotted_griffin.txt b/res/cardsfolder/spotted_griffin.txt deleted file mode 100644 index 9a52a4fb32f..00000000000 --- a/res/cardsfolder/spotted_griffin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spotted Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/3 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4396.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/190.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spread_the_sickness.txt b/res/cardsfolder/spread_the_sickness.txt deleted file mode 100644 index 734b974794e..00000000000 --- a/res/cardsfolder/spread_the_sickness.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Spread the Sickness -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ SVar=DBProliferate | SpellDescription$ Destroy target creature, then proliferate. -SVar:DBProliferate:DB$Proliferate -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spread_the_sickness.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/56.jpg -End diff --git a/res/cardsfolder/spreading_seas.txt b/res/cardsfolder/spreading_seas.txt deleted file mode 100644 index 21a88346325..00000000000 --- a/res/cardsfolder/spreading_seas.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spreading Seas -ManaCost:1 U -Types:Enchantment Aura -Text:Enchanted land is an Island. -K:Enchant land -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spreading_seas.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spring_cleaning.txt b/res/cardsfolder/spring_cleaning.txt deleted file mode 100644 index 6e3f47874e7..00000000000 --- a/res/cardsfolder/spring_cleaning.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spring Cleaning -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Enchantment | SubAbility$ SVar=DBClash | SpellDescription$ Destroy target enchantment. Clash with an opponent. If you win, destroy all enchantments your opponents control. -SVar:DBClash:DB$Clash | WinSubAbility$ DBDestroyAll -SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Enchantment.YouDontCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spring_cleaning.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spring_of_eternal_peace.txt b/res/cardsfolder/spring_of_eternal_peace.txt deleted file mode 100644 index 8db12c97fbb..00000000000 --- a/res/cardsfolder/spring_of_eternal_peace.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Spring of Eternal Peace -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 3 G G | LifeAmount$ 8 | SpellDescription$ You gain 8 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spring_of_eternal_peace.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/springing_tiger.txt b/res/cardsfolder/springing_tiger.txt deleted file mode 100644 index df7ba9d4b9b..00000000000 --- a/res/cardsfolder/springing_tiger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Springing Tiger -ManaCost:3 G -Types:Creature Cat -Text:no text -PT:3/3 -K:stPumpSelf:Creature:2/2:Threshold:Threshold - Springing Tiger gets +2/+2 as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/springing_tiger.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/springjack_knight.txt b/res/cardsfolder/springjack_knight.txt deleted file mode 100644 index ba747b7b2c2..00000000000 --- a/res/cardsfolder/springjack_knight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Springjack Knight -ManaCost:2 W -Types:Creature Kithkin Knight -Text:no text -PT:2/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigClash | TriggerDescription$ Whenever CARDNAME attacks, clash with an opponent. If you win, target creature gains double strike until end of turn. -SVar:TrigClash:AB$Clash | Cost$ 0 | Tgt$ TgtC | WinSubAbility$ DBPump -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ Double Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/springjack_knight.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/springjack_shepherd.txt b/res/cardsfolder/springjack_shepherd.txt deleted file mode 100644 index cab8dace0f5..00000000000 --- a/res/cardsfolder/springjack_shepherd.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Springjack Shepherd -ManaCost:3 W -Types:Creature Kithkin Wizard -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Chroma - When CARDNAME 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Goat | TokenTypes$ Creature,Goat | TokenOwner$ You | TokenColors$ White | TokenPower$ 0 | TokenToughness$ 1 -SVar:X:Count$Chroma.W -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/springjack_shepherd.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/springleaf_drum.txt b/res/cardsfolder/springleaf_drum.txt deleted file mode 100644 index 7bba09d3740..00000000000 --- a/res/cardsfolder/springleaf_drum.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Springleaf Drum -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T tapXType<1/Creature> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/springleaf_drum.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/261.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprite_noble.txt b/res/cardsfolder/sprite_noble.txt deleted file mode 100644 index 2f933d19b27..00000000000 --- a/res/cardsfolder/sprite_noble.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sprite Noble -ManaCost:2 U -Types:Creature Faerie -Text:no text -PT:2/2 -K:Flying -K:stPumpAll:Creature.withFlying+YouCtrl:0/1:No Condition:Other creatures you control with flying get +0/+1. -A:AB$ PumpAll | Cost$ T | ValidCards$ Creature.withFlying+Other+YouCtrl | NumAtt$ +1 | SpellDescription$ Other creatures you control with flying get +1/+0 until end of turn. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprite_noble.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprout.txt b/res/cardsfolder/sprout.txt deleted file mode 100644 index 17c1b5eaf2b..00000000000 --- a/res/cardsfolder/sprout.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sprout -ManaCost:G -Types:Instant -Text:no text -A:SP$ Token | Cost$ G | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprout.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprout_swarm.txt b/res/cardsfolder/sprout_swarm.txt deleted file mode 100644 index abaeeb8bd3d..00000000000 --- a/res/cardsfolder/sprout_swarm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sprout Swarm -ManaCost:1 G -Types:Instant -Text:(NOTE: "Convoke" is not implemented.) -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprout_swarm.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprouting_phytohydra.txt b/res/cardsfolder/sprouting_phytohydra.txt deleted file mode 100644 index 0b4fae81dbe..00000000000 --- a/res/cardsfolder/sprouting_phytohydra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sprouting Phytohydra -ManaCost:4 G -Types:Creature Plant Hydra -Text:no text -PT:0/2 -K:Defender -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigCopy | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME is dealt damage, you may put a token that's a copy of CARDNAME onto the battlefield. -SVar:TrigCopy:AB$CopyPermanent | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprouting_phytohydra.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprouting_thrinax.txt b/res/cardsfolder/sprouting_thrinax.txt deleted file mode 100644 index dba3249842c..00000000000 --- a/res/cardsfolder/sprouting_thrinax.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sprouting Thrinax -ManaCost:B R G -Types:Creature Lizard -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put three 1/1 green Saproling creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 3 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprouting_thrinax.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sprouting_vines.txt b/res/cardsfolder/sprouting_vines.txt deleted file mode 100644 index 090f1724e6c..00000000000 --- a/res/cardsfolder/sprouting_vines.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sprouting Vines -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sprouting_vines.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spur_grappler.txt b/res/cardsfolder/spur_grappler.txt deleted file mode 100644 index d89a89dcf2a..00000000000 --- a/res/cardsfolder/spur_grappler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spur Grappler -ManaCost:2 R -Types:Creature Beast -Text:no text -PT:2/1 -K:stPumpSelf:Creature:2/1:isNotPresent Land.untapped+YouCtrl:Spur Grappler gets +2/+1 as long as you control no untapped lands. -SVar:BuffedBy:Spell -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spur_grappler.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spurnmage_advocate.txt b/res/cardsfolder/spurnmage_advocate.txt deleted file mode 100644 index b13464a642c..00000000000 --- a/res/cardsfolder/spurnmage_advocate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spurnmage Advocate -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T | ValidTgts$ Card.YouDontCtrl | TargetMin$ 2 | TargetMax$ 2 | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBDestroy | SpellDescription$ Return two target cards from an opponent's graveyard to his or her hand. Destroy target attacking creature. -SVar:DBDestroy:DB$Destroy | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/spurnmage_advocate.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/spurred_wolverine.txt b/res/cardsfolder/spurred_wolverine.txt deleted file mode 100644 index 058b33f57b3..00000000000 --- a/res/cardsfolder/spurred_wolverine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Spurred Wolverine -ManaCost:4 R -Types:Creature Wolverine Beast -Text:no text -PT:3/2 -A:AB$ Pump | Cost$ tapXType<2/Beast> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/spurred_wolverine.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/237.jpg -End diff --git a/res/cardsfolder/squadron_hawk.txt b/res/cardsfolder/squadron_hawk.txt deleted file mode 100644 index b06da70ab1a..00000000000 --- a/res/cardsfolder/squadron_hawk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Squadron Hawk -ManaCost:1 W -Types:Creature Hawk -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for up to three cards named CARDNAME, reveal them, and put them into your hand. If you do, shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedSquadron Hawk | ChangeNum$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/squadron_hawk.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squall.txt b/res/cardsfolder/squall.txt deleted file mode 100644 index d7de092f0fd..00000000000 --- a/res/cardsfolder/squall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Squall -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 G | NumDmg$ 2 | ValidCards$ Creature.withFlying | ValidDescription$ each creature with flying. | SpellDescription$ CARDNAME deals 2 damage to each creature with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/squall.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/143.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/275.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squall_drifter.txt b/res/cardsfolder/squall_drifter.txt deleted file mode 100644 index aeb226afe80..00000000000 --- a/res/cardsfolder/squall_drifter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Squall Drifter -ManaCost:1 W -Types:Snow Creature Elemental -Text:no text -PT:1/1 -K:Flying -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121273.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/17.jpg -End diff --git a/res/cardsfolder/squall_line.txt b/res/cardsfolder/squall_line.txt deleted file mode 100644 index 640cc98e644..00000000000 --- a/res/cardsfolder/squall_line.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squall Line -ManaCost:X G G -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ X G G | ValidCards$ Creature.withFlying | ValidPlayers$ Each | NumDmg$ X | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals X damage to each creature with flying and each player. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squall_line.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squallmonger.txt b/res/cardsfolder/squallmonger.txt deleted file mode 100755 index eb65077da63..00000000000 --- a/res/cardsfolder/squallmonger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Squallmonger -ManaCost:3 G -Types:Creature Monger -Text:no text -PT:3/3 -A:AB$ DamageAll | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | AnyPlayer$ True | ValidDescription$ each creature with flying and and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying and each player. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/squallmonger.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squandered_resources.txt b/res/cardsfolder/squandered_resources.txt deleted file mode 100644 index 8ee90fe2a9d..00000000000 --- a/res/cardsfolder/squandered_resources.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squandered Resources -ManaCost:B G -Types:Enchantment -Text:no text -A:AB$ ManaReflected | Cost$ Sac<1/Land> | ColorOrType$ Type | Valid$ Defined.Sacrificed | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any type the sacrificed land could produce. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squandered_resources.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squeaking_pie_grubfellows.txt b/res/cardsfolder/squeaking_pie_grubfellows.txt deleted file mode 100644 index 9ec3b398fec..00000000000 --- a/res/cardsfolder/squeaking_pie_grubfellows.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squeaking Pie Grubfellows -ManaCost:3 B -Types:Creature Goblin Shaman -Text: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. -PT:3/2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/squeaking_pie_grubfellows.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squee_goblin_nabob.txt b/res/cardsfolder/squee_goblin_nabob.txt deleted file mode 100644 index 7caf4cf8651..00000000000 --- a/res/cardsfolder/squee_goblin_nabob.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Squee, Goblin Nabob -ManaCost:2 R -Types:Legendary Creature Goblin -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, you may return CARDNAME from your graveyard to your hand. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:SacMe:2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squee_goblin_nabob.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/214.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squees_embrace.txt b/res/cardsfolder/squees_embrace.txt deleted file mode 100644 index 22bce083c4f..00000000000 --- a/res/cardsfolder/squees_embrace.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Squee's Embrace -ManaCost:R W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2:Enchanted creature gets +2/+2. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChange | TriggerDescription$ When enchanted creature is put into a graveyard from the battlefield, return that card to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ TriggeredCard | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/squees_embrace.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squees_toy.txt b/res/cardsfolder/squees_toy.txt deleted file mode 100644 index 8d03d0399ef..00000000000 --- a/res/cardsfolder/squees_toy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Squee's Toy -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ PreventDamage | Cost$ T | ValidTgts$ Creature | Amount$ 1 | TgtPrompt$ Select target creature | SpellDescription$ Prevent the next 1 damage that would be dealt to target creature this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/squees_toy.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squeeze.txt b/res/cardsfolder/squeeze.txt deleted file mode 100644 index eb8e1a6e8bd..00000000000 --- a/res/cardsfolder/squeeze.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squeeze -ManaCost:3 U -Types:Enchantment -Text:Sorcery spells cost 3 more to cast. -K:CostChange:All:More:3:Spell:All:Sorcery:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squeeze.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squelch.txt b/res/cardsfolder/squelch.txt deleted file mode 100644 index 226dfe094c2..00000000000 --- a/res/cardsfolder/squelch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squelch -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TgtPrompt$ Select target Activated Ability | ValidTgts$ Card | TargetType$ Activated | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target activated ability. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/squelch.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squire.txt b/res/cardsfolder/squire.txt deleted file mode 100644 index c6bfdcfb715..00000000000 --- a/res/cardsfolder/squire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squire -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108908.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/90.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squirming_mass.txt b/res/cardsfolder/squirming_mass.txt deleted file mode 100644 index de75debf0a9..00000000000 --- a/res/cardsfolder/squirming_mass.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Squirming Mass -ManaCost:1 B -Types:Creature Horror -Text:no text -PT:1/1 -K:Fear -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card15170.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squirrel_mob.txt b/res/cardsfolder/squirrel_mob.txt deleted file mode 100644 index f62bdeb5113..00000000000 --- a/res/cardsfolder/squirrel_mob.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Squirrel Mob -ManaCost:1 G G -Types:Creature Squirrel -Text:no text -PT:2/2 -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +1/+1 for each other Squirrel on the battlefield. -SVar:X:Count$Valid Squirrel.Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squirrel_mob.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squirrel_nest.txt b/res/cardsfolder/squirrel_nest.txt deleted file mode 100644 index d9099040dd7..00000000000 --- a/res/cardsfolder/squirrel_nest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Squirrel Nest -ManaCost:1 G G -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpAll:Card.AttachedBy:0/0/SVar=Token:no Condition:Enchanted land has "Tap: Put a 1/1 green Squirrel creature token onto the battlefield.". -SVar:Token:AB$Token | Cost$ T | TokenAmount$ 1 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | SpellDescription$ Put a 1/1 green Squirrel creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/squirrel_nest.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/squirrel_wrangler.txt b/res/cardsfolder/squirrel_wrangler.txt deleted file mode 100644 index 601a2394689..00000000000 --- a/res/cardsfolder/squirrel_wrangler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Squirrel Wrangler -ManaCost:2 G G -Types:Creature Human Druid -Text:no text -PT:2/2 -A:AB$ Token | Cost$ 1 G Sac<1/Land> | TokenAmount$ 2 | TokenName$ Squirrel | TokenTypes$ Creature,Squirrel | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 green Squirrel creature tokens onto the battlefield. -A:AB$ PumpAll | Cost$ 1 G Sac<1/Land> | ValidCards$ Creature.Squirrel | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Squirrel creatures get +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/squirrel_wrangler.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stabbing_pain.txt b/res/cardsfolder/stabbing_pain.txt deleted file mode 100644 index 9394c74f659..00000000000 --- a/res/cardsfolder/stabbing_pain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stabbing Pain -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SubAbility$ SVar=DBTap | SpellDescription$ Target creature gets -1/-1 until end of turn. Tap that creature. -SVar:DBTap:DB$Tap | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stabbing_pain.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/118.jpg -End diff --git a/res/cardsfolder/stabilizer.txt b/res/cardsfolder/stabilizer.txt deleted file mode 100644 index 80b4bd003b9..00000000000 --- a/res/cardsfolder/stabilizer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stabilizer -ManaCost:2 -Types:Artifact -Text:Players can't cycle cards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stabilizer.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/staff_of_domination.txt b/res/cardsfolder/staff_of_domination.txt deleted file mode 100644 index a5a95dbfaef..00000000000 --- a/res/cardsfolder/staff_of_domination.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Staff of Domination -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ 1 | SpellDescription$ Untap CARDNAME. -A:AB$ GainLife | Cost$ 2 T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -A:AB$ Untap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Untap target creature. -A:AB$ Tap | Cost$ 4 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -A:AB$ Draw | Cost$ 5 T | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_domination.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/156.jpg -End diff --git a/res/cardsfolder/staff_of_the_ages.txt b/res/cardsfolder/staff_of_the_ages.txt deleted file mode 100644 index 886d2e3d801..00000000000 --- a/res/cardsfolder/staff_of_the_ages.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Staff of the Ages -ManaCost:3 -Types:Artifact -Text:Creatures with landwalk abilities can be blocked as though they didn't have those abilities. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_the_ages.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/staff_of_zegon.txt b/res/cardsfolder/staff_of_zegon.txt deleted file mode 100644 index c1a7a24cb23..00000000000 --- a/res/cardsfolder/staff_of_zegon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Staff of Zegon -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -2 | IsCurse$ True | SpellDescription$ Target creature gets -2/-0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/staff_of_zegon.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stag_beetle.txt b/res/cardsfolder/stag_beetle.txt deleted file mode 100644 index 6aba35380dc..00000000000 --- a/res/cardsfolder/stag_beetle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stag Beetle -ManaCost:3 G G -Types:Creature Insect -Text:no text -PT:0/0 -K:etbCounter:P1P1:X -SVar:X:Count$Valid Creature.Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stag_beetle.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stalker_hag.txt b/res/cardsfolder/stalker_hag.txt deleted file mode 100644 index 2f31427a6c8..00000000000 --- a/res/cardsfolder/stalker_hag.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stalker Hag -ManaCost:BG BG BG -Types:Creature Hag -Text:no text -PT:3/2 -K:Swampwalk -K:Forestwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalker_hag.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stalking_assassin.txt b/res/cardsfolder/stalking_assassin.txt deleted file mode 100644 index fabc190c91e..00000000000 --- a/res/cardsfolder/stalking_assassin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stalking Assassin -ManaCost:1 U B -Types:Creature Human Assassin -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ 3 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -A:AB$ Destroy | Cost$ 3 B T | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | SpellDescription$ Destroy target tapped creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_assassin.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/277.jpg -End diff --git a/res/cardsfolder/stalking_bloodsucker.txt b/res/cardsfolder/stalking_bloodsucker.txt deleted file mode 100644 index 09a4bce2879..00000000000 --- a/res/cardsfolder/stalking_bloodsucker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stalking Bloodsucker -ManaCost:4 B B -Types:Creature Vampire -Text:no text -PT:4/4 -K:Flying -A:AB$ Pump | Cost$ 1 B Discard<1/Card> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Stalking Bloodsucker gets +2/+2 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_bloodsucker.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/163.jpg -End diff --git a/res/cardsfolder/stalking_stones.txt b/res/cardsfolder/stalking_stones.txt deleted file mode 100644 index f1626166613..00000000000 --- a/res/cardsfolder/stalking_stones.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stalking Stones -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 6 | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Artifact,Elemental | Permanent$ True | SpellDescription$ CARDNAME becomes a 3/3 Elemental artifact creature that's still a land. (This effect lasts indefinitely.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_stones.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/284.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/333.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stalking_tiger.txt b/res/cardsfolder/stalking_tiger.txt deleted file mode 100644 index eb8a45afe14..00000000000 --- a/res/cardsfolder/stalking_tiger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stalking Tiger -ManaCost:3 G -Types:Creature Cat -Text:no text -PT:3/3 -K:CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_tiger.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/149.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/253.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/141.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/112.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stalking_vengeance.txt b/res/cardsfolder/stalking_vengeance.txt deleted file mode 100644 index 25954b6ea67..00000000000 --- a/res/cardsfolder/stalking_vengeance.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stalking Vengeance -ManaCost:5 R R -Types:Creature Avatar -Text:no text -PT:5/5 -K:Haste -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever another creature you control is put into a graveyard from the battlefield, it deals damage equal to its power to target player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | NumDmg$ X -SVar:X:TriggeredCard$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_vengeance.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stalwart_shield_bearers.txt b/res/cardsfolder/stalwart_shield_bearers.txt deleted file mode 100644 index e74b68173ba..00000000000 --- a/res/cardsfolder/stalwart_shield_bearers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stalwart Shield-Bearers -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:0/3 -K:Defender -K:stPumpAll:Creature.withDefender+Other+YouCtrl:0/2:No Condition:Other creatures you control with defender get +0/+2. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stalwart_shield_bearers.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stampede.txt b/res/cardsfolder/stampede.txt deleted file mode 100644 index 481c808e9cc..00000000000 --- a/res/cardsfolder/stampede.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stampede -ManaCost:1 G G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 G G | ValidCards$ Creature.attacking | NumAtt$ +1 | KW$ Trample | SpellDescription$ Attacking creatures get +1/+0 and gain trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stampede.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/189.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stampede_driver.txt b/res/cardsfolder/stampede_driver.txt deleted file mode 100644 index 2bdc767d0df..00000000000 --- a/res/cardsfolder/stampede_driver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stampede Driver -ManaCost:G -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ PumpAll | Cost$ 1 G T Discard<1/Card> | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Trample | SpellDescription$ Creatures you control get +1/+1 and gain trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stampede_driver.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stampeding_rhino.txt b/res/cardsfolder/stampeding_rhino.txt deleted file mode 100644 index c02d5cf2abb..00000000000 --- a/res/cardsfolder/stampeding_rhino.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stampeding Rhino -ManaCost:4 G -Types:Creature Rhino -Text:no text -PT:4/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stampeding_rhino.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stampeding_serow.txt b/res/cardsfolder/stampeding_serow.txt deleted file mode 100644 index 19cf2aa85f9..00000000000 --- a/res/cardsfolder/stampeding_serow.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stampeding Serow -ManaCost:2 G G -Types:Creature Antelope Beast -Text:no text -PT:5/4 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a green creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | ChangeType$ Creature.Green+YouCtrl | ChangeNum$ 1 | Mandatory$ True | Hidden$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stampeding_serow.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stampeding_wildebeests.txt b/res/cardsfolder/stampeding_wildebeests.txt deleted file mode 100644 index 87384842319..00000000000 --- a/res/cardsfolder/stampeding_wildebeests.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stampeding Wildebeests -ManaCost:2 G G -Types:Creature Antelope Beast -Text:no text -PT:5/4 -K:Trample -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ At the beginning of your upkeep, return a green creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ChangeType$ Creature.Green+YouCtrl | ChangeNum$ 1 | Origin$ Battlefield | Destination$ Hand | Mandatory$ True | Hidden$ True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stampeding_wildebeests.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/71.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stand_firm.txt b/res/cardsfolder/stand_firm.txt deleted file mode 100644 index df9bbe9f386..00000000000 --- a/res/cardsfolder/stand_firm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stand Firm -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 1 | NumDef$ 1 | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stand_firm.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/standing_stones.txt b/res/cardsfolder/standing_stones.txt deleted file mode 100644 index 813683b4006..00000000000 --- a/res/cardsfolder/standing_stones.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Standing Stones -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/standing_stones.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/standing_troops.txt b/res/cardsfolder/standing_troops.txt deleted file mode 100644 index 3a5ae72a46f..00000000000 --- a/res/cardsfolder/standing_troops.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Standing Troops -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:1/4 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/standing_troops.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/48.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/22.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/44.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/standstill.txt b/res/cardsfolder/standstill.txt deleted file mode 100644 index f774ac54180..00000000000 --- a/res/cardsfolder/standstill.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Standstill -ManaCost:1 U -Types:Enchantment -Text:When a player casts a spell, sacrifice CARDNAME. If you do, each of that player's opponents draws three cards. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/standstill.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stangg.txt b/res/cardsfolder/stangg.txt deleted file mode 100644 index d3c565256ec..00000000000 --- a/res/cardsfolder/stangg.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stangg -ManaCost:4 R G -Types:Legendary Creature Human Warrior -Text: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. When Stangg leaves the battlefield, exile that token. When that token leaves the battlefield, sacrifice Stangg. -PT:3/4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stangg.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/star_compass.txt b/res/cardsfolder/star_compass.txt deleted file mode 100644 index 5de0ace424b..00000000000 --- a/res/cardsfolder/star_compass.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Star Compass -ManaCost:2 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Basic.YouCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color a basic land you control could produce. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/star_compass.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/315.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/starlight.txt b/res/cardsfolder/starlight.txt deleted file mode 100644 index 82c522fc631..00000000000 --- a/res/cardsfolder/starlight.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Starlight -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ X | SpellDescription$ You gain 3 life for each black creature target opponent controls. -SVar:X:Count$BlackTypeOppCtrl.Creature/Times.3 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/starlight.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/191.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/49.jpg -End diff --git a/res/cardsfolder/starlight_invoker.txt b/res/cardsfolder/starlight_invoker.txt deleted file mode 100644 index cacb96c4e2d..00000000000 --- a/res/cardsfolder/starlight_invoker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Starlight Invoker -ManaCost:1 W -Types:Creature Human Cleric Mutant -Text:no text -PT:1/3 -A:AB$ GainLife | Cost$ 7 W | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/starlight_invoker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/20.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/47.jpg -End diff --git a/res/cardsfolder/starlit_angel.txt b/res/cardsfolder/starlit_angel.txt deleted file mode 100644 index 7f1043c2415..00000000000 --- a/res/cardsfolder/starlit_angel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Starlit Angel -ManaCost:3 W W -Types:Creature Angel -Text:no text -PT:3/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4398.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/starlit_sanctum.txt b/res/cardsfolder/starlit_sanctum.txt deleted file mode 100644 index ac67a47652d..00000000000 --- a/res/cardsfolder/starlit_sanctum.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Starlit Sanctum -ManaCost:no cost -Types:Land -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ GainLife | Cost$ W T Sac<1/Creature.cleric> | LifeAmount$ X | CostDesc$ W, T, Sacrifice a Cleric creature: | SpellDescription$ You gain life equal to the sacrificed creature's toughness. -SVar:X:Sacrificed$CardToughness -A:AB$ LoseLife | Cost$ B T Sac<1/Creature.cleric> | ValidTgts$ Player | LifeAmount$ X | TgtPrompt$ Select a player | CostDesc$ B, T, Sacrifice a Cleric creature: | SpellDescription$ Target player loses life equal to the sacrificed creature's power. -SVar:X:Sacrificed$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/starlit_sanctum.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/starstorm.txt b/res/cardsfolder/starstorm.txt deleted file mode 100644 index cf85cf22f34..00000000000 --- a/res/cardsfolder/starstorm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Starstorm -ManaCost:X R R -Types:Instant -Text:no text -K:Cycling:3 -A:SP$ DamageAll | Cost$ X R R | ValidCards$ Creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/starstorm.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/starved_rusalka.txt b/res/cardsfolder/starved_rusalka.txt deleted file mode 100644 index fce6fd2c3b5..00000000000 --- a/res/cardsfolder/starved_rusalka.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Starved Rusalka -ManaCost:G -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ G Sac<1/Creature> | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/starved_rusalka.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stasis.txt b/res/cardsfolder/stasis.txt deleted file mode 100644 index b86b969a85b..00000000000 --- a/res/cardsfolder/stasis.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Stasis -ManaCost:1 U -Types:Enchantment -Text:Players skip their untap steps. -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stasis.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/81.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/81.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/127.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/104.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/83.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/statecraft.txt b/res/cardsfolder/statecraft.txt deleted file mode 100644 index f07f2df8ac1..00000000000 --- a/res/cardsfolder/statecraft.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Statecraft -ManaCost:3 U -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN Prevent all combat damage that would be dealt to and dealt by CARDNAME.:No Condition:Prevent all combat damage that would be dealt to and dealt by creatures you control. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/statecraft.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/staunch_defenders.txt b/res/cardsfolder/staunch_defenders.txt deleted file mode 100644 index 444147bc706..00000000000 --- a/res/cardsfolder/staunch_defenders.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Staunch Defenders -ManaCost:3 W W -Types:Creature Human Soldier -Text:no text -PT:3/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/staunch_defenders.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/49.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/261.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/45.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steadfast_guard.txt b/res/cardsfolder/steadfast_guard.txt deleted file mode 100644 index a11e87f33b7..00000000000 --- a/res/cardsfolder/steadfast_guard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steadfast Guard -ManaCost:W W -Types:Creature Human Rebel -Text:no text -PT:2/2 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card132111.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/50.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steadfastness.txt b/res/cardsfolder/steadfastness.txt deleted file mode 100644 index d0842dd15a5..00000000000 --- a/res/cardsfolder/steadfastness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steadfastness -ManaCost:1 W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumDef$ +3 | SpellDescription$ Creatures you control get +0/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/steadfastness.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/27.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steady_progress.txt b/res/cardsfolder/steady_progress.txt deleted file mode 100644 index 8dd99d2ce0c..00000000000 --- a/res/cardsfolder/steady_progress.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steady Progress -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Proliferate | Cost$ 2 U | SpellDescription$ Proliferate. Draw a card. | SubAbility$ SVar=DB -SVar:DB:DB$Draw | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steady_progress.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steal_artifact.txt b/res/cardsfolder/steal_artifact.txt deleted file mode 100644 index d594102fb2f..00000000000 --- a/res/cardsfolder/steal_artifact.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Steal Artifact -ManaCost:2 U U -Types:Enchantment Aura -Text:You control enchanted artifact. -K:Enchant artifact -K:enControlArtifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/steal_artifact.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/103.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/82.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/82.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/99.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/128.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/105.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/84.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steam_blast.txt b/res/cardsfolder/steam_blast.txt deleted file mode 100644 index b74a29d9723..00000000000 --- a/res/cardsfolder/steam_blast.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Steam Blast -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 2 R | NumDmg$ 2 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/steam_blast.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steam_catapult.txt b/res/cardsfolder/steam_catapult.txt deleted file mode 100644 index c009d72dce1..00000000000 --- a/res/cardsfolder/steam_catapult.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steam Catapult -ManaCost:3 W W -Types:Creature Human Soldier -Text:no text -PT:2/3 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Destroy target tapped creature. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/steam_catapult.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steam_frigate.txt b/res/cardsfolder/steam_frigate.txt deleted file mode 100644 index 4ea83ef4fb0..00000000000 --- a/res/cardsfolder/steam_frigate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steam Frigate -ManaCost:2 U -Types:Creature Human Pirate -Text:no text -PT:3/3 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steam_frigate.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steam_spitter.txt b/res/cardsfolder/steam_spitter.txt deleted file mode 100644 index 7b4c997e59c..00000000000 --- a/res/cardsfolder/steam_spitter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steam Spitter -ManaCost:4 G -Types:Creature Spider -Text:no text -PT:1/5 -K:Reach -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/steam_spitter.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/124.jpg -End diff --git a/res/cardsfolder/steam_vents.txt b/res/cardsfolder/steam_vents.txt deleted file mode 100644 index 03aa2689940..00000000000 --- a/res/cardsfolder/steam_vents.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Steam Vents -ManaCost:no cost -Types:Land Island Mountain -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96923.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steamclaw.txt b/res/cardsfolder/steamclaw.txt deleted file mode 100644 index f4e283e5c71..00000000000 --- a/res/cardsfolder/steamclaw.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steamclaw -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 3 T | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/steamclaw.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steel_leaf_paladin.txt b/res/cardsfolder/steel_leaf_paladin.txt deleted file mode 100644 index 32acc779b56..00000000000 --- a/res/cardsfolder/steel_leaf_paladin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Steel Leaf Paladin -ManaCost:4 G W -Types:Creature Elf Knight -Text:no text -PT:4/4 -K:First Strike -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a green or white creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.White+YouCtrl,Creature.Green+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steel_leaf_paladin.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steel_of_the_godhead.txt b/res/cardsfolder/steel_of_the_godhead.txt deleted file mode 100644 index ffefeed3cd2..00000000000 --- a/res/cardsfolder/steel_of_the_godhead.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Steel of the Godhead -ManaCost:2 WU -Types:Enchantment Aura -Text:no text -K:Enchant Creature -K:stPumpEnchanted:Creature.White:1/1/Lifelink:No Condition:As long as enchanted creature is white, it gets +1/+1 and has lifelink -K:stPumpEnchanted:Creature.Blue:1/1/HIDDEN Unblockable:No Condition:As long as enchanted creature is blue, it gets +1/+1 and is unblockable. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steel_of_the_godhead.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steel_overseer.txt b/res/cardsfolder/steel_overseer.txt deleted file mode 100644 index 181cde0bfb6..00000000000 --- a/res/cardsfolder/steel_overseer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steel Overseer -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -A:AB$ PutCounterAll | Cost$ T | ValidCards$ Artifact.Creature+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each artifact creature you control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/steel_overseer.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steel_sabotage.txt b/res/cardsfolder/steel_sabotage.txt deleted file mode 100644 index 3d0619b4ac2..00000000000 --- a/res/cardsfolder/steel_sabotage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steel Sabotage -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target Artifact spell | ValidTgts$ Artifact | PrecostDesc$ Choose one - | SpellDescription$ Counter target artifact spell; -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Origin$ Battlefield | Destination$ Hand | SpellDescription$ or return target artifact to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steel_sabotage.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steel_wall.txt b/res/cardsfolder/steel_wall.txt deleted file mode 100644 index a44b12d2e06..00000000000 --- a/res/cardsfolder/steel_wall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steel Wall -ManaCost:1 -Types:Artifact Creature Wall -Text:no text -PT:0/4 -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card48910.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steelclad_serpent.txt b/res/cardsfolder/steelclad_serpent.txt deleted file mode 100644 index 4968edae211..00000000000 --- a/res/cardsfolder/steelclad_serpent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steelclad Serpent -ManaCost:5 U -Types:Artifact Creature Serpent -Text:no text -PT:4/5 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack.:isNotPresent Artifact.Other+YouCtrl:Steelclad Serpent can't attack unless you control another artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steelclad_serpent.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steelshaper_apprentice.txt b/res/cardsfolder/steelshaper_apprentice.txt deleted file mode 100644 index 3ee52e8f444..00000000000 --- a/res/cardsfolder/steelshaper_apprentice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steelshaper Apprentice -ManaCost:2 W W -Types:Creature Human Soldier -Text:no text -PT:1/3 -A:AB$ ChangeZone | Cost$ W T Return<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Equipment | ChangeNum$ 1 | SpellDescription$ Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/steelshaper_apprentice.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/15.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steelshapers_gift.txt b/res/cardsfolder/steelshapers_gift.txt deleted file mode 100644 index 688a8901f4f..00000000000 --- a/res/cardsfolder/steelshapers_gift.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Steelshaper's Gift -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Hand | ChangeType$ Equipment | ChangeNum$ 1 | SpellDescription$ Search your library for an Equipment card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/steelshapers_gift.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steely_resolve.txt b/res/cardsfolder/steely_resolve.txt deleted file mode 100644 index b9192ff60d6..00000000000 --- a/res/cardsfolder/steely_resolve.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Steely Resolve -ManaCost:1 G -Types:Enchantment -Text:As CARDNAME enters the battlefield, choose a creature type. -K:stPumpAll:Creature.ChosenType:0/0/Shroud:No Condition:Creatures of the chosen type have shroud. (They can't be the targets of spells or abilities.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/steely_resolve.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stench_of_decay.txt b/res/cardsfolder/stench_of_decay.txt deleted file mode 100644 index 9f37dab1552..00000000000 --- a/res/cardsfolder/stench_of_decay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stench of Decay -ManaCost:1 B B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 B B | ValidCards$ Creature.nonArtifact | IsCurse$ True | NumAtt$ -1 | NumDef$ -1 | SpellDescription$ Nonartifact creatures get -1/-1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stench_of_decay.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/27.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/stenchskipper.txt b/res/cardsfolder/stenchskipper.txt deleted file mode 100644 index dd3f5a85069..00000000000 --- a/res/cardsfolder/stenchskipper.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stenchskipper -ManaCost:3 B -Types:Creature Elemental -Text:no text -PT:6/5 -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Goblin.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no Goblins, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | ConditionPresent$ Goblin.YouCtrl | ConditionCompare$ EQ0 -SVar:RemRandomDeck:True -SVar:NeedsToPlay:Goblin.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stenchskipper.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steppe_lynx.txt b/res/cardsfolder/steppe_lynx.txt deleted file mode 100644 index 16be891475d..00000000000 --- a/res/cardsfolder/steppe_lynx.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Steppe Lynx -ManaCost:W -Types:Creature Cat -Text:no text -PT:0/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steppe_lynx.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sterling_grove.txt b/res/cardsfolder/sterling_grove.txt deleted file mode 100644 index bb0040fe782..00000000000 --- a/res/cardsfolder/sterling_grove.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sterling Grove -ManaCost:W G -Types:Enchantment -Text:no text -K:stPumpAll:Enchantment.Other+YouCtrl:0/0/Shroud:No Condition:Other enchantments you control have shroud. (They can't be the targets of spells or abilities.) -A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Library | Destination$ Library | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sterling_grove.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stern_judge.txt b/res/cardsfolder/stern_judge.txt deleted file mode 100644 index c42ed378d70..00000000000 --- a/res/cardsfolder/stern_judge.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stern Judge -ManaCost:2 W -Types:Creature Cleric -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ T | Defined$ Opponent | LifeAmount$ X | SubAbility$ SVar=DBLoseLife | SpellDescription$ Each player loses 1 life for each Swamp he or she controls. -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ Y -SVar:X:Count$TypeOppCtrl.Swamp -SVar:Y:Count$TypeYouCtrl.Swamp -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tor/en-us/card35082.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stern_marshal.txt b/res/cardsfolder/stern_marshal.txt deleted file mode 100644 index ec5850657bb..00000000000 --- a/res/cardsfolder/stern_marshal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stern Marshal -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ T | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Target creature gets +2/+2 until end of turn. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4400.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stern_proctor.txt b/res/cardsfolder/stern_proctor.txt deleted file mode 100644 index e5a4a1009d6..00000000000 --- a/res/cardsfolder/stern_proctor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stern Proctor -ManaCost:U U -Types:Creature Human Wizard -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target artifact or enchantment to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Stern_Proctor.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/steward_of_valeron.txt b/res/cardsfolder/steward_of_valeron.txt deleted file mode 100644 index 5b67df185e9..00000000000 --- a/res/cardsfolder/steward_of_valeron.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Steward of Valeron -ManaCost:G W -Types:Creature Human Druid Knight -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/steward_of_valeron.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stifle.txt b/res/cardsfolder/stifle.txt deleted file mode 100644 index b60a89c2588..00000000000 --- a/res/cardsfolder/stifle.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stifle -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TgtPrompt$ Select target Activated or Triggered Ability | ValidTgts$ Card | TargetType$ Activated,Triggered | SpellDescription$ Counter target activated or triggered ability. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stifle.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/still_life.txt b/res/cardsfolder/still_life.txt deleted file mode 100644 index c86716e5366..00000000000 --- a/res/cardsfolder/still_life.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Still Life -ManaCost:1 G G -Types:Enchantment -Text:no text -A:AB$ Animate | Cost$ G G | Defined$ Self | Power$ 4 | Toughness$ 3 | Types$ Creature,Centaur | SpellDescription$ CARDNAME becomes a 4/3 Centaur creature until end of turn. It's still an enchantment. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/still_life.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stillmoon_cavalier.txt b/res/cardsfolder/stillmoon_cavalier.txt deleted file mode 100644 index 19e51dbc682..00000000000 --- a/res/cardsfolder/stillmoon_cavalier.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stillmoon Cavalier -ManaCost:1 WB WB -Types:Creature Zombie Knight -Text:no text -PT:2/1 -K:Protection from white -K:Protection from black -A:AB$ Pump | Cost$ WB | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ WB | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -A:AB$ Pump | Cost$ WB WB | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stillmoon_cavalier.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/95.jpg -End diff --git a/res/cardsfolder/stinging_barrier.txt b/res/cardsfolder/stinging_barrier.txt deleted file mode 100644 index 6603ba4f46e..00000000000 --- a/res/cardsfolder/stinging_barrier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stinging Barrier -ManaCost:2 U U -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ DealDamage | Cost$ U T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stinging_barrier.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stingscourger.txt b/res/cardsfolder/stingscourger.txt deleted file mode 100644 index 29b3cd9d37c..00000000000 --- a/res/cardsfolder/stingscourger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stingscourger -ManaCost:1 R -Types:Creature Goblin Warrior -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target creature an opponent controls to its owner's hand. -SVar:TrigChangeZone:DB$ChangeZone | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature an opponent controls | Origin$ Battlefield | Destination$ Hand -K:Echo:3 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stingscourger.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stinkdrinker_daredevil.txt b/res/cardsfolder/stinkdrinker_daredevil.txt deleted file mode 100644 index a1507eb3978..00000000000 --- a/res/cardsfolder/stinkdrinker_daredevil.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stinkdrinker Daredevil -ManaCost:2 R -Types:Creature Goblin Rogue -Text:Giant spells you cast cost 2 less to cast. -PT:1/3 -K:CostChange:Player:Less:2:Spell:All:Giant:NoSpecial -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stinkdrinker_daredevil.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stinkweed_imp.txt b/res/cardsfolder/stinkweed_imp.txt deleted file mode 100644 index b16408522d8..00000000000 --- a/res/cardsfolder/stinkweed_imp.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stinkweed Imp -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:1/2 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -K:Dredge 5 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stinkweed_imp.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stir_the_grave.txt b/res/cardsfolder/stir_the_grave.txt deleted file mode 100644 index ac9589825e8..00000000000 --- a/res/cardsfolder/stir_the_grave.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stir the Grave -ManaCost:X B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ X B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card with converted mana cost X or less from your graveyard to the battlefield. -SVar:X:Targeted$CardManaCost -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stir_the_grave.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stirring_wildwood.txt b/res/cardsfolder/stirring_wildwood.txt deleted file mode 100644 index 67e66535745..00000000000 --- a/res/cardsfolder/stirring_wildwood.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stirring Wildwood -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Animate | Cost$ 1 G W | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Elemental | Keywords$ Reach | Colors$ Green,White | SpellDescription$ Until end of turn, CARDNAME becomes a 3/4 green and white Elemental creature with reach. It's still a land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stirring_wildwood.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stitch_in_time.txt b/res/cardsfolder/stitch_in_time.txt deleted file mode 100644 index d2c306f35bd..00000000000 --- a/res/cardsfolder/stitch_in_time.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stitch in Time -ManaCost:1 U R -Types:Sorcery -Text:no text -A:SP$ FlipACoin | Cost$ 1 U R | WinSubAbility$ DBAddTurn | SpellDescription$ Flip a coin. If you win the flip, take an extra turn after this one. -SVar:DBAddTurn:DB$AddTurn | Defined$ You | NumTurns$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stitch_in_time.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stitch_together.txt b/res/cardsfolder/stitch_together.txt deleted file mode 100644 index b71cc45fc0c..00000000000 --- a/res/cardsfolder/stitch_together.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Stitch Together -ManaCost:B B -Types:Sorcery -Text:Return target creature card from your graveyard to your hand.\r\nThreshold - Return that card from your graveyard to the battlefield instead if seven or more cards are in your graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stitch_together.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stoic_angel.txt b/res/cardsfolder/stoic_angel.txt deleted file mode 100644 index 70ab43c5053..00000000000 --- a/res/cardsfolder/stoic_angel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stoic Angel -ManaCost:1 G W U -Types:Creature Angel -Text:Players can't untap more than one creature during their untap steps. -PT:3/4 -K:Flying -K:Vigilance -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_angel.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stoic_champion.txt b/res/cardsfolder/stoic_champion.txt deleted file mode 100644 index dbae8847fd4..00000000000 --- a/res/cardsfolder/stoic_champion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stoic Champion -ManaCost:W W -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_champion.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/21.jpg -End diff --git a/res/cardsfolder/stoic_ephemera.txt b/res/cardsfolder/stoic_ephemera.txt deleted file mode 100644 index 2face951a54..00000000000 --- a/res/cardsfolder/stoic_ephemera.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stoic Ephemera -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:5/5 -K:Defender -K:Flying -T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Opponent | IsPresent$ Card.blocking+Self | PresentZone$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME blocks, sacrifice it at end of combat. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_ephemera.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stoic_rebuttal.txt b/res/cardsfolder/stoic_rebuttal.txt deleted file mode 100644 index a8f2860ab35..00000000000 --- a/res/cardsfolder/stoic_rebuttal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stoic Rebuttal -ManaCost:1 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | IsPresent$ Artifact.YouCtrl | PresentCompare$ LT3 | SpellDescription$ Counter target spell. -A:SP$ Counter | Cost$ U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | CostDesc$ Metalcraft - | SpellDescription$ CARDNAME costs 1 less to cast if you control 3 or more artifacts. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_rebuttal.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stolen_grain.txt b/res/cardsfolder/stolen_grain.txt deleted file mode 100644 index 366a4a452bf..00000000000 --- a/res/cardsfolder/stolen_grain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stolen Grain -ManaCost:4 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 4 B B | ValidTgts$ Opponent | NumDmg$ 5 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 5 damage to target opponent. You gain 5 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 5 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stolen_grain.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stomp_and_howl.txt b/res/cardsfolder/stomp_and_howl.txt deleted file mode 100644 index 64f6ca42b6d..00000000000 --- a/res/cardsfolder/stomp_and_howl.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stomp and Howl -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact and target enchantment. | SubAbility$ SVar=DestroyEnch -SVar:DestroyEnch:DB$ Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stomp_and_howl.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stomper_cub.txt b/res/cardsfolder/stomper_cub.txt deleted file mode 100644 index 8106cf60672..00000000000 --- a/res/cardsfolder/stomper_cub.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stomper Cub -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:5/3 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stomper_cub.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stomping_ground.txt b/res/cardsfolder/stomping_ground.txt deleted file mode 100644 index 369348c079a..00000000000 --- a/res/cardsfolder/stomping_ground.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Stomping Ground -ManaCost:no cost -Types:Land Mountain Forest -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96896.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_calendar.txt b/res/cardsfolder/stone_calendar.txt deleted file mode 100644 index 0a32c81c083..00000000000 --- a/res/cardsfolder/stone_calendar.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stone Calendar -ManaCost:5 -Types:Artifact -Text:Spells you cast cost up to 1 less to cast. -K:CostChange:Player:Less:1:Spell:All:All:NoSpecial -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_calendar.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_catapult.txt b/res/cardsfolder/stone_catapult.txt deleted file mode 100644 index 7a1860cef18..00000000000 --- a/res/cardsfolder/stone_catapult.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stone Catapult -ManaCost:4 B -Types:Creature Human Soldier -Text:no text -PT:1/2 -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature.nonBlack+tapped | TgtPrompt$ Select target tapped nonblack creature | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Destroy target tapped nonblack creature. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_catapult.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_giant.txt b/res/cardsfolder/stone_giant.txt deleted file mode 100644 index bc6a2d9afe6..00000000000 --- a/res/cardsfolder/stone_giant.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Stone Giant -ManaCost:2 R R -Types:Creature Giant -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.YouCtrl+powerLTX | TgtPrompt$ Select target creature you control with power less than Stone Giant's. | KW$ Flying & At the beginning of the end step, destroy CARDNAME. | SpellDescription$ Target creature you control with toughness less than CARDNAME's power gains flying until end of turn. Destroy that creature at the beginning of the next end step. -SVar:X:Count$CardPower -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_giant.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/177.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/178.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/269.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/241.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/159.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/178.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_golem.txt b/res/cardsfolder/stone_golem.txt deleted file mode 100644 index a8245d1432a..00000000000 --- a/res/cardsfolder/stone_golem.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stone Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:4/4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_golem.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/215.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_kavu.txt b/res/cardsfolder/stone_kavu.txt deleted file mode 100644 index bf514895719..00000000000 --- a/res/cardsfolder/stone_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stone Kavu -ManaCost:4 G -Types:Creature Kavu -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_kavu.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/93.jpg -End diff --git a/res/cardsfolder/stone_rain.txt b/res/cardsfolder/stone_rain.txt deleted file mode 100644 index 89d10e7b5f0..00000000000 --- a/res/cardsfolder/stone_rain.txt +++ /dev/null @@ -1,27 +0,0 @@ -Name:Stone Rain -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_rain.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/225.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/206.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/179.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/191.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/123.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/221.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/215.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/242.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/157.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/117.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/221.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/217.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/209.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/179.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/270.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/118.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/194.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/178.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_seeder_hierophant.txt b/res/cardsfolder/stone_seeder_hierophant.txt deleted file mode 100644 index b8940131752..00000000000 --- a/res/cardsfolder/stone_seeder_hierophant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stone-Seeder Hierophant -ManaCost:2 G G -Types:Creature Human Druid -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execuet$ TrigUntap | TriggerZones$ Battlefield | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, untap CARDNAME. -A:AB$ Untap | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap target land. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_seeder_hierophant.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/184.jpg -End diff --git a/res/cardsfolder/stone_spirit.txt b/res/cardsfolder/stone_spirit.txt deleted file mode 100644 index 4c2b162ed25..00000000000 --- a/res/cardsfolder/stone_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stone Spirit -ManaCost:4 R -Types:Creature Elemental Spirit -Text:CARDNAME can't be blocked by creatures with flying. -PT:4/3 -K:CantBeBlockedBy Creature.withFlying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_spirit.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/271.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stone_throwing_devils.txt b/res/cardsfolder/stone_throwing_devils.txt deleted file mode 100644 index 6c40480467b..00000000000 --- a/res/cardsfolder/stone_throwing_devils.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stone-Throwing Devils -ManaCost:B -Types:Creature Devil -Text:no text -PT:1/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_throwing_devils.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/14.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/stone_tongue_basilisk.txt b/res/cardsfolder/stone_tongue_basilisk.txt deleted file mode 100644 index 8f7ebc00a4a..00000000000 --- a/res/cardsfolder/stone_tongue_basilisk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stone-Tongue Basilisk -ManaCost:4 G G G -Types:Creature Basilisk -Text:no text -PT:4/5 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroy | TriggerDescription$ Destroy damaged creature at end of combat. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -K:stPumpSelf:Creature:0/0/HIDDEN All creatures able to block CARDNAME do so.:Threshold:Threshold - As long as seven or more cards are in your graveyard, all creatures able to block CARDNAME do so. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_tongue_basilisk.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonebrow_krosan_hero.txt b/res/cardsfolder/stonebrow_krosan_hero.txt deleted file mode 100644 index da1c1dbf628..00000000000 --- a/res/cardsfolder/stonebrow_krosan_hero.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stonebrow, Krosan Hero -ManaCost:3 R G -Types:Legendary Creature Centaur Warrior -Text:no text -PT:4/4 -K:Trample -T:Mode$ Attacks | ValidCard$ Creature.YouCtrl+withTrample | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control with trample attacks, it gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonebrow_krosan_hero.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonecloaker.txt b/res/cardsfolder/stonecloaker.txt deleted file mode 100644 index 75e936094ec..00000000000 --- a/res/cardsfolder/stonecloaker.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Stonecloaker -ManaCost:2 W -Types:Creature Gargoyle -Text:no text -PT:3/2 -K:Flash -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouCtrl -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, exile target card from a graveyard. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | Cost$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonecloaker.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stoneforge_mystic.txt b/res/cardsfolder/stoneforge_mystic.txt deleted file mode 100644 index a912c893ece..00000000000 --- a/res/cardsfolder/stoneforge_mystic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stoneforge Mystic -ManaCost:1 W -Types:Creature Kor Artificer -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Equipment | ChangeNum$ 1 -A:AB$ChangeZone | Cost$ 1 W T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Equipment | ChangeNum$ 1 | SpellDescription$ You may put an Equipment card from your hand onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoneforge_mystic.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonehands.txt b/res/cardsfolder/stonehands.txt deleted file mode 100644 index 10a3cd939bb..00000000000 --- a/res/cardsfolder/stonehands.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stonehands -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+2 -A:AB$ Pump | Cost$ R | Defined$ Enchanted | NumAtt$ +1 | SpellDescription$ Enchanted creature gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonehands.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonewood_invocation.txt b/res/cardsfolder/stonewood_invocation.txt deleted file mode 100644 index 96a0014f5af..00000000000 --- a/res/cardsfolder/stonewood_invocation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stonewood Invocation -ManaCost:3 G -Types:Instant -Text:no text -K:Split second -A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +5 | NumDef$ +5 | KW$ Shroud | SpellDescription$ Target creature gets +5/+5 and gains shroud until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonewood_invocation.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonewood_invoker.txt b/res/cardsfolder/stonewood_invoker.txt deleted file mode 100644 index bc51f42414f..00000000000 --- a/res/cardsfolder/stonewood_invoker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stonewood Invoker -ManaCost:1 G -Types:Creature Elf Mutant -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 7 G | NumAtt$ +5 | NumDef$ +5 | SpellDescription$ CARDNAME gets +5/+5 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonewood_invoker.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/139.jpg -End diff --git a/res/cardsfolder/stonework_puma.txt b/res/cardsfolder/stonework_puma.txt deleted file mode 100644 index b391cc72eff..00000000000 --- a/res/cardsfolder/stonework_puma.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stonework Puma -ManaCost:3 -Types:Artifact Creature Cat Ally -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonework_puma.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonybrook_angler.txt b/res/cardsfolder/stonybrook_angler.txt deleted file mode 100644 index 0eab3fa111f..00000000000 --- a/res/cardsfolder/stonybrook_angler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stonybrook Angler -ManaCost:1 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/2 -A:AB$ TapOrUntap | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonybrook_angler.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/90.jpg -End diff --git a/res/cardsfolder/stonybrook_banneret.txt b/res/cardsfolder/stonybrook_banneret.txt deleted file mode 100644 index a718e2abff9..00000000000 --- a/res/cardsfolder/stonybrook_banneret.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stonybrook Banneret -ManaCost:1 U -Types:Creature Merfolk Wizard -Text:Merfolk spells and Wizard spells you cast cost 1 less to cast. -PT:1/1 -K:Islandwalk -K:CostChange:Player:Less:1:Spell:All:Merfolk/Wizard:OnlyOneBonus -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonybrook_banneret.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stonybrook_schoolmaster.txt b/res/cardsfolder/stonybrook_schoolmaster.txt deleted file mode 100644 index dde14aeb483..00000000000 --- a/res/cardsfolder/stonybrook_schoolmaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stonybrook Schoolmaster -ManaCost:2 W -Types:Creature Merfolk Wizard -Text:no text -PT:1/2 -T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME becomes tapped, you may put a 1/1 blue Merfolk Wizard creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ U 1 1 Merfolk Wizard | TokenName$ Merfolk Wizard | TokenAmount$ 1 | TokenColors$ Blue | TokenTypes$ Creature,Merfolk,Wizard | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stonybrook_schoolmaster.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_cauldron.txt b/res/cardsfolder/storm_cauldron.txt deleted file mode 100644 index cbfdffcd731..00000000000 --- a/res/cardsfolder/storm_cauldron.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Storm Cauldron -ManaCost:5 -Types:Artifact -Text:Each player may play an additional land during each of his or her turns. -T:Mode$ TapsForMana | ValidCard$ Land | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ Whenever a land is tapped for mana, return it to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredCard -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_cauldron.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/314.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/179.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_crow.txt b/res/cardsfolder/storm_crow.txt deleted file mode 100644 index 7bc029ad624..00000000000 --- a/res/cardsfolder/storm_crow.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Storm Crow -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14753.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/104.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/54.jpg|2 -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/100.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/100.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/101.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_elemental.txt b/res/cardsfolder/storm_elemental.txt deleted file mode 100644 index adbae607980..00000000000 --- a/res/cardsfolder/storm_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Storm Elemental -ManaCost:5 U -Types:Creature Elemental -Text:no text -PT:3/4 -K:Flying -A:AB$ Tap | Cost$ U ExileFromTop<1/Card> | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Tap target creature with flying. -A:AB$ Pump | Cost$ U ExileFromTop<1/Card> | Defined$ Self | NumAtt$ +X | NumDef$ +X | SpellDescription$ If the exiled card is a snow land, CARDNAME gets +1/+1 until end of turn. -SVar:X:Exiled$Valid Land.Snow -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_elemental.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_entity.txt b/res/cardsfolder/storm_entity.txt deleted file mode 100644 index bfdfb4c411a..00000000000 --- a/res/cardsfolder/storm_entity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Storm Entity -ManaCost:1 R -Types:Creature Elemental -Text:CARDNAME enters the battlefield with a +1/+1 counter on it for each other spell cast this turn. -PT:1/1 -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_entity.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_front.txt b/res/cardsfolder/storm_front.txt deleted file mode 100644 index 535367b6b10..00000000000 --- a/res/cardsfolder/storm_front.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Storm Front -ManaCost:G -Types:Enchantment -Text:no text -A:AB$ Tap | Cost$ G G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Tap target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_front.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/153.jpg -End diff --git a/res/cardsfolder/storm_herd.txt b/res/cardsfolder/storm_herd.txt deleted file mode 100644 index d4e26ac59bd..00000000000 --- a/res/cardsfolder/storm_herd.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Storm Herd -ManaCost:8 W W -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 8 W W | TokenAmount$ X | TokenName$ Pegasus | TokenTypes$ Creature,Pegasus | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put X 1/1 white Pegasus creature tokens with flying onto the battlefield, where X is your life total. -SVar:X:Count$YourLifeTotal -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96968.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_seeker.txt b/res/cardsfolder/storm_seeker.txt deleted file mode 100644 index 08f59c79e7b..00000000000 --- a/res/cardsfolder/storm_seeker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Storm Seeker -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 G | ValidTgts$ Player | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of cards in target player's hand to that player. -SVar:X:TargetedPlayer$CardsInHand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_seeker.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_shaman.txt b/res/cardsfolder/storm_shaman.txt deleted file mode 100644 index 74e8811dce0..00000000000 --- a/res/cardsfolder/storm_shaman.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Storm Shaman -ManaCost:2 R -Types:Creature Human Cleric Shaman -Text:no text -PT:0/4 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_shaman.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/118.jpg|2 -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/222.jpg -End diff --git a/res/cardsfolder/storm_spirit.txt b/res/cardsfolder/storm_spirit.txt deleted file mode 100644 index ab604e6a628..00000000000 --- a/res/cardsfolder/storm_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Storm Spirit -ManaCost:3 W U G -Types:Creature Elemental Spirit -Text:no text -PT:3/3 -K:Flying -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_spirit.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/381.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/storm_world.txt b/res/cardsfolder/storm_world.txt deleted file mode 100644 index 4e518b27e38..00000000000 --- a/res/cardsfolder/storm_world.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Storm World -ManaCost:R -Types:World Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.YouCtrl | PresentZone$ Hand | PresentCompare$ LT4 | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals X damage to that player, where X is 4 minus the number of cards in his or her hand. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ LT4 | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigDamageOpp | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals X damage to that player, where X is 4 minus the number of cards in his or her hand. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ X -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ Y -SVar:X:Count$InYourHand/NMinus.4 -SVar:Y:Count$InOppHand/NMinus.4 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_world.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormbind.txt b/res/cardsfolder/stormbind.txt deleted file mode 100644 index 7a6ffe5dff7..00000000000 --- a/res/cardsfolder/stormbind.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stormbind -ManaCost:1 R G -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 2 Discard<1/Random> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormbind.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/102.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/382.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormcallers_boon.txt b/res/cardsfolder/stormcallers_boon.txt deleted file mode 100644 index 1673a7e91a7..00000000000 --- a/res/cardsfolder/stormcallers_boon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stormcaller's Boon -ManaCost:2 W U -Types:Enchantment -Text:no text -K:Cascade -A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.YouCtrl | KW$ Flying | SpellDescription$ Creatures you control gain flying until end of turn. -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormcallers_boon.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormcloud_djinn.txt b/res/cardsfolder/stormcloud_djinn.txt deleted file mode 100644 index 6fcba7b8f9c..00000000000 --- a/res/cardsfolder/stormcloud_djinn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stormcloud Djinn -ManaCost:4 U -Types:Creature Djinn -Text:no text -PT:3/3 -K:Flying -K:CARDNAME can block only creatures with flying. -A:AB$ Pump | Cost$ R R | NumAtt$ +2 | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gets +2/+0 until end of turn and deals 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormcloud_djinn.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/82.jpg -End diff --git a/res/cardsfolder/stormfront_pegasus.txt b/res/cardsfolder/stormfront_pegasus.txt deleted file mode 100644 index 4e17d9dfdd7..00000000000 --- a/res/cardsfolder/stormfront_pegasus.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stormfront Pegasus -ManaCost:1 W -Types:Creature Pegasus -Text:no text -PT:2/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormfront_pegasus.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/34.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormfront_riders.txt b/res/cardsfolder/stormfront_riders.txt deleted file mode 100644 index 1836994309d..00000000000 --- a/res/cardsfolder/stormfront_riders.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Stormfront Riders -ManaCost:4 W -Types:Creature Human Soldier -Text:no text -PT:4/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return two creatures you control to their owner's hand. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield. -SVar:TrigToken:AB$ Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Soldier | TokenTypes$ Creature,Soldier | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Creature.YouCtrl | ChangeNum$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormfront_riders.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormscale_anarch.txt b/res/cardsfolder/stormscale_anarch.txt deleted file mode 100644 index 4e15d204018..00000000000 --- a/res/cardsfolder/stormscale_anarch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stormscale Anarch -ManaCost:2 R R -Types:Creature Viashino Shaman -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ 2 R Discard<1/Random> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals 2 damage to target creature or player. If the discarded card was multicolored, CARDNAME deals 4 damage to that creature or player instead. -SVar:X:Discarded$CardMulticolor.4.2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscale_anarch.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormscape_apprentice.txt b/res/cardsfolder/stormscape_apprentice.txt deleted file mode 100644 index 8599dab64dd..00000000000 --- a/res/cardsfolder/stormscape_apprentice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stormscape Apprentice -ManaCost:U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -A:AB$ LoseLife | Cost$ B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscape_apprentice.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/75.jpg -End diff --git a/res/cardsfolder/stormscape_familiar.txt b/res/cardsfolder/stormscape_familiar.txt deleted file mode 100644 index b5dcb84963a..00000000000 --- a/res/cardsfolder/stormscape_familiar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stormscape Familiar -ManaCost:1 U -Types:Creature Bird -Text:White spells and black spells you cast cost 1 less to cast. -PT:1/1 -K:Flying -K:CostChange:Player:Less:1:Spell:white/black:All:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscape_familiar.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/32.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormscape_master.txt b/res/cardsfolder/stormscape_master.txt deleted file mode 100644 index a29a51f1fb5..00000000000 --- a/res/cardsfolder/stormscape_master.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Stormscape Master -ManaCost:2 U U -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature gains protection from white until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from blue | SpellDescription$ Target creature gains protection from blue until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from black | SpellDescription$ Target creature gains protection from black until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from red | SpellDescription$ Target creature gains protection from red until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from green | SpellDescription$ Target creature gains protection from green until end of turn. -A:AB$ LoseLife | Cost$ B B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormscape_master.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/76.jpg -End diff --git a/res/cardsfolder/stormtide_leviathan.txt b/res/cardsfolder/stormtide_leviathan.txt deleted file mode 100644 index f89be6a9125..00000000000 --- a/res/cardsfolder/stormtide_leviathan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stormtide Leviathan -ManaCost:5 U U U -Types:Creature Leviathan -Text:no text -PT:8/8 -K:Islandwalk -K:stPumpAll:Land:0/0/Types=Island:No Condition:All lands are Islands in addition to their other types. -K:stPumpAll:Creature.withoutFlying+withoutIslandwalk:0/0/HIDDEN CARDNAME can't attack.:No Condition:Creatures without flying or islandwalk can't attack. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormtide_leviathan.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stormwatch_eagle.txt b/res/cardsfolder/stormwatch_eagle.txt deleted file mode 100644 index d503ffdf611..00000000000 --- a/res/cardsfolder/stormwatch_eagle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stormwatch Eagle -ManaCost:3 U -Types:Creature Bird -Text:no text -PT:2/1 -K:Flying -A:AB$ ChangeZone | Cost$ Sac<1/Land> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormwatch_eagle.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strafe.txt b/res/cardsfolder/strafe.txt deleted file mode 100644 index bae33b7acd1..00000000000 --- a/res/cardsfolder/strafe.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Strafe -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ R | ValidTgts$ Creature.nonRed | TgtPrompt$ Select target nonred Creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target nonred creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strafe.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strands_of_night.txt b/res/cardsfolder/strands_of_night.txt deleted file mode 100644 index ff2a57823b2..00000000000 --- a/res/cardsfolder/strands_of_night.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Strands of Night -ManaCost:2 B B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ B B PayLife<2> Sac<1/Swamp> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strands_of_night.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/24.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/156.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strands_of_undeath.txt b/res/cardsfolder/strands_of_undeath.txt deleted file mode 100644 index 6a2213a71a8..00000000000 --- a/res/cardsfolder/strands_of_undeath.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Strands of Undeath -ManaCost:3 B -Types:Enchantment Aura -Text:no text -PT:2/2 -K:Enchant creature -K:enPump:0/0 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, target player discards two cards. -A:AB$ Regenerate | Cost$ B | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select a player | NumCards$ 2 | Mode$ TgtChoose -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/strands_of_undeath.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strandwalker.txt b/res/cardsfolder/strandwalker.txt deleted file mode 100644 index 6910dae77f6..00000000000 --- a/res/cardsfolder/strandwalker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Strandwalker -ManaCost:5 -Types:Artifact Equipment -Text:Equipped creature gets +2/+4 and has reach. -K:eqPump 4:+2/+4/Reach -K:Living Weapon -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strandwalker.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strangling_soot.txt b/res/cardsfolder/strangling_soot.txt deleted file mode 100644 index a99ba49426e..00000000000 --- a/res/cardsfolder/strangling_soot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Strangling Soot -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 B | ValidTgts$ Creature.toughnessLE3 | TgtPrompt$ Select target creature with toughness 3 or less | SpellDescription$ Destroy target creature with toughness 3 or less. -A:SP$ Destroy | Cost$ 5 R | Flashback$ True | CostDesc$ Flashback 5 R | ValidTgts$ Creature.toughnessLE3 | TgtPrompt$ Select target creature with toughness 3 or less | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card109710.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stratadon.txt b/res/cardsfolder/stratadon.txt deleted file mode 100644 index 135d22d042e..00000000000 --- a/res/cardsfolder/stratadon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stratadon -ManaCost:10 -Types:Artifact Creature Beast -Text:Domain - Stratadon costs 1 less to cast for each basic land type among lands you control. -PT:5/5 -K:Trample -K:CostChange:Player:Less:X:Self:All:All:No Condition -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stratadon.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strategic_planning.txt b/res/cardsfolder/strategic_planning.txt deleted file mode 100644 index cfff0046177..00000000000 --- a/res/cardsfolder/strategic_planning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Strategic Planning -ManaCost:1 U -Types:Sorcery -Text:no text -A:AB$ Dig | Cost$ 1 U | DigNum$ 3 | DestinationZone2$ Graveyard | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest into your graveyard. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strategic_planning.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stratozeppelid.txt b/res/cardsfolder/stratozeppelid.txt deleted file mode 100644 index 9a2ca93cdbd..00000000000 --- a/res/cardsfolder/stratozeppelid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stratozeppelid -ManaCost:4 U -Types:Creature Beast -Text:no text -PT:4/4 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stratozeppelid.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/straw_golem.txt b/res/cardsfolder/straw_golem.txt deleted file mode 100644 index 615110f9f57..00000000000 --- a/res/cardsfolder/straw_golem.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Straw Golem -ManaCost:1 -Types:Artifact Creature Golem -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigSacrifice | TriggerDescription$ When an opponent casts a creature spell, sacrifice CARDNAME. -SVar:TrigSacrifice:AB$Sacrifice | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/straw_golem.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/straw_soldiers.txt b/res/cardsfolder/straw_soldiers.txt deleted file mode 100644 index e240b7c1770..00000000000 --- a/res/cardsfolder/straw_soldiers.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Straw Soldiers -ManaCost:1 U -Types:Creature Scarecrow Soldier -Text:no text -PT:1/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10613.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stream_hopper.txt b/res/cardsfolder/stream_hopper.txt deleted file mode 100644 index a33d416dec2..00000000000 --- a/res/cardsfolder/stream_hopper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Stream Hopper -ManaCost:UR -Types:Creature Goblin -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ UR | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stream_hopper.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/113.jpg -End diff --git a/res/cardsfolder/stream_of_acid.txt b/res/cardsfolder/stream_of_acid.txt deleted file mode 100644 index 2f3716e8ff2..00000000000 --- a/res/cardsfolder/stream_of_acid.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stream of Acid -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Land,Creature.nonBlack | TgtPrompt$ Select target land or nonblack creature | SpellDescription$ Destroy target land or nonblack creature. -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Starter_1999/stream_of_acid.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/91.jpg -End diff --git a/res/cardsfolder/stream_of_life.txt b/res/cardsfolder/stream_of_life.txt deleted file mode 100644 index 944d8f05c77..00000000000 --- a/res/cardsfolder/stream_of_life.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Stream of Life -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ X G | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SpellDescription$ Target player gains X life. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stream_of_life.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/282.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/126.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/126.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/272.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/190.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/156.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/272.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/254.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/124.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stream_of_unconsciousness.txt b/res/cardsfolder/stream_of_unconsciousness.txt deleted file mode 100644 index 3224e9e3a0d..00000000000 --- a/res/cardsfolder/stream_of_unconsciousness.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stream of Unconsciousness -ManaCost:U -Types:Tribal Instant Wizard -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. If you control a Wizard, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Wizard.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Wizard, -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stream_of_unconsciousness.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/street_wraith.txt b/res/cardsfolder/street_wraith.txt deleted file mode 100644 index d819e1ee43d..00000000000 --- a/res/cardsfolder/street_wraith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Street Wraith -ManaCost:3 B B -Types:Creature Wraith -Text:no text -PT:3/4 -K:Swampwalk -K:Cycling:PayLife<2> -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/street_wraith.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/streetbreaker_wurm.txt b/res/cardsfolder/streetbreaker_wurm.txt deleted file mode 100644 index 36e60d16985..00000000000 --- a/res/cardsfolder/streetbreaker_wurm.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Streetbreaker Wurm -ManaCost:3 R G -Types:Creature Wurm -Text:no text -PT:6/4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card106575.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strength_of_cedars.txt b/res/cardsfolder/strength_of_cedars.txt deleted file mode 100644 index c831d5c17de..00000000000 --- a/res/cardsfolder/strength_of_cedars.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Strength of Cedars -ManaCost:4 G -Types:Instant Arcane -Text:no text -A:SP$ Pump | Cost$ 4 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of lands you control. -SVar:X:Count$TypeYouCtrl.Land -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_cedars.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/245.jpg -End diff --git a/res/cardsfolder/strength_of_isolation.txt b/res/cardsfolder/strength_of_isolation.txt deleted file mode 100644 index 03e72225971..00000000000 --- a/res/cardsfolder/strength_of_isolation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Strength of Isolation -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+2/Protection from black -K:Madness:W -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_isolation.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strength_of_lunacy.txt b/res/cardsfolder/strength_of_lunacy.txt deleted file mode 100644 index ddbce494054..00000000000 --- a/res/cardsfolder/strength_of_lunacy.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Strength of Lunacy -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+1/Protection from white -K:Madness:B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_lunacy.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strength_of_night.txt b/res/cardsfolder/strength_of_night.txt deleted file mode 100644 index a4254f25107..00000000000 --- a/res/cardsfolder/strength_of_night.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Strength of Night -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. If CARDNAME was kicked, Zombie creatures you control get an additional +2/+2 until end of turn. -A:SP$ PumpAll | Cost$ 2 G B | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SubAbility$ SVar=DBPumpYourZombies | SpellDescription$ Kicker B (You may pay an additional B as you cast this spell.) -SVar:DBPumpYourZombies:DB$ PumpAll | ValidCards$ Creature.Zombie+YouCtrl | NumAtt$+2 | NumDef$ +2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_night.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/86.jpg -End diff --git a/res/cardsfolder/strength_of_unity.txt b/res/cardsfolder/strength_of_unity.txt deleted file mode 100644 index 96f380bfee4..00000000000 --- a/res/cardsfolder/strength_of_unity.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Strength of Unity -ManaCost:3 W -Types:Enchantment Aura -Text:Domain - Enchanted creature gets +1/+1 for each basic land type among lands you control. -K:Enchant creature -K:enPump:0/0 -K:stPumpEnchanted:Creature:X/X:no Condition:no text -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/strength_of_unity.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strider_harness.txt b/res/cardsfolder/strider_harness.txt deleted file mode 100644 index 5cb7dea1568..00000000000 --- a/res/cardsfolder/strider_harness.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Strider Harness -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +1/+1 and has haste. -K:eqPump 1:+1/+1/Haste -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/strider_harness.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/strip_mine.txt b/res/cardsfolder/strip_mine.txt deleted file mode 100644 index 88fd7da981e..00000000000 --- a/res/cardsfolder/strip_mine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Strip Mine -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land. | Cost$ T Sac<1/CARDNAME> | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strip_mine.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/189.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/71.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/striped_bears.txt b/res/cardsfolder/striped_bears.txt deleted file mode 100644 index b0d05bb6651..00000000000 --- a/res/cardsfolder/striped_bears.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Striped Bears -ManaCost:3 G -Types:Creature Bear -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/striped_bears.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stroke_of_genius.txt b/res/cardsfolder/stroke_of_genius.txt deleted file mode 100644 index 9373083036a..00000000000 --- a/res/cardsfolder/stroke_of_genius.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stroke of Genius -ManaCost:X 2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ X 2 U | ValidTgts$ Player | TgtPrompt$ Choose a player | NumCards$ X | SpellDescription$ Target player draws X cards. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stroke_of_genius.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stromgald_cabal.txt b/res/cardsfolder/stromgald_cabal.txt deleted file mode 100644 index ca9a61fd54d..00000000000 --- a/res/cardsfolder/stromgald_cabal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stromgald Cabal -ManaCost:1 B B -Types:Creature Human Knight -Text:no text -PT:2/2 -A:AB$ Counter | Cost$ T PayLife<1> | TargetType$ Spell | TgtPrompt$ Select target White spell | ValidTgts$ Card.White | SpellDescription$ Counter target white spell. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stromgald_cabal.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/57.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/157.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stromgald_crusader.txt b/res/cardsfolder/stromgald_crusader.txt deleted file mode 100644 index 7ef0e20ccbc..00000000000 --- a/res/cardsfolder/stromgald_crusader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stromgald Crusader -ManaCost:B B -Types:Creature Zombie Knight -Text:no text -PT:2/1 -K:Protection from white -A:AB$ Pump | Cost$ B | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ B B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stromgald_crusader.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/71.jpg -End diff --git a/res/cardsfolder/strongarm_thug.txt b/res/cardsfolder/strongarm_thug.txt deleted file mode 100644 index 829846b28ea..00000000000 --- a/res/cardsfolder/strongarm_thug.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Strongarm Thug -ManaCost:2 B -Types:Creature Human Mercenary -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target Mercenary card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Mercenary.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/strongarm_thug.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_assassin.txt b/res/cardsfolder/stronghold_assassin.txt deleted file mode 100644 index d96aa8cd126..00000000000 --- a/res/cardsfolder/stronghold_assassin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stronghold Assassin -ManaCost:1 B B -Types:Creature Zombie Assassin -Text:no text -PT:2/1 -A:AB$ Destroy | Cost$ T Sac<1/Creature> | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy target nonblack creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_assassin.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/21.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/166.jpg -End diff --git a/res/cardsfolder/stronghold_biologist.txt b/res/cardsfolder/stronghold_biologist.txt deleted file mode 100644 index 52fbd4b7274..00000000000 --- a/res/cardsfolder/stronghold_biologist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stronghold Biologist -ManaCost:2 U -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ U U T Discard<1/Card> | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Card.Creature | SpellDescription$ Counter target creature spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_biologist.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_discipline.txt b/res/cardsfolder/stronghold_discipline.txt deleted file mode 100644 index cf445023016..00000000000 --- a/res/cardsfolder/stronghold_discipline.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Stronghold Discipline -ManaCost:2 B B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 2 B B | Defined$ Opponent | LifeAmount$ X | SubAbility$ SVar=DBLoseLife | SpellDescription$ Each player loses 1 life for each creature he or she controls. -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ Y -SVar:X:Count$TypeOppCtrl.Creature -SVar:Y:Count$TypeYouCtrl.Creature -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_discipline.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/73.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_machinist.txt b/res/cardsfolder/stronghold_machinist.txt deleted file mode 100644 index be1599bfb86..00000000000 --- a/res/cardsfolder/stronghold_machinist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stronghold Machinist -ManaCost:2 U -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ U U T Discard<1/Card> | TargetType$ Spell | TgtPrompt$ Select target nonCreature spell | ValidTgts$ Card.nonCreature | SpellDescription$ Counter target noncreature spell. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_machinist.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_rats.txt b/res/cardsfolder/stronghold_rats.txt deleted file mode 100644 index 8b7c7f80c34..00000000000 --- a/res/cardsfolder/stronghold_rats.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stronghold Rats -ManaCost:2 B -Types:Creature Rat -Text:no text -PT:2/1 -K:Shadow -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, each player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Each | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_rats.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_taskmaster.txt b/res/cardsfolder/stronghold_taskmaster.txt deleted file mode 100644 index e08d78317a5..00000000000 --- a/res/cardsfolder/stronghold_taskmaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stronghold Taskmaster -ManaCost:2 B B -Types:Creature Giant Minion -Text:no text -PT:4/3 -K:stPumpAll:Creature.Black+Other:-1/-1:No Condition:Other black creatures get -1/-1. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_taskmaster.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stronghold_zeppelin.txt b/res/cardsfolder/stronghold_zeppelin.txt deleted file mode 100644 index 4916fc47ef8..00000000000 --- a/res/cardsfolder/stronghold_zeppelin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stronghold Zeppelin -ManaCost:2 U U -Types:Creature Human -Text:no text -PT:3/3 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_zeppelin.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/student_of_warfare.txt b/res/cardsfolder/student_of_warfare.txt deleted file mode 100644 index 8b6f355a475..00000000000 --- a/res/cardsfolder/student_of_warfare.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Student of Warfare -ManaCost:W -Types:Creature Human Knight -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE2:3:3:LevelGE7:4:4:LEVEL 2-6 3/3 First strike LEVEL 7+ 4/4 Double Strike -K:stPumpSelf:Creature.countersGE2LEVEL+countersLT7LEVEL:0/0/First Strike:No Condition:no text -K:stPumpSelf:Creature.countersGE7LEVEL:0/0/Double Strike:No Condition:no text -K:Level up:W -K:maxLevel:7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/student_of_warfare.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stuffy_doll.txt b/res/cardsfolder/stuffy_doll.txt deleted file mode 100644 index 1db72355681..00000000000 --- a/res/cardsfolder/stuffy_doll.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stuffy Doll -ManaCost:5 -Types:Artifact Creature Construct -Text:Whenever damage is dealt to Stuffy Doll, it deals that much damage to your opponent. -PT:0/1 -K:Indestructible -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to itself. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card116724.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stun.txt b/res/cardsfolder/stun.txt deleted file mode 100644 index d6f45f31ab9..00000000000 --- a/res/cardsfolder/stun.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stun -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Target creature can't block this turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/stun.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/207.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/172.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stun_sniper.txt b/res/cardsfolder/stun_sniper.txt deleted file mode 100644 index 449b4df68a5..00000000000 --- a/res/cardsfolder/stun_sniper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Stun Sniper -ManaCost:W R -Types:Creature Human Archer -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBTap | SpellDescription$ CARDNAME deals 1 damage to target creature. Tap that creature. -SVar:DBTap:DB$Tap | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stun_sniper.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/100.jpg -End diff --git a/res/cardsfolder/stunted_growth.txt b/res/cardsfolder/stunted_growth.txt deleted file mode 100644 index fa0c854c7c9..00000000000 --- a/res/cardsfolder/stunted_growth.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Stunted Growth -ManaCost:3 G G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G G | Origin$ Hand | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Player | Mandatory$ True | ChangeType$ Card | ChangeNum$ 3 | IsCurse$ True | Chooser$ Targeted | SpellDescription$ Target player chooses three cards from his or her hand and puts them on top of his or her library in any order. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/stunted_growth.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stupefying_touch.txt b/res/cardsfolder/stupefying_touch.txt deleted file mode 100644 index aeffe13dd9f..00000000000 --- a/res/cardsfolder/stupefying_touch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Stupefying Touch -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant Creature -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -K:enPumpCurse:HIDDEN CARDNAME's activated abilities can't be activated.:Enchanted creature's activated abilities can't be activated. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stupefying_touch.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/stupor.txt b/res/cardsfolder/stupor.txt deleted file mode 100644 index 9415b9059a9..00000000000 --- a/res/cardsfolder/stupor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Stupor -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Opponent | NumCards$ 1 | Mode$ Random | SpellDescription$ Target opponent discards a card at random, then discards a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/stupor.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/158.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/45.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sturdy_hatchling.txt b/res/cardsfolder/sturdy_hatchling.txt deleted file mode 100644 index 8f7e5af07bb..00000000000 --- a/res/cardsfolder/sturdy_hatchling.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sturdy Hatchling -ManaCost:3 GU -Types:Creature Elemental -Text: -PT:6/6 -K:etbCounter:M1M1:4 -A:AB$ Pump | Cost$ GU | KW$ Shroud | SpellDescription$ CARDNAME gains shroud until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a green spell, remove a -1/-1 counter from CARDNAME. -T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a blue spell, remove a -1/-1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:BuffedBy:Spell.Blue,Spell.Green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sturdy_hatchling.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/163.jpg -End diff --git a/res/cardsfolder/su_chi.txt b/res/cardsfolder/su_chi.txt deleted file mode 100644 index 32612449226..00000000000 --- a/res/cardsfolder/su_chi.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Su-Chi -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigAddMana | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, add 4 to your mana pool. -SVar:TrigAddMana:AB$Mana | Cost$ 0 | Produced$1 | Amount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/su_chi.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/subterranean_shambler.txt b/res/cardsfolder/subterranean_shambler.txt deleted file mode 100644 index 198ae0d13da..00000000000 --- a/res/cardsfolder/subterranean_shambler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Subterranean Shambler -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:2/3 -K:Echo:3 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTremor | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, it deals 1 damage to each creature without flying. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigTremor | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or leaves the battlefield, it deals 1 damage to each creature without flying. -SVar:TrigTremor:AB$ DamageAll | Cost$ 0 | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/subterranean_shambler.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/subterranean_spirit.txt b/res/cardsfolder/subterranean_spirit.txt deleted file mode 100644 index e9a658b3c28..00000000000 --- a/res/cardsfolder/subterranean_spirit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Subterranean Spirit -ManaCost:3 R R -Types:Creature Elemental -Text:no text -PT:3/3 -K:Protection from red -A:AB$ DamageAll | Cost$ T | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature and without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/subterranean_spirit.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/subversion.txt b/res/cardsfolder/subversion.txt deleted file mode 100644 index e6665cc2be9..00000000000 --- a/res/cardsfolder/subversion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Subversion -ManaCost:3 B B -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ At the beginning of your upkeep, each opponent loses 1 life. You gain life equal to the life lost this way. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/subversion.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sudden_death.txt b/res/cardsfolder/sudden_death.txt deleted file mode 100644 index 71cb72e7db6..00000000000 --- a/res/cardsfolder/sudden_death.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sudden Death -ManaCost:1 B B -Types:Instant -Text:no text -K:Split second -A:SP$ Pump | Cost$ 1 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SpellDescription$ Target creature gets -4/-4 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_death.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sudden_impact.txt b/res/cardsfolder/sudden_impact.txt deleted file mode 100644 index 5f36843e1e5..00000000000 --- a/res/cardsfolder/sudden_impact.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sudden Impact -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Player | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the number of cards in target player's hand to that player. -SVar:X:TargetedPlayer$CardsInHand -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_impact.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/226.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/208.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/223.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/222.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sudden_strength.txt b/res/cardsfolder/sudden_strength.txt deleted file mode 100644 index a9af94c2c87..00000000000 --- a/res/cardsfolder/sudden_strength.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sudden Strength -ManaCost:3 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 3 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target creature gets +3/+3 until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_strength.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/132.jpg -End diff --git a/res/cardsfolder/suffer_the_past.txt b/res/cardsfolder/suffer_the_past.txt deleted file mode 100644 index be87e55ddd1..00000000000 --- a/res/cardsfolder/suffer_the_past.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Suffer the Past -ManaCost:X B -Types:Instant -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/suffer_the_past.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suffocating_blast.txt b/res/cardsfolder/suffocating_blast.txt deleted file mode 100644 index 3eb22a2f199..00000000000 --- a/res/cardsfolder/suffocating_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Suffocating Blast -ManaCost:1 U U R -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U U R | Types$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDamage | SpellDescription$ Counter target spell and CARDNAME deals 3 damage to target creature. -SVar:DBDamage:DB$DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/suffocating_blast.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suicidal_charge.txt b/res/cardsfolder/suicidal_charge.txt deleted file mode 100644 index 83e9e652f23..00000000000 --- a/res/cardsfolder/suicidal_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Suicidal Charge -ManaCost:3 R B -Types:Enchantment -Text:no text -A:AB$ PumpAll | Cost$ Sac<1/CARDNAME> | ValidCards$ Creature.YouDontCtrl | NumAtt$ -1 | NumDef$ -1 | KW$ HIDDEN CARDNAME attacks each turn if able. | IsCurse$ True | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn. Those creatures attack this turn if able. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suicidal_charge.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suleimans_legacy.txt b/res/cardsfolder/suleimans_legacy.txt deleted file mode 100644 index aad9e0bf6a0..00000000000 --- a/res/cardsfolder/suleimans_legacy.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Suleiman's Legacy -ManaCost:R W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME enters the battlefield, destroy all Djinns and Efreets. They can't be regenerated. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Djinn,Efreet | NoRegen$ True -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Djinn,Efreet | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a Djinn or Efreet enters the battlefield, destroy it. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredCard | NoRegen$ True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/suleimans_legacy.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfur_elemental.txt b/res/cardsfolder/sulfur_elemental.txt deleted file mode 100644 index 87b4366cf6c..00000000000 --- a/res/cardsfolder/sulfur_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sulfur Elemental -ManaCost:2 R -Types:Creature Elemental -Text:no text -PT:3/2 -K:Flash -K:Split second -K:stPumpAll:Creature.White:1/-1:no Condition:White creatures get +1/-1. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfur_elemental.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfur_vent.txt b/res/cardsfolder/sulfur_vent.txt deleted file mode 100644 index a9a1e3efcb5..00000000000 --- a/res/cardsfolder/sulfur_vent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sulfur Vent -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R U | SpellDescription$ Add R U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfur_vent.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfuric_vapors.txt b/res/cardsfolder/sulfuric_vapors.txt deleted file mode 100644 index 0289939f481..00000000000 --- a/res/cardsfolder/sulfuric_vapors.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sulfuric Vapors -ManaCost:3 R -Types:Enchantment -Text: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. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfuric_vapors.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfuric_vortex.txt b/res/cardsfolder/sulfuric_vortex.txt deleted file mode 100644 index 1c45070a773..00000000000 --- a/res/cardsfolder/sulfuric_vortex.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sulfuric Vortex -ManaCost:1 R R -Types:Enchantment -Text:If a player would gain life, that player gains no life instead. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 2 damage to that player. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigDamageOpp | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 2 damage to that player. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 2 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfuric_vortex.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfurous_blast.txt b/res/cardsfolder/sulfurous_blast.txt deleted file mode 100644 index c9c9ac07fb1..00000000000 --- a/res/cardsfolder/sulfurous_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sulfurous Blast -ManaCost:2 R R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 2 R R | NumDmg$ X | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. If you cast this spell during your main phase, CARDNAME deals 3 damage to each creature and each player instead. -SVar:X:Count$IfMainPhase.3.2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfurous_blast.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sulfurous_springs.txt b/res/cardsfolder/sulfurous_springs.txt deleted file mode 100644 index c77c81f5fa0..00000000000 --- a/res/cardsfolder/sulfurous_springs.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Sulfurous Springs -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sulfurous_springs.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/345.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/440.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/325.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/352.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/359.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/summer_bloom.txt b/res/cardsfolder/summer_bloom.txt deleted file mode 100644 index 307137f3f27..00000000000 --- a/res/cardsfolder/summer_bloom.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Summer Bloom -ManaCost:1 G -Types:Sorcery -Text:You may play up to three additional lands this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/summer_bloom.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/72.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/144.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/113.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/273.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/summon_the_school.txt b/res/cardsfolder/summon_the_school.txt deleted file mode 100644 index 7217fdb6941..00000000000 --- a/res/cardsfolder/summon_the_school.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Summon the School -ManaCost:3 W -Types:Tribal Sorcery Merfolk -Text:no text -A:SP$ Token | Cost$ 3 W | TokenImage$ U 1 1 Merfolk Wizard | TokenAmount$ 2 | TokenName$ Merfolk Wizard | TokenTypes$ Creature,Merfolk,Wizard | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 blue Merfolk Wizard creature tokens onto the battlefield. -A:AB$ ChangeZone | Cost$tapXType<4/Merfolk> | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | SpellDescription$ Return CARDNAME from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/summon_the_school.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/summoners_bane.txt b/res/cardsfolder/summoners_bane.txt deleted file mode 100644 index 6012d96b7f8..00000000000 --- a/res/cardsfolder/summoners_bane.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Summoner's Bane -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target creature spell | ValidTgts$ Creature | SubAbility$ SVar=DBToken | SpellDescription$ Counter target creature spell. Put a 2/2 blue Illusion creature token onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Illusion | TokenTypes$ Creature,Illusion | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 2 | TokenToughness$ 2 | TokenImage$ U 2 2 Illusion -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/summoners_bane.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/summoning_station.txt b/res/cardsfolder/summoning_station.txt deleted file mode 100644 index b091c431021..00000000000 --- a/res/cardsfolder/summoning_station.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Summoning Station -ManaCost:7 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ T | TokenAmount$ 1 | TokenName$ Pincher | TokenTypes$ Creature,Pincher | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a 2/2 colorless Pincher creature token onto the battlefield. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact | TriggerZones$ Battlefield | Execute$ TrigUntap | OptionalDecider$ You | TriggerDescription$ Whenever an artifact is put into a graveyard from the battlefield, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/summoning_station.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sun_ce_young_conquerer.txt b/res/cardsfolder/sun_ce_young_conquerer.txt deleted file mode 100644 index f38a6d52edf..00000000000 --- a/res/cardsfolder/sun_ce_young_conquerer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sun Ce, Young Conquerer -ManaCost:3 U U -Types:Legendary Creature Human Soldier -Text:no text -PT:3/3 -K:Horsemanship -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target creature to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_ce_young_conquerer.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sun_clasp.txt b/res/cardsfolder/sun_clasp.txt deleted file mode 100644 index 0393c901bec..00000000000 --- a/res/cardsfolder/sun_clasp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sun Clasp -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:1/3:Enchanted creature gets +1/+3. -A:AB$ ChangeZone | Cost$ W | Origin$ Battlefield | Destination$ Hand | Defined$ Enchanted | SpellDescription$ Return enchanted creature to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_clasp.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sun_quan_lord_of_wu.txt b/res/cardsfolder/sun_quan_lord_of_wu.txt deleted file mode 100644 index 3d88589c55d..00000000000 --- a/res/cardsfolder/sun_quan_lord_of_wu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sun Quan, Lord of Wu -ManaCost:4 U U -Types:Legendary Creature Human Soldier -Text:no text -PT:4/4 -K:stPumpAll:Creature.YouCtrl:0/0/Horsemanship:No Condition:Creatures you control have horsemanship. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_quan_lord_of_wu.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sun_titan.txt b/res/cardsfolder/sun_titan.txt deleted file mode 100644 index d99487ac4ef..00000000000 --- a/res/cardsfolder/sun_titan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sun Titan -ManaCost:4 W W -Types:Creature Giant -Text:no text -PT:6/6 -K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME enters the battlefield, you may return target permanent card with converted mana cost 3 or less from your graveyard to the battlefield. -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may return target permanent card with converted mana cost 3 or less from your graveyard to the battlefield. -SVar:TrigChange:AB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Permanent.YouCtrl+cmcLE3 | Cost$ 0 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sun_titan.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunastian_falconer.txt b/res/cardsfolder/sunastian_falconer.txt deleted file mode 100644 index 85f62cd6609..00000000000 --- a/res/cardsfolder/sunastian_falconer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunastian Falconer -ManaCost:3 R G -Types:Legendary Creature Human Shaman -Text:no text -PT:4/4 -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1687.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunbeam_spellbomb.txt b/res/cardsfolder/sunbeam_spellbomb.txt deleted file mode 100644 index ee334fb0bb5..00000000000 --- a/res/cardsfolder/sunbeam_spellbomb.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sunbeam Spellbomb -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 1 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -A:AB$ GainLife | Cost$ W Sac<1/CARDNAME> | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunbeam_spellbomb.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/250.jpg -End diff --git a/res/cardsfolder/sunblast_angel.txt b/res/cardsfolder/sunblast_angel.txt deleted file mode 100644 index d5e62884e21..00000000000 --- a/res/cardsfolder/sunblast_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sunblast Angel -ManaCost:4 W W -Types:Creature Angel -Text:no text -PT:4/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroyAll | TriggerDescription$ When CARDNAME enters the battlefield, destroy all tapped creatures. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.tapped -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunblast_angel.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suncrusher.txt b/res/cardsfolder/suncrusher.txt deleted file mode 100644 index a296793bbf0..00000000000 --- a/res/cardsfolder/suncrusher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Suncrusher -ManaCost:9 -Types:Artifact Creature Construct -Text:no text -PT:3/3 -K:Sunburst -A:AB$ Destroy | Cost$ 4 T SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ Destroy target creature. -A:AB$ ChangeZone | Cost$ 2 SubCounter<1/P1P1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/suncrusher.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunder.txt b/res/cardsfolder/sunder.txt deleted file mode 100644 index 32540abaef6..00000000000 --- a/res/cardsfolder/sunder.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sunder -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U | ChangeType$ Land | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all lands to their owners' hands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunder.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunder_from_within.txt b/res/cardsfolder/sunder_from_within.txt deleted file mode 100644 index a31e9669ada..00000000000 --- a/res/cardsfolder/sunder_from_within.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sunder from Within -ManaCost:2 R R -Types:Sorcery Arcane -Text:no text -A:SP$ Destroy | Cost$ 2 R R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SpellDescription$ Destroy target artifact or land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunder_from_within.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/117.jpg -End diff --git a/res/cardsfolder/sunfire_balm.txt b/res/cardsfolder/sunfire_balm.txt deleted file mode 100644 index 00f42ff2b31..00000000000 --- a/res/cardsfolder/sunfire_balm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunfire Balm -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ 2 W | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | Amount$ 4 | SpellDescription$ Prevent the next 4 damage that would be dealt to target creature or player this turn. -K:Cycling:1 W -T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigPrevent | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME, you may prevent the next 1 damage that would be dealt to target creature or player this turn. -SVar:TrigPrevent:AB$ PreventDamage | Cost$ 0 | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | Amount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunfire_balm.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunflare_shaman.txt b/res/cardsfolder/sunflare_shaman.txt deleted file mode 100644 index 625a5de5787..00000000000 --- a/res/cardsfolder/sunflare_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sunflare Shaman -ManaCost:1 R -Types:Creature Elemental Shaman -Text:no text -PT:2/1 -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtCP | NumDmg$ X | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals X damage to target creature or player and X damage to itself, where X is the number of Elemental cards in your graveyard. -SVar:DBDealDamage:DB$DealDamage | NumDmg$ X | Defined$ Self -SVar:X:Count$TypeInYourYard.Elemental -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunflare_shaman.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/108.jpg -End diff --git a/res/cardsfolder/sunglasses_of_urza.txt b/res/cardsfolder/sunglasses_of_urza.txt deleted file mode 100644 index 875e9689b03..00000000000 --- a/res/cardsfolder/sunglasses_of_urza.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sunglasses of Urza -ManaCost:3 -Types:Artifact -Text:You may spend white mana as though it were red mana. -A:AB$ Mana | Cost$ W | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunglasses_of_urza.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/271.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/273.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/276.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/365.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sungrass_egg.txt b/res/cardsfolder/sungrass_egg.txt deleted file mode 100644 index 8e800b41b6b..00000000000 --- a/res/cardsfolder/sungrass_egg.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sungrass Egg -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ 2 T Sac<1/CARDNAME> | Produced$ G W | SubAbility$ SVar=DBDraw | SpellDescription$ Add G W to your mana pool. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sungrass_egg.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/311.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sungrass_prairie.txt b/res/cardsfolder/sungrass_prairie.txt deleted file mode 100644 index 1a7b96f7a63..00000000000 --- a/res/cardsfolder/sungrass_prairie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sungrass Prairie -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ 1 T | Produced$ W G | SpellDescription$ Add W G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sungrass_prairie.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunhome_enforcer.txt b/res/cardsfolder/sunhome_enforcer.txt deleted file mode 100644 index 7980d4a0b74..00000000000 --- a/res/cardsfolder/sunhome_enforcer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sunhome Enforcer -ManaCost:2 R W -Types:Creature Giant Soldier -Text:no text -PT:2/4 -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunhome_enforcer.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/233.jpg -End diff --git a/res/cardsfolder/sunhome_fortress_of_the_legion.txt b/res/cardsfolder/sunhome_fortress_of_the_legion.txt deleted file mode 100644 index 1f14e41ffff..00000000000 --- a/res/cardsfolder/sunhome_fortress_of_the_legion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sunhome, Fortress of the Legion -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ 2 R W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Double Strike | SpellDescription$ Target creature gains double strike until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunhome_fortress_of_the_legion.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunken_city.txt b/res/cardsfolder/sunken_city.txt deleted file mode 100644 index 9bd9860c0a1..00000000000 --- a/res/cardsfolder/sunken_city.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunken City -ManaCost:U U -Types:Enchantment -Text:no text -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U U -K:stPumpAll:Creature.Blue:1/1:No Condition:Blue creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_city.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/35.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunken_field.txt b/res/cardsfolder/sunken_field.txt deleted file mode 100644 index 94b39addb5e..00000000000 --- a/res/cardsfolder/sunken_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunken Field -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=Counter:No Condition:Enchanted land has "Tap: Counter target spell unless its controller pays 1." -SVar:Counter:AB$Counter | Cost$ T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | UnlessPayer$ TargetedController | SpellDescription$ Counter target spell unless its controller pays 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_field.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunken_hope.txt b/res/cardsfolder/sunken_hope.txt deleted file mode 100644 index 51c5e9d3d82..00000000000 --- a/res/cardsfolder/sunken_hope.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunken Hope -ManaCost:3 U U -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Each | TriggerZones$ Battlefield | Execute$ TrigChangeZoneYou | TriggerDescription$ At the beginning of each player's upkeep, that player returns a creature he or she controls to its owner's hand. -SVar:TrigChangeZoneYou:AB$ ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Hidden$ True | ChangeType$ Creature | Defined$ TriggeredPlayer | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_hope.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/37.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunken_ruins.txt b/res/cardsfolder/sunken_ruins.txt deleted file mode 100644 index 538e21ccfc9..00000000000 --- a/res/cardsfolder/sunken_ruins.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sunken Ruins -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ UB T | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -A:AB$ Mana | Cost$ UB T | Produced$ U B | SpellDescription$ Add U B to your mana pool. -A:AB$ Mana | Cost$ UB T | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunken_ruins.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunlance.txt b/res/cardsfolder/sunlance.txt deleted file mode 100644 index 04301306215..00000000000 --- a/res/cardsfolder/sunlance.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sunlance -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ W | ValidTgts$ Creature.nonWhite | TgtPrompt$ Select target nonwhite Creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target nonwhite creature. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card122355.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunpetal_grove.txt b/res/cardsfolder/sunpetal_grove.txt deleted file mode 100644 index 0d0888e938e..00000000000 --- a/res/cardsfolder/sunpetal_grove.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunpetal Grove -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped unless you control a Forest or a Plains. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunpetal_grove.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/228.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunrise_sovereign.txt b/res/cardsfolder/sunrise_sovereign.txt deleted file mode 100644 index 99b41d57872..00000000000 --- a/res/cardsfolder/sunrise_sovereign.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunrise Sovereign -ManaCost:5 R -Types:Creature Giant Warrior -Text:no text -PT:5/5 -K:stPumpAll:Creature.Giant+Other+YouCtrl:2/2/Trample:No Condition:Other Giant creatures you control get +2/+2 and have trample. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunrise_sovereign.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suns_bounty.txt b/res/cardsfolder/suns_bounty.txt deleted file mode 100644 index 61b3d249006..00000000000 --- a/res/cardsfolder/suns_bounty.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sun's Bounty -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 4 | SpellDescription$ You gain 4 life. -K:Recover:1 W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suns_bounty.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunscape_familiar.txt b/res/cardsfolder/sunscape_familiar.txt deleted file mode 100644 index 98937f692c4..00000000000 --- a/res/cardsfolder/sunscape_familiar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunscape Familiar -ManaCost:1 W -Types:Creature Wall -Text:Green spells and blue spells you cast cost 1 less to cast. -PT:0/3 -K:Defender -K:CostChange:Player:Less:1:Spell:green/blue:All:OnlyOneBonus -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscape_familiar.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunscape_master.txt b/res/cardsfolder/sunscape_master.txt deleted file mode 100644 index 2ca2a92b005..00000000000 --- a/res/cardsfolder/sunscape_master.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunscape Master -ManaCost:2 W W -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ U U T | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -A:AB$ PumpAll | Cost$ G G T | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Creatures you control get +2/+2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscape_master.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunscour.txt b/res/cardsfolder/sunscour.txt deleted file mode 100755 index f52b6331251..00000000000 --- a/res/cardsfolder/sunscour.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunscour -ManaCost:5 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 5 W W | ValidCards$ Creature | SpellDescription$ Destroy all creatures. -A:SP$ DestroyAll | Cost$ ExileFromHand<2/Card.White> | ValidCards$ Creature | CostDesc$ You may exile two white cards from your hand | SpellDescription$ rather than pay CARDNAME's mana cost. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunscour.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunseed_nurturer.txt b/res/cardsfolder/sunseed_nurturer.txt deleted file mode 100644 index a3c0d175f7d..00000000000 --- a/res/cardsfolder/sunseed_nurturer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sunseed Nurturer -ManaCost:2 W -Types:Creature Human Druid Wizard -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | IsPresent$ Creature.powerGE5+YouCtrl | Execute$ TrigLife | TriggerDescription$ At the beginning of your end step, if you control a creature with power 5 or greater, you may gain 2 life. -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:TrigLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunseed_nurturer.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunspear_shikari.txt b/res/cardsfolder/sunspear_shikari.txt deleted file mode 100644 index c7333529dc0..00000000000 --- a/res/cardsfolder/sunspear_shikari.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunspear Shikari -ManaCost:1 W -Types:Creature Cat Soldier -Text:no text -PT:2/2 -K:stPumpSelf:Permanent.equipped:0/0/First Strike & Lifelink:No Condition:As long as Sunspear Shikari is equipped, it has first strike and lifelink. -SVar:EquipMe:Once -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunspear_shikari.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunspring_expedition.txt b/res/cardsfolder/sunspring_expedition.txt deleted file mode 100644 index cecd3656ead..00000000000 --- a/res/cardsfolder/sunspring_expedition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sunspring Expedition -ManaCost:W -Types:Enchantment -Text:no text -A:AB$ GainLife | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | Defined$ You | LifeAmount$ 8 | SpellDescription$ You gain 8 life. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunspring_expedition.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunstone.txt b/res/cardsfolder/sunstone.txt deleted file mode 100644 index fbc5a32a414..00000000000 --- a/res/cardsfolder/sunstone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sunstone -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Fog | Cost$ 2 Sac<1/Land.Snow> | CostDesc$ 2, Sacrifice a snow land: | SpellDescription$ Prevent all combat damage that would be dealt this turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunstone.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunstrike_legionnaire.txt b/res/cardsfolder/sunstrike_legionnaire.txt deleted file mode 100644 index 8176f4ea5bf..00000000000 --- a/res/cardsfolder/sunstrike_legionnaire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sunstrike Legionnaire -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:CARDNAME doesn't untap during your untap step. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever another creature enters the battlefield, untap CARDNAME. -A:AB$ Tap | Cost$ T | ValidTgts$ Creature.cmcLE3 | TgtPrompt$ Select target creature with converted mana cost 3 or less | SpellDescription$ Tap target creature with converted mana cost 3 or less. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunstrike_legionnaire.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suntail_hawk.txt b/res/cardsfolder/suntail_hawk.txt deleted file mode 100644 index 638d8952082..00000000000 --- a/res/cardsfolder/suntail_hawk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Suntail Hawk -ManaCost:W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suntail_hawk.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/51.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/49.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/28.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suntouched_myr.txt b/res/cardsfolder/suntouched_myr.txt deleted file mode 100644 index 9599431257c..00000000000 --- a/res/cardsfolder/suntouched_myr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Suntouched Myr -ManaCost:3 -Types:Artifact Creature Myr -Text:no text -PT:0/0 -K:Sunburst -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suntouched_myr.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sunweb.txt b/res/cardsfolder/sunweb.txt deleted file mode 100644 index c39dd8370f7..00000000000 --- a/res/cardsfolder/sunweb.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Sunweb -ManaCost:3 W -Types:Creature Wall -Text:no text -PT:5/6 -K:Flying -K:Defender -K:CARDNAME can't block creatures with power 2 or less. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunweb.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/52.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/46.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/246.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/supreme_exemplar.txt b/res/cardsfolder/supreme_exemplar.txt deleted file mode 100644 index 79deb3976f8..00000000000 --- a/res/cardsfolder/supreme_exemplar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Supreme Exemplar -ManaCost:6 U -Types:Creature Elemental -Text:no text -PT:10/10 -K:Flying -K:Champion:Elemental -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/supreme_exemplar.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/supreme_inquisitor.txt b/res/cardsfolder/supreme_inquisitor.txt deleted file mode 100644 index 6aaa369ea0e..00000000000 --- a/res/cardsfolder/supreme_inquisitor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Supreme Inquisitor -ManaCost:3 U U -Types:Creature Human Wizard -Text:no text -PT:1/3 -A:AB$ ChangeZone | Cost$ tapXType<5/Wizard> | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ 5 | IsCurse$ True | SpellDescription$ Search target player's library for up to five cards and exile them. Then that player shuffles his or her library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/supreme_inquisitor.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suqata_assassin.txt b/res/cardsfolder/suqata_assassin.txt deleted file mode 100644 index ae2fc05a622..00000000000 --- a/res/cardsfolder/suqata_assassin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Suq'Ata Assassin -ManaCost:1 B B -Types:Creature Human Assassin -Text:no text -PT:1/1 -K:Fear -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ Opponent | Num$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/suqata_assassin.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suqata_firewalker.txt b/res/cardsfolder/suqata_firewalker.txt deleted file mode 100644 index 1fd1226d151..00000000000 --- a/res/cardsfolder/suqata_firewalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Suq'Ata Firewalker -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:0/1 -K:CARDNAME can't be the target of red spells or abilities from red sources. -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/suqata_firewalker.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suqata_lancer.txt b/res/cardsfolder/suqata_lancer.txt deleted file mode 100644 index 495fbcb72f6..00000000000 --- a/res/cardsfolder/suqata_lancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Suq'Ata Lancer -ManaCost:2 R -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Haste -K:Flanking -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suqata_lancer.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/96.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/69.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surge_node.txt b/res/cardsfolder/surge_node.txt deleted file mode 100644 index 0b6dae43bb0..00000000000 --- a/res/cardsfolder/surge_node.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Surge Node -ManaCost:1 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:6 -A:AB$ PutCounter | Cost$ 1 T SubCounter<1/CHARGE> | ValidTgts$ Artifact | TgtPrompt$ Select target Artifact | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on target artifact. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_node.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surge_of_strength.txt b/res/cardsfolder/surge_of_strength.txt deleted file mode 100644 index 61138b7ed92..00000000000 --- a/res/cardsfolder/surge_of_strength.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Surge of Strength -ManaCost:R G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R G Discard<1/Card.Green;Card.Red> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | KW$ Trample | CostDesc$ As an additional cost to cast Surge of Strength, discard a red or green card. | SpellDescription$ Target creature gains trample and gets +X/+0 until end of turn, where X is that creature's converted mana cost. -SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_strength.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surge_of_thoughtweft.txt b/res/cardsfolder/surge_of_thoughtweft.txt deleted file mode 100644 index 39c1f857f01..00000000000 --- a/res/cardsfolder/surge_of_thoughtweft.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Surge of Thoughtweft -ManaCost:1 W -Types:Tribal Instant Kithkin -Text:no text -A:SP$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SubAbility$ SVar=DBDraw | SpellDescription$ Creatures you control get +1/+1 until end of turn. If you control a Kithkin, draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 | ConditionPresent$ Kithkin.YouCtrl | ConditionCompare$ GE1 | ConditionDescription$ If you control a Kithkin, -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surge_of_thoughtweft.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surging_aether.txt b/res/cardsfolder/surging_aether.txt deleted file mode 100644 index 9dbb16c6cf3..00000000000 --- a/res/cardsfolder/surging_aether.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Surging AEther -ManaCost:3 U -Types:Instant -Text: -K:Ripple:4 -A:SP$ ChangeZone | Cost$ 3 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surging_aether.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surging_dementia.txt b/res/cardsfolder/surging_dementia.txt deleted file mode 100644 index ca0273a6570..00000000000 --- a/res/cardsfolder/surging_dementia.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Surging Dementia -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. -K:Ripple:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surging_dementia.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surging_flame.txt b/res/cardsfolder/surging_flame.txt deleted file mode 100644 index 3d60463bf51..00000000000 --- a/res/cardsfolder/surging_flame.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Surging Flame -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -K:Ripple:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surging_flame.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/99.jpg -End diff --git a/res/cardsfolder/surging_might.txt b/res/cardsfolder/surging_might.txt deleted file mode 100644 index 3fa4a330314..00000000000 --- a/res/cardsfolder/surging_might.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Surging Might -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2 -K:Ripple:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surging_might.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surging_sentinels.txt b/res/cardsfolder/surging_sentinels.txt deleted file mode 100644 index d7007754341..00000000000 --- a/res/cardsfolder/surging_sentinels.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Surging Sentinels -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:2/1 -K:First Strike -K:Ripple:4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surging_sentinels.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surrakar_banisher.txt b/res/cardsfolder/surrakar_banisher.txt deleted file mode 100644 index 14f013d8c65..00000000000 --- a/res/cardsfolder/surrakar_banisher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Surrakar Banisher -ManaCost:4 U -Types:Creature Surrakar -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target tapped creature to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Hand -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surrakar_banisher.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surrakar_marauder.txt b/res/cardsfolder/surrakar_marauder.txt deleted file mode 100644 index 9d6aaeabb23..00000000000 --- a/res/cardsfolder/surrakar_marauder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Surrakar Marauder -ManaCost:1 B -Types:Creature Surrakar -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gains intimidate until end of turn. (It can't be blocked except by artifact creatures and/or creatures that share a color with it.) -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Intimidate -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surrakar_marauder.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surrakar_spellblade.txt b/res/cardsfolder/surrakar_spellblade.txt deleted file mode 100644 index c3e2d3de942..00000000000 --- a/res/cardsfolder/surrakar_spellblade.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Surrakar Spellblade -ManaCost:1 U U -Types:Creature Surrakar -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Instant.YouCtrl,Sorcery.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a instant or sorcery spell, you may put a charge counter on CARDNAME. -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may draw X cards, where X is the number of charge counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ X -SVar:X:Count$CardCounters.CHARGE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/surrakar_spellblade.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/surveilling_sprite.txt b/res/cardsfolder/surveilling_sprite.txt deleted file mode 100644 index 2615bcd2e0a..00000000000 --- a/res/cardsfolder/surveilling_sprite.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Surveilling Sprite -ManaCost:1 U -Types:Creature Faerie Rogue -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:SacMe:1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/surveilling_sprite.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/67.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/survival_of_the_fittest.txt b/res/cardsfolder/survival_of_the_fittest.txt deleted file mode 100644 index 800f4c8aee3..00000000000 --- a/res/cardsfolder/survival_of_the_fittest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Survival of the Fittest -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ G Discard<1/Creature> | Origin$ Library | Destination$ Hand | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a Creature card and put it into your hand. Then shuffle your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/survival_of_the_fittest.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sustainer_of_the_realm.txt b/res/cardsfolder/sustainer_of_the_realm.txt deleted file mode 100644 index 56480afceb0..00000000000 --- a/res/cardsfolder/sustainer_of_the_realm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sustainer of the Realm -ManaCost:2 W W -Types:Creature Angel -Text:no text -PT:2/3 -K:Flying -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +0/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sustainer_of_the_realm.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/23.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sustaining_spirit.txt b/res/cardsfolder/sustaining_spirit.txt deleted file mode 100644 index 1476dc30a13..00000000000 --- a/res/cardsfolder/sustaining_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sustaining Spirit -ManaCost:1 W -Types:Creature Angel Spirit -Text:no text -PT:0/3 -K:Cumulative upkeep:1 W -K:Damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sustaining_spirit.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sustenance.txt b/res/cardsfolder/sustenance.txt deleted file mode 100644 index fa4bc6a9386..00000000000 --- a/res/cardsfolder/sustenance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sustenance -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ 1 Sac<1/Land> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sustenance.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/278.jpg -End diff --git a/res/cardsfolder/suture_priest.txt b/res/cardsfolder/suture_priest.txt deleted file mode 100644 index 7c9777040c3..00000000000 --- a/res/cardsfolder/suture_priest.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Suture Priest -ManaCost:1 W -Types:Creature Cleric -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouDontCtrl+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature enters the battlefield under an opponent's control, you may have that player lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/suture_priest.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/suture_spirit.txt b/res/cardsfolder/suture_spirit.txt deleted file mode 100644 index dc7b8149811..00000000000 --- a/res/cardsfolder/suture_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Suture Spirit -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:1/1 -K:Flying -A:AB$ Regenerate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Cost$ WB WB WB | SpellDescription$ Regenerate target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/suture_spirit.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sutured_ghoul.txt b/res/cardsfolder/sutured_ghoul.txt deleted file mode 100644 index b92016f2414..00000000000 --- a/res/cardsfolder/sutured_ghoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sutured Ghoul -ManaCost:4 B B B -Types:Creature Zombie -Text:As Sutured Ghoul enters the battlefield, exile any number of creature cards from your graveyard.\r\nSutured Ghoul's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. -PT:*/* -K:Trample -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sutured_ghoul.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/svogthos_the_restless_tomb.txt b/res/cardsfolder/svogthos_the_restless_tomb.txt deleted file mode 100644 index 4b78edc40e9..00000000000 --- a/res/cardsfolder/svogthos_the_restless_tomb.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Svogthos, the Restless Tomb -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Animate | Cost$ 3 B G | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Zombie,Plant | Colors$ Black,Green | Keywords$ This creature's power and toughness are each equal to the number of creature cards in your graveyard. | SpellDescription$ Until end of turn, CARDNAME 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. -SVar:This creature's power and toughness are each equal to the number of creature cards in your graveyard.:stSetPT:Count$TypeInYourYard.Creature:Count$TypeInYourYard.Creature:This creature's power and toughness are each equal to the number of creature cards in your graveyard. -SVar:X:Count$TypeInYourYard.Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/svogthos_the_restless_tomb.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/svyelunite_priest.txt b/res/cardsfolder/svyelunite_priest.txt deleted file mode 100644 index 6533cafd973..00000000000 --- a/res/cardsfolder/svyelunite_priest.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Svyelunite Priest -ManaCost:1 U -Types:Creature Merfolk Cleric -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ U U T | KW$ Shroud | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep | SpellDescription$ 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/svyelunite_priest.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/svyelunite_temple.txt b/res/cardsfolder/svyelunite_temple.txt deleted file mode 100644 index b6158749dc6..00000000000 --- a/res/cardsfolder/svyelunite_temple.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Svyelunite Temple -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | Amount$ 2 | SpellDescription$ Add U U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/svyelunite_temple.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/441.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/329.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swallowing_plague.txt b/res/cardsfolder/swallowing_plague.txt deleted file mode 100644 index 346bcab313d..00000000000 --- a/res/cardsfolder/swallowing_plague.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Swallowing Plague -ManaCost:X B B -Types:Sorcery Arcane -Text:no text -A:SP$ DealDamage | Cost$ X B B | Tgt$ TgtC | NumDmg$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals X damage to target creature and you gain X life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/swallowing_plague.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swamp.txt b/res/cardsfolder/swamp.txt deleted file mode 100644 index d02b5b418af..00000000000 --- a/res/cardsfolder/swamp.txt +++ /dev/null @@ -1,44 +0,0 @@ -Name:Swamp -ManaCost:no cost -Types:Basic Land Swamp -Text:no text -SVar:PicCount:4 -SVar:Rarity:Land -SVar:Picture:http://resources.wizards.com/magic/cards/unh/en-us/card73973.jpg\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159290\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159291\http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=159292 -SetInfo:USG|Land|http://magiccards.info/scans/en/us/339.jpg|4 -SetInfo:TMP|Land|http://magiccards.info/scans/en/tp/334.jpg|4 -SetInfo:ZEN|Land|http://magiccards.info/scans/en/zen/238.jpg|4 -SetInfo:4ED|Land|http://magiccards.info/scans/en/4e/190.jpg|3 -SetInfo:3ED|Land|http://magiccards.info/scans/en/rv/299.jpg|3 -SetInfo:SOM|Land|http://magiccards.info/scans/en/som/238.jpg|4 -SetInfo:TSP|Land|http://magiccards.info/scans/en/ts/290.jpg|4 -SetInfo:ODY|Land|http://magiccards.info/scans/en/od/339.jpg|4 -SetInfo:MIR|Land|http://magiccards.info/scans/en/mr/311.jpg|4 -SetInfo:PTK|Land|http://magiccards.info/scans/en/p3k/172.jpg|3 -SetInfo:7ED|Land|http://magiccards.info/scans/en/7e/346.jpg|4 -SetInfo:POR|Land|http://magiccards.info/scans/en/po/219.jpg|4 -SetInfo:ROE|Land|http://magiccards.info/scans/en/roe/237.jpg|4 -SetInfo:10E|Land|http://magiccards.info/scans/en/10e/372.jpg|4 -SetInfo:RAV|Land|http://magiccards.info/scans/en/rav/295.jpg|4 -SetInfo:6ED|Land|http://magiccards.info/scans/en/6e/339.jpg|4 -SetInfo:5ED|Land|http://magiccards.info/scans/en/5e/442.jpg|4 -SetInfo:ONS|Land|http://magiccards.info/scans/en/on/339.jpg|4 -SetInfo:S99|Land|http://magiccards.info/scans/en/st/162.jpg|4 -SetInfo:MBS|Land|http://magiccards.info/scans/en/mbs/150.jpg|2 -SetInfo:8ED|Land|http://magiccards.info/scans/en/8e/339.jpg|4 -SetInfo:CHK|Land|http://magiccards.info/scans/en/chk/295.jpg|4 -SetInfo:PO2|Land|http://magiccards.info/scans/en/po2/163.jpg|3 -SetInfo:9ED|Land|http://magiccards.info/scans/en/9e/339.jpg|4 -SetInfo:ICE|Land|http://magiccards.info/scans/en/ia/353.jpg|3 -SetInfo:MRD|Land|http://magiccards.info/scans/en/mi/295.jpg|4 -SetInfo:SHM|Land|http://magiccards.info/scans/en/shm/290.jpg|4 -SetInfo:LEA|Land|http://magiccards.info/scans/en/al/290.jpg|2 -SetInfo:LEB|Land|http://magiccards.info/scans/en/be/295.jpg|3 -SetInfo:INV|Land|http://magiccards.info/scans/en/in/339.jpg|4 -SetInfo:MMQ|Land|http://magiccards.info/scans/en/mm/339.jpg|4 -SetInfo:ALA|Land|http://magiccards.info/scans/en/ala/238.jpg|4 -SetInfo:M11|Land|http://magiccards.info/scans/en/m11/238.jpg|4 -SetInfo:M10|Land|http://magiccards.info/scans/en/m10/238.jpg|4 -SetInfo:LRW|Land|http://magiccards.info/scans/en/lw/290.jpg|4 -SetInfo:2ED|Land|http://magiccards.info/scans/en/un/295.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/swamp_mosquito.txt b/res/cardsfolder/swamp_mosquito.txt deleted file mode 100644 index bcc528aab77..00000000000 --- a/res/cardsfolder/swamp_mosquito.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Swamp Mosquito -ManaCost:1 B -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPoison | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, defending player gets a poison counter. (A player with ten or more poison counters loses the game.) -SVar:TrigPoison:AB$Poison | Cost$ 0 | Defined$ Opponent | Num$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/swamp_mosquito.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/30.jpg|2 -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swans_of_bryn_argoll.txt b/res/cardsfolder/swans_of_bryn_argoll.txt deleted file mode 100644 index 30b3e335ce4..00000000000 --- a/res/cardsfolder/swans_of_bryn_argoll.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Swans of Bryn Argoll -ManaCost:2 WU WU -Types:Creature Bird Spirit -Text: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. -PT:4/3 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/swans_of_bryn_argoll.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swarm_of_rats.txt b/res/cardsfolder/swarm_of_rats.txt deleted file mode 100644 index a37c8e16679..00000000000 --- a/res/cardsfolder/swarm_of_rats.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Swarm of Rats -ManaCost:1 B -Types:Creature Rat -Text:no text -PT:*/1 -K:stSetPT:Count$Valid Rat.YouCtrl:1:Swarm of Rats's power is equal to the number of Rats you control. -SVar:BuffedBy:Rat -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/swarm_of_rats.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/167.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/29.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swarmyard.txt b/res/cardsfolder/swarmyard.txt deleted file mode 100644 index a9465be4c5c..00000000000 --- a/res/cardsfolder/swarmyard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Swarmyard -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Regenerate | ValidTgts$ Insect,Rat,Spider,Squirrel | TgtPrompt$ Select target Insect, Rat, Spider, or Squirrel | Cost$ T | SpellDescription$ Regenerate target Insect, Rat, Spider, or Squirrel. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/swarmyard.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swat.txt b/res/cardsfolder/swat.txt deleted file mode 100644 index 94fb1ef667d..00000000000 --- a/res/cardsfolder/swat.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Swat -ManaCost:1 B B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | SpellDescription$ Destroy target creature with power 2 or less. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/swat.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/174.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/69.jpg -End diff --git a/res/cardsfolder/sway_of_the_stars.txt b/res/cardsfolder/sway_of_the_stars.txt deleted file mode 100644 index 8651f3d7dbc..00000000000 --- a/res/cardsfolder/sway_of_the_stars.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sway of the Stars -ManaCost:8 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 8 U U | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBChangeAll | SpellDescription$ 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. -SVar:DBChangeAll:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBChangeAll2 -SVar:DBChangeAll2:DB$ChangeZoneAll | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Library | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 7 | Defined$ Each | SubAbility$ SVar=DBSetLife -SVar:DBSetLife:DB$SetLife | Defined$ Each | LifeAmount$ 7 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sway_of_the_stars.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swelter.txt b/res/cardsfolder/swelter.txt deleted file mode 100644 index dc054c92955..00000000000 --- a/res/cardsfolder/swelter.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Swelter -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to each of two target creatures. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/swelter.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swift_maneuver.txt b/res/cardsfolder/swift_maneuver.txt deleted file mode 100644 index d91ed716d08..00000000000 --- a/res/cardsfolder/swift_maneuver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Swift Maneuver -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ 1 W | Tgt$ TgtCP | Amount$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ 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. -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/swift_maneuver.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swirling_sandstorm.txt b/res/cardsfolder/swirling_sandstorm.txt deleted file mode 100644 index 97ff5959796..00000000000 --- a/res/cardsfolder/swirling_sandstorm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Swirling Sandstorm -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 3 R | NumDmg$ X | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | ValidDescription$ each creature without flying and each player. | SpellDescription$ Threshold - CARDNAME deals 5 damage to each creature without flying if seven or more cards are in your graveyard. -SVar:X:Count$Threshold.5.0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/swirling_sandstorm.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_dancer.txt b/res/cardsfolder/sword_dancer.txt deleted file mode 100644 index 0c2c4ada967..00000000000 --- a/res/cardsfolder/sword_dancer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sword Dancer -ManaCost:1 W -Types:Creature Human Rebel -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ W W | ValidTgts$ Creature.attacking | IsCurse$ True | NumAtt$ -1 | TgtPrompt$ Select target attacking creature | SpellDescription$ Target attacking creature gets -1/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_dancer.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_body_and_mind.txt b/res/cardsfolder/sword_of_body_and_mind.txt deleted file mode 100644 index 47b0d85ed0b..00000000000 --- a/res/cardsfolder/sword_of_body_and_mind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sword of Body and Mind -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has protection from green and from blue. -K:eqPump 2:+2/+2/Protection from green & Protection from blue -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SubAbility$ SVar=DBMill -SVar:DBMill:DB$Mill | Defined$ TriggeredTarget | NumCards$ 10 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_body_and_mind.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_feast_and_famine.txt b/res/cardsfolder/sword_of_feast_and_famine.txt deleted file mode 100644 index ea0ba1a2ab3..00000000000 --- a/res/cardsfolder/sword_of_feast_and_famine.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sword of Feast and Famine -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has protection from black and from green. -K:eqPump 2:+2/+2/Protection from black & Protection from green -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, that player discards a card and you untap all lands you control. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ SVar=DBUntapAll -SVar:DBUntapAll:DB$UntapAll | ValidCards$ Land.YouCtrl -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_feast_and_famine.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_fire_and_ice.txt b/res/cardsfolder/sword_of_fire_and_ice.txt deleted file mode 100644 index 81e347e515d..00000000000 --- a/res/cardsfolder/sword_of_fire_and_ice.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Sword of Fire and Ice -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has protection from red and from blue. -K:eqPump 2:+2/+2/Protection from red & Protection from blue -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDealDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, CARDNAME deals 2 damage to target creature or player and you draw a card. -SVar:TrigDealDamage:AB$DealDamage | Cost$ 0 | Tgt$TgtCP | NumDmg$ 2 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_fire_and_ice.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_kaldra.txt b/res/cardsfolder/sword_of_kaldra.txt deleted file mode 100644 index b7997b37dc0..00000000000 --- a/res/cardsfolder/sword_of_kaldra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sword of Kaldra -ManaCost:4 -Types:Legendary Artifact Equipment -Text:no text -K:eqPump 4:+5/+5 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Creature | Execute$ TrigExile | TriggerDescription$ When equipped creature deals damage to a creature, exile that creature. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredTarget | Origin$ Battlefield | Destination$ Exile -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_kaldra.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_light_and_shadow.txt b/res/cardsfolder/sword_of_light_and_shadow.txt deleted file mode 100644 index 522ae90efaa..00000000000 --- a/res/cardsfolder/sword_of_light_and_shadow.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sword of Light and Shadow -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has protection from white and from black.\r\n\r\nWhenever 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. -K:eqPump 2:+2/+2/Protection from white & Protection from black -#Note: This trigger does not work due to some bug in Input where it is getting cleared. When that's fixed, this trigger should work. -#T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigGainLife | TriggerZones$ Battlefield | TriggerDescription$ 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. -#SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 | SubAbility$ SVar=DBReturn -#SVar:DBReturn:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature in your graveyard -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_light_and_shadow.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_the_chosen.txt b/res/cardsfolder/sword_of_the_chosen.txt deleted file mode 100644 index 34b2faf53c3..00000000000 --- a/res/cardsfolder/sword_of_the_chosen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sword of the Chosen -ManaCost:2 -Types:Legendary Artifact -Text:no text -A:AB$ Pump | Cost$ T | ValidTgts$ Creature.Legendary | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target legendary creature gets +2/+2 until end of turn. | TgtPrompt$ Select target legendary creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_chosen.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_the_meek.txt b/res/cardsfolder/sword_of_the_meek.txt deleted file mode 100644 index e203dbd0d78..00000000000 --- a/res/cardsfolder/sword_of_the_meek.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sword of the Meek -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+2.\r\nWhenever a 1/1 creature enters the battlefield under your control, you may return CARDNAME from your graveyard to the battlefield, then attach it to that creature. -K:eqPump 2:+1/+2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_meek.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_the_paruns.txt b/res/cardsfolder/sword_of_the_paruns.txt deleted file mode 100644 index d374b3447a3..00000000000 --- a/res/cardsfolder/sword_of_the_paruns.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sword of the Paruns -ManaCost:4 -Types:Artifact Equipment -Text:no text -K:eqPump 3:+0/+0 -K:stPumpAll:Creature.tapped+YouCtrl:2/0:isPresent Card.AttachedBy+tapped:As long as equipped creature is tapped, tapped creatures you control get +2/+0. -K:stPumpAll:Creature.untapped+YouCtrl:0/2:isPresent Card.AttachedBy+untapped:As long as equipped creature is untapped, untapped creatures you control get +0/+2. -A:AB$ TapOrUntap | Cost$ 3 | Defined$ Equipped | IsPresent$ Card.AttachedBy | SpellDescription$ You may tap or untap equipped creature. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_the_paruns.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_vengeance.txt b/res/cardsfolder/sword_of_vengeance.txt deleted file mode 100644 index 8badc8a42be..00000000000 --- a/res/cardsfolder/sword_of_vengeance.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sword of Vengeance -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+0 and has first strike, vigilance, trample, and haste. -K:eqPump 3:+2/+0/First Strike & Vigilance & Trample & Haste -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_vengeance.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sword_of_war_and_peace.txt b/res/cardsfolder/sword_of_war_and_peace.txt deleted file mode 100644 index 8160b6e265c..00000000000 --- a/res/cardsfolder/sword_of_war_and_peace.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Sword of War and Peace -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2 and has protection from red and from white. -K:eqPump 2:+2/+2/Protection from red & Protection from white -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, CARDNAME 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. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredTarget | NumDmg$ X | SubAbility$ SVar=DBGain -SVar:X:TargetedPlayer$CardsInHand -SVar:DBGain:DB$GainLife | Defined$ You | LifeAmount$ Y -SVar:Y:Count$CardsInYourHand -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/sword_of_war_and_peace.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/swords_to_plowshares.txt b/res/cardsfolder/swords_to_plowshares.txt deleted file mode 100644 index 128d46725e8..00000000000 --- a/res/cardsfolder/swords_to_plowshares.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Swords to Plowshares -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. Its controller gains life equal to its power. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ TargetedController | LifeAmount$ X -SVar:X:Targeted$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/br/en-us/card21172.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/224.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/226.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/302.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/278.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/225.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sygg_river_guide.txt b/res/cardsfolder/sygg_river_guide.txt deleted file mode 100644 index 90a01b933e0..00000000000 --- a/res/cardsfolder/sygg_river_guide.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sygg, River Guide -ManaCost:W U -Types:Legendary Creature Merfolk Wizard -Text:no text -PT:2/2 -K:Islandwalk -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sygg_river_guide.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/251.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_basilisk.txt b/res/cardsfolder/sylvan_basilisk.txt deleted file mode 100644 index c2e1e15c4b4..00000000000 --- a/res/cardsfolder/sylvan_basilisk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sylvan Basilisk -ManaCost:3 G G -Types:Creature Basilisk -Text:no text -PT:2/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDestroyBlocker | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, destroy that creature. -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_basilisk.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/86.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/145.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_bounty.txt b/res/cardsfolder/sylvan_bounty.txt deleted file mode 100644 index 2d907ce2cca..00000000000 --- a/res/cardsfolder/sylvan_bounty.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sylvan Bounty -ManaCost:5 G -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 5 G | LifeAmount$ 8 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 8 life. -K:TypeCycling:Basic:1 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_bounty.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/94.jpg -End diff --git a/res/cardsfolder/sylvan_echoes.txt b/res/cardsfolder/sylvan_echoes.txt deleted file mode 100644 index 09312705c49..00000000000 --- a/res/cardsfolder/sylvan_echoes.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvan Echoes -ManaCost:G -Types:Enchantment -Text:no text -T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you clash and win, you may draw a card. (This ability triggers after the clash ends.) -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_echoes.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/237.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_library.txt b/res/cardsfolder/sylvan_library.txt deleted file mode 100644 index 26262ca0704..00000000000 --- a/res/cardsfolder/sylvan_library.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvan Library -ManaCost:1 G -Types:Enchantment -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_library.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/191.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/157.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_messenger.txt b/res/cardsfolder/sylvan_messenger.txt deleted file mode 100644 index 801fdc2b665..00000000000 --- a/res/cardsfolder/sylvan_messenger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Sylvan Messenger -ManaCost:3 G -Types:Creature Elf -Text:no text -PT:2/2 -K:Trample -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Elf -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card27666.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_might.txt b/res/cardsfolder/sylvan_might.txt deleted file mode 100644 index f7138614572..00000000000 --- a/res/cardsfolder/sylvan_might.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sylvan Might -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +2/+2 and gains trample until end of turn. -A:SP$ Pump | Cost$ 2 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Trample | Flashback$ True | CostDesc$ Flashback 2 G G | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_might.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/277.jpg -End diff --git a/res/cardsfolder/sylvan_paradise.txt b/res/cardsfolder/sylvan_paradise.txt deleted file mode 100644 index 0e1547c28c6..00000000000 --- a/res/cardsfolder/sylvan_paradise.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvan Paradise -ManaCost:G -Types:Instant -Text:no text -A:SP$ Animate | Cost$ G | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Green | OverwriteColors$ True | SpellDescription$ Any number of target creatures become green until end of turn. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_paradise.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_ranger.txt b/res/cardsfolder/sylvan_ranger.txt deleted file mode 100644 index c0f40532d68..00000000000 --- a/res/cardsfolder/sylvan_ranger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvan Ranger -ManaCost:1 G -Types:Creature Elf Scout -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, reveal it, put it into your hand, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_ranger.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_safekeeper.txt b/res/cardsfolder/sylvan_safekeeper.txt deleted file mode 100644 index 3ab350cb042..00000000000 --- a/res/cardsfolder/sylvan_safekeeper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvan Safekeeper -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Sac<1/Land> | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | KW$ Shroud | SpellDescription$ Target creature you control gains shroud until end of turn. (It can't be the target of spells or abilities.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_safekeeper.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_scrying.txt b/res/cardsfolder/sylvan_scrying.txt deleted file mode 100644 index 25d865c9276..00000000000 --- a/res/cardsfolder/sylvan_scrying.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sylvan Scrying -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | SpellDescription$ Search your library for a land card, reveal it, and put it into your hand. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_scrying.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/130.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvan_tutor.txt b/res/cardsfolder/sylvan_tutor.txt deleted file mode 100644 index 1ca776dadea..00000000000 --- a/res/cardsfolder/sylvan_tutor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Sylvan Tutor -ManaCost:G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:Rarity:Rare -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/sylvan_tutor.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvok_explorer.txt b/res/cardsfolder/sylvok_explorer.txt deleted file mode 100644 index 3125acb54e4..00000000000 --- a/res/cardsfolder/sylvok_explorer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvok Explorer -ManaCost:1 G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ ManaReflected | Cost$ T | ColorOrType$ Color | Valid$ Land.YouDontCtrl | ReflectProperty$ Produce | SpellDescription$ Add to your mana pool one mana of any color that a land an opponent controls could produce. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvok_explorer.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvok_lifestaff.txt b/res/cardsfolder/sylvok_lifestaff.txt deleted file mode 100644 index f734a15a8e9..00000000000 --- a/res/cardsfolder/sylvok_lifestaff.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Sylvok Lifestaff -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0. -K:eqPump 1:+1/+0 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigGainLife | TriggerDescription$ Whenever equipped creature is put into a graveyard, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvok_lifestaff.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/sylvok_replica.txt b/res/cardsfolder/sylvok_replica.txt deleted file mode 100644 index fbf8cdbfdf9..00000000000 --- a/res/cardsfolder/sylvok_replica.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Sylvok Replica -ManaCost:3 -Types:Artifact Creature Shaman -Text:no text -PT:1/3 -A:AB$ Destroy | Cost$ G Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvok_replica.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/210.jpg -End diff --git a/res/cardsfolder/symbiosis.txt b/res/cardsfolder/symbiosis.txt deleted file mode 100644 index a09c9f2974f..00000000000 --- a/res/cardsfolder/symbiosis.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Symbiosis -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | TargetMin$ 2 | TargetMax$ 2 | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ Two target creatures each get +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiosis.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/symbiotic_beast.txt b/res/cardsfolder/symbiotic_beast.txt deleted file mode 100644 index 4569ffcb9a4..00000000000 --- a/res/cardsfolder/symbiotic_beast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Symbiotic Beast -ManaCost:4 G G -Types:Creature Insect Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put four 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ G 1 1 Insect | TokenAmount$ 4 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiotic_beast.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/287.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/symbiotic_deployment.txt b/res/cardsfolder/symbiotic_deployment.txt deleted file mode 100644 index 8ca3f930e93..00000000000 --- a/res/cardsfolder/symbiotic_deployment.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Symbiotic Deployment -ManaCost:2 G -Types:Enchantment -Text:no text -K:Skip your draw step. -A:AB$ Draw | Cost$ 1 tapXType<2/Creature.YouCtrl> | Defined$ You | NumCards$ 1 | CostDesc$ 1, Tap two untapped creatures you control: | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiotic_deployment.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/symbiotic_elf.txt b/res/cardsfolder/symbiotic_elf.txt deleted file mode 100644 index c39b26e0ac7..00000000000 --- a/res/cardsfolder/symbiotic_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Symbiotic Elf -ManaCost:3 G -Types:Creature Elf -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put two 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 2 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card32216.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/288.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/symbiotic_wurm.txt b/res/cardsfolder/symbiotic_wurm.txt deleted file mode 100644 index 014d2669c33..00000000000 --- a/res/cardsfolder/symbiotic_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Symbiotic Wurm -ManaCost:5 G G G -Types:Creature Wurm -Text:no text -PT:7/7 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put seven 1/1 green Insect creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 7 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbiotic_wurm.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/symbol_of_unsummoning.txt b/res/cardsfolder/symbol_of_unsummoning.txt deleted file mode 100644 index 2a3d27e3789..00000000000 --- a/res/cardsfolder/symbol_of_unsummoning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Symbol of Unsummoning -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/symbol_of_unsummoning.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/synapse_sliver.txt b/res/cardsfolder/synapse_sliver.txt deleted file mode 100644 index fee1fc420e6..00000000000 --- a/res/cardsfolder/synapse_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Synapse Sliver -ManaCost:4 U -Types:Creature Sliver -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Sliver | ValidTarget$ Player | TriggerZones$ Battlefield | CombatDamage$ True | OptionalDecider$ TriggeredSourceController | Execute$ TrigDraw | TriggerDescription$ Whenever a Sliver deals combat damage to a player, its controller may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ TriggeredSourceController | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/synapse_sliver.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/synchronous_sliver.txt b/res/cardsfolder/synchronous_sliver.txt deleted file mode 100644 index 447e39c1e6d..00000000000 --- a/res/cardsfolder/synchronous_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Synchronous Sliver -ManaCost:4 U -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Creature.Sliver:0/0/Vigilance:No Condition:All Sliver creatures have vigilance. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/synchronous_sliver.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/syncopate.txt b/res/cardsfolder/syncopate.txt deleted file mode 100644 index 0413c7a8c05..00000000000 --- a/res/cardsfolder/syncopate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Syncopate -ManaCost:X U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ X U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | Destination$ Exile | UnlessCost$ X | SpellDescription$ 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. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/syncopate.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/synod_artificer.txt b/res/cardsfolder/synod_artificer.txt deleted file mode 100644 index c30f5d3bfbe..00000000000 --- a/res/cardsfolder/synod_artificer.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Synod Artificer -ManaCost:2 U -Types:Creature Vedalken Artificer -Text:no text -PT:1/2 -A:AB$ Tap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Tap X target noncreature artifacts. -A:AB$ Untap | Cost$ X T | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | SpellDescription$ Untap X target noncreature artifacts. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Artifact.nonCreature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/synod_artificer.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/synod_sanctum.txt b/res/cardsfolder/synod_sanctum.txt deleted file mode 100644 index b7005c122a7..00000000000 --- a/res/cardsfolder/synod_sanctum.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Synod Sanctum -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Choose target permanent you control. | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SpellDescription$ Exile target permanent you control. -A:AB$ ChangeZone | Cost$ 2 Sac<1/CARDNAME> | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SpellDescription$ Return all cards exiled with CARDNAME to the battlefield under your control. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/synod_sanctum.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/syphon_life.txt b/res/cardsfolder/syphon_life.txt deleted file mode 100644 index 47d52aea9c3..00000000000 --- a/res/cardsfolder/syphon_life.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Syphon Life -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ LoseLife | Cost$ 1 B B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. -A:SP$ LoseLife | Cost$ 1 B B Discard<1/Land> | ActivatingZone$ Graveyard | CostDesc$ Retrace | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/syphon_life.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/syphon_soul.txt b/res/cardsfolder/syphon_soul.txt deleted file mode 100644 index 0073a7b8e0f..00000000000 --- a/res/cardsfolder/syphon_soul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Syphon Soul -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B | Defined$ Opponent | NumDmg$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 2 damage to each other player. You gain life equal to the damage dealt this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/syphon_soul.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/176.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/159.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/szadek_lord_of_secrets.txt b/res/cardsfolder/szadek_lord_of_secrets.txt deleted file mode 100644 index a5739afcc67..00000000000 --- a/res/cardsfolder/szadek_lord_of_secrets.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Szadek, Lord of Secrets -ManaCost:3 U U B B -Types:Legendary Creature Vampire -Text: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. -K:Flying -PT:5/5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/szadek_lord_of_secrets.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/234.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tablet_of_epityr.txt b/res/cardsfolder/tablet_of_epityr.txt deleted file mode 100644 index 077ba9c55b7..00000000000 --- a/res/cardsfolder/tablet_of_epityr.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tablet of Epityr -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever an artifact you control is put into a graveyard from the battlefield, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tablet_of_epityr.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tahngarth_talruum_hero.txt b/res/cardsfolder/tahngarth_talruum_hero.txt deleted file mode 100644 index c37d93f25ad..00000000000 --- a/res/cardsfolder/tahngarth_talruum_hero.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tahngarth, Talruum Hero -ManaCost:3 R R -Types:Legendary Creature Minotaur Warrior -Text:no text -PT:4/4 -K:Vigilance -A:AB$ DealDamage | Cost$ 1 R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DamageThis | SpellDescription$ CARDNAME deals damage equal to its power to target creature. That creature deals damage equal to its power to CARDNAME. -SVar:DamageThis:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y -SVar:X:Count$CardPower -SVar:Y:Targeted$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tahngarth_talruum_hero.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/74.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/tahngarths_rage.txt b/res/cardsfolder/tahngarths_rage.txt deleted file mode 100644 index 88964a4c6c2..00000000000 --- a/res/cardsfolder/tahngarths_rage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tahngarth's Rage -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -K:stPumpEnchanted:Creature.attacking:3/0:No Condition:Enchanted creature gets +3/+0 as long as it's attacking. Otherwise, it gets -2/-1. -K:stPumpEnchanted:Creature.notattacking:-2/-1:No Condition:no text -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tahngarths_rage.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taiga.txt b/res/cardsfolder/taiga.txt deleted file mode 100644 index 41e91a0051d..00000000000 --- a/res/cardsfolder/taiga.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Taiga -ManaCost:no cost -Types:Land Mountain Forest -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/taiga.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/292.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/298.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/302.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_aether.txt b/res/cardsfolder/tainted_aether.txt deleted file mode 100644 index fd5609f75c9..00000000000 --- a/res/cardsfolder/tainted_aether.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tainted AEther -ManaCost:2 B B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature enters the battlefield, -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouDontCtrl | Execute$ TrigSacrificeAI | TriggerZones$ Battlefield | TriggerDescription$ its controller sacrifices a creature or land. -SVar:TrigSacrifice:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature,Land | Defined$ You -SVar:TrigSacrificeAI:AB$ Sacrifice | Cost$ 0 | SacValid$ Creature,Land | Defined$ Opponent -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_aether.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/161.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_field.txt b/res/cardsfolder/tainted_field.txt deleted file mode 100644 index 1449e6b0fbe..00000000000 --- a/res/cardsfolder/tainted_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tainted Field -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add W to your mana pool. Activate this ability only if you control a Swamp. -A:AB$ Mana | Cost$ T | Produced$ B | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add B to your mana pool. Activate this ability only if you control a Swamp. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_field.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_isle.txt b/res/cardsfolder/tainted_isle.txt deleted file mode 100644 index 4f90b6a257b..00000000000 --- a/res/cardsfolder/tainted_isle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tainted Isle -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add U to your mana pool. Activate this ability only if you control a Swamp. -A:AB$ Mana | Cost$ T | Produced$ B | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add B to your mana pool. Activate this ability only if you control a Swamp. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_isle.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_peak.txt b/res/cardsfolder/tainted_peak.txt deleted file mode 100644 index bfdbfb2c379..00000000000 --- a/res/cardsfolder/tainted_peak.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tainted Peak -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add B to your mana pool. Activate this ability only if you control a Swamp. -A:AB$ Mana | Cost$ T | Produced$ R | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add R to your mana pool. Activate this ability only if you control a Swamp. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_peak.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_strike.txt b/res/cardsfolder/tainted_strike.txt deleted file mode 100644 index e29ae5d9762..00000000000 --- a/res/cardsfolder/tainted_strike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tainted Strike -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | KW$ Infect | SpellDescription$ Target creature gets +1/+0 and gains infect until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_strike.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/80.jpg -End diff --git a/res/cardsfolder/tainted_well.txt b/res/cardsfolder/tainted_well.txt deleted file mode 100644 index e9cc5f55391..00000000000 --- a/res/cardsfolder/tainted_well.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tainted Well -ManaCost:2 B -Types:Enchantment Aura -Text:Enchanted land is a Swamp. -K:Enchant land -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_well.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tainted_wood.txt b/res/cardsfolder/tainted_wood.txt deleted file mode 100644 index 716d97d9f7c..00000000000 --- a/res/cardsfolder/tainted_wood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tainted Wood -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add B to your mana pool. Activate this ability only if you control a Swamp. -A:AB$ Mana | Cost$ T | Produced$ G | IsPresent$ Swamp.YouCtrl | SpellDescription$ Add G to your mana pool. Activate this ability only if you control a Swamp. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tainted_wood.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taj_nar_swordsmith.txt b/res/cardsfolder/taj_nar_swordsmith.txt deleted file mode 100644 index 26d351c5815..00000000000 --- a/res/cardsfolder/taj_nar_swordsmith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Taj-Nar Swordsmith -ManaCost:3 W -Types:Creature Cat Soldier -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ X | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Equipment+cmcLEX | ChangeNum$ 1 -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/taj_nar_swordsmith.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tajuru_archer.txt b/res/cardsfolder/tajuru_archer.txt deleted file mode 100644 index be3999f230a..00000000000 --- a/res/cardsfolder/tajuru_archer.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Tajuru Archer -ManaCost:2 G -Types:Creature Elf Archer Ally -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self| OptionalDecider$ You | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have CARDNAME deal damage to target creature with flying equal to the number of Allies you control. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may have CARDNAME deal damage to target creature with flying equal to the number of Allies you control. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.withFlying | NumDmg$ NumAllies | TgtPrompt$ Select a target creature with flying. -SVar:NumAllies:Count$Valid Ally.YouCtrl -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/tajuru_archer.jpg -SVar:Rarity:Uncommon -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/take_possession.txt b/res/cardsfolder/take_possession.txt deleted file mode 100644 index 84bd320eab6..00000000000 --- a/res/cardsfolder/take_possession.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Take Possession -ManaCost:5 U U -Types:Enchantment Aura -Text:You control enchanted permanent. -K:Split second -K:Enchant permanent -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136199.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/takenos_cavalry.txt b/res/cardsfolder/takenos_cavalry.txt deleted file mode 100644 index de1b236bfbe..00000000000 --- a/res/cardsfolder/takenos_cavalry.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Takeno's Cavalry -ManaCost:3 W -Types:Creature Human Samurai Archer -Text:no text -PT:1/1 -K:Bushido 1 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Spirit.attacking,Spirit.blocking | TgtPrompt$ Select target attacking or blocking Spirit | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target attacking or blocking Spirit. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/takenos_cavalry.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/takenuma_bleeder.txt b/res/cardsfolder/takenuma_bleeder.txt deleted file mode 100644 index a12660a22a1..00000000000 --- a/res/cardsfolder/takenuma_bleeder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Takenuma Bleeder -ManaCost:2 B -Types:Creature Ogre Shaman -Text:no text -PT:3/3 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME attacks or blocks, you lose 1 life if you don't control a Demon. -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigLoseLife | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, you lose 1 life if you don't control a Demon. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 | ConditionPresent$ Demon.YouCtrl | ConditionCompare$ EQ0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/takenuma_bleeder.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_air_ship.txt b/res/cardsfolder/talas_air_ship.txt deleted file mode 100644 index 89699c3dc2d..00000000000 --- a/res/cardsfolder/talas_air_ship.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Talas Air Ship -ManaCost:3 U -Types:Creature Human Pirate -Text:no text -PT:3/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6524.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_explorer.txt b/res/cardsfolder/talas_explorer.txt deleted file mode 100644 index 375cbba9a37..00000000000 --- a/res/cardsfolder/talas_explorer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Talas Explorer -ManaCost:1 U -Types:Creature Human Pirate Scout -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/talas_explorer.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_merchant.txt b/res/cardsfolder/talas_merchant.txt deleted file mode 100644 index 7b8286e6dee..00000000000 --- a/res/cardsfolder/talas_merchant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Talas Merchant -ManaCost:1 U -Types:Creature Human Pirate -Text:no text -PT:1/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6525.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_researcher.txt b/res/cardsfolder/talas_researcher.txt deleted file mode 100644 index 314b940cc06..00000000000 --- a/res/cardsfolder/talas_researcher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Talas Researcher -ManaCost:4 U -Types:Creature Human Pirate Wizard -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ Draw a card. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/talas_researcher.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_scout.txt b/res/cardsfolder/talas_scout.txt deleted file mode 100644 index 522b7444e33..00000000000 --- a/res/cardsfolder/talas_scout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Talas Scout -ManaCost:1 U -Types:Creature Human Pirate Scout -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6521.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talas_warrior.txt b/res/cardsfolder/talas_warrior.txt deleted file mode 100644 index dd700dc7cec..00000000000 --- a/res/cardsfolder/talas_warrior.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Talas Warrior -ManaCost:1 U U -Types:Creature Human Pirate Warrior -Text:no text -PT:2/2 -K:Unblockable -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6545.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talisman_of_dominance.txt b/res/cardsfolder/talisman_of_dominance.txt deleted file mode 100644 index 497f2c41bf7..00000000000 --- a/res/cardsfolder/talisman_of_dominance.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Talisman of Dominance -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talisman_of_dominance.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talisman_of_impulse.txt b/res/cardsfolder/talisman_of_impulse.txt deleted file mode 100644 index 9ebcd657147..00000000000 --- a/res/cardsfolder/talisman_of_impulse.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Talisman of Impulse -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talisman_of_impulse.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/254.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talisman_of_indulgence.txt b/res/cardsfolder/talisman_of_indulgence.txt deleted file mode 100644 index 8dc70048a03..00000000000 --- a/res/cardsfolder/talisman_of_indulgence.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Talisman of Indulgence -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talisman_of_indulgence.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talisman_of_progress.txt b/res/cardsfolder/talisman_of_progress.txt deleted file mode 100644 index 7b8f6670aa3..00000000000 --- a/res/cardsfolder/talisman_of_progress.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Talisman of Progress -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talisman_of_progress.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/256.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talisman_of_unity.txt b/res/cardsfolder/talisman_of_unity.txt deleted file mode 100644 index 9f147167c12..00000000000 --- a/res/cardsfolder/talisman_of_unity.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Talisman of Unity -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talisman_of_unity.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/257.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tallowisp.txt b/res/cardsfolder/tallowisp.txt deleted file mode 100644 index 23f1eb3f6d5..00000000000 --- a/res/cardsfolder/tallowisp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tallowisp -ManaCost:1 W -Types:Creature Spirit -Text:no text -PT:1/3 -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigSearch | TriggerDescription$ 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. -SVar:TrigSearch:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Aura.withEnchant creature | ChangeNum$ 1 | Shuffle$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tallowisp.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talon_sliver.txt b/res/cardsfolder/talon_sliver.txt deleted file mode 100644 index 2db23cec59e..00000000000 --- a/res/cardsfolder/talon_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Talon Sliver -ManaCost:1 W -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/First Strike:No Condition:All Sliver creatures have first strike. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/talon_sliver.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talon_trooper.txt b/res/cardsfolder/talon_trooper.txt deleted file mode 100644 index 48e25a7b825..00000000000 --- a/res/cardsfolder/talon_trooper.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Talon Trooper -ManaCost:1 W U -Types:Creature Bird Scout -Text:no text -PT:2/3 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/talon_trooper.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/14.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talonrend.txt b/res/cardsfolder/talonrend.txt deleted file mode 100644 index ffe29a09ada..00000000000 --- a/res/cardsfolder/talonrend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Talonrend -ManaCost:4 U -Types:Creature Elemental -Text:no text -PT:0/5 -K:Flying -A:AB$ Pump | Cost$ UR | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/talonrend.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/30.jpg -End diff --git a/res/cardsfolder/talruum_champion.txt b/res/cardsfolder/talruum_champion.txt deleted file mode 100644 index fc408c596b2..00000000000 --- a/res/cardsfolder/talruum_champion.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Talruum Champion -ManaCost:4 R -Types:Creature Minotaur -Text:no text -PT:3/3 -K:First Strike -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | Execute$ TrigBlocks | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature loses first strike until end of turn. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigBlocked | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature loses first strike until end of turn. -SVar:TrigBlocks:AB$ Debuff | Cost$ 0 | Defined$ TriggeredAttacker | Keywords$ First Strike -SVar:TrigBlocked:AB$ Debuff | Cost$ 0 | Defined$ TriggeredBlocker | Keywords$ First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/talruum_champion.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talruum_minotaur.txt b/res/cardsfolder/talruum_minotaur.txt deleted file mode 100644 index 0c48f1dc300..00000000000 --- a/res/cardsfolder/talruum_minotaur.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Talruum Minotaur -ManaCost:2 R R -Types:Creature Minotaur -Text:no text -PT:3/3 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card14624.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/210.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/talus_paladin.txt b/res/cardsfolder/talus_paladin.txt deleted file mode 100644 index d7534b5129f..00000000000 --- a/res/cardsfolder/talus_paladin.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Talus Paladin -ManaCost:3 W -Types:Creature Human Knight Ally -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME 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 CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigPumpAll | Secondary$ True | TriggerDescription$ Whenever CARDNAME 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 CARDNAME. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Ally.YouCtrl | KW$ Lifelink | SubAbility$ SVar=DBCounter -SVar:DBCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | OptionalDecider$ You -SVar:PlayMain1:TRUE -SVar:BuffedBy:Ally -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/Talus_Paladin.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tamanoa.txt b/res/cardsfolder/tamanoa.txt deleted file mode 100644 index d29ba1f3222..00000000000 --- a/res/cardsfolder/tamanoa.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tamanoa -ManaCost:R G W -Types:Creature Spirit -Text:no text -PT:2/4 -T:Mode$ DamageDone | ValidSource$ Card.nonCreature+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a noncreature source you control deals damage, you gain that much life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -Svar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tamanoa.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_asp.txt b/res/cardsfolder/tangle_asp.txt deleted file mode 100644 index 4669afaadb4..00000000000 --- a/res/cardsfolder/tangle_asp.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tangle Asp -ManaCost:1 G -Types:Creature Snake -Text:no text -PT:1/2 -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_asp.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_golem.txt b/res/cardsfolder/tangle_golem.txt deleted file mode 100644 index 3e0afe41878..00000000000 --- a/res/cardsfolder/tangle_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tangle Golem -ManaCost:7 -Types:Artifact Creature Golem -Text:Affinity for Forests (This spell costs 1 less to cast for each Forest you control.) -PT:5/4 -K:CostChange:Player:Less:1:Self:All:All:Affinity/Forest -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_golem.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_hulk.txt b/res/cardsfolder/tangle_hulk.txt deleted file mode 100644 index a3a14475dd8..00000000000 --- a/res/cardsfolder/tangle_hulk.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tangle Hulk -ManaCost:5 -Types:Artifact Creature Beast -Text:no text -PT:5/3 -A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME. -# -# I suspect that this SVar may have been a copy and paste mistake. :) -# SVar:RemAIDeck:True -# -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_hulk.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_mantis.txt b/res/cardsfolder/tangle_mantis.txt deleted file mode 100644 index e5d30ae9b00..00000000000 --- a/res/cardsfolder/tangle_mantis.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tangle Mantis -ManaCost:2 G G -Types:Creature Insect -Text:no text -PT:3/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_mantis.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_spider.txt b/res/cardsfolder/tangle_spider.txt deleted file mode 100644 index 802fea9b9ea..00000000000 --- a/res/cardsfolder/tangle_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tangle Spider -ManaCost:4 G G -Types:Creature Spider -Text:no text -PT:3/4 -K:Flash -K:Reach -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_spider.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/85.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/303.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tangle_wire.txt b/res/cardsfolder/tangle_wire.txt deleted file mode 100644 index c1a4f8c9295..00000000000 --- a/res/cardsfolder/tangle_wire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tangle Wire -ManaCost:3 -Types:Artifact -Text: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 CARDNAME. -K:Fading:4 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangle_wire.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tanglebloom.txt b/res/cardsfolder/tanglebloom.txt deleted file mode 100644 index cc1d4de42d2..00000000000 --- a/res/cardsfolder/tanglebloom.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tanglebloom -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 1 T | LifeAmount$ 1 | SpellDescription$ You gain 1 life. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card95221.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/258.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/311.jpg -End diff --git a/res/cardsfolder/tangleroot.txt b/res/cardsfolder/tangleroot.txt deleted file mode 100644 index 5f2d6e81633..00000000000 --- a/res/cardsfolder/tangleroot.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tangleroot -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Creature | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player casts a creature spell, that player adds G to his or her mana pool. -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tangleroot.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/259.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tanglewalker.txt b/res/cardsfolder/tanglewalker.txt deleted file mode 100644 index 283766f0118..00000000000 --- a/res/cardsfolder/tanglewalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tanglewalker -ManaCost:2 G -Types:Creature Dryad -Text:no text -PT:2/2 -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN Unblockable:isPresent Land.Artifact+YouDontCtrl:Each creature you control is unblockable as long as defending player controls an artifact land. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tanglewalker.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taoist_hermit.txt b/res/cardsfolder/taoist_hermit.txt deleted file mode 100644 index 6f95d909e5a..00000000000 --- a/res/cardsfolder/taoist_hermit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Taoist Hermit -ManaCost:2 G -Types:Creature Human Mystic -Text: -PT:2/2 -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/taoist_hermit.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taoist_mystic.txt b/res/cardsfolder/taoist_mystic.txt deleted file mode 100644 index 69a8065545a..00000000000 --- a/res/cardsfolder/taoist_mystic.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Taoist Mystic -ManaCost:2 G -Types:Creature Human Mystic -Text:Taoist Mystic can't be blocked by creatures with horsemanship. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/taoist_mystic.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tar_pit_warrior.txt b/res/cardsfolder/tar_pit_warrior.txt deleted file mode 100644 index b167634ddda..00000000000 --- a/res/cardsfolder/tar_pit_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tar Pit Warrior -ManaCost:2 B -Types:Creature Cyclops Warrior -Text:no text -PT:3/4 -K:When CARDNAME becomes the target of a spell or ability, sacrifice it. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tar_pit_warrior.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tar_pitcher.txt b/res/cardsfolder/tar_pitcher.txt deleted file mode 100644 index b60d39b93ea..00000000000 --- a/res/cardsfolder/tar_pitcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tar Pitcher -ManaCost:3 R -Types:Creature Goblin Shaman -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ T Sac<1/Goblin> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tar_pitcher.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tarfire.txt b/res/cardsfolder/tarfire.txt deleted file mode 100644 index ef9be176733..00000000000 --- a/res/cardsfolder/tarfire.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tarfire -ManaCost:R -Types:Tribal Instant Goblin -Text:no text -A:SP$ DealDamage | Cost$ R | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tarfire.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/194.jpg -End diff --git a/res/cardsfolder/tarmogoyf.txt b/res/cardsfolder/tarmogoyf.txt deleted file mode 100644 index 0a2b92a5ecf..00000000000 --- a/res/cardsfolder/tarmogoyf.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tarmogoyf -ManaCost:1 G -Types:Creature Lhurgoyf -Text: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. -PT:0/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tarmogoyf.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tarnished_citadel.txt b/res/cardsfolder/tarnished_citadel.txt deleted file mode 100644 index c8868454004..00000000000 --- a/res/cardsfolder/tarnished_citadel.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Tarnished Citadel -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBPain | SpellDescription$ Add W to your mana pool. CARDNAME deals 3 damage to you. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 3 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 3 damage to you. -A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ SVar=DBPain | SpellDescription$ Add R to your mana pool. CARDNAME deals 3 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 3 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 3 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tarnished_citadel.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tarox_bladewing.txt b/res/cardsfolder/tarox_bladewing.txt deleted file mode 100644 index d35b86f8e90..00000000000 --- a/res/cardsfolder/tarox_bladewing.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tarox Bladewing -ManaCost:2 R R R -Types:Legendary Creature Dragon -Text:no text -PT:4/3 -K:Flying -K:Haste -A:AB$ Pump | Cost$ Discard<1/Card.namedTarox Bladewing> | NumAtt$ +X | NumDef$ +X | CostDesc$ Grandeur - Discard another card named Tarox Bladewing: | SpellDescription$ Tarox Bladewing gets +X/+X until end of turn, where X is its power. -SVar:X:Count$CardPower -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card136139.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tarpan.txt b/res/cardsfolder/tarpan.txt deleted file mode 100644 index 7b74b4f3065..00000000000 --- a/res/cardsfolder/tarpan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tarpan -ManaCost:G -Types:Creature Horse -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you gain 1 life. -SVar:TrigSac:AB$GainLife | Cost$ 0 | Defined$ TriggeredCardController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tarpan.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/192.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/task_force.txt b/res/cardsfolder/task_force.txt deleted file mode 100755 index 7e955ef58d7..00000000000 --- a/res/cardsfolder/task_force.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Task Force -ManaCost:2 W -Types:Creature Human Rebel -Text:no text -PT:1/3 -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, it gets +0/+3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/task_force.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/task_mage_assembly.txt b/res/cardsfolder/task_mage_assembly.txt deleted file mode 100644 index a3076343a0b..00000000000 --- a/res/cardsfolder/task_mage_assembly.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Task Mage Assembly -ManaCost:2 R -Types:Enchantment -Text:no text -K:When there are no creatures on the battlefield, sacrifice CARDNAME. -A:AB$ DealDamage | Cost$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | AnyPlayer$ True | SorcerySpeed$ True | SpellDescription$ CARDNAME deals 1 damage to target creature. Any player may activate this ability but only any time he or she could cast a sorcery. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/task_mage_assembly.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taste_for_mayhem.txt b/res/cardsfolder/taste_for_mayhem.txt deleted file mode 100644 index d9e904892b4..00000000000 --- a/res/cardsfolder/taste_for_mayhem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Taste for Mayhem -ManaCost:R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+0 -K:stPumpEnchanted:Creature:2/0:Hellbent:Hellbent - Enchanted creature gets an additional +2/+0 as long as you have no cards in hand. -SVar:BuffedBy:Card -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/taste_for_mayhem.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tattered_drake.txt b/res/cardsfolder/tattered_drake.txt deleted file mode 100644 index 237aed1b431..00000000000 --- a/res/cardsfolder/tattered_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tattered Drake -ManaCost:4 U -Types:Creature Zombie Drake -Text:no text -PT:2/2 -K:Flying -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tattered_drake.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/68.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tatterkite.txt b/res/cardsfolder/tatterkite.txt deleted file mode 100644 index 993ef210ab1..00000000000 --- a/res/cardsfolder/tatterkite.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tatterkite -ManaCost:3 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/1 -K:Flying -K:CARDNAME can't have counters placed on it. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tatterkite.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/264.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tattermunge_duo.txt b/res/cardsfolder/tattermunge_duo.txt deleted file mode 100644 index f695d50c1a0..00000000000 --- a/res/cardsfolder/tattermunge_duo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tattermunge Duo -ManaCost:2 RG -Types:Creature Goblin Warrior Shaman -Text:no text -PT:2/3 -T:Mode$ SpellCast | ValidCard$ Card.Red+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump11 | TriggerDescription$ Whenever you cast a red spell, CARDNAME gets +1/+1 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Green+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpKW | TriggerDescription$ Whenever you cast a green spell, CARDNAME gains forestwalk until end of turn. -SVar:TrigPump11:AB$Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ +1 | Defined$ Self -SVar:TrigPumpKW:AB$Pump | Cost$ 0 | KW$ Forestwalk | Defined$ Self -SVar:BuffedBy:Card.Red,Card.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tattermunge_duo.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tattermunge_maniac.txt b/res/cardsfolder/tattermunge_maniac.txt deleted file mode 100644 index 4afb9b7e4eb..00000000000 --- a/res/cardsfolder/tattermunge_maniac.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tattermunge Maniac -ManaCost:RG -Types:Creature Goblin Warrior -Text:no text -PT:2/1 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tattermunge_maniac.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tattermunge_witch.txt b/res/cardsfolder/tattermunge_witch.txt deleted file mode 100644 index 1d7dc245bc1..00000000000 --- a/res/cardsfolder/tattermunge_witch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tattermunge Witch -ManaCost:1 RG -Types:Creature Goblin Shaman -Text:no text -PT:2/1 -A:AB$ PumpAll | Cost$ R G | ValidCards$ Creature.blocked | NumAtt$ +1 | KW$ Trample | SpellDescription$ Each blocked creature gets +1/+0 and gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tattermunge_witch.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taunting_challenge.txt b/res/cardsfolder/taunting_challenge.txt deleted file mode 100644 index 266f8ee6436..00000000000 --- a/res/cardsfolder/taunting_challenge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Taunting Challenge -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN All creatures able to block CARDNAME do so. | SpellDescription$ All creatures able to block target creature this turn do so. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/taunting_challenge.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taunting_elf.txt b/res/cardsfolder/taunting_elf.txt deleted file mode 100644 index f1e1816a47d..00000000000 --- a/res/cardsfolder/taunting_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Taunting Elf -ManaCost:G -Types:Creature Elf -Text:no text -PT:0/1 -K:All creatures able to block CARDNAME do so. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/taunting_elf.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/122.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/290.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/taurean_mauler.txt b/res/cardsfolder/taurean_mauler.txt deleted file mode 100644 index 3dd446d70e3..00000000000 --- a/res/cardsfolder/taurean_mauler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Taurean Mauler -ManaCost:2 R -Types:Creature Shapeshifter -Text:no text -PT:2/2 -K:Changeling -T:Mode$ SpellCast | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever an opponent casts a spell, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/taurean_mauler.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tawnoss_wand.txt b/res/cardsfolder/tawnoss_wand.txt deleted file mode 100644 index 5e3d768e971..00000000000 --- a/res/cardsfolder/tawnoss_wand.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tawnos's Wand -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | ValidTgts$ Creature.powerLE2 | KW$ HIDDEN Unblockable | SpellDescription$ Target creature with power 2 or less is unblockable this turn. | TgtPrompt$ Select target creature with power 2 or less. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tawnoss_wand.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/366.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teardrop_kami.txt b/res/cardsfolder/teardrop_kami.txt deleted file mode 100644 index 5b79574f9ec..00000000000 --- a/res/cardsfolder/teardrop_kami.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Teardrop Kami -ManaCost:U -Types:Creature Spirit -Text:no text -PT:1/1 -A:AB$ TapOrUntap | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/teardrop_kami.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/55.jpg -End diff --git a/res/cardsfolder/tears_of_rage.txt b/res/cardsfolder/tears_of_rage.txt deleted file mode 100644 index 703e5cdb33a..00000000000 --- a/res/cardsfolder/tears_of_rage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tears of Rage -ManaCost:2 R R -Types:Instant -Text:Cast CARDNAME only during the declare attackers step.\r\n -A:SP$ PumpAll | Cost$ 2 R R | ActivatingPhases$ Declare Attackers - Play Instants and Abilities | ValidCards$ Creature.attacking+YouCtrl | NumAtt$ +X | KW$ Trample & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ 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. -SVar:X:Count$Valid Creature.attacking+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tears_of_rage.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tectonic_break.txt b/res/cardsfolder/tectonic_break.txt deleted file mode 100644 index b2b98d92767..00000000000 --- a/res/cardsfolder/tectonic_break.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tectonic Break -ManaCost:X R R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ X R R | Amount$ X | SacValid$ Land | Defined$ Each | SpellDescription$ Each player sacrifices X lands. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_break.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/216.jpg -End diff --git a/res/cardsfolder/tectonic_edge.txt b/res/cardsfolder/tectonic_edge.txt deleted file mode 100644 index 3ee749ca94c..00000000000 --- a/res/cardsfolder/tectonic_edge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tectonic Edge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | Cost$ 1 T Sac<1/CARDNAME> | IsPresent$ Land.YouDontCtrl | PresentCompare$ GE4 | SpellDescription$ Destroy target nonbasic land. Activate this ability only if an opponent controls four or more lands. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_edge.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tectonic_fiend.txt b/res/cardsfolder/tectonic_fiend.txt deleted file mode 100644 index 29e03ca9eac..00000000000 --- a/res/cardsfolder/tectonic_fiend.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tectonic Fiend -ManaCost:4 R R -Types:Creature Elemental -Text:no text -PT:7/7 -K:CARDNAME attacks each turn if able. -K:Echo:4 R R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_fiend.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tectonic_instability.txt b/res/cardsfolder/tectonic_instability.txt deleted file mode 100644 index 93c912c8592..00000000000 --- a/res/cardsfolder/tectonic_instability.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tectonic Instability -ManaCost:2 R -Types:Enchantment -Text:Whenever a land enters the battlefield, tap all lands its controller controls. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tectonic_instability.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teekas_dragon.txt b/res/cardsfolder/teekas_dragon.txt deleted file mode 100644 index 4ea8049b217..00000000000 --- a/res/cardsfolder/teekas_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Teeka's Dragon -ManaCost:9 -Types:Artifact Creature Dragon -Text:no text -PT:5/5 -K:Flying -K:Trample -K:Rampage 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/teekas_dragon.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teetering_peaks.txt b/res/cardsfolder/teetering_peaks.txt deleted file mode 100644 index efe9923445f..00000000000 --- a/res/cardsfolder/teetering_peaks.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Teetering Peaks -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +0 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/teetering_peaks.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teferis_puzzle_box.txt b/res/cardsfolder/teferis_puzzle_box.txt deleted file mode 100644 index d3e1796f471..00000000000 --- a/res/cardsfolder/teferis_puzzle_box.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Teferi's Puzzle Box -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigChangeAll | TriggerDescription$ 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. -SVar:TrigChangeAll:DB$ ChangeZoneAll | Defined$ TriggeredPlayer | Origin$ Hand | Destination$ Library | LibraryPosition$ -1 | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ X | Defined$ TriggeredPlayer | SubAbility$ SVar=DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:X:Remembered$Amount -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_puzzle_box.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/316.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/156.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/314.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/312.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teferis_response.txt b/res/cardsfolder/teferis_response.txt deleted file mode 100644 index 015aa9da25c..00000000000 --- a/res/cardsfolder/teferis_response.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Teferi's Response -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell,Ability | ValidTgts$ Card | DestroyPermanent$ True | TargetValidTargeting$ Land.YouCtrl | SpellDescription$ 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. | SubAbility$ SVar=DB -SVar:DB:DB$Draw | NumCards$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/teferis_response.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tek.txt b/res/cardsfolder/tek.txt deleted file mode 100644 index 2e1db421de0..00000000000 --- a/res/cardsfolder/tek.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Tek -ManaCost:5 -Types:Artifact Creature Dragon -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/2:isPresent Plains.YouCtrl:Tek gets +0/+2 as long as you control a Plains, -K:stPumpSelf:Creature:0/0/Flying:isPresent Island.YouCtrl:has flying as long as you control an Island, -K:stPumpSelf:Creature:2/0:isPresent Swamp.YouCtrl:gets +2/+0 as long as you control a Swamp, -K:stPumpSelf:Creature:0/0/First Strike:isPresent Mountain.YouCtrl:has first strike as long as you control a Mountain, -K:stPumpSelf:Creature:0/0/Trample:isPresent Forest.YouCtrl:has trample as long as you control a Forest. -SVar:RemRandomDeck:True -SVar:BuffedBy:Land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tek.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_archers.txt b/res/cardsfolder/tel_jilad_archers.txt deleted file mode 100644 index 396bdc95d11..00000000000 --- a/res/cardsfolder/tel_jilad_archers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tel-Jilad Archers -ManaCost:4 G -Types:Creature Elf Archer -Text:no text -PT:2/4 -K:Reach -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_archers.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_chosen.txt b/res/cardsfolder/tel_jilad_chosen.txt deleted file mode 100644 index 0ef2e801ef4..00000000000 --- a/res/cardsfolder/tel_jilad_chosen.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Chosen -ManaCost:1 G -Types:Creature Elf Warrior -Text:no text -PT:2/1 -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_chosen.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_defiance.txt b/res/cardsfolder/tel_jilad_defiance.txt deleted file mode 100644 index 69bd91fe87c..00000000000 --- a/res/cardsfolder/tel_jilad_defiance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Defiance -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from artifacts | SpellDescription$ Target creature gains protection from artifacts until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_defiance.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/129.jpg -End diff --git a/res/cardsfolder/tel_jilad_exile.txt b/res/cardsfolder/tel_jilad_exile.txt deleted file mode 100644 index 9358110a211..00000000000 --- a/res/cardsfolder/tel_jilad_exile.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Exile -ManaCost:3 G -Types:Creature Troll Warrior -Text:no text -PT:2/3 -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_exile.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_fallen.txt b/res/cardsfolder/tel_jilad_fallen.txt deleted file mode 100644 index bf3cc52ae1e..00000000000 --- a/res/cardsfolder/tel_jilad_fallen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tel-Jilad Fallen -ManaCost:2 G G -Types:Creature Elf Warrior -Text:no text -PT:3/1 -K:Protection from artifacts -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_fallen.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_justice.txt b/res/cardsfolder/tel_jilad_justice.txt deleted file mode 100644 index b11f975a9cc..00000000000 --- a/res/cardsfolder/tel_jilad_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Justice -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SubAbility$ SVar=DBScry | SpellDescription$ 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.) -SVar:DBScry:DB$Scry | ScryNum$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_justice.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_lifebreather.txt b/res/cardsfolder/tel_jilad_lifebreather.txt deleted file mode 100644 index 097c84fcd02..00000000000 --- a/res/cardsfolder/tel_jilad_lifebreather.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Lifebreather -ManaCost:4 G -Types:Creature Troll Shaman -Text:no text -PT:3/2 -A:AB$ Regenerate | Cost$ G T Sac<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_lifebreather.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_outrider.txt b/res/cardsfolder/tel_jilad_outrider.txt deleted file mode 100644 index 17ddbf01eaa..00000000000 --- a/res/cardsfolder/tel_jilad_outrider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tel-Jilad Outrider -ManaCost:3 G -Types:Creature Elf Warrior -Text:no text -PT:3/1 -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_outrider.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tel_jilad_wolf.txt b/res/cardsfolder/tel_jilad_wolf.txt deleted file mode 100644 index 405a0fc9ebe..00000000000 --- a/res/cardsfolder/tel_jilad_wolf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tel-Jilad Wolf -ManaCost:2 G -Types:Creature Wolf -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.Artifact | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked by an artifact creature, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tel_jilad_wolf.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telekinetic_bonds.txt b/res/cardsfolder/telekinetic_bonds.txt deleted file mode 100644 index 2ca52fc27bf..00000000000 --- a/res/cardsfolder/telekinetic_bonds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Telekinetic Bonds -ManaCost:2 U U U -Types:Enchantment -Text:no text -T:Mode$ Discarded | ValidPlayer$ Player | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigTapOrUntap | TriggerDescription$ Whenever a player discards a card, you may pay 1 U. If you do, you may tap or untap target permanent. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 1 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/telekinetic_bonds.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telekinetic_sliver.txt b/res/cardsfolder/telekinetic_sliver.txt deleted file mode 100644 index 15541956588..00000000000 --- a/res/cardsfolder/telekinetic_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Telekinetic Sliver -ManaCost:2 U U -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=Tap:no Condition:All Slivers have "Tap: Tap target permanent." -SVar:Tap:AB$Tap | Cost$ T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent. | SpellDescription$ Tap target permanent. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/telekinetic_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telepathic_spies.txt b/res/cardsfolder/telepathic_spies.txt deleted file mode 100644 index e80cf3030c4..00000000000 --- a/res/cardsfolder/telepathic_spies.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Telepathic Spies -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/telepathic_spies.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/47.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telethopter.txt b/res/cardsfolder/telethopter.txt deleted file mode 100644 index 8fbafbcccb2..00000000000 --- a/res/cardsfolder/telethopter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Telethopter -ManaCost:4 -Types:Artifact Creature Thopter -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ tapXType<1/Creature> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/telethopter.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telimtor.txt b/res/cardsfolder/telimtor.txt deleted file mode 100644 index 7dd508d1ee5..00000000000 --- a/res/cardsfolder/telimtor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Telim'Tor -ManaCost:4 R -Types:Legendary Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ When CARDNAME attacks, all attacking creatures with flanking get +1/+1 until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking+withFlanking | NumAtt$ 1 | NumDef$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/telimtor.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/197.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telimtors_darts.txt b/res/cardsfolder/telimtors_darts.txt deleted file mode 100644 index e097470cb10..00000000000 --- a/res/cardsfolder/telimtors_darts.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Telim'Tor's Darts -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 2 T | Tgt$ TgtP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/telimtors_darts.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telimtors_edict.txt b/res/cardsfolder/telimtors_edict.txt deleted file mode 100644 index c1bed77bec8..00000000000 --- a/res/cardsfolder/telimtors_edict.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Telim'Tor's Edict -ManaCost:R -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ R | ValidTgts$ Permanet.YouCtrl,Permanet.YouOwn | TgtPrompt$ Select target permanent you own or control | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent you own or control. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/telimtors_edict.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teller_of_tales.txt b/res/cardsfolder/teller_of_tales.txt deleted file mode 100644 index 366ea9158dc..00000000000 --- a/res/cardsfolder/teller_of_tales.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Teller of Tales -ManaCost:3 U U -Types:Creature Spirit -Text:no text -PT:3/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.Spirit,Card.Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTapOrUntap | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may tap or untap target creature. -SVar:TrigTapOrUntap:AB$TapOrUntap | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/teller_of_tales.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/telling_time.txt b/res/cardsfolder/telling_time.txt deleted file mode 100644 index b67c182f9fe..00000000000 --- a/res/cardsfolder/telling_time.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Telling Time -ManaCost:1 U -Types:Instant -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/telling_time.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/69.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tempered_steel.txt b/res/cardsfolder/tempered_steel.txt deleted file mode 100644 index d56bcb9bb84..00000000000 --- a/res/cardsfolder/tempered_steel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tempered Steel -ManaCost:1 W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.Artifact+YouCtrl:2/2:No Condition:Artifact creatures you control get +2/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tempered_steel.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tempest_drake.txt b/res/cardsfolder/tempest_drake.txt deleted file mode 100644 index 240132a53cb..00000000000 --- a/res/cardsfolder/tempest_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tempest Drake -ManaCost:1 W U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/vi/en-us/card3746.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tempest_of_light.txt b/res/cardsfolder/tempest_of_light.txt deleted file mode 100644 index 54b53de25dd..00000000000 --- a/res/cardsfolder/tempest_of_light.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tempest of Light -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 2 W | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tempest_of_light.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/28.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/36.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/50.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/51.jpg -End diff --git a/res/cardsfolder/tempest_owl.txt b/res/cardsfolder/tempest_owl.txt deleted file mode 100644 index 27c1e6c368e..00000000000 --- a/res/cardsfolder/tempest_owl.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tempest Owl -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/2 -K:Flying -K:Kicker:4 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, tap up to three target permanents. -SVar:TrigTap:AB$Tap | Cost$ 0 | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select up to three target permanents | ValidTgts$ Permanent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tempest_owl.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temple_acolyte.txt b/res/cardsfolder/temple_acolyte.txt deleted file mode 100644 index d57db70eed7..00000000000 --- a/res/cardsfolder/temple_acolyte.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Temple Acolyte -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/temple_acolyte.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temple_bell.txt b/res/cardsfolder/temple_bell.txt deleted file mode 100644 index 495f5088930..00000000000 --- a/res/cardsfolder/temple_bell.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Temple Bell -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ T | NumCards$ 1 | SubAbility$ SVar=DBDraw | SpellDescription$ Each player draws a card. -SVar:DBDraw:DB$Draw | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/temple_bell.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temple_elder.txt b/res/cardsfolder/temple_elder.txt deleted file mode 100644 index cec34cd2aad..00000000000 --- a/res/cardsfolder/temple_elder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Temple Elder -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:1/2 -A:AB$ GainLife | Cost$ T | LifeAmount$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep,Draw,Main1,BeginCombat | SpellDescription$ You gain 1 life. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://serv4.tcgimages.eu/img/cards/Portal_Second_Age/temple_elder.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temple_garden.txt b/res/cardsfolder/temple_garden.txt deleted file mode 100644 index 39eb2398317..00000000000 --- a/res/cardsfolder/temple_garden.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Temple Garden -ManaCost:no cost -Types:Land Forest Plains -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89093.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temple_of_the_false_god.txt b/res/cardsfolder/temple_of_the_false_god.txt deleted file mode 100644 index 8150f8838b8..00000000000 --- a/res/cardsfolder/temple_of_the_false_god.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Temple of the False God -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 2 | IsPresent$ Land.YouCtrl | PresentCompare$ GE5 | SpellDescription$ Add 2 to your mana pool. Activate this ability only if you control five or more lands. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/temple_of_the_false_god.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_adept.txt b/res/cardsfolder/temporal_adept.txt deleted file mode 100644 index 8ed1aa98063..00000000000 --- a/res/cardsfolder/temporal_adept.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Temporal Adept -ManaCost:1 U U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U U U T | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_adept.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/106.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/48.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/102.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_aperture.txt b/res/cardsfolder/temporal_aperture.txt deleted file mode 100644 index 20fa658b593..00000000000 --- a/res/cardsfolder/temporal_aperture.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Temporal Aperture -ManaCost:2 -Types:Artifact -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_aperture.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_eddy.txt b/res/cardsfolder/temporal_eddy.txt deleted file mode 100644 index 8e5c7945503..00000000000 --- a/res/cardsfolder/temporal_eddy.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Temporal Eddy -ManaCost:2 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U U | ValidTgts$ Creature,Land | TgtPrompt$ Select target creature or land | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature or land on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_eddy.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_fissure.txt b/res/cardsfolder/temporal_fissure.txt deleted file mode 100644 index fc66c2353b9..00000000000 --- a/res/cardsfolder/temporal_fissure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Temporal Fissure -ManaCost:4 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -K:Storm -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_fissure.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_isolation.txt b/res/cardsfolder/temporal_isolation.txt deleted file mode 100644 index 757b9a4bdcc..00000000000 --- a/res/cardsfolder/temporal_isolation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Temporal Isolation -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:Shadow & HIDDEN Prevent all damage that would be dealt by CARDNAME.:Enchanted creature has shadow. Prevent all damage that would be dealt by enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_isolation.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_manipulation.txt b/res/cardsfolder/temporal_manipulation.txt deleted file mode 100644 index d1a5e2ec204..00000000000 --- a/res/cardsfolder/temporal_manipulation.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Temporal Manipulation -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 3 U U | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_manipulation.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporal_spring.txt b/res/cardsfolder/temporal_spring.txt deleted file mode 100644 index 242638ad1db..00000000000 --- a/res/cardsfolder/temporal_spring.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Temporal Spring -ManaCost:1 G U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target permanent on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporal_spring.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/temporary_insanity.txt b/res/cardsfolder/temporary_insanity.txt deleted file mode 100644 index 01e1884f731..00000000000 --- a/res/cardsfolder/temporary_insanity.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Temporary Insanity -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ GainControl | Cost$ 3 R | ValidTgts$ Creature.powerLTX | TgtPrompt$ Select target creature with power less than or equal to the number of cards in your graveyard | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ 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. -SVar:X:Count$InYourYard -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/temporary_insanity.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tempting_wurm.txt b/res/cardsfolder/tempting_wurm.txt deleted file mode 100644 index 99978add02d..00000000000 --- a/res/cardsfolder/tempting_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tempting Wurm -ManaCost:1 G -Types:Creature Wurm -Text:no text -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. (NOTE: Auras not supported at the moment) -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact,Creature,Enchantment.nonAura,Land | Defined$ Opponent | ChangeNum$ X -SVar:X:Count$InOppHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tempting_wurm.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tendo_ice_bridge.txt b/res/cardsfolder/tendo_ice_bridge.txt deleted file mode 100644 index 1c58fdec843..00000000000 --- a/res/cardsfolder/tendo_ice_bridge.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tendo Ice Bridge -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:1 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tendo_ice_bridge.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tendrils_of_agony.txt b/res/cardsfolder/tendrils_of_agony.txt deleted file mode 100644 index abb12cc675c..00000000000 --- a/res/cardsfolder/tendrils_of_agony.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tendrils of Agony -ManaCost:2 B B -Types:Sorcery -Text:no text -K:Storm -A:SP$ LoseLife | Cost$ 2 B B | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tendrils_of_agony.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tendrils_of_corruption.txt b/res/cardsfolder/tendrils_of_corruption.txt deleted file mode 100644 index e4300097d5a..00000000000 --- a/res/cardsfolder/tendrils_of_corruption.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tendrils of Corruption -ManaCost:3 B -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 3 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals X damage to target creature and you gain X life, where X is the number of Swamps you control. -SVar:DBGainLife:DB$GainLife | LifeAmount$ X -SVar:X:Count$TypeYouCtrl.Swamp -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card106632.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/114.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/136.jpg -End diff --git a/res/cardsfolder/tendrils_of_despair.txt b/res/cardsfolder/tendrils_of_despair.txt deleted file mode 100644 index af00b090a92..00000000000 --- a/res/cardsfolder/tendrils_of_despair.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tendrils of Despair -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B Sac<1/Creature> | ValidTgts$ Opponent | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target opponent discards two cards. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tendrils_of_despair.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/teneb_the_harvester.txt b/res/cardsfolder/teneb_the_harvester.txt deleted file mode 100644 index 438ee96a1b8..00000000000 --- a/res/cardsfolder/teneb_the_harvester.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Teneb, the Harvester -ManaCost:3 B G W -Types:Legendary Creature Dragon -Text:no text -PT:6/6 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigChange | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ChangeNum$ 1 | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/teneb_the_harvester.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tenza_godos_maul.txt b/res/cardsfolder/tenza_godos_maul.txt deleted file mode 100644 index 0b56c3e79a4..00000000000 --- a/res/cardsfolder/tenza_godos_maul.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tenza, Godo's Maul -ManaCost:3 -Types:Legendary Artifact Equipment -Text:Equipped creature gets +1/+1. -K:eqPump 1:+1/+1 -K:stPumpEquipped:Creature.Legendary:2/2:No Condition:As long as it's legendary, it gets an additional +2/+2. -K:stPumpEquipped:Creature.Red:0/0/Trample:No Condition:As long as it's red, it has trample. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tenza_godos_maul.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tephraderm.txt b/res/cardsfolder/tephraderm.txt deleted file mode 100644 index 84644cca2e5..00000000000 --- a/res/cardsfolder/tephraderm.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tephraderm -ManaCost:4 R -Types:Creature Beast -Text:no text -PT:4/5 -T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ Card.Self | Execute$ TrigDealDamage1 | TriggerDescription$ Whenever a creature deals damage to CARDNAME, CARDNAME deals that much damage to that creature. -T:Mode$ DamageDone | ValidSource$ Instant,Sorcery | ValidTarget$ Card.Self | Execute$ TrigDealDamage2 | TriggerDescription$ Whenever a spell deals damage to CARDNAME, CARDNAME deals that much damage to that spell's controller. -SVar:TrigDealDamage1:AB$DealDamage | Cost$ 0 | Defined$ TriggeredSource | NumDmg$ X -SVar:TrigDealDamage2:AB$DealDamage | Cost$ 0 | Defined$ TriggeredSourceController | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tephraderm.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terashis_cry.txt b/res/cardsfolder/terashis_cry.txt deleted file mode 100644 index 13330452938..00000000000 --- a/res/cardsfolder/terashis_cry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terashi's Cry -ManaCost:3 W -Types:Sorcery Arcane -Text:no text -A:SP$ Tap | Cost$ 3 W | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SpellDescription$ Tap up to three target creatures. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/terashis_cry.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terashis_grasp.txt b/res/cardsfolder/terashis_grasp.txt deleted file mode 100644 index 88712cca7f6..00000000000 --- a/res/cardsfolder/terashis_grasp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Terashi's Grasp -ManaCost:2 W -Types:Sorcery Arcane -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target artifact or enchantment. You gain life equal to its converted mana cost. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/terashis_grasp.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/26.jpg -End diff --git a/res/cardsfolder/terashis_verdict.txt b/res/cardsfolder/terashis_verdict.txt deleted file mode 100644 index 143496c9a34..00000000000 --- a/res/cardsfolder/terashis_verdict.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terashi's Verdict -ManaCost:1 W -Types:Instant Arcane -Text:no text -A:SP$ Destroy | Cost$ 1 W | ValidTgts$ Creature.powerLE3+attacking | TgtPrompt$ Select target attacking creature with power 3 or less | SpellDescription$ Destroy target attacking creature with power 3 or less. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/terashis_verdict.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/27.jpg -End diff --git a/res/cardsfolder/terminal_moraine.txt b/res/cardsfolder/terminal_moraine.txt deleted file mode 100644 index ed8f40a861a..00000000000 --- a/res/cardsfolder/terminal_moraine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terminal Moraine -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/terminal_moraine.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terminate.txt b/res/cardsfolder/terminate.txt deleted file mode 100644 index 150bca8a511..00000000000 --- a/res/cardsfolder/terminate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terminate -ManaCost:B R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SpellDescription$ Destroy target creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/terminate.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/46.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/128.jpg -End diff --git a/res/cardsfolder/terohs_faithful.txt b/res/cardsfolder/terohs_faithful.txt deleted file mode 100644 index 3840bc227c9..00000000000 --- a/res/cardsfolder/terohs_faithful.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Teroh's Faithful -ManaCost:3 W -Types:Creature Human Cleric -Text:no text -PT:1/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/terohs_faithful.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terohs_vanguard.txt b/res/cardsfolder/terohs_vanguard.txt deleted file mode 100644 index 3c7b5368878..00000000000 --- a/res/cardsfolder/terohs_vanguard.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Teroh's Vanguard -ManaCost:3 W -Types:Creature Human Nomad -Text:no text -PT:2/3 -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | Threshold$ True | TriggerDescription$ Threshold - As long as seven or more cards are in your graveyard, CARDNAME has "When CARDNAME enters the battlefield, creatures you control gain protection from black until end of turn." -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.YouCtrl | KW$ Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/terohs_vanguard.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terra_eternal.txt b/res/cardsfolder/terra_eternal.txt deleted file mode 100644 index e4c1a0d33e5..00000000000 --- a/res/cardsfolder/terra_eternal.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terra Eternal -ManaCost:2 W -Types:Enchantment -Text:no text -K:stPumpAll:Land:0/0/HIDDEN Indestructible:No Condition:All lands are indestructible. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/terra_eternal.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terra_stomper.txt b/res/cardsfolder/terra_stomper.txt deleted file mode 100644 index cb5cba66308..00000000000 --- a/res/cardsfolder/terra_stomper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Terra Stomper -ManaCost:3 G G G -Types:Creature Beast -Text:no text -PT:8/8 -K:Trample -K:CARDNAME can't be countered. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/terra_stomper.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/187.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terrain_generator.txt b/res/cardsfolder/terrain_generator.txt deleted file mode 100644 index c412d9292ca..00000000000 --- a/res/cardsfolder/terrain_generator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Terrain Generator -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 2 T | ChangeType$ Land.Basic+YouCtrl | ChangeNum$ 1 | Hidden$ True | Origin$ Hand | Destination$ Battlefield | Tapped$ True | SpellDescription$ You may put a basic land card from your hand onto the battlefield tapped. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/terrain_generator.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terramorphic_expanse.txt b/res/cardsfolder/terramorphic_expanse.txt deleted file mode 100644 index ee38c8b90a1..00000000000 --- a/res/cardsfolder/terramorphic_expanse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Terramorphic Expanse -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put it onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card118874.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/229.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/229.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/279.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/360.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terravore.txt b/res/cardsfolder/terravore.txt deleted file mode 100644 index da466a8ed34..00000000000 --- a/res/cardsfolder/terravore.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Terravore -ManaCost:1 G G -Types:Creature Lhurgoyf -Text:no text -PT:1/1 -K:Trample -K:stSetPT:Count$TypeInAllYards.Land:Count$TypeInAllYards.Land:CARDNAME's power and toughness are each equal to the number of land cards in all graveyards. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/terravore.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/territorial_baloth.txt b/res/cardsfolder/territorial_baloth.txt deleted file mode 100644 index 4dbe6ececcf..00000000000 --- a/res/cardsfolder/territorial_baloth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Territorial Baloth -ManaCost:4 G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/territorial_baloth.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/terror.txt b/res/cardsfolder/terror.txt deleted file mode 100644 index 3115f9750da..00000000000 --- a/res/cardsfolder/terror.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Terror -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonArtifact+nonBlack | TgtPrompt$ Select target nonartifact, nonblack creature | NoRegen$ True | SpellDescription$ Destroy target nonartifact, nonblack creature. It can't be regenerated. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/terror.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/39.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/39.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/58.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/48.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/182.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/160.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/40.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/79.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/test_of_endurance.txt b/res/cardsfolder/test_of_endurance.txt deleted file mode 100644 index 3882b5ab011..00000000000 --- a/res/cardsfolder/test_of_endurance.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Test of Endurance -ManaCost:2 W W -Types:Enchantment -Text:At the beginning of your upkeep, if you have 50 or more life, you win the game. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/test_of_endurance.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/testament_of_faith.txt b/res/cardsfolder/testament_of_faith.txt deleted file mode 100644 index 31d3942beff..00000000000 --- a/res/cardsfolder/testament_of_faith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Testament of Faith -ManaCost:W -Types:Enchantment -Text:no text -A:AB$ Animate | Cost$ X | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Wall | Keywords$ Defender | SpellDescription$ CARDNAME becomes an X/X Wall creature with defender until end of turn. It's still an enchantment. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/testament_of_faith.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tethered_griffin.txt b/res/cardsfolder/tethered_griffin.txt deleted file mode 100644 index b6057ce21e3..00000000000 --- a/res/cardsfolder/tethered_griffin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tethered Griffin -ManaCost:W -Types:Creature Griffin -Text:no text -PT:2/3 -K:Flying -K:When you control no enchantments, sacrifice CARDNAME. -SVar:NeedsToPlay:Enchantment.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tethered_griffin.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tethered_skirge.txt b/res/cardsfolder/tethered_skirge.txt deleted file mode 100644 index 373a629b45d..00000000000 --- a/res/cardsfolder/tethered_skirge.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tethered Skirge -ManaCost:2 B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -T:Mode$ SpellAbilityCast | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability, you lose 1 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tethered_skirge.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/70.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tetsuo_umezawa.txt b/res/cardsfolder/tetsuo_umezawa.txt deleted file mode 100644 index 1563490d56a..00000000000 --- a/res/cardsfolder/tetsuo_umezawa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tetsuo Umezawa -ManaCost:R B U -Types:Legendary Creature Human Archer -Text:no text -PT:3/3 -K:CARDNAME can't be the target of Aura spells. -A:AB$ Destroy | Cost$ U B B R T | ValidTgts$ Creature.tapped,Creature.blocking | TgtPrompt$ Select target tapped or blocking creature | SpellDescription$ Destroy target tapped or blocking creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tetsuo_umezawa.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/302.jpg -End diff --git a/res/cardsfolder/teysa_orzhov_scion.txt b/res/cardsfolder/teysa_orzhov_scion.txt deleted file mode 100644 index afa1bd59b13..00000000000 --- a/res/cardsfolder/teysa_orzhov_scion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Teysa, Orzhov Scion -ManaCost:1 W B -Types:Legendary Creature Human Advisor -Text:no text -PT:2/3 -A:AB$ ChangeZone | Cost$ Sac<3/Creature.White> | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Exile | CostDesc$ Sacrifice 3 white creatures: | TgtPrompt$ Select target creature | SpellDescription$ Exile target creature. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Black+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever another black creature you control is put into a graveyard from the battlefield, put a 1/1 white Spirit creature token with flying onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ W 1 1 Spirit | TokenAmount$ 1 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/teysa_orzhov_scion.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tezzeret_agent_of_bolas.txt b/res/cardsfolder/tezzeret_agent_of_bolas.txt deleted file mode 100644 index 8a64988e9a4..00000000000 --- a/res/cardsfolder/tezzeret_agent_of_bolas.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tezzeret, Agent of Bolas -ManaCost:2 U B -Types:Planeswalker Tezzeret -Text:no text -Loyalty:3 -A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact | SpellDescription$ 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. -A:AB$ Animate | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | Power$ 5 | Toughness$ 5 | Types$ Creature | Permanent$ True | SpellDescription$ Target artifact becomes a 5/5 artifact creature. -A:AB$ LoseLife | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SubAbility$ SVar=DBGain | SpellDescription$ Target player loses X life and you gain X life, where X is twice the number of artifacts you control. -SVar:DBGain:DB$GainLife | Defined$ You | LifeAmount$ X -SVar:X:Count$Valid Artifact.YouCtrl/Times.2 -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzeret_agent_of_bolas.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tezzeret_the_seeker.txt b/res/cardsfolder/tezzeret_the_seeker.txt deleted file mode 100644 index 109cf3408fc..00000000000 --- a/res/cardsfolder/tezzeret_the_seeker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tezzeret the Seeker -ManaCost:3 U U -Types:Planeswalker Tezzeret -Text:no text -Loyalty:4 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzeret_the_seeker.jpg -SetInfo:ALA|Mythic|http://magiccards.info/scans/en/ala/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tezzerets_gambit.txt b/res/cardsfolder/tezzerets_gambit.txt deleted file mode 100644 index 064286f669c..00000000000 --- a/res/cardsfolder/tezzerets_gambit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tezzeret's Gambit -ManaCost:3 PU -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 PU | Defined$ You | NumCards$ 2 | SubAbility$ SVar=DBProlif | SpellDescription$ Draw two cards, then proliferate. -SVar:DBProlif:DB$Proliferate -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzerets_gambit.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thalakos_deceiver.txt b/res/cardsfolder/thalakos_deceiver.txt deleted file mode 100644 index 5f4813519ec..00000000000 --- a/res/cardsfolder/thalakos_deceiver.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thalakos Deceiver -ManaCost:3 U -Types:Creature Thalakos Wizard -Text:no text -PT:1/1 -K:Shadow -T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, you may sacrifice it. If you do, gain control of target creature. (This effect lasts indefinitely.) -SVar:TrigGainControl:AB$GainControl | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_deceiver.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thalakos_drifters.txt b/res/cardsfolder/thalakos_drifters.txt deleted file mode 100644 index b50834dbbad..00000000000 --- a/res/cardsfolder/thalakos_drifters.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thalakos Drifters -ManaCost:2 U U -Types:Creature Thalakos -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ Discard<1/Card> | KW$ Shadow | SpellDescription$ CARDNAME gains shadow until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_drifters.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/47.jpg -End diff --git a/res/cardsfolder/thalakos_lowlands.txt b/res/cardsfolder/thalakos_lowlands.txt deleted file mode 100644 index e92cc273068..00000000000 --- a/res/cardsfolder/thalakos_lowlands.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thalakos Lowlands -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add W to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add U to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_lowlands.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/338.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thalakos_mistfolk.txt b/res/cardsfolder/thalakos_mistfolk.txt deleted file mode 100644 index a970a39b24f..00000000000 --- a/res/cardsfolder/thalakos_mistfolk.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Thalakos Mistfolk -ManaCost:2 U -Types:Creature Thalakos Illusion -Text:no text -PT:2/1 -K:Shadow -# -# ChangeZone default to top of library for destination -# -A:AB$ ChangeZone | Cost$ U | Defined$ Self | Origin$ Battlefield | Destination $ Library | SpellDescription$ Put CARDNAME on top of its owner's library. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_mistfolk.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thalakos_scout.txt b/res/cardsfolder/thalakos_scout.txt deleted file mode 100644 index 3c4adad7de7..00000000000 --- a/res/cardsfolder/thalakos_scout.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thalakos Scout -ManaCost:1 U -Types:Creature Thakalos Soldier Scout -Text:no text -PT:2/1 -K:Shadow -A:AB$ ChangeZone | Cost$ Discard<1/Card> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_scout.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/48.jpg -End diff --git a/res/cardsfolder/thalakos_seer.txt b/res/cardsfolder/thalakos_seer.txt deleted file mode 100644 index 25132f2ed54..00000000000 --- a/res/cardsfolder/thalakos_seer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thalakos Seer -ManaCost:U U -Types:Creature Thalakos Wizard -Text:no text -PT:1/1 -K:Shadow -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$TrigDraw | TriggerDescription$ When CARDNAME leaves the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_seer.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thalakos_sentry.txt b/res/cardsfolder/thalakos_sentry.txt deleted file mode 100644 index d8dd0b70ed6..00000000000 --- a/res/cardsfolder/thalakos_sentry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thalakos Sentry -ManaCost:1 U -Types:Creature Thalakos Soldier -Text:no text -PT:1/2 -K:Shadow -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thalakos_sentry.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thallid.txt b/res/cardsfolder/thallid.txt deleted file mode 100644 index 47ac10ef1fa..00000000000 --- a/res/cardsfolder/thallid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thallid -ManaCost:G -Types:Creature Fungus -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thallid.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/87.jpg|4 -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thallid_devourer.txt b/res/cardsfolder/thallid_devourer.txt deleted file mode 100644 index 61c857a2b53..00000000000 --- a/res/cardsfolder/thallid_devourer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thallid Devourer -ManaCost:1 G G -Types:Creature Fungus -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Pump | Cost$ Sac<1/Saproling> | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ Thallid Devourer gets +1/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thallid_devourer.jpg -SetInfo:FEM|Uncommon|http://magiccards.info/scans/en/fe/91.jpg -End diff --git a/res/cardsfolder/thallid_germinator.txt b/res/cardsfolder/thallid_germinator.txt deleted file mode 100644 index 9252a6094a5..00000000000 --- a/res/cardsfolder/thallid_germinator.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thallid Germinator -ManaCost:2 G -Types:Creature Fungus -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Pump | Cost$ Sac<1/Saproling> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thallid_germinator.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/225.jpg -End diff --git a/res/cardsfolder/thallid_shell_dweller.txt b/res/cardsfolder/thallid_shell_dweller.txt deleted file mode 100644 index 68b2f66b559..00000000000 --- a/res/cardsfolder/thallid_shell_dweller.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thallid Shell-Dweller -ManaCost:1 G -Types:Creature Fungus -Text:no text -PT:0/5 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thallid_shell_dweller.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/that_which_was_taken.txt b/res/cardsfolder/that_which_was_taken.txt deleted file mode 100644 index 78ecade4459..00000000000 --- a/res/cardsfolder/that_which_was_taken.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:That Which Was Taken -ManaCost:5 -Types:Legendary Artifact -Text:no text -K:stPumpAll:Permanent.countersGE1DIVINITY:0/0/HIDDEN Indestructible:No Condition:Each permanent with a divinity counter on it is indestructible. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/bok/en-us/card74644.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thaumatog.txt b/res/cardsfolder/thaumatog.txt deleted file mode 100644 index 14bde46c6ec..00000000000 --- a/res/cardsfolder/thaumatog.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thaumatog -ManaCost:1 W G -Types:Creature Atog -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ Sac<1/Enchantment> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Thaumatog gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ Sac<1/Land> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Thaumatog gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thaumatog.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/295.jpg -End diff --git a/res/cardsfolder/thawing_glaciers.txt b/res/cardsfolder/thawing_glaciers.txt deleted file mode 100644 index bed44644348..00000000000 --- a/res/cardsfolder/thawing_glaciers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thawing Glaciers -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ ChangeZone | Cost$ 1 T | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | Shuffle$ True | SubAbility$ SVar=DBDelTrig | SpellDescription$ Search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. Return CARDNAME to its owner's hand at the beginning of the next cleanup step. -SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return CARDNAME to its owner's hand at the beginning of the next cleanup step. -SVar:TrigBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thawing_glaciers.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_abyss.txt b/res/cardsfolder/the_abyss.txt deleted file mode 100644 index d4338e3fd5a..00000000000 --- a/res/cardsfolder/the_abyss.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:The Abyss -ManaCost:3 B -Types:World Enchantment -Text: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. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_abyss.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_brute.txt b/res/cardsfolder/the_brute.txt deleted file mode 100644 index 231b0a30f14..00000000000 --- a/res/cardsfolder/the_brute.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:The Brute -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+0 -A:AB$ Regenerate | Cost$ R R R | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_brute.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/272.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/244.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_hive.txt b/res/cardsfolder/the_hive.txt deleted file mode 100644 index 6c545aebc4e..00000000000 --- a/res/cardsfolder/the_hive.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:The Hive -ManaCost:5 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 5 T | TokenAmount$ 1 | TokenName$ Wasp | TokenTypes$ Artifact,Creature,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put a 1/1 colorless Insect artifact creature token with flying named Wasp onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_hive.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/272.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/274.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/402.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/369.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/324.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/315.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/277.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_lady_of_the_mountain.txt b/res/cardsfolder/the_lady_of_the_mountain.txt deleted file mode 100644 index cfb689a011e..00000000000 --- a/res/cardsfolder/the_lady_of_the_mountain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:The Lady of the Mountain -ManaCost:4 R G -Types:Legendary Creature Giant -Text:no text -PT:5/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1689.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/303.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_rack.txt b/res/cardsfolder/the_rack.txt deleted file mode 100644 index 37c72faea11..00000000000 --- a/res/cardsfolder/the_rack.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:The Rack -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ LT3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each opponent's upkeep, CARDNAME deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/NMinus.3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_rack.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/113.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/278.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/370.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_tabernacle_at_pendrell_vale.txt b/res/cardsfolder/the_tabernacle_at_pendrell_vale.txt deleted file mode 100644 index c0c5d0735fb..00000000000 --- a/res/cardsfolder/the_tabernacle_at_pendrell_vale.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:The Tabernacle at Pendrell Vale -ManaCost:no cost -Types:Legendary Land -Text:no text -K:stPumpAll:Creature:0/0/At the beginning of your upkeep, destroy CARDNAME unless you pay 1:No Condition:All creatures have "At the beginning of your upkeep, destroy this creature unless you pay 1." -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/the_tabernacle_at_pendrell_vale.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/the_unspeakable.txt b/res/cardsfolder/the_unspeakable.txt deleted file mode 100644 index d8bf195dbe7..00000000000 --- a/res/cardsfolder/the_unspeakable.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:The Unspeakable -ManaCost:6 U U U -Types:Legendary Creature Spirit -Text:no text -PT:6/7 -K:Flying -K:Trample -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReturn | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may return target Arcane card from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Arcane.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card78693.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/theft_of_dreams.txt b/res/cardsfolder/theft_of_dreams.txt deleted file mode 100644 index 5d735207249..00000000000 --- a/res/cardsfolder/theft_of_dreams.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Theft of Dreams -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ X | SpellDescription$ Draw a card for each tapped creature target opponent controls. -SVar:X:Count$TypeOppCtrlTapped.Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/theft_of_dreams.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/49.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/73.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thelonite_hermit.txt b/res/cardsfolder/thelonite_hermit.txt deleted file mode 100644 index 3bc0cc9a22d..00000000000 --- a/res/cardsfolder/thelonite_hermit.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thelonite Hermit -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -K:Morph:3 G G -K:stPumpAll:Creature.Saproling:1/1:No Condition:Saproling creatures get +1/+1. -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, put four 1/1 green Saproling creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 4 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put four 1/1 green Saproling creature tokens onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thelonite_hermit.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thermal_blast.txt b/res/cardsfolder/thermal_blast.txt deleted file mode 100644 index e1203027ec5..00000000000 --- a/res/cardsfolder/thermal_blast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thermal Blast -ManaCost:4 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals 3 damage to target creature. Threshold - CARDNAME deals 5 damage to that creature instead if seven or more cards are in your graveyard. -SVar:X:Count$Threshold.5.3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thermal_blast.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/224.jpg -End diff --git a/res/cardsfolder/thermal_glider.txt b/res/cardsfolder/thermal_glider.txt deleted file mode 100644 index 83086b4caa0..00000000000 --- a/res/cardsfolder/thermal_glider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thermal Glider -ManaCost:2 W -Types:Creature Human Rebel -Text:no text -PT:2/1 -K:Flying -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thermal_glider.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thermal_navigator.txt b/res/cardsfolder/thermal_navigator.txt deleted file mode 100644 index 0a19209641f..00000000000 --- a/res/cardsfolder/thermal_navigator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thermal Navigator -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Artifact> | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thermal_navigator.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thermokarst.txt b/res/cardsfolder/thermokarst.txt deleted file mode 100644 index 685e13f235c..00000000000 --- a/res/cardsfolder/thermokarst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thermokarst -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SubAbility$ SVar=DBGainLife | SpellDescription$ Destroy target land. If that land was a snow land, you gain 1 life. -SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 | ConditionDefined$ Targeted | ConditionPresent$ Land.Snow | ConditionCompare$ EQ1 | ConditionDescription$ If that land was a snow land, -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thermokarst.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thermopod.txt b/res/cardsfolder/thermopod.txt deleted file mode 100644 index c660ae28a3c..00000000000 --- a/res/cardsfolder/thermopod.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thermopod -ManaCost:4 R -Types:Snow Creature Slug -Text:no text -PT:4/3 -A:AB$ Mana | Cost$ Sac<1/Creature> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Pump | Cost$ S | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thermopod.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thicket_basilisk.txt b/res/cardsfolder/thicket_basilisk.txt deleted file mode 100644 index 0c5da246e79..00000000000 --- a/res/cardsfolder/thicket_basilisk.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Thicket Basilisk -ManaCost:3 G G -Types:Creature Basilisk -Text:no text -PT:2/4 -T:Mode$ Blocks | ValidCard$ Card.Self | TriggerZones$ Battlefield | DelayedTrigger$ DelayBlockTrig | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature.nonWall | DelayedTrigger$ DelayAttackTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a non-Wall creature, destroy that creature at end of combat. -SVar:DelayBlockTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyAttacker | TriggerDescription$ Destroy attacking creature at end of combat. -SVar:DelayAttackTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyAttacker:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thicket_basilisk.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/127.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/127.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/193.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/158.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/256.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/125.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thief_of_hope.txt b/res/cardsfolder/thief_of_hope.txt deleted file mode 100644 index be0069ef340..00000000000 --- a/res/cardsfolder/thief_of_hope.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thief of Hope -ManaCost:2 B -Types:Creature Spirit -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, target opponent loses 1 life and you gain 1 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | ValidTgts$ Opponent | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -K:Soulshift:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thief_of_hope.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thieving_magpie.txt b/res/cardsfolder/thieving_magpie.txt deleted file mode 100644 index b7f3fb66e02..00000000000 --- a/res/cardsfolder/thieving_magpie.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Thieving Magpie -ManaCost:2 U U -Types:Creature Bird -Text:no text -PT:1/3 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thieving_magpie.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/107.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/49.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/115.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/103.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/think_tank.txt b/res/cardsfolder/think_tank.txt deleted file mode 100644 index 0175ed16eac..00000000000 --- a/res/cardsfolder/think_tank.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Think Tank -ManaCost:2 U -Types:Enchantment -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, look at the top card of your library. You may put that card into your graveyard. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 1 | ChangeNum$ 1 | DestinationZone$ Graveyard | Optional$ True | LibraryPosition2$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/think_tank.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/think_twice.txt b/res/cardsfolder/think_twice.txt deleted file mode 100644 index c373266b392..00000000000 --- a/res/cardsfolder/think_twice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Think Twice -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 U | NumCards$ 1 | SpellDescription$ Draw a card. -A:SP$ Draw | Cost$ 2 U | NumCards$ 1 | Flashback$ True | CostDesc$ Flashback 2 U | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/think_twice.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thirst.txt b/res/cardsfolder/thirst.txt deleted file mode 100644 index e25d2be44da..00000000000 --- a/res/cardsfolder/thirst.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thirst -ManaCost:2 U -Types:Enchantment Aura -Text:Enchanted creature doesn't untap during its controller's untap step. -K:Enchant creature -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay U -K:When CARDNAME enters the battlefield, tap enchanted creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thirst.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thirst_for_knowledge.txt b/res/cardsfolder/thirst_for_knowledge.txt deleted file mode 100644 index a74dac2b145..00000000000 --- a/res/cardsfolder/thirst_for_knowledge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thirst for Knowledge -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 3 | SpellDescription$ Draw three cards. Then discard two cards unless you discard an artifact card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thirst_for_knowledge.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thistledown_duo.txt b/res/cardsfolder/thistledown_duo.txt deleted file mode 100644 index d74fd3e72dd..00000000000 --- a/res/cardsfolder/thistledown_duo.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thistledown Duo -ManaCost:2 WU -Types:Creature Kithkin Soldier Wizard -Text:no text -PT:2/2 -T:Mode$ SpellCast | ValidCard$ Card.White+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump11 | TriggerDescription$ Whenever you cast a white spell, CARDNAME gets +1/+1 until end of turn. -T:Mode$ SpellCast | ValidCard$ Card.Blue+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpKW | TriggerDescription$ Whenever you cast a blue spell, CARDNAME gains flying until end of turn. -SVar:TrigPump11:AB$Pump | Cost$ 0 | NumAtt$ +1 | NumDef$ +1 | Defined$ Self -SVar:TrigPumpKW:AB$Pump | Cost$ 0 | KW$ Flying | Defined$ Self -SVar:BuffedBy:Spell.White,Spell.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thistledown_duo.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thistledown_liege.txt b/res/cardsfolder/thistledown_liege.txt deleted file mode 100644 index cdfa2f03091..00000000000 --- a/res/cardsfolder/thistledown_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thistledown Liege -ManaCost:1 WU WU WU -Types:Creature Kithkin Knight -Text:no text -PT:1/3 -K:Flash -K:stPumpAll:Creature.White+Other+YouCtrl:1/1:No Condition:Other white creatures you control get +1/+1. -K:stPumpAll:Creature.Blue+Other+YouCtrl:1/1:No Condition:Other blue creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thistledown_liege.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thopter_assembly.txt b/res/cardsfolder/thopter_assembly.txt deleted file mode 100644 index 2874c46aeb8..00000000000 --- a/res/cardsfolder/thopter_assembly.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thopter Assembly -ManaCost:6 -Types:Artifact Creature Thopter -Text:no text -PT:5/5 -K:Flying -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Thopter.Other+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if you control no Thopters other than CARDNAME, return CARDNAME to its owner's hand and put five 1/1 colorless Thopter artifact creature tokens with flying onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenAmount$ 5 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thopter_assembly.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thopter_foundry.txt b/res/cardsfolder/thopter_foundry.txt deleted file mode 100644 index dffd000756c..00000000000 --- a/res/cardsfolder/thopter_foundry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thopter Foundry -ManaCost:WB U -Types:Artifact -Text:no text -A:AB$ Token | Cost$ 1 Sac<1/Artifact.nonToken> | CostDesc$ 1, Sacrifice a nontoken artifact: | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SubAbility$ SVar=DBGainLife | SpellDescription$ Put a 1/1 blue Thopter artifact creature token with flying onto the battlefield. You gain 1 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 1 -SVar:AIPreference:SacCost$Permanent.namedSword of the Meek -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thopter_foundry.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thopter_squadron.txt b/res/cardsfolder/thopter_squadron.txt deleted file mode 100644 index 3858b77762f..00000000000 --- a/res/cardsfolder/thopter_squadron.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thopter Squadron -ManaCost:5 -Types:Artifact Creature Thopter -Text:no text -PT:0/0 -K:Flying -K:etbCounter:P1P1:3 -A:AB$ Token | Cost$ 1 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Thopter | TokenTypes$ Artifact,Creature,Thopter | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SorcerySpeed$ True | SpellDescription$ 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. -A:AB$ PutCounter | Cost$ 1 Sac<1/Thopter> | CounterType$ P1P1 | CounterNum$ 1 | SorcerySpeed$ True | SpellDescription$ Put a +1/+1 counter on Thopter Squadron. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thopter_squadron.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thorn_of_amethyst.txt b/res/cardsfolder/thorn_of_amethyst.txt deleted file mode 100644 index c9195494f6d..00000000000 --- a/res/cardsfolder/thorn_of_amethyst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thorn of Amethyst -ManaCost:2 -Types:Artifact -Text:Noncreature spells cost 1 more to cast. -K:CostChange:All:More:1:Spell:All:Creature:NonType -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thorn_of_amethyst.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/262.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thorn_thallid.txt b/res/cardsfolder/thorn_thallid.txt deleted file mode 100644 index 047f6bb19fd..00000000000 --- a/res/cardsfolder/thorn_thallid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thorn Thallid -ManaCost:1 G G -Types:Creature Fungus -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ DealDamage | Cost$ SubCounter<3/SPORE> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thorn_thallid.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/96.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/thorn_thrash_viashino.txt b/res/cardsfolder/thorn_thrash_viashino.txt deleted file mode 100644 index 193258655c2..00000000000 --- a/res/cardsfolder/thorn_thrash_viashino.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thorn-Thrash Viashino -ManaCost:3 R -Types:Creature Viashino Warrior -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ G | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -K:Devour:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thorn_thrash_viashino.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/116.jpg -End diff --git a/res/cardsfolder/thornling.txt b/res/cardsfolder/thornling.txt deleted file mode 100644 index 11c92cb22fc..00000000000 --- a/res/cardsfolder/thornling.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thornling -ManaCost:3 G G -Types:Creature Elemental Shapeshifter -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ G | KW$ Haste | SpellDescription$ CARDNAME gains haste until end of turn. -A:AB$ Pump | Cost$ G | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -A:AB$ Pump | Cost$ G | KW$ HIDDEN Indestructible | SpellDescription$ CARDNAME is indestructible this turn. -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -A:AB$ Pump | Cost$ 1 | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ CARDNAME gets -1/+1 until end of turn. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornling.jpg -SetInfo:CFX|Mythic|http://magiccards.info/scans/en/cfx/95.jpg -End diff --git a/res/cardsfolder/thornscape_apprentice.txt b/res/cardsfolder/thornscape_apprentice.txt deleted file mode 100644 index b46390c71d2..00000000000 --- a/res/cardsfolder/thornscape_apprentice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thornscape Apprentice -ManaCost:G -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike | SpellDescription$ Target creature gains first strike until end of turn. -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornscape_apprentice.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/215.jpg -End diff --git a/res/cardsfolder/thornscape_familiar.txt b/res/cardsfolder/thornscape_familiar.txt deleted file mode 100644 index 5dbd00a3ca4..00000000000 --- a/res/cardsfolder/thornscape_familiar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thornscape Familiar -ManaCost:1 G -Types:Creature Insect -Text:Red spells and white spells you cast cost 1 less to cast. -PT:2/1 -K:CostChange:Player:Less:1:Spell:red/white:All:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornscape_familiar.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thornscape_master.txt b/res/cardsfolder/thornscape_master.txt deleted file mode 100644 index 060fd506359..00000000000 --- a/res/cardsfolder/thornscape_master.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Thornscape Master -ManaCost:2 G G -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ R R T | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature has Protection from white until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature has Protection from blue until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature has Protection from black until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature has Protection from red until end of turn. -A:AB$ Pump | Cost$ W W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from white | SpellDescription$ Target creature has Protection from green until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornscape_master.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thorntooth_witch.txt b/res/cardsfolder/thorntooth_witch.txt deleted file mode 100644 index 23851661f53..00000000000 --- a/res/cardsfolder/thorntooth_witch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thorntooth Witch -ManaCost:5 B -Types:Creature Treefolk Shaman -Text:no text -PT:3/4 -T:Mode$ SpellCast | ValidCard$ Treefolk.Other+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast a Treefolk spell, you may have target creature get +3/-3 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | NumDef$ -3 | IsCurse$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thorntooth_witch.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thornwatch_scarecrow.txt b/res/cardsfolder/thornwatch_scarecrow.txt deleted file mode 100644 index 74a8d2e5fba..00000000000 --- a/res/cardsfolder/thornwatch_scarecrow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thornwatch Scarecrow -ManaCost:6 -Types:Artifact Creature Scarecrow -Text:no text -PT:4/4 -K:stPumpSelf:Creature:0/0/Wither:isPresent Creature.Green+YouCtrl:Thornwatch Scarecrow has wither as long as you control a green creature. (It deals damage to creatures in the form of -1/-1 counters.) -K:stPumpSelf:Creature:0/0/Vigilance:isPresent Creature.White+YouCtrl:Thornwatch Scarecrow has vigilance as long as you control a white creature. -SVar:BuffedBy:Creature.White,Creature.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornwatch_scarecrow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thornweald_archer.txt b/res/cardsfolder/thornweald_archer.txt deleted file mode 100644 index 33411949f7b..00000000000 --- a/res/cardsfolder/thornweald_archer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thornweald Archer -ManaCost:1 G -Types:Creature Elf Archer -Text:no text -PT:2/1 -K:Deathtouch -K:Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornweald_archer.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thornwind_faeries.txt b/res/cardsfolder/thornwind_faeries.txt deleted file mode 100644 index 472aab1de32..00000000000 --- a/res/cardsfolder/thornwind_faeries.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thornwind Faeries -ManaCost:1 U U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thornwind_faeries.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thought_courier.txt b/res/cardsfolder/thought_courier.txt deleted file mode 100644 index 48f80f5ce53..00000000000 --- a/res/cardsfolder/thought_courier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thought Courier -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card82980.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thought_devourer.txt b/res/cardsfolder/thought_devourer.txt deleted file mode 100644 index 0fcfdf2563c..00000000000 --- a/res/cardsfolder/thought_devourer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thought Devourer -ManaCost:2 U U -Types:Creature Beast -Text:Your maximum hand size is reduced by four. -PT:4/4 -K:HandSize - 4 Self -K:Flying -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_devourer.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thought_eater.txt b/res/cardsfolder/thought_eater.txt deleted file mode 100644 index 5ca10a6067c..00000000000 --- a/res/cardsfolder/thought_eater.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thought Eater -ManaCost:1 U -Types:Creature Beast -Text:Your maximum hand size is reduced by three. -PT:2/2 -K:HandSize - 3 Self -K:Flying -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_eater.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thought_nibbler.txt b/res/cardsfolder/thought_nibbler.txt deleted file mode 100644 index 14fb0bd52a2..00000000000 --- a/res/cardsfolder/thought_nibbler.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thought Nibbler -ManaCost:U -Types:Creature Beast -Text:Your maximum hand size is reduced by two. -PT:1/1 -K:HandSize - 2 Self -K:Flying -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thought_nibbler.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtbind.txt b/res/cardsfolder/thoughtbind.txt deleted file mode 100644 index 7a97f1c647e..00000000000 --- a/res/cardsfolder/thoughtbind.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Thoughtbind -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell with CMC 4 or less | ValidTgts$ Card.cmcLE4 | SpellDescription$ Counter target spell with converted mana cost 4 or less. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtbind.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtcast.txt b/res/cardsfolder/thoughtcast.txt deleted file mode 100644 index 4a4f4f62a81..00000000000 --- a/res/cardsfolder/thoughtcast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thoughtcast -ManaCost:4 U -Types:Sorcery -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.)\r\n -A:SP$ Draw | Cost$ 4 U | NumCards$ 2 | SpellDescription$ Draw two cards. -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtcast.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtcutter_agent.txt b/res/cardsfolder/thoughtcutter_agent.txt deleted file mode 100644 index dc76128c111..00000000000 --- a/res/cardsfolder/thoughtcutter_agent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thoughtcutter Agent -ManaCost:U B -Types:Artifact Creature Human Rogue -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ U B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SubAbility$ SVar=DBReveal | SpellDescription$ Target player loses 1 life and reveals his or her hand. -SVar:DBReveal:DB$RevealHand | Defined$ Targeted -SVar:Rarity:Uncommon -SVar:Picture:http://magic.tcgplayer.com/db/cards/16857.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/201.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtleech.txt b/res/cardsfolder/thoughtleech.txt deleted file mode 100644 index 1bcb50116e0..00000000000 --- a/res/cardsfolder/thoughtleech.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thoughtleech -ManaCost:G G -Types:Enchantment -Text:no text -T:Mode$ Taps | ValidCard$ Island.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigGainLife | Optional $ True | TriggerDescription$ Whenever an Island an opponent controls becomes tapped, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtleech.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/274.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/157.jpg -End diff --git a/res/cardsfolder/thoughtpicker_witch.txt b/res/cardsfolder/thoughtpicker_witch.txt deleted file mode 100644 index 8d018d4a64b..00000000000 --- a/res/cardsfolder/thoughtpicker_witch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thoughtpicker Witch -ManaCost:B -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Dig | Cost$ 1 Sac<1/Creature> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | DigNum$ 2 | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition2$ 0 | SpellDescription$ Look at the top two cards of target opponent's library, then exile one of them. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtpicker_witch.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtseize.txt b/res/cardsfolder/thoughtseize.txt deleted file mode 100644 index 54ef5b9adcc..00000000000 --- a/res/cardsfolder/thoughtseize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thoughtseize -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B | ValidTgts$ Player | NumCards$ 1 | DiscardValid$ Card.nonLand | Mode$ RevealYouChoose | SubAbility$ SVar=DBLoseLife | SpellDescription$ Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. You lose 2 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/lrw/en/card145969.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thoughtweft_gambit.txt b/res/cardsfolder/thoughtweft_gambit.txt deleted file mode 100644 index 0fe0895e189..00000000000 --- a/res/cardsfolder/thoughtweft_gambit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thoughtweft Gambit -ManaCost:4 WU WU -Types:Instant -Text:no text -#Switched order of abilities since DB$UntapAll doesn't exist yet -A:SP$ UntapAll | Cost$ 4 WU WU | ValidCards$ Creature.YouCtrl | SubAbility$ SVar=DBTap | SpellDescription$ Tap all creatures your opponents control and untap all creatures you control. -SVar:DBTap:DB$TapAll | ValidCards$ Creature.YouDontCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtweft_gambit.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thousand_legged_kami.txt b/res/cardsfolder/thousand_legged_kami.txt deleted file mode 100644 index 2dfd6d1be46..00000000000 --- a/res/cardsfolder/thousand_legged_kami.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thousand-legged Kami -ManaCost:6 G G -Types:Creature Spirit -Text:no text -PT:6/6 -K:Soulshift:7 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thousand_legged_kami.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_dynamo.txt b/res/cardsfolder/thran_dynamo.txt deleted file mode 100644 index 06aadd03af9..00000000000 --- a/res/cardsfolder/thran_dynamo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thran Dynamo -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 3 | SpellDescription$ Add 3 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_dynamo.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_forge.txt b/res/cardsfolder/thran_forge.txt deleted file mode 100644 index 8cd307e585e..00000000000 --- a/res/cardsfolder/thran_forge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thran Forge -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ 2 | ValidTgts$ Creature.nonArtifact | TgtPrompt$ Select target nonartifact creature | Types$ Artifact | SubAbility$ SVar=DBPump | SpellDescription$ Until end of turn, target nonartifact creature gets +1/+0 and becomes an artifact in addition to its other types. -SVar:DBPump:DB$Pump | Defined$ Targeted | NumAtt$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_forge.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_foundry.txt b/res/cardsfolder/thran_foundry.txt deleted file mode 100644 index f80da1a747b..00000000000 --- a/res/cardsfolder/thran_foundry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thran Foundry -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZoneAll | Cost$ 1 T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Library | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Target player shuffles his or her graveyard into his or her library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_foundry.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_golem.txt b/res/cardsfolder/thran_golem.txt deleted file mode 100644 index ffb0d852729..00000000000 --- a/res/cardsfolder/thran_golem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thran Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -K:stPumpSelf:Creature:2/2/Flying & First Strike & Trample:isEnchanted:As long as Thran Golem is enchanted, it gets +2/+2 and has flying, first strike, and trample. -SVar:EnchantMe:Once -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_golem.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/141.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_lens.txt b/res/cardsfolder/thran_lens.txt deleted file mode 100644 index 62c99e5b323..00000000000 --- a/res/cardsfolder/thran_lens.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thran Lens -ManaCost:2 -Types:Artifact -Text:no text -K:stAnimateAll:Permanent:no changes:no types:Overwrite:No Abilities:No Condition:All permanents are colorless. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_lens.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_quarry.txt b/res/cardsfolder/thran_quarry.txt deleted file mode 100644 index c9809774081..00000000000 --- a/res/cardsfolder/thran_quarry.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Thran Quarry -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | IsPresent$ Creature.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, if you control no creatures, sacrifice CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | ConditionPresent$ Creature.YouCtrl | ConditionCompare$ EQ0 -SVar:NeedsToPlay:Creature.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_quarry.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thran_war_machine.txt b/res/cardsfolder/thran_war_machine.txt deleted file mode 100644 index d385163ff58..00000000000 --- a/res/cardsfolder/thran_war_machine.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thran War Machine -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:4/5 -K:CARDNAME attacks each turn if able. -K:Echo:4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thran_war_machine.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrashing_mudspawn.txt b/res/cardsfolder/thrashing_mudspawn.txt deleted file mode 100644 index 073049b65cb..00000000000 --- a/res/cardsfolder/thrashing_mudspawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thrashing Mudspawn -ManaCost:3 B B -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ DamageDone | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME is dealt damage, you lose that much life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -K:Morph:1 B B -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrashing_mudspawn.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrashing_wumpus.txt b/res/cardsfolder/thrashing_wumpus.txt deleted file mode 100644 index 9ba71ffe4e7..00000000000 --- a/res/cardsfolder/thrashing_wumpus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thrashing Wumpus -ManaCost:3 B B -Types:Creature Beast -Text:no text -PT:3/3 -A:AB$ DamageAll | Cost$ B | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature and each player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrashing_wumpus.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thraximundar.txt b/res/cardsfolder/thraximundar.txt deleted file mode 100644 index 87318815837..00000000000 --- a/res/cardsfolder/thraximundar.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thraximundar -ManaCost:4 U B R -Types:Legendary Creature Zombie Assassin -Text:no text -PT:6/6 -K:Haste -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever Thraximundar attacks, defending player sacrifices a creature. -T:Mode$ Sacrificed | ValidCard$ Creature | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever a player sacrifices a creature, you may put a +1/+1 counter on CARDNAME. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Opponent | SacValid$ Creature -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/thraximundar.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/threads_of_disloyalty.txt b/res/cardsfolder/threads_of_disloyalty.txt deleted file mode 100644 index ec230f02c6b..00000000000 --- a/res/cardsfolder/threads_of_disloyalty.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Threads of Disloyalty -ManaCost:1 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:enControlCreature:Option=CMC 2 or less -K:Enchant creature with converted mana cost 2 or less -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/threads_of_disloyalty.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/threaten.txt b/res/cardsfolder/threaten.txt deleted file mode 100644 index d06d8a863c0..00000000000 --- a/res/cardsfolder/threaten.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Threaten -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83472.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/241.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/223.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/three_tragedies.txt b/res/cardsfolder/three_tragedies.txt deleted file mode 100644 index c22ad03d3c9..00000000000 --- a/res/cardsfolder/three_tragedies.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Three Tragedies -ManaCost:3 B B -Types:Sorcery Arcane -Text:no text -A:SP$ Discard | Cost$ 3 B B | ValidTgts$ Player | NumCards$ 3 | Mode$ TgtChoose | SpellDescription$ Target player discards three cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/three_tragedies.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/three_visits.txt b/res/cardsfolder/three_visits.txt deleted file mode 100644 index 2987353c9c6..00000000000 --- a/res/cardsfolder/three_visits.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Three Visits -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/three_visits.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thresher_beast.txt b/res/cardsfolder/thresher_beast.txt deleted file mode 100644 index cb4ecb70242..00000000000 --- a/res/cardsfolder/thresher_beast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thresher Beast -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:4/4 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player sacrifices a land. -SVar:TrigSac:AB$ Sacrifice | Cost$ 0 | SacValid$ Land | Defined$ Opponent | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thresher_beast.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/128.jpg -End diff --git a/res/cardsfolder/thrill_of_the_hunt.txt b/res/cardsfolder/thrill_of_the_hunt.txt deleted file mode 100644 index a9ef7d23cb3..00000000000 --- a/res/cardsfolder/thrill_of_the_hunt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thrill of the Hunt -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +2 | SpellDescription$ Target creature gets +1/+2 until end of turn. -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +2 | Flashback$ True | CostDesc$ Flashback W | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrill_of_the_hunt.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thriss_nantuko_primus.txt b/res/cardsfolder/thriss_nantuko_primus.txt deleted file mode 100644 index af6a010dcd9..00000000000 --- a/res/cardsfolder/thriss_nantuko_primus.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thriss, Nantuko Primus -ManaCost:5 G G -Types:Legendary Creature Insect Druid -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +5 | NumDef$ +5 | SpellDescription$ Target creature gets +5/+5 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thriss_nantuko_primus.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/134.jpg -End diff --git a/res/cardsfolder/thrive.txt b/res/cardsfolder/thrive.txt deleted file mode 100644 index 60ec51edee4..00000000000 --- a/res/cardsfolder/thrive.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thrive -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ PutCounter | Cost$ X G | CounterNum$ 1 | CounterType$ P1P1 | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | TgtPrompt$ Select target creatures | SpellDescription$ Put a +1/+1 counter on each of X target creatures. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrive.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/129.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/throat_slitter.txt b/res/cardsfolder/throat_slitter.txt deleted file mode 100644 index f6cac56ec52..00000000000 --- a/res/cardsfolder/throat_slitter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Throat Slitter -ManaCost:4 B -Types:Creature Rat Ninja -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 2 B Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 2 B | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (2 B, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDestroy | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, destroy target nonblack creature that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Creature.nonBlack+YouDontCtrl | TgtPrompt$ Select target nonblack creature defending player controls -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/throat_slitter.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/throne_of_bone.txt b/res/cardsfolder/throne_of_bone.txt deleted file mode 100644 index 5515e1a923d..00000000000 --- a/res/cardsfolder/throne_of_bone.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Throne of Bone -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Black | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a black spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/throne_of_bone.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/317.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/273.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/275.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/322.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/403.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/371.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/316.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/279.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/throne_of_geth.txt b/res/cardsfolder/throne_of_geth.txt deleted file mode 100644 index 1aebf17460a..00000000000 --- a/res/cardsfolder/throne_of_geth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Throne of Geth -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Proliferate | Cost$ T Sac<1/Artifact> | SpellDescription$ Proliferate -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/throne_of_geth.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrull_champion.txt b/res/cardsfolder/thrull_champion.txt deleted file mode 100644 index a894f986e3a..00000000000 --- a/res/cardsfolder/thrull_champion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thrull Champion -ManaCost:4 B -Types:Creature Thrull -Text:no text -PT:2/2 -K:stPumpAll:Creature.Thrull:+1/+1:No Condition:Thrull creatures get +1/+1. -A:AB$ GainControl | Cost$ T | ValidTgts$ Thrull | TgtPrompt$ Select target Thrull | LoseControl$ LoseControl,LeavesPlay | SpellDescription$ Gain control of target Thrull for as long as you control CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrull_champion.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrull_surgeon.txt b/res/cardsfolder/thrull_surgeon.txt deleted file mode 100644 index 619f0f13fe9..00000000000 --- a/res/cardsfolder/thrull_surgeon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thrull Surgeon -ManaCost:1 B -Types:Creature Thrull -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ 1 B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player. | Mode$ RevealYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ 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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrull_surgeon.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/76.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrumming_stone.txt b/res/cardsfolder/thrumming_stone.txt deleted file mode 100644 index 280bbb4312d..00000000000 --- a/res/cardsfolder/thrumming_stone.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Thrumming Stone -ManaCost:5 -Types:Legendary Artifact -Text:Spells you cast have ripple 4. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrumming_stone.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrummingbird.txt b/res/cardsfolder/thrummingbird.txt deleted file mode 100644 index 93a6606d06c..00000000000 --- a/res/cardsfolder/thrummingbird.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thrummingbird -ManaCost:1 U -Types:Creature Bird Horror -Text:no text -PT:1/1 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigProliferate | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, proliferate. -SVar:TrigProliferate:AB$Proliferate | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrummingbird.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thrun_the_last_troll.txt b/res/cardsfolder/thrun_the_last_troll.txt deleted file mode 100644 index cb411104ad6..00000000000 --- a/res/cardsfolder/thrun_the_last_troll.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thrun, the Last Troll -ManaCost:2 G G -Types:Legendary Creature Troll Shaman -Text:no text -PT:4/4 -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -K:CARDNAME can't be countered. -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/thrun_the_last_troll.jpg -SetInfo:MBS|Mythic|http://magiccards.info/scans/en/mbs/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunder_dragon.txt b/res/cardsfolder/thunder_dragon.txt deleted file mode 100644 index 31b89f87df0..00000000000 --- a/res/cardsfolder/thunder_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thunder Dragon -ManaCost:5 R R -Types:Creature Dragon -Text:no text -PT:5/5 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAllNonFlyers | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to each creature without flying. -SVar:TrigDamageAllNonFlyers:AB$DamageAll | Cost$ 0 | NumDmg$ 3 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_dragon.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunder_of_hooves.txt b/res/cardsfolder/thunder_of_hooves.txt deleted file mode 100644 index 926dcc68db3..00000000000 --- a/res/cardsfolder/thunder_of_hooves.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunder of Hooves -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 3 R | NumDmg$ X | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | ValidDescription$ each creature without flying and each player. | SpellDescription$ CARDNAME deals X damage to each creature without flying and each player, where X is the number of Beasts on the battlefield. -SVar:X:Count$TypeOnBattlefield.Beast -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_of_hooves.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunder_spirit.txt b/res/cardsfolder/thunder_spirit.txt deleted file mode 100644 index 466887b72b6..00000000000 --- a/res/cardsfolder/thunder_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunder Spirit -ManaCost:1 W W -Types:Creature Elemental Spirit -Text:no text -PT:2/2 -K:Flying -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_spirit.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunder_strike.txt b/res/cardsfolder/thunder_strike.txt deleted file mode 100644 index 09ad9bec185..00000000000 --- a/res/cardsfolder/thunder_strike.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Thunder Strike -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ First Strike | SpellDescription$ Target creature gets +2/+0 and gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_strike.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/157.jpg -End diff --git a/res/cardsfolder/thunder_thrash_elder.txt b/res/cardsfolder/thunder_thrash_elder.txt deleted file mode 100644 index 177e5551c15..00000000000 --- a/res/cardsfolder/thunder_thrash_elder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thunder-Thrash Elder -ManaCost:2 R -Types:Creature Viashino Warrior -Text:no text -PT:1/1 -K:Devour:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_thrash_elder.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunder_wall.txt b/res/cardsfolder/thunder_wall.txt deleted file mode 100644 index 6cd27a4a517..00000000000 --- a/res/cardsfolder/thunder_wall.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thunder Wall -ManaCost:1 U U -Types:Creature Wall -Text:no text -PT:0/2 -K:Defender -K:Flying -A:AB$ Pump | Cost$ U | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunder_wall.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/104.jpg -End diff --git a/res/cardsfolder/thunderblust.txt b/res/cardsfolder/thunderblust.txt deleted file mode 100644 index b3f0d8c9d9f..00000000000 --- a/res/cardsfolder/thunderblust.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thunderblust -ManaCost:2 R R R -Types:Creature Elemental -Text:no text -PT:7/2 -K:Haste -K:Persist -K:stPumpSelf:Creature:0/0/Trample:isValid Card.Self+countersGE1M1M1:Thunderblust has trample as long as it has a -1/-1 counter on it. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderblust.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunderbolt.txt b/res/cardsfolder/thunderbolt.txt deleted file mode 100644 index ee4d903a36d..00000000000 --- a/res/cardsfolder/thunderbolt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunderbolt -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ Choose one - CARDNAME deals 3 damage to target player; -A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.withFlying | NumDmg$ 4 | SpellDescription$ or CARDNAME deals 4 damage to target creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderbolt.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunderclap.txt b/res/cardsfolder/thunderclap.txt deleted file mode 100644 index a92e5d3d6d3..00000000000 --- a/res/cardsfolder/thunderclap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thunderclap -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature. -SVar:AltCost:Sac<1/Mountain> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderclap.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/219.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thundercloud_elemental.txt b/res/cardsfolder/thundercloud_elemental.txt deleted file mode 100644 index ea6bbd05619..00000000000 --- a/res/cardsfolder/thundercloud_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Thundercloud Elemental -ManaCost:5 U U -Types:Creature Elemental -Text:no text -PT:3/4 -K:Flying -A:AB$ TapAll | Cost$ 3 U | ValidCards$ Creature.toughnessLE2 | SpellDescription$ Tap all creatures with toughness 2 or less. -A:AB$ DebuffAll | Cost$ 3 U | ValidCards$ Creature.Other | Keywords$ Flying | SpellDescription$ All other creatures lose flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thundercloud_elemental.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thundercloud_shaman.txt b/res/cardsfolder/thundercloud_shaman.txt deleted file mode 100644 index 4db83e3ae4c..00000000000 --- a/res/cardsfolder/thundercloud_shaman.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thundercloud Shaman -ManaCost:3 R R -Types:Creature Giant Shaman -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamageAll | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to the number of Giants you control to each non-Giant creature. -SVar:TrigDamageAll:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.nonGiant | NumDmg$ X | ValidDescription$ each non-Giant creature. -SVar:X:Count$TypeYouCtrl.Giant -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thundercloud_shaman.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/195.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunderheads.txt b/res/cardsfolder/thunderheads.txt deleted file mode 100644 index cd0609f9e92..00000000000 --- a/res/cardsfolder/thunderheads.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunderheads -ManaCost:2 U -Types:Instant -Text:no text -K:Replicate 2 U -A:SP$ Token | Cost$ 2 U | TokenName$ Weird | TokenOwner$ You | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Defender<>Flying<>HIDDEN At the beginning of the end step, exile CARDNAME. | TokenAmount$ 1 | TokenColors$ Blue | TokenTypes$ Creature,Weird | SpellDescription$ 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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderheads.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thundering_giant.txt b/res/cardsfolder/thundering_giant.txt deleted file mode 100644 index 51aea00b45c..00000000000 --- a/res/cardsfolder/thundering_giant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thundering Giant -ManaCost:3 R R -Types:Creature Giant -Text:no text -PT:4/3 -K:Haste -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card130381.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/221.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thundering_tanadon.txt b/res/cardsfolder/thundering_tanadon.txt deleted file mode 100644 index 3adb7eaad51..00000000000 --- a/res/cardsfolder/thundering_tanadon.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thundering Tanadon -ManaCost:4 PG PG -Types:Artifact Creature Beast -Text:no text -PT:5/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thundering_tanadon.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thundermare.txt b/res/cardsfolder/thundermare.txt deleted file mode 100644 index 48aecf953ca..00000000000 --- a/res/cardsfolder/thundermare.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Thundermare -ManaCost:5 R -Types:Creature Elemental Horse -Text:no text -PT:5/5 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all other creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thundermare.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/116.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/158.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunderscape_apprentice.txt b/res/cardsfolder/thunderscape_apprentice.txt deleted file mode 100644 index 465a539bc25..00000000000 --- a/res/cardsfolder/thunderscape_apprentice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunderscape Apprentice -ManaCost:R -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ LoseLife | Cost$ B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 1 | SpellDescription$ Target player loses 1 life. -A:AB$ Pump | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderscape_apprentice.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/174.jpg -End diff --git a/res/cardsfolder/thunderscape_familiar.txt b/res/cardsfolder/thunderscape_familiar.txt deleted file mode 100644 index 0783be45147..00000000000 --- a/res/cardsfolder/thunderscape_familiar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thunderscape Familiar -ManaCost:1 R -Types:Creature Kavu -Text:Black spells and green spells you cast cost 1 less to cast. -PT:1/1 -K:First Strike -K:CostChange:Player:Less:1:Spell:black/green:All:OnlyOneBonus -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderscape_familiar.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thunderscape_master.txt b/res/cardsfolder/thunderscape_master.txt deleted file mode 100644 index 0ff6bfcb696..00000000000 --- a/res/cardsfolder/thunderscape_master.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Thunderscape Master -ManaCost:2 R R -Types:Creature Human Wizard -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ B B T | ValidTgts$ Player | TgtPrompt$ Select a player | LifeAmount$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ Target player loses 2 life and you gain 2 life. -A:AB$ PumpAll | Cost$ G G T | ValidCards$ Creature.YouCtrl | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Creatures you control get +2/+2 until end of turn. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderscape_master.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/175.jpg -End diff --git a/res/cardsfolder/thundersong_trumpeter.txt b/res/cardsfolder/thundersong_trumpeter.txt deleted file mode 100644 index 15dd6dc6c3e..00000000000 --- a/res/cardsfolder/thundersong_trumpeter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Thundersong Trumpeter -ManaCost:R W -Types:Creature Human Soldier -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ HIDDEN CARDNAME can't attack or block. | SpellDescription$ Target creature can't attack or block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/thundersong_trumpeter.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/235.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/thwart.txt b/res/cardsfolder/thwart.txt deleted file mode 100644 index 1dfa22a23fd..00000000000 --- a/res/cardsfolder/thwart.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Thwart -ManaCost:2 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:AltCost:Return<3/Island> -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/thwart.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tibor_and_lumia.txt b/res/cardsfolder/tibor_and_lumia.txt deleted file mode 100644 index c6117a09669..00000000000 --- a/res/cardsfolder/tibor_and_lumia.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tibor and Lumia -ManaCost:2 U R -Types:Legendary Creature Human Wizard -Text:no text -PT:3/3 -#Should the order of these be changed? I can't tell which one gets triggered first on a consistent basis... -PA -T:Mode$ SpellCast | ValidPlayer$ You | ValidCard$ Card.Blue | TriggerZones$ Battlefield | Execute$ TrigFlying | TriggerDescription$ Whenever you cast a blue spell, target creature gains flying until end of turn. -T:Mode$ SpellCast | ValidPlayer$ You | ValidCard$ Card.Red | TriggerZones$ Battlefield | Execute$ TrigTremor | TriggerDescription$ Whenever you cast a red spell, CARDNAME deals 1 damage to each creature without flying. -SVar:TrigFlying:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying -SVar:TrigTremor:AB$DamageAll | Cost$ 0 | ValidCards$ Creature.withoutFlying | NumDmg$ 1 | ValidDescription$ each creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tibor_and_lumia.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ticking_gnomes.txt b/res/cardsfolder/ticking_gnomes.txt deleted file mode 100644 index 6f7409220d8..00000000000 --- a/res/cardsfolder/ticking_gnomes.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ticking Gnomes -ManaCost:3 -Types:Artifact Creature Gnome -Text:no text -PT:3/3 -K:Echo:3 -A:AB$ DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/ticking_gnomes.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidal_bore.txt b/res/cardsfolder/tidal_bore.txt deleted file mode 100644 index f7969cfb116..00000000000 --- a/res/cardsfolder/tidal_bore.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tidal Bore -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ TapOrUntap | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ You may tap or untap target creature. -SVar:AltCost:Return<1/Island> -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_bore.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidal_control.txt b/res/cardsfolder/tidal_control.txt deleted file mode 100644 index cad93f985ac..00000000000 --- a/res/cardsfolder/tidal_control.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tidal Control -ManaCost:2 U U -Types:Enchantment -Text:no text -K:Cumulative upkeep:2 -A:AB$ Counter | Cost$ 2 | TargetType$ Spell | TgtPrompt$ Select target red or green spell | ValidTgts$ Card.Green,Card.Red | AnyPlayer$ True | SpellDescription$ Counter target red or green spell. Any player may activate this ability. -A:AB$ Counter | Cost$ PayLife<2> | TargetType$ Spell | TgtPrompt$ Select target red of green spell | ValidTgts$ Card.Green,Card.Red | AnyPlayer$ True | SpellDescription$ Counter target red or green spell. Any player may activate this ability. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_control.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidal_courier.txt b/res/cardsfolder/tidal_courier.txt deleted file mode 100644 index 3cb3cceaf8c..00000000000 --- a/res/cardsfolder/tidal_courier.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tidal Courier -ManaCost:3 U -Types:Creature Merfolk -Text:no text -PT:1/2 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigDig | TriggerDescription$ When CARDNAME 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. -SVar:TrigDig:AB$Dig | Cost$ 0 | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Elf -A:AB$ Pump | Cost$ 3 U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_courier.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/31.jpg -End diff --git a/res/cardsfolder/tidal_kraken.txt b/res/cardsfolder/tidal_kraken.txt deleted file mode 100644 index 8f3657b0872..00000000000 --- a/res/cardsfolder/tidal_kraken.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tidal Kraken -ManaCost:5 U U U -Types:Creature Kraken -Text:no text -PT:6/6 -K:Unblockable -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83301.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/108.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/110.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidal_surge.txt b/res/cardsfolder/tidal_surge.txt deleted file mode 100644 index 3abf8dc68b9..00000000000 --- a/res/cardsfolder/tidal_surge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tidal Surge -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ Tap | Cost$ 1 U | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target creature without flying | ValidTgts$ Creature.withoutFlying | SpellDescription$ Tap up to three target creatures without flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_surge.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/56.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/102.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/75.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidal_wave.txt b/res/cardsfolder/tidal_wave.txt deleted file mode 100644 index 69ce84b7e61..00000000000 --- a/res/cardsfolder/tidal_wave.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tidal Wave -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 U | TokenAmount$ 1 | TokenName$ Wall | TokenTypes$ Creature,Wall | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Defender<>At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ Put a 5/5 blue Wall creature token with defender onto the battlefield. Sacrifice it at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidal_wave.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tideforce_elemental.txt b/res/cardsfolder/tideforce_elemental.txt deleted file mode 100644 index 402b8c44dc7..00000000000 --- a/res/cardsfolder/tideforce_elemental.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tideforce Elemental -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:2/1 -A:AB$ TapOrUntap | Cost$ U T | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | SpellDescription$ You may tap or untap another target creature. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may untap CARDNAME. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Tideforce_Elemental.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidehollow_sculler.txt b/res/cardsfolder/tidehollow_sculler.txt deleted file mode 100644 index 5a31c202853..00000000000 --- a/res/cardsfolder/tidehollow_sculler.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tidehollow Sculler -ManaCost:W B -Types:Artifact Creature Zombie -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals his or her hand and you choose a nonland card from it. Exile that card. When CARDNAME leaves the battlefield, return the exiled card to its owner's hand. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigBounce | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals his or her hand and you choose a nonland card from it. Exile that card. When CARDNAME leaves the battlefield, return the exiled card to its owner's hand. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | TgtPrompt$ Select target player | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | RememberChanged$ True | ForgetOtherRemembered$ True -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Exile | Destination$ Hand | Defined$ Remembered | SubAbility$ SVar=DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidehollow_sculler.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidehollow_strix.txt b/res/cardsfolder/tidehollow_strix.txt deleted file mode 100644 index e882e201fd6..00000000000 --- a/res/cardsfolder/tidehollow_strix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tidehollow Strix -ManaCost:U B -Types:Artifact Creature Bird -Text:no text -PT:2/1 -K:Flying -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidehollow_strix.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/203.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidespout_tyrant.txt b/res/cardsfolder/tidespout_tyrant.txt deleted file mode 100644 index 2f78ad34cd2..00000000000 --- a/res/cardsfolder/tidespout_tyrant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tidespout Tyrant -ManaCost:5 U U U -Types:Creature Djinn -Text:no text -PT:5/5 -K:Flying -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigBounce | TriggerDescription$ Whenever you cast a spell, return target permanent to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidespout_tyrant.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tidings.txt b/res/cardsfolder/tidings.txt deleted file mode 100644 index 4358e4a392b..00000000000 --- a/res/cardsfolder/tidings.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tidings -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U U | NumCards$ 4 | SpellDescription$ Draw four cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tidings.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/54.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tiger_claws.txt b/res/cardsfolder/tiger_claws.txt deleted file mode 100644 index 04392b5108e..00000000000 --- a/res/cardsfolder/tiger_claws.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tiger Claws -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPump:+1/+1/Trample -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tiger_claws.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tigereye_cameo.txt b/res/cardsfolder/tigereye_cameo.txt deleted file mode 100644 index e1a9cab827c..00000000000 --- a/res/cardsfolder/tigereye_cameo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tigereye Cameo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tigereye_cameo.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/314.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tilling_treefolk.txt b/res/cardsfolder/tilling_treefolk.txt deleted file mode 100644 index 752f21cb82b..00000000000 --- a/res/cardsfolder/tilling_treefolk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tilling Treefolk -ManaCost:2 G -Types:Creature Treefolk Druid -Text:no text -PT:1/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return up to two target land cards from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Land.YouCtrl | TargetMin$ 0 | TargetMax$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tilling_treefolk.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timber_protector.txt b/res/cardsfolder/timber_protector.txt deleted file mode 100644 index 2349f15f580..00000000000 --- a/res/cardsfolder/timber_protector.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Timber Protector -ManaCost:4 G -Types:Creature Treefolk Warrior -Text:no text -PT:4/6 -K:stPumpAll:Creature.Treefolk+Other+YouCtrl:1/1:No Condition:Other Treefolk creatures you control get +1/+1. -K:stPumpAll:Forest+YouCtrl,Treefolk.Other+YouCtrl:0/0/HIDDEN Indestructible:No Condition:Other Treefolk and Forests you control are indestructible. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/timber_protector.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timberland_ruins.txt b/res/cardsfolder/timberland_ruins.txt deleted file mode 100644 index e0521490ca9..00000000000 --- a/res/cardsfolder/timberland_ruins.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Timberland Ruins -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -K:CARDNAME enters the battlefield tapped. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/timberland_ruins.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timberline_ridge.txt b/res/cardsfolder/timberline_ridge.txt deleted file mode 100644 index bf62ca0049a..00000000000 --- a/res/cardsfolder/timberline_ridge.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Timberline Ridge -ManaCost:no cost -Types:Land -Text:no text -K:stPumpSelf:Permanent:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:isValid Permanent.countersGE1DEPLETION:CARDNAME doesn't untap during your untap step if it has a depletion counter on it. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add R to your mana pool. Put a depletion counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add G to your mana pool. Put a depletion counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At the beginning of your upkeep, remove a depletion counter from CARDNAME. -SVar:TrigSubCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:AddCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/timberline_ridge.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/356.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timbermare.txt b/res/cardsfolder/timbermare.txt deleted file mode 100644 index 4d234f075ea..00000000000 --- a/res/cardsfolder/timbermare.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Timbermare -ManaCost:3 G -Types:Creature Elemental Horse -Text:no text -PT:5/5 -K:Haste -K:Echo:5 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all other creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.Other -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/timbermare.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timbermaw_larva.txt b/res/cardsfolder/timbermaw_larva.txt deleted file mode 100644 index f20cbe41171..00000000000 --- a/res/cardsfolder/timbermaw_larva.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Timbermaw Larva -ManaCost:3 G -Types:Creature Beast -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +1/+1 until end of turn for each Forest you control. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Forest.YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/timbermaw_larva.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timberwatch_elf.txt b/res/cardsfolder/timberwatch_elf.txt deleted file mode 100644 index 0d22c670eb3..00000000000 --- a/res/cardsfolder/timberwatch_elf.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Timberwatch Elf -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of Elves on the battlefield. -SVar:X:Count$TypeOnBattlefield.Elf -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/lgn/en-us/card45121.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/140.jpg -End diff --git a/res/cardsfolder/time_bomb.txt b/res/cardsfolder/time_bomb.txt deleted file mode 100644 index d681a89a682..00000000000 --- a/res/cardsfolder/time_bomb.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Time Bomb -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_bomb.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/404.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_ebb.txt b/res/cardsfolder/time_ebb.txt deleted file mode 100644 index 562b9ce25df..00000000000 --- a/res/cardsfolder/time_ebb.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Time Ebb -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_ebb.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/96.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/57.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/55.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/76.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_elemental.txt b/res/cardsfolder/time_elemental.txt deleted file mode 100644 index 3504b19843e..00000000000 --- a/res/cardsfolder/time_elemental.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Time Elemental -ManaCost:2 U -Types:Creature Elemental -Text:no text -PT:0/2 -A:AB$ ChangeZone | Cost$ 2 U U T | ValidTgts$ Permanent.unenchanted | TgtPrompt$ Select target unenchanted permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent that isn't enchanted to its owner's hand. -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelayedTrig | TriggerDescription$ When CARDNAME attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelayedTrig | Secondary$ True | TriggerDescription$ When CARDNAME attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you. -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigSac | TriggerDescription$ At end of combat, sacrifice CARDNAME and CARDNAME deals 5 damage to you. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ Self | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$DealDamage | NumDmg$ 5 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_elemental.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/129.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/108.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_of_heroes.txt b/res/cardsfolder/time_of_heroes.txt deleted file mode 100644 index 1adde241c9a..00000000000 --- a/res/cardsfolder/time_of_heroes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Time of Heroes -ManaCost:1 W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.countersGE1LEVEL+YouCtrl:2/2:No Condition:Each creature you control with a level counter on it gets +2/+2. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_of_heroes.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_of_need.txt b/res/cardsfolder/time_of_need.txt deleted file mode 100644 index 7175c71c330..00000000000 --- a/res/cardsfolder/time_of_need.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Time of Need -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Hand | ChangeType$ Creature.Legendary | ChangeNum$ 1 | SpellDescription$ Search your library for a legendary creature card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_of_need.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/247.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_reversal.txt b/res/cardsfolder/time_reversal.txt deleted file mode 100644 index 519b0c3a45d..00000000000 --- a/res/cardsfolder/time_reversal.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Time Reversal -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 3 U U | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBChangeAll | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library -SVar:DBChangeAll:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 7 | Defined$ Each | SubAbility$ SVar=DBChange | SpellDescription$ , then draws seven cards. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SpellDescription$ Exile CARDNAME. -SVar:RemAIDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_reversal.jpg -SetInfo:M11|Mythic|http://magiccards.info/scans/en/m11/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_sieve.txt b/res/cardsfolder/time_sieve.txt deleted file mode 100644 index a84b6d0f631..00000000000 --- a/res/cardsfolder/time_sieve.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Time Sieve -ManaCost:U B -Types:Artifact -Text:no text -A:AB$ AddTurn | Cost$ T Sac<5/Artifact> | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_sieve.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_spiral.txt b/res/cardsfolder/time_spiral.txt deleted file mode 100644 index 3c33e147c4b..00000000000 --- a/res/cardsfolder/time_spiral.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Time Spiral -ManaCost:4 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBChangeAll | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library -SVar:DBChangeAll:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 7 | Defined$ Each | SubAbility$ SVar=DBChange | SpellDescription$ , then draws seven cards. -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Exile | SubAbility$ SVar=DBUntap | SpellDescription$ Exile CARDNAME. You untap up to six lands. -SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 6 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_spiral.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/103.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_stretch.txt b/res/cardsfolder/time_stretch.txt deleted file mode 100644 index f85f998caca..00000000000 --- a/res/cardsfolder/time_stretch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Time Stretch -ManaCost:8 U U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 8 U U | ValidTgts$ Player | TgtPrompt$ Select target player. | NumTurns$ 2 | SpellDescription$ Target player takes two extra turns after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_stretch.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/108.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_vault.txt b/res/cardsfolder/time_vault.txt deleted file mode 100644 index 99ee0b7fcf3..00000000000 --- a/res/cardsfolder/time_vault.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Time Vault -ManaCost:2 -Types:Artifact -Text:If you would begin your turn while Time Vault is tapped, you may skip that turn instead. If you do, untap Time Vault. -K:CARDNAME doesn't untap during your untap step. -K:CARDNAME enters the battlefield tapped. -A:AB$ AddTurn | Cost$ T | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_vault.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/274.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/276.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_walk.txt b/res/cardsfolder/time_walk.txt deleted file mode 100644 index e1686f6c751..00000000000 --- a/res/cardsfolder/time_walk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Time Walk -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 1 U | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_walk.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/84.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/84.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/time_warp.txt b/res/cardsfolder/time_warp.txt deleted file mode 100644 index eec12156853..00000000000 --- a/res/cardsfolder/time_warp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Time Warp -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ AddTurn | Cost$ 3 U U | ValidTgts$ Player | TgtPrompt$ Select target player | NumTurns$ 1 | SpellDescription$ Target player takes an extra turn after this one. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_warp.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/97.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/75.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timetwister.txt b/res/cardsfolder/timetwister.txt deleted file mode 100644 index 40ccf9e9bfe..00000000000 --- a/res/cardsfolder/timetwister.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Timetwister -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 2 U | ChangeType$ Card | Origin$ Hand | Destination$ Library | Shuffle$ True | SubAbility$ SVar=DBChangeAll | SpellDescription$ Each player shuffles his or her graveyard and hand into his or her library, then draws seven cards. -SVar:DBChangeAll:DB$ChangeZoneAll | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | SubAbility$ SVar=DBDraw | Shuffle$ True -SVar:DBDraw:DB$Draw | NumCards$ 7 | Defined$ Each | SubAbility$ SVar=DBChange -SVar:DBChange:DB$ChangeZone | Origin$ Stack | Destination$ Graveyard -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/timetwister.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/85.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/85.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/timid_drake.txt b/res/cardsfolder/timid_drake.txt deleted file mode 100644 index 18cc9bfe74a..00000000000 --- a/res/cardsfolder/timid_drake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Timid Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When another creature enters the battlefield, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:AntiBuffedBy:Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/timid_drake.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/54.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tin_wing_chimera.txt b/res/cardsfolder/tin_wing_chimera.txt deleted file mode 100644 index 1740966f908..00000000000 --- a/res/cardsfolder/tin_wing_chimera.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tin-Wing Chimera -ManaCost:4 -Types:Artifact Creature Chimera -Text:no text -PT:2/2 -K:Flying -A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) -SVar:DBPump:DB$Pump | KW$ Flying | Defined$ Targeted | Permanent$ True -SVar:Rarity:Uncommon -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/tin_wing_chimera.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tinder_farm.txt b/res/cardsfolder/tinder_farm.txt deleted file mode 100644 index 7991677a4b0..00000000000 --- a/res/cardsfolder/tinder_farm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tinder Farm -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$T Sac<1/CARDNAME> | Produced$ R W | SpellDescription$ Add R W to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tinder_farm.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tinder_wall.txt b/res/cardsfolder/tinder_wall.txt deleted file mode 100644 index 267615d45f3..00000000000 --- a/res/cardsfolder/tinder_wall.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tinder Wall -ManaCost:G -Types:Creature Plant Wall -Text:no text -PT:0/3 -K:Defender -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ R | Amount$ 2 | SpellDescription$ Add R R to your mana pool. -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.blockedBySource | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature it's blocking. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tinder_wall.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tine_shrike.txt b/res/cardsfolder/tine_shrike.txt deleted file mode 100644 index 7be3b8c5e10..00000000000 --- a/res/cardsfolder/tine_shrike.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tine Shrike -ManaCost:3 W -Types:Creature Bird -Text:no text -PT:2/1 -K:Flying -K:Infect -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tine_shrike.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tinker.txt b/res/cardsfolder/tinker.txt deleted file mode 100644 index 994c82fbc57..00000000000 --- a/res/cardsfolder/tinker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tinker -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 U Sac<1/Artifact> | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card and put that card onto the battlefield. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tinker.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tireless_missionaries.txt b/res/cardsfolder/tireless_missionaries.txt deleted file mode 100644 index 2f7cdaef369..00000000000 --- a/res/cardsfolder/tireless_missionaries.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tireless Missionaries -ManaCost:4 W -Types:Creature Human Cleric -Text:no text -PT:2/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tireless_missionaries.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tireless_tribe.txt b/res/cardsfolder/tireless_tribe.txt deleted file mode 100644 index c9d0d4881b9..00000000000 --- a/res/cardsfolder/tireless_tribe.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tireless Tribe -ManaCost:W -Types:Creature Human Nomad -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Discard<1/Card> | NumDef$ +4 | SpellDescription$ CARDNAME gets +0/+4 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tireless_tribe.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titan_forge.txt b/res/cardsfolder/titan_forge.txt deleted file mode 100644 index 6f7dcfd1426..00000000000 --- a/res/cardsfolder/titan_forge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Titan Forge -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 3 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Token | Cost$ T SubCounter<3/CHARGE> | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 9 | TokenToughness$ 9 | SpellDescription$ Put a 9/9 colorless Golem artifact creature token onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/titan_forge.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titanias_boon.txt b/res/cardsfolder/titanias_boon.txt deleted file mode 100644 index 79298ea67f8..00000000000 --- a/res/cardsfolder/titanias_boon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Titania's Boon -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ PutCounterAll | Cost$ 3 G | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on each creature you control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanias_boon.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titanias_chosen.txt b/res/cardsfolder/titanias_chosen.txt deleted file mode 100644 index 9053502390a..00000000000 --- a/res/cardsfolder/titanias_chosen.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Titania's Chosen -ManaCost:2 G -Types:Creature Elf Archer -Text:no text -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a player casts a green spell, put a +1/+1 counter on Titania's Chosen. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Spell.Green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanias_chosen.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titanias_song.txt b/res/cardsfolder/titanias_song.txt deleted file mode 100644 index 52d3833df54..00000000000 --- a/res/cardsfolder/titanias_song.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Titania's Song -ManaCost:3 G -Types:Enchantment -Text:no text -K:stAnimateAll:Artifact.nonCreature:Count$CardManaCost/Count$CardManaCost:Creature:no colors:Overwrite:No condition:Each noncreature artifact loses its abilities and becomes an artifact creature with power and toughness each equal to its converted mana cost. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ If CARDNAME leaves the battlefield, this effect continues until end of turn. -SVar:TrigEffect:AB$ Effect | Cost$ 0 | Name$ Titania's Song Effect | Keywords$ KWAnimateAll -SVar:KWAnimateAll:stAnimateAll:Artifact.nonCreature:Count$CardManaCost/Count$CardManaCost:Creature:no colors:Overwrite:No condition:Each noncreature artifact loses its abilities and becomes an artifact creature with power and toughness each equal to its converted mana cost. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanias_song.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/194.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/127.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/160.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titanic_bulvox.txt b/res/cardsfolder/titanic_bulvox.txt deleted file mode 100644 index ebbca975aaf..00000000000 --- a/res/cardsfolder/titanic_bulvox.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Titanic Bulvox -ManaCost:6 G G -Types:Creature Beast -Text:no text -PT:7/4 -K:Trample -K:Morph:4 G G G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanic_bulvox.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/titanic_ultimatum.txt b/res/cardsfolder/titanic_ultimatum.txt deleted file mode 100644 index b361077d59c..00000000000 --- a/res/cardsfolder/titanic_ultimatum.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Titanic Ultimatum -ManaCost:R R G G G W W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ R R G G G W W | ValidCards$ Creature.YouCtrl | NumAtt$ +5 | NumDef$ +5 | KW$ First Strike & Lifelink & Trample | SpellDescription$ Until end of turn, creatures you control get +5/+5 and gain first strike, lifelink, and trample. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanic_ultimatum.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/204.jpg -End - - diff --git a/res/cardsfolder/titanium_golem.txt b/res/cardsfolder/titanium_golem.txt deleted file mode 100644 index b41783baa0c..00000000000 --- a/res/cardsfolder/titanium_golem.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Titanium Golem -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 1 W | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/titanium_golem.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/263.jpg -End diff --git a/res/cardsfolder/titans_revenge.txt b/res/cardsfolder/titans_revenge.txt deleted file mode 100644 index 11cb59ad250..00000000000 --- a/res/cardsfolder/titans_revenge.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Titan's Revenge -ManaCost:X R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ X R R | NumDmg$ X | Tgt$ TgtCP | SubAbility$ SVar=DBClash | SpellDescription$ CARDNAME deals X damage to target creature or player. Clash with an opponent. If you win, return CARDNAME to it's owner's hand. -SVar:DBClash:DB$Clash | WinSubAbility$ DBReturn -SVar:DBReturn:DB$ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/titans_revenge.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tithe.txt b/res/cardsfolder/tithe.txt deleted file mode 100644 index 782ae7684c0..00000000000 --- a/res/cardsfolder/tithe.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tithe -ManaCost:W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Hand | ChangeType$ Plains | ChangeNum$ 1 | Shuffle$ True | SpellDescription$ Search your library for a Plains card. -A:SP$ ChangeZone | Cost$ W | Origin$ Library | Destination$ Hand | ChangeType$ Plains | ChangeNum$ 2 | Shuffle$ True | IsPresent$ Land.YouCtrl | PresentCompare$ LTX | SpellDescription$ If you control fewer lands than an opponent, you may search your library for an additional Plains card. Reveal those cards and put them into your hand. Then shuffle your library. -SVar:X:Count$Valid Land.YouDontCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tithe.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tivadar_of_thorn.txt b/res/cardsfolder/tivadar_of_thorn.txt deleted file mode 100644 index 7020318ea07..00000000000 --- a/res/cardsfolder/tivadar_of_thorn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tivadar of Thorn -ManaCost:1 W W -Types:Legendary Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from red -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target Goblin. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Goblin | TgtPrompt$ Select target Goblin -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tivadar_of_thorn.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tivadars_crusade.txt b/res/cardsfolder/tivadars_crusade.txt deleted file mode 100644 index 9e75f092da4..00000000000 --- a/res/cardsfolder/tivadars_crusade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tivadar's Crusade -ManaCost:1 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 1 W W | ValidCards$ Goblin | SpellDescription$ Destroy all Goblins. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tivadars_crusade.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/91.jpg -End diff --git a/res/cardsfolder/to_arms.txt b/res/cardsfolder/to_arms.txt deleted file mode 100644 index 8c2f54ae5a0..00000000000 --- a/res/cardsfolder/to_arms.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:To Arms! -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ UntapAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/to_arms.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tobias_andrion.txt b/res/cardsfolder/tobias_andrion.txt deleted file mode 100644 index d503f809543..00000000000 --- a/res/cardsfolder/tobias_andrion.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tobias Andrion -ManaCost:3 W U -Types:Legendary Creature Human Advisor -Text:no text -PT:4/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1691.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toil_to_renown.txt b/res/cardsfolder/toil_to_renown.txt deleted file mode 100644 index b82b30fce83..00000000000 --- a/res/cardsfolder/toil_to_renown.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Toil to Renown -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 1 G | Defined$ You | LifeAmount$ X | SpellDescription$ You gain 1 life for each tapped artifact, creature, and land you control. -SVar:X:Count$Valid Artifact.YouCtrl+tapped,Creature.YouCtrl+tapped,Land.YouCtrl+tapped -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/toil_to_renown.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toils_of_night_and_day.txt b/res/cardsfolder/toils_of_night_and_day.txt deleted file mode 100644 index bbcc147bf3c..00000000000 --- a/res/cardsfolder/toils_of_night_and_day.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Toils of Night and Day -ManaCost:2 U -Types:Instant Arcane -Text:no text -A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ SVar=DBTapOrUntap | SpellDescription$ You may tap or untap target permanent, then you may tap or untap another target permanent. -SVar:DBTapOrUntap:DB$TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent (2) -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/toils_of_night_and_day.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolaria_west.txt b/res/cardsfolder/tolaria_west.txt deleted file mode 100644 index 05335a61bd9..00000000000 --- a/res/cardsfolder/tolaria_west.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tolaria West -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -K:Transmute:1 U U -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolaria_west.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolarian_academy.txt b/res/cardsfolder/tolarian_academy.txt deleted file mode 100644 index 2cbf116fa5a..00000000000 --- a/res/cardsfolder/tolarian_academy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tolarian Academy -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ X | SpellDescription$ Add U to your mana pool for each Artifact you control. -SVar:X:Count$Valid Artifact.YouCtrl -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_academy.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolarian_emissary.txt b/res/cardsfolder/tolarian_emissary.txt deleted file mode 100644 index 8960fd8022f..00000000000 --- a/res/cardsfolder/tolarian_emissary.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tolarian Emissary -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/2 -K:Flying -K:Kicker:1 W -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target enchantment. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_emissary.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolarian_entrancer.txt b/res/cardsfolder/tolarian_entrancer.txt deleted file mode 100644 index 64657874975..00000000000 --- a/res/cardsfolder/tolarian_entrancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tolarian Entrancer -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, gain control of that creature at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigGainControl | TriggerDescription$ Gain control of blocking creature. -SVar:TrigGainControl:AB$GainControl | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_entrancer.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolarian_serpent.txt b/res/cardsfolder/tolarian_serpent.txt deleted file mode 100644 index 3df41feff5b..00000000000 --- a/res/cardsfolder/tolarian_serpent.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tolarian Serpent -ManaCost:5 U U -Types:Creature Serpent -Text:no text -PT:7/7 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ At the beginning of your upkeep, put the top seven cards of your library into your graveyard. -SVar:TrigMill:AB$ Mill | Cost$ 0 | NumCards$ 7 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolarian_serpent.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tolsimir_wolfblood.txt b/res/cardsfolder/tolsimir_wolfblood.txt deleted file mode 100644 index 23a2764d132..00000000000 --- a/res/cardsfolder/tolsimir_wolfblood.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tolsimir Wolfblood -ManaCost:4 G W -Types:Legendary Creature Elf Warrior -Text:no text -PT:3/4 -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -K:stPumpAll:Creature.White+Other+YouCtrl:1/1:No Condition:Other white creatures you control get +1/+1. -A:AB$ Token | Cost$ T | TokenAmount$ 1 | TokenName$ Voja | TokenTypes$ Legendary,Creature,Wolf | TokenOwner$ You | TokenColors$ Green,White | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a legendary 2/2 green and white Wolf creature token named Voja onto the battlefield. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tolsimir_wolfblood.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/236.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tomb_of_urami.txt b/res/cardsfolder/tomb_of_urami.txt deleted file mode 100644 index 1fa18f4e5b4..00000000000 --- a/res/cardsfolder/tomb_of_urami.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tomb of Urami -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you if you don't control an Ogre. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You | ConditionPresent$ Ogre.YouCtrl | ConditionCompare$ EQ0 -A:AB$ Token | Cost$ 2 B B T Sac | TokenAmount$ 1 | TokenController$ You | TokenName$ Urami | TokenTypes$ Legendary,Creature,Demon,Spirit | TokenColors$ Black | TokenPower$ 5 | TokenToughness$ 5 | TokenKeywords$ Flying | CostDesc$ 2 B B, T, Sacrifice all lands you control: | SpellDescription$ Put a legendary 5/5 black Demon Spirit creature token with flying named Urami onto the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tomb_of_urami.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tome_scour.txt b/res/cardsfolder/tome_scour.txt deleted file mode 100644 index d657566cb97..00000000000 --- a/res/cardsfolder/tome_scour.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tome Scour -ManaCost:U -Types:Sorcery -Text:no text -A:SP$ Mill | Cost$ U | NumCards$ 5 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top five cards of his or her library into his or her graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tome_scour.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/76.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tonic_peddler.txt b/res/cardsfolder/tonic_peddler.txt deleted file mode 100644 index 4779e9c22ce..00000000000 --- a/res/cardsfolder/tonic_peddler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tonic Peddler -ManaCost:1 W -Types:Creature Human Spellshaper -PT:1/1 -Text:no text -A:AB$ GainLife | Cost$ W T Discard<1/Card> | LifeAmount$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player gains 3 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tonic_peddler.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tooth_of_chiss_goria.txt b/res/cardsfolder/tooth_of_chiss_goria.txt deleted file mode 100644 index c6be8f95a54..00000000000 --- a/res/cardsfolder/tooth_of_chiss_goria.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tooth of Chiss-Goria -ManaCost:3 -Types:Artifact -Text:Affinity for artifacts (This spell costs 1 less to cast for each artifact you control.) -K:Flash -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | SpellDescription$ Target creature gets +1/+0 until end of turn. -K:CostChange:Player:Less:1:Self:All:All:Affinity/Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tooth_of_chiss_goria.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/264.jpg -End diff --git a/res/cardsfolder/tooth_of_ramos.txt b/res/cardsfolder/tooth_of_ramos.txt deleted file mode 100644 index 652c8f28757..00000000000 --- a/res/cardsfolder/tooth_of_ramos.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tooth of Ramos -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tooth_of_ramos.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/topan_ascetic.txt b/res/cardsfolder/topan_ascetic.txt deleted file mode 100644 index 10218c256fd..00000000000 --- a/res/cardsfolder/topan_ascetic.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Topan Ascetic -ManaCost:2 G -Types:Creature Human Monk -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/topan_ascetic.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/151.jpg -End diff --git a/res/cardsfolder/tor_giant.txt b/res/cardsfolder/tor_giant.txt deleted file mode 100644 index 673ee453d96..00000000000 --- a/res/cardsfolder/tor_giant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tor Giant -ManaCost:3 R -Types:Creature Giant -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ia/en-us/card2656.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tor_wauki.txt b/res/cardsfolder/tor_wauki.txt deleted file mode 100644 index c61cf3824db..00000000000 --- a/res/cardsfolder/tor_wauki.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tor Wauki -ManaCost:2 B B R -Types:Legendary Creature Human Archer -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target attacking or blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tor_wauki.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torch_drake.txt b/res/cardsfolder/torch_drake.txt deleted file mode 100644 index c618a384d29..00000000000 --- a/res/cardsfolder/torch_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Torch Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torch_drake.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/38.jpg -End diff --git a/res/cardsfolder/torch_slinger.txt b/res/cardsfolder/torch_slinger.txt deleted file mode 100644 index bb07d63af04..00000000000 --- a/res/cardsfolder/torch_slinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Torch Slinger -ManaCost:2 R -Types: Creature Goblin Shaman -Text:no text -PT:2/2 -K:Kicker:1 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, it deals 2 damage to target creature. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torch_slinger.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torch_song.txt b/res/cardsfolder/torch_song.txt deleted file mode 100644 index 1a9ede44a82..00000000000 --- a/res/cardsfolder/torch_song.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Torch Song -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ DealDamage | Cost$ 2 R Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/torch_song.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/222.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torii_watchward.txt b/res/cardsfolder/torii_watchward.txt deleted file mode 100644 index 1667b98f331..00000000000 --- a/res/cardsfolder/torii_watchward.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Torii Watchward -ManaCost:4 W -Types:Creature Spirit -Text:no text -PT:3/3 -K:Vigilance -K:Soulshift:4 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card87342.jpg -SetInfo:SOK|Common|http://magiccards.info/scans/en/sok/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torment.txt b/res/cardsfolder/torment.txt deleted file mode 100644 index e163c3c5318..00000000000 --- a/res/cardsfolder/torment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Torment -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-3/-0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torment.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tormented_angel.txt b/res/cardsfolder/tormented_angel.txt deleted file mode 100644 index e8716788447..00000000000 --- a/res/cardsfolder/tormented_angel.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tormented Angel -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:1/5 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card18287.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tormods_crypt.txt b/res/cardsfolder/tormods_crypt.txt deleted file mode 100644 index a6f79f129e4..00000000000 --- a/res/cardsfolder/tormods_crypt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tormod's Crypt -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ ChangeZoneAll | Cost$ T Exile<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | Shuffle$ True | SpellDescription$ Exile all cards from target player's graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tormods_crypt.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/109.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torpor_dust.txt b/res/cardsfolder/torpor_dust.txt deleted file mode 100644 index 818e7f20f3d..00000000000 --- a/res/cardsfolder/torpor_dust.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Torpor Dust -ManaCost:2 UB -Types:Enchantment Aura -Text:no text -K:Flash -K:Enchant creature -K:enPumpCurse:-3/-0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torpor_dust.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/177.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torrent_of_fire.txt b/res/cardsfolder/torrent_of_fire.txt deleted file mode 100644 index b881fb2ed03..00000000000 --- a/res/cardsfolder/torrent_of_fire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Torrent of Fire -ManaCost:3 R R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R R | ValidTgts$ Creature,Player | TgtPrompt$ Select target creature or player | NumDmg$ X | SpellDescription$ CARDNAME deals damage equal to the highest converted mana cost among permanents you control to target creature or player. -SVar:X:Count$MaxCMCYouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torrent_of_fire.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torsten_von_ursus.txt b/res/cardsfolder/torsten_von_ursus.txt deleted file mode 100644 index e6fc6d87be1..00000000000 --- a/res/cardsfolder/torsten_von_ursus.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Torsten Von Ursus -ManaCost:3 W G G -Types:Legendary Creature Human Soldier -Text:no text -PT:5/5 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/le/en-us/card1693.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tortoise_formation.txt b/res/cardsfolder/tortoise_formation.txt deleted file mode 100644 index 1e94e05355e..00000000000 --- a/res/cardsfolder/tortoise_formation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tortoise Formation -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 3 U | ValidCards$ Creature.YouCtrl | KW$ Shroud | SpellDescription$ Creatures you control gain shroud until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tortoise_formation.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/torture.txt b/res/cardsfolder/torture.txt deleted file mode 100644 index e2ec21ce69f..00000000000 --- a/res/cardsfolder/torture.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Torture -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:+0/+0 -A:AB$ PutCounter | Cost$ 1 B | Defined$ Enchanted | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on enchanted creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/torture.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/23.jpg|2 -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/61.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tortured_existence.txt b/res/cardsfolder/tortured_existence.txt deleted file mode 100644 index 078831aa69b..00000000000 --- a/res/cardsfolder/tortured_existence.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tortured Existence -ManaCost:B -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ B Discard<1/Card> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tortured_existence.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/totem_guide_hartebeest.txt b/res/cardsfolder/totem_guide_hartebeest.txt deleted file mode 100644 index 5f717431652..00000000000 --- a/res/cardsfolder/totem_guide_hartebeest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Totem-Guide Hartebeest -ManaCost:4 W -Types:Creature Antelope -Text:no text -PT:2/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for an Aura card, reveal it, put it into your hand, then shuffle your library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Aura | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/totem_guide_hartebeest.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/totem_speaker.txt b/res/cardsfolder/totem_speaker.txt deleted file mode 100644 index 8554801960f..00000000000 --- a/res/cardsfolder/totem_speaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Totem Speaker -ManaCost:4 G -Types:Creature Elf Druid -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Beast | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a Beast enters the battlefield, you may gain 3 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/totem_speaker.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/touch_of_brilliance.txt b/res/cardsfolder/touch_of_brilliance.txt deleted file mode 100644 index 4ecbd75ad0d..00000000000 --- a/res/cardsfolder/touch_of_brilliance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Touch of Brilliance -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U | NumCards$ 2 | SpellDescription$ Draw two cards. -SVar:Rarity:Common -SVar:Picture:http://serv1.tcgimages.eu/img/cards/Portal/touch_of_brilliance.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/58.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/57.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/touch_of_darkness.txt b/res/cardsfolder/touch_of_darkness.txt deleted file mode 100644 index 605f4a96945..00000000000 --- a/res/cardsfolder/touch_of_darkness.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Touch of Darkness -ManaCost:B -Types:Instant -Text:no text -A:SP$ Animate | Cost$ B | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ MaxTgts | TgtPrompt$ Select target creatures | Colors$ Black | OverwriteColors$ True | SpellDescription$ Any number of target creatures become black until end of turn. -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_darkness.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/touch_of_death.txt b/res/cardsfolder/touch_of_death.txt deleted file mode 100644 index 27a67ce3e27..00000000000 --- a/res/cardsfolder/touch_of_death.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Touch of Death -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B | Tgt$ TgtP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player. You gain 1 life. | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:DB$GainLife | LifeAmount$ 1 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_death.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/62.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/touch_of_invisibility.txt b/res/cardsfolder/touch_of_invisibility.txt deleted file mode 100644 index 706b0b17d57..00000000000 --- a/res/cardsfolder/touch_of_invisibility.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Touch of Invisibility -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 3 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Target creature is unblockable this turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/touch_of_invisibility.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/109.jpg -End diff --git a/res/cardsfolder/touchstone.txt b/res/cardsfolder/touchstone.txt deleted file mode 100644 index 6bf5db715aa..00000000000 --- a/res/cardsfolder/touchstone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Touchstone -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ T | ValidTgts$ Artifact.YouDontCtrl | TgtPrompt$ Select target artifact you don't control | SpellDescription$ Tap target artifact you don't control. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/touchstone.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/161.jpg -End diff --git a/res/cardsfolder/tower_drake.txt b/res/cardsfolder/tower_drake.txt deleted file mode 100644 index 6c3c1efa742..00000000000 --- a/res/cardsfolder/tower_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tower Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:2/1 -K:Flying -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_drake.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/82.jpg -End diff --git a/res/cardsfolder/tower_gargoyle.txt b/res/cardsfolder/tower_gargoyle.txt deleted file mode 100644 index 1f58be42f17..00000000000 --- a/res/cardsfolder/tower_gargoyle.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tower Gargoyle -ManaCost:1 W U B -Types:Artifact Creature Gargoyle -Text:no text -PT:4/4 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_gargoyle.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tower_of_calamities.txt b/res/cardsfolder/tower_of_calamities.txt deleted file mode 100644 index 467d2367ed8..00000000000 --- a/res/cardsfolder/tower_of_calamities.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tower of Calamities -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DealDamage | Cost$ 8 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 12 | SpellDescription$ CARDNAME deals 12 damage to target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_calamities.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tower_of_champions.txt b/res/cardsfolder/tower_of_champions.txt deleted file mode 100644 index b0dabbc4f1d..00000000000 --- a/res/cardsfolder/tower_of_champions.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tower of Champions -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 8 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +6 | NumDef$ +6 | SpellDescription$ Target creature gets +6/+6 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_champions.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/265.jpg -End diff --git a/res/cardsfolder/tower_of_coireall.txt b/res/cardsfolder/tower_of_coireall.txt deleted file mode 100644 index 8f23bd55b2c..00000000000 --- a/res/cardsfolder/tower_of_coireall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tower of Coireall -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't be blocked by Walls. | SpellDescription$ Target creature can't be blocked by Walls this turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_coireall.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/110.jpg -End diff --git a/res/cardsfolder/tower_of_eons.txt b/res/cardsfolder/tower_of_eons.txt deleted file mode 100644 index 8fbca0696c3..00000000000 --- a/res/cardsfolder/tower_of_eons.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tower of Eons -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ 8 T | LifeAmount$ 10 | SpellDescription$ You gain 10 life. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_eons.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/266.jpg -End diff --git a/res/cardsfolder/tower_of_fortunes.txt b/res/cardsfolder/tower_of_fortunes.txt deleted file mode 100644 index 7a68e573e47..00000000000 --- a/res/cardsfolder/tower_of_fortunes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tower of Fortunes -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ 8 T | NumCards$ 4 | SpellDescription$ Draw four cards. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_fortunes.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tower_of_murmurs.txt b/res/cardsfolder/tower_of_murmurs.txt deleted file mode 100644 index 3aa18c8abae..00000000000 --- a/res/cardsfolder/tower_of_murmurs.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tower of Murmurs -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ 8 T | NumCards$ 8 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top eight cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_murmurs.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tower_of_the_magistrate.txt b/res/cardsfolder/tower_of_the_magistrate.txt deleted file mode 100644 index 64bae5962b6..00000000000 --- a/res/cardsfolder/tower_of_the_magistrate.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tower of the Magistrate -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Protection from artifacts | SpellDescription$ Target creature gains protection from artifacts until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tower_of_the_magistrate.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/towering_baloth.txt b/res/cardsfolder/towering_baloth.txt deleted file mode 100644 index 8678ca6c3e6..00000000000 --- a/res/cardsfolder/towering_baloth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Towering Baloth -ManaCost:6 G G -Types:Creature Beast -Text:no text -PT:7/6 -K:Morph:6 G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/towering_baloth.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/292.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toxic_iguanar.txt b/res/cardsfolder/toxic_iguanar.txt deleted file mode 100644 index 10ba81901d0..00000000000 --- a/res/cardsfolder/toxic_iguanar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Toxic Iguanar -ManaCost:R -Types:Creature Lizard -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/0/Deathtouch:isPresent Permanent.Green+YouCtrl: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.) -SVar:BuffedBy:Permanent.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/toxic_iguanar.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toxic_nim.txt b/res/cardsfolder/toxic_nim.txt deleted file mode 100644 index 8607f1045cd..00000000000 --- a/res/cardsfolder/toxic_nim.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Toxic Nim -ManaCost:4 B B -Types:Creature Zombie -Text:no text -PT:4/1 -K:Infect -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/toxic_nim.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toxin_sliver.txt b/res/cardsfolder/toxin_sliver.txt deleted file mode 100644 index 5746813170b..00000000000 --- a/res/cardsfolder/toxin_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Toxin Sliver -ManaCost:3 B -Types:Creature Sliver -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Sliver | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever a Sliver deals combat damage to a creature, destroy that creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget | NoRegen$ True -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/toxin_sliver.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/toymaker.txt b/res/cardsfolder/toymaker.txt deleted file mode 100644 index 22c0f58acac..00000000000 --- a/res/cardsfolder/toymaker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Toymaker -ManaCost:2 -Types:Artifact Creature Spellshaper -Text:no text -PT:1/1 -A:AB$ Animate | Cost$ 1 T Discard<1/Card> | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Creature | SpellDescription$ 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.) -SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/toymaker.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/314.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tracker.txt b/res/cardsfolder/tracker.txt deleted file mode 100644 index b8dbb16e3da..00000000000 --- a/res/cardsfolder/tracker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tracker -ManaCost:2 G -Types:Creature Human -Text:no text -PT:2/2 -A:AB$ DealDamage | Cost$ G G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DamageThis | SpellDescription$ CARDNAME deals damage equal to its power to target creature. That creature deals damage equal to its power to CARDNAME. -SVar:DamageThis:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y -SVar:X:Count$CardPower -SVar:Y:Targeted$CardPower -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tracker.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trade_caravan.txt b/res/cardsfolder/trade_caravan.txt deleted file mode 100644 index a4f2ab79389..00000000000 --- a/res/cardsfolder/trade_caravan.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trade Caravan -ManaCost:W -Types:Creature Human Nomad -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a currency counter on CARDNAME. -A:AB$ Untap | Cost$ SubCounter<2/CURRENCY> | ValidTgts$ Land.Basic | TgtPrompt$ Select target basic land | ActivatingPhases$ Upkeep | OpponentTurn$ True | SpellDescription$ Untap target basic land. Activate this ability only during an opponent's upkeep. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ CURRENCY | CounterNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trade_caravan.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/123.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/trade_routes.txt b/res/cardsfolder/trade_routes.txt deleted file mode 100644 index f8526c8968e..00000000000 --- a/res/cardsfolder/trade_routes.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trade Routes -ManaCost:1 U -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | SpellDescription$ Return target land you control to its owner's hand. -A:AB$ Draw | Cost$ 1 Discard<1/Land> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/trade_routes.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/109.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/112.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/108.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tradewind_rider.txt b/res/cardsfolder/tradewind_rider.txt deleted file mode 100644 index 1880eb15b1d..00000000000 --- a/res/cardsfolder/tradewind_rider.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tradewind Rider -ManaCost:3 U -Types:Creature Spirit -Text:no text -PT:1/4 -K:Flying -A:AB$ ChangeZone | Cost$ T tapXType<2/Creature> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tradewind_rider.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tragic_poet.txt b/res/cardsfolder/tragic_poet.txt deleted file mode 100644 index 3b351b6535e..00000000000 --- a/res/cardsfolder/tragic_poet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tragic Poet -ManaCost:W -Types:Creature Human -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | TgtPrompt$ Choose target enchantment card in your graveyard | ValidTgts$ Enchantment | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target enchantment card from your graveyard to your hand. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tragic_poet.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trailblazer.txt b/res/cardsfolder/trailblazer.txt deleted file mode 100644 index e42dc2d5a18..00000000000 --- a/res/cardsfolder/trailblazer.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trailblazer -ManaCost:2 G G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SpellDescription$ Target creature is unblockable this turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/trailblazer.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/160.jpg -End diff --git a/res/cardsfolder/trailblazers_boots.txt b/res/cardsfolder/trailblazers_boots.txt deleted file mode 100644 index 673e46c7103..00000000000 --- a/res/cardsfolder/trailblazers_boots.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trailblazer's Boots -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature has nonbasic landwalk. -K:eqPump 2:Nonbasic landwalk -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trailblazers_boots.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trained_armodon.txt b/res/cardsfolder/trained_armodon.txt deleted file mode 100644 index 13967075f76..00000000000 --- a/res/cardsfolder/trained_armodon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trained Armodon -ManaCost:1 G G -Types:Creature Elephant -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83303.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/284.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/154.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/257.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/274.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trained_cheetah.txt b/res/cardsfolder/trained_cheetah.txt deleted file mode 100644 index 8d54cb6a53d..00000000000 --- a/res/cardsfolder/trained_cheetah.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trained Cheetah -ManaCost:2 G -Types:Creature Cat -Text:no text -PT:2/2 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trained_cheetah.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trained_jackal.txt b/res/cardsfolder/trained_jackal.txt deleted file mode 100644 index 960cad0bf44..00000000000 --- a/res/cardsfolder/trained_jackal.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trained Jackal -ManaCost:G -Types:Creature Hound -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10571.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trained_orgg.txt b/res/cardsfolder/trained_orgg.txt deleted file mode 100644 index d17865ad32c..00000000000 --- a/res/cardsfolder/trained_orgg.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trained Orgg -ManaCost:6 R -Types:Creature Orgg Beast -Text:no text -PT:6/6 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21785.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/120.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trained_pronghorn.txt b/res/cardsfolder/trained_pronghorn.txt deleted file mode 100644 index 48ecde730c4..00000000000 --- a/res/cardsfolder/trained_pronghorn.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trained Pronghorn -ManaCost:1 W -Types:Creature Antelope -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | KW$ HIDDEN Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Prevent all damage that would be dealt to CARDNAME this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trained_pronghorn.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/training_drone.txt b/res/cardsfolder/training_drone.txt deleted file mode 100644 index c139dfd8b49..00000000000 --- a/res/cardsfolder/training_drone.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Training Drone -ManaCost:3 -Types:Artifact Creature Drone -Text:no text -PT:4/4 -K:stPumpSelf:Creature.unequipped:0/0/HIDDEN CARDNAME can't attack. & HIDDEN CARDNAME can't block.:No Condition:Training Drone can't attack or block unless it's equipped. -SVar:BuffedBy:Artifact.Equipment -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/training_drone.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/training_grounds.txt b/res/cardsfolder/training_grounds.txt deleted file mode 100644 index 2cc85f95c69..00000000000 --- a/res/cardsfolder/training_grounds.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Training Grounds -ManaCost:U -Types:Enchantment -Text: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. -K:CostChange:Player:Less:2:Ability:All:Creature:TargetInPlay -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/training_grounds.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/traitorous_instinct.txt b/res/cardsfolder/traitorous_instinct.txt deleted file mode 100644 index fce0eaf13fd..00000000000 --- a/res/cardsfolder/traitorous_instinct.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Traitorous Instinct -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | LoseControl$ EOT | SubAbility$ SVar=DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. Until end of turn, it gets +2/+0 and gains haste. -SVar:DBPump:DB$Pump | Defined$ Targeted | NumAtt$ +2 | KW$ Haste -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/traitorous_instinct.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tranquil_domain.txt b/res/cardsfolder/tranquil_domain.txt deleted file mode 100644 index 91e640e312b..00000000000 --- a/res/cardsfolder/tranquil_domain.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tranquil Domain -ManaCost:1 G -Types:Instant -Text:no text -A:SP$ DestroyAll | Cost$ 1 G | ValidCards$ Enchantment.nonAura | SpellDescription$ Destroy all non-Aura enchantments. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_domain.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/143.jpg -End diff --git a/res/cardsfolder/tranquil_garden.txt b/res/cardsfolder/tranquil_garden.txt deleted file mode 100644 index 72d6e51803a..00000000000 --- a/res/cardsfolder/tranquil_garden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tranquil Garden -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add G to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add W to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_garden.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tranquil_grove.txt b/res/cardsfolder/tranquil_grove.txt deleted file mode 100644 index 487081ba461..00000000000 --- a/res/cardsfolder/tranquil_grove.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tranquil Grove -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ DestroyAll | Cost$ 1 G G | ValidCards$ Enchantment.Other | SpellDescription$ Destroy all other enchantments. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_grove.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/84.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/258.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tranquil_path.txt b/res/cardsfolder/tranquil_path.txt deleted file mode 100644 index d1eb0a650ae..00000000000 --- a/res/cardsfolder/tranquil_path.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tranquil Path -ManaCost:4 G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 4 G | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_path.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/89.jpg -End diff --git a/res/cardsfolder/tranquil_thicket.txt b/res/cardsfolder/tranquil_thicket.txt deleted file mode 100644 index c008287aee6..00000000000 --- a/res/cardsfolder/tranquil_thicket.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tranquil Thicket -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:Cycling:G -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquil_thicket.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/326.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tranquility.txt b/res/cardsfolder/tranquility.txt deleted file mode 100644 index aa0aad06522..00000000000 --- a/res/cardsfolder/tranquility.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Tranquility -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 G | ValidCards$ Enchantment | SpellDescription$ Destroy all enchantments. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tranquility.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/155.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/129.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/129.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/276.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/161.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/217.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/280.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/259.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/128.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/195.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/transcendent_master.txt b/res/cardsfolder/transcendent_master.txt deleted file mode 100644 index 602f87d9bfa..00000000000 --- a/res/cardsfolder/transcendent_master.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Transcendent Master -ManaCost:1 W W -Types:Creature Human Cleric Avatar -Text:no text -PT:3/3 -K:stSetPT:3:3:LevelGE6:6:6:LevelGE12:9:9:LEVEL 6-11 6/6 Lifelink LEVEL 12+ 9/9 Lifelink Indestructible -K:stPumpSelf:Creature.countersGE6LEVEL:0/0/Lifelink:No Condition:no text -K:stPumpSelf:Creature.countersGEXLEVEL:0/0/HIDDEN Indestructible:No Condition:no text -K:Level up:1 -K:maxLevel:12 -SVar:X:Number$12 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/transcendent_master.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/transguild_courier.txt b/res/cardsfolder/transguild_courier.txt deleted file mode 100644 index 4a014a0bb2a..00000000000 --- a/res/cardsfolder/transguild_courier.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Transguild Courier -ManaCost:4 -Types:Artifact Creature Golem -Text:Transguild Courier is all colors (even if this card isn't on the battlefield). -PT:3/3 -K:CARDNAME is white. -K:CARDNAME is blue. -K:CARDNAME is black. -K:CARDNAME is red. -K:CARDNAME is green. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/transguild_courier.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/transluminant.txt b/res/cardsfolder/transluminant.txt deleted file mode 100644 index 1485100fdf9..00000000000 --- a/res/cardsfolder/transluminant.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Transluminant -ManaCost:1 G -Types:Creature Dryad Shaman -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87946.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/transmutation.txt b/res/cardsfolder/transmutation.txt deleted file mode 100644 index 33486a4d91f..00000000000 --- a/res/cardsfolder/transmutation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Transmutation -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/transmutation.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trap_digger.txt b/res/cardsfolder/trap_digger.txt deleted file mode 100644 index a23ce732c3c..00000000000 --- a/res/cardsfolder/trap_digger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trap Digger -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:1/3 -A:AB$ PutCounter | Cost$ 2 W T | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ TRAP | CounterNum$ 1 | SpellDescription$ Put a trap counter on target land you control. -A:AB$ DealDamage | Cost$ Sac<1/Land.countersGE1TRAP> | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | NumDmg$ 3 | CostDesc$ Sacrifice a land with a trap counter on it: | SpellDescription$ CARDNAME deals 3 damage to target attacking creature without flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/trap_digger.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trapjaw_kelpie.txt b/res/cardsfolder/trapjaw_kelpie.txt deleted file mode 100644 index ac16016e98e..00000000000 --- a/res/cardsfolder/trapjaw_kelpie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trapjaw Kelpie -ManaCost:4 GU GU -Types:Creature Beast -Text:no text -PT:3/3 -K:Flash -K:Persist -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trapjaw_kelpie.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trapmakers_snare.txt b/res/cardsfolder/trapmakers_snare.txt deleted file mode 100644 index 92e0d1a5606..00000000000 --- a/res/cardsfolder/trapmakers_snare.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trapmaker's Snare -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Hand | ChangeType$ Trap | ChangeNum$ 1 | SpellDescription$ Search your library for a Trap card, reveal it, and put it into your hand. Then shuffle your library. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trapmakers_snare.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/traproot_kami.txt b/res/cardsfolder/traproot_kami.txt deleted file mode 100644 index c289b21ab5e..00000000000 --- a/res/cardsfolder/traproot_kami.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Traproot Kami -ManaCost:G -Types:Creature Spirit -Text:no text -PT:0/* -K:Defender -K:Reach -K:stSetPT:0:Count$Valid Forest:CARDNAME's toughness is equal to the number of Forests on the battlefield. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/traproot_kami.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/147.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trash_for_treasure.txt b/res/cardsfolder/trash_for_treasure.txt deleted file mode 100644 index cb13bf11323..00000000000 --- a/res/cardsfolder/trash_for_treasure.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trash for Treasure -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 R Sac<1/Artifact> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target artifact card in your graveyard | ValidTgts$ Artifact.YouCtrl | SpellDescription$ Return target artifact card from your graveyard to the battlefield. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/trash_for_treasure.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/traumatic_visions.txt b/res/cardsfolder/traumatic_visions.txt deleted file mode 100644 index c3a4a40473f..00000000000 --- a/res/cardsfolder/traumatic_visions.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Traumatic Visions -ManaCost:3 U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 3 U U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -K:TypeCycling:Basic:1 U -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/traumatic_visions.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/traumatize.txt b/res/cardsfolder/traumatize.txt deleted file mode 100644 index 0c6c7e921cb..00000000000 --- a/res/cardsfolder/traumatize.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Traumatize -ManaCost:3 U U -Types:Sorcery -Text:no text -A:SP$ Mill | Cost$ 3 U U | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | SpellDescription$ Target player puts the top half of his or her library, rounded down, into his or her graveyard. -SVar:X:TargetedPlayer$CardsInLibrary/HalfDown -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/traumatize.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/77.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/77.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/119.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/109.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treacherous_link.txt b/res/cardsfolder/treacherous_link.txt deleted file mode 100644 index 3fb99d16cd3..00000000000 --- a/res/cardsfolder/treacherous_link.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Treacherous Link -ManaCost:1 B -Types:Enchantment Aura -Text:All damage that would be dealt to enchanted creature is dealt to its controller instead. -K:Enchant creature -K:enPumpCurse:+0/+0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_link.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/71.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treachery.txt b/res/cardsfolder/treachery.txt deleted file mode 100644 index 8fd3f2ee69b..00000000000 --- a/res/cardsfolder/treachery.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treachery -ManaCost:3 U U -Types:Enchantment Aura -Text:You control enchanted creature. -K:Enchant creature -K:enControlCreature -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap up to five lands. -SVar:TrigUntap:AB$ Untap | Cost$ 0 | UntapUpTo$ True | UntapType$ Land | Amount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/treachery.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treasure_hunter.txt b/res/cardsfolder/treasure_hunter.txt deleted file mode 100644 index 55dcfb187d0..00000000000 --- a/res/cardsfolder/treasure_hunter.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Treasure Hunter -ManaCost:2 W -Types:Creature Human -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target artifact card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Artifact.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treasure_hunter.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/23.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treasure_mage.txt b/res/cardsfolder/treasure_mage.txt deleted file mode 100644 index ed720be59db..00000000000 --- a/res/cardsfolder/treasure_mage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treasure Mage -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.cmcGE6 | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treasure_mage.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treasure_trove.txt b/res/cardsfolder/treasure_trove.txt deleted file mode 100644 index 811a6840179..00000000000 --- a/res/cardsfolder/treasure_trove.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Treasure Trove -ManaCost:2 U U -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 2 U U | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treasure_trove.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/110.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/50.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tree_monkey.txt b/res/cardsfolder/tree_monkey.txt deleted file mode 100644 index 722014c81df..00000000000 --- a/res/cardsfolder/tree_monkey.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tree Monkey -ManaCost:G -Types:Creature Ape -Text:no text -PT:1/1 -K:Reach -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84665.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/88.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tree_of_tales.txt b/res/cardsfolder/tree_of_tales.txt deleted file mode 100644 index 0d04c013977..00000000000 --- a/res/cardsfolder/tree_of_tales.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tree of Tales -ManaCost:no cost -Types:Artifact Land -Text:(Tree of Tales isn't a spell.) -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tree_of_tales.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treefolk_harbinger.txt b/res/cardsfolder/treefolk_harbinger.txt deleted file mode 100644 index ed6296fce1c..00000000000 --- a/res/cardsfolder/treefolk_harbinger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treefolk Harbinger -ManaCost:G -Types:Creature Treefolk Druid -Text:no text -PT:0/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card.Treefolk,Card.Forest | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treefolk_harbinger.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treefolk_seedlings.txt b/res/cardsfolder/treefolk_seedlings.txt deleted file mode 100644 index 5b4333bf05d..00000000000 --- a/res/cardsfolder/treefolk_seedlings.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Treefolk Seedlings -ManaCost:2 G -Types:Creature Treefolk -Text:no text -PT:2/* -K:stSetPT:2:Count$Valid Forest.YouCtrl:CARDNAME's toughness is equal to the number of Forests you control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treefolk_seedlings.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/278.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treespring_lorian.txt b/res/cardsfolder/treespring_lorian.txt deleted file mode 100644 index 7fdc4753bf5..00000000000 --- a/res/cardsfolder/treespring_lorian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Treespring Lorian -ManaCost:5 G -Types:Creature Beast -Text:no text -PT:5/4 -K:Morph:5 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/treespring_lorian.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/293.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treetop_bracers.txt b/res/cardsfolder/treetop_bracers.txt deleted file mode 100644 index 6e900b57c2c..00000000000 --- a/res/cardsfolder/treetop_bracers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treetop Bracers -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1/HIDDEN CantBeBlockedBy Creature.withoutFlying:Enchanted creature gets +1/+1 and can't be blocked except by creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_bracers.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/123.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/276.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treetop_rangers.txt b/res/cardsfolder/treetop_rangers.txt deleted file mode 100644 index 91652e618ab..00000000000 --- a/res/cardsfolder/treetop_rangers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Treetop Rangers -ManaCost:2 G -Types:Creature Elf -Text:CARDNAME can't be blocked except by creatures with flying. -PT:2/2 -K:CantBeBlockedBy Creature.withoutFlying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_rangers.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treetop_scout.txt b/res/cardsfolder/treetop_scout.txt deleted file mode 100644 index 5a7866e7f4a..00000000000 --- a/res/cardsfolder/treetop_scout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Treetop Scout -ManaCost:G -Types:Creature Elf Scout -Text:CARDNAME can't be blocked except by creatures with flying. -PT:1/1 -K:CantBeBlockedBy Creature.withoutFlying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_scout.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treetop_sentinel.txt b/res/cardsfolder/treetop_sentinel.txt deleted file mode 100644 index 2dd077c3e33..00000000000 --- a/res/cardsfolder/treetop_sentinel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Treetop Sentinel -ManaCost:2 U U -Types:Creature Bird Soldier -Text:no text -PT:2/3 -K:Flying -K:Protection from green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_sentinel.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treetop_village.txt b/res/cardsfolder/treetop_village.txt deleted file mode 100644 index 81510fb269c..00000000000 --- a/res/cardsfolder/treetop_village.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treetop Village -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Animate | Cost$ 1 G | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Ape | Colors$ Green | Keywords$ Trample | SpellDescription$ CARDNAME 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_village.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/143.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/361.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tremble.txt b/res/cardsfolder/tremble.txt deleted file mode 100644 index dfcc229dc68..00000000000 --- a/res/cardsfolder/tremble.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Tremble -ManaCost:1 R -Types:Sorcery -A:SP$ Sacrifice | Cost$ 1 R | SacValid$ Land | Defined$ Each | SpellDescription$ Each player sacrifices a land. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tremble.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tremor.txt b/res/cardsfolder/tremor.txt deleted file mode 100644 index 3bc6fde7944..00000000000 --- a/res/cardsfolder/tremor.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tremor -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ R | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidDescription$ each creature without flying. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6592.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/228.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/225.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/220.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/118.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/211.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/99.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trench_wurm.txt b/res/cardsfolder/trench_wurm.txt deleted file mode 100644 index 7b883883d45..00000000000 --- a/res/cardsfolder/trench_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trench Wurm -ManaCost:3 B -Types:Creature Wurm -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ 2 R T | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trench_wurm.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/127.jpg -End diff --git a/res/cardsfolder/trenching_steed.txt b/res/cardsfolder/trenching_steed.txt deleted file mode 100644 index cf960aa0334..00000000000 --- a/res/cardsfolder/trenching_steed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trenching Steed -ManaCost:3 W -Types:Creature Horse Rebel -Text:no text -PT:2/3 -A:AB$ Pump | Cost$ Sac<1/Land> | CostDesc$ Sacrifice a land: | NumDef$ 3 | SpellDescription$ CARDNAME gets +0/+3 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trenching_steed.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trespassing_souleater.txt b/res/cardsfolder/trespassing_souleater.txt deleted file mode 100644 index 10a4d3cc036..00000000000 --- a/res/cardsfolder/trespassing_souleater.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trespassing Souleater -ManaCost:3 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ PU | Defined$ Self | KW$ Unblockable | SpellDescription$ CARDNAME is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trespassing_souleater.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tresserhorn_sinks.txt b/res/cardsfolder/tresserhorn_sinks.txt deleted file mode 100644 index dbd77847d48..00000000000 --- a/res/cardsfolder/tresserhorn_sinks.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tresserhorn Sinks -ManaCost:no cost -Types:Snow Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tresserhorn_sinks.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tresserhorn_skyknight.txt b/res/cardsfolder/tresserhorn_skyknight.txt deleted file mode 100644 index d7dd5822e2b..00000000000 --- a/res/cardsfolder/tresserhorn_skyknight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tresserhorn Skyknight -ManaCost:5 B B -Types:Creature Zombie Knight -Text:Prevent all damage that would be dealt to Tresserhorn Skyknight by creatures with first strike. -PT:5/3 -K:Flying -K:PreventAllDamageBy Creature.withFirst Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tresserhorn_skyknight.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/treva_the_renewer.txt b/res/cardsfolder/treva_the_renewer.txt deleted file mode 100644 index 05c1bd2d73e..00000000000 --- a/res/cardsfolder/treva_the_renewer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Treva, the Renewer -ManaCost:3 G W U -Types:Legendary Creature Dragon -Text:Whenever Treva, the Renewer deals combat damage to a player, you may pay 2 W. If you do, choose a color. You gain 1 life for each permanent of that color. -PT:6/6 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/treva_the_renewer.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trevas_attendant.txt b/res/cardsfolder/trevas_attendant.txt deleted file mode 100644 index f02fa85b834..00000000000 --- a/res/cardsfolder/trevas_attendant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Treva's Attendant -ManaCost:5 -Types:Artifact Creature Golem -Text:no text -PT:3/3 -A:AB$ Mana | Cost$ 1 Sac<1/CARDNAME> | Produced$ G W U | SpellDescription$ Add G W U to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trevas_attendant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trevas_charm.txt b/res/cardsfolder/trevas_charm.txt deleted file mode 100644 index 3418a4363f1..00000000000 --- a/res/cardsfolder/trevas_charm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Treva's Charm -ManaCost:G W U -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G W U | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | PrecostDesc$ Choose one - | SpellDescription$ Destroy target enchantment; -A:SP$ ChangeZone | Cost$ G W U | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | Origin$ Battlefield | Destination$ Exile | PrecostDesc$ or | SpellDescription$ exile target attacking creature; -A:SP$ Draw | Cost$ G W U | Defined$ You | NumCards$ 1 | SubAbility$ SVar=DBDiscard | PrecostDesc$ or | SpellDescription$ draw a card, then discard a card. -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trevas_charm.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trevas_ruins.txt b/res/cardsfolder/trevas_ruins.txt deleted file mode 100644 index 34528905b13..00000000000 --- a/res/cardsfolder/trevas_ruins.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Treva's Ruins -ManaCost:no cost -Types:Land Lair -Text:When CARDNAME enters the battlefield, sacrifice it unless you return a non-Lair land you control to its owner's hand. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:NeedsToPlay:Land.nonLair+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trevas_ruins.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/triangle_of_war.txt b/res/cardsfolder/triangle_of_war.txt deleted file mode 100644 index a430885aa36..00000000000 --- a/res/cardsfolder/triangle_of_war.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Triangle of War -ManaCost:1 -Types:Artifact -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/triangle_of_war.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tribal_flames.txt b/res/cardsfolder/tribal_flames.txt deleted file mode 100644 index 66c8a6fd3a9..00000000000 --- a/res/cardsfolder/tribal_flames.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tribal Flames -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ Domain - Tribal Flames deals X damage to target creature or player, where X is the number of basic land types among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsb/en-us/card108916.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/176.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/70.jpg -End diff --git a/res/cardsfolder/tribal_forcemage.txt b/res/cardsfolder/tribal_forcemage.txt deleted file mode 100644 index 19006ad6a4b..00000000000 --- a/res/cardsfolder/tribal_forcemage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tribal Forcemage -ManaCost:1 G -Types:Creature Elf Wizard -Text: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. -PT:1/1 -K:Morph:1 G -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tribal_forcemage.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tribal_golem.txt b/res/cardsfolder/tribal_golem.txt deleted file mode 100644 index ba2d2707291..00000000000 --- a/res/cardsfolder/tribal_golem.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Tribal Golem -ManaCost:6 -Types:Artifact Creature Golem -Text:no text -PT:4/4 -K:stPumpSelf:Creature:0/0/Trample:isPresent Beast.YouCtrl:CARDNAME has trample as long as you control a Beast, -K:stPumpSelf:Creature:0/0/Haste:isPresent Goblin.YouCtrl:haste as long as you control a Goblin, -K:stPumpSelf:Creature:0/0/First Strike:isPresent Soldier.YouCtrl:first strike as long as you control a Soldier, -K:stPumpSelf:Creature:0/0/Flying:isPresent Wizard.YouCtrl:flying as long as you control a Wizard, -K:stPumpSelf:Card:0/0/SVar=ABRegen:isPresent Zombie.YouCtrl:and "B: Regenerate CARDNAME" as long as you control a Zombie. -SVar:ABRegen:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:BuffedBy:Beast,Goblin,Soldier,Wizard,Zombie -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tribal_golem.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/311.jpg -End diff --git a/res/cardsfolder/trickster_mage.txt b/res/cardsfolder/trickster_mage.txt deleted file mode 100644 index 6722ec7e733..00000000000 --- a/res/cardsfolder/trickster_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trickster Mage -ManaCost:U -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ TapOrUntap | Cost$ U T Discard<1/Card> | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trickster_mage.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/49.jpg -End diff --git a/res/cardsfolder/triclopean_sight.txt b/res/cardsfolder/triclopean_sight.txt deleted file mode 100644 index c108cd9a03d..00000000000 --- a/res/cardsfolder/triclopean_sight.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Triclopean Sight -ManaCost:1 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:Flash -K:enPump:+1/+1/Vigilance:Enchanted creature gets +1/+1 and has vigilance. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap enchanted creature. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Enchanted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/triclopean_sight.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trigon_of_corruption.txt b/res/cardsfolder/trigon_of_corruption.txt deleted file mode 100644 index b62e5881853..00000000000 --- a/res/cardsfolder/trigon_of_corruption.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trigon of Corruption -ManaCost:4 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ PutCounter | Cost$ B B T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ PutCounter | Cost$ 2 T SubCounter<1/CHARGE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | CounterType$ M1M1 | CounterNum$ 1 | SpellDescription$ Put a -1/-1 counter on target creature. -SVar:Rarity:Uncommon -# SVar:RemAIDeck:True -# I've run some tests where the AI does use both abilities of this card, but it can be flakey. -SVar:Picture:http://www.wizards.com/global/images/magic/general/trigon_of_corruption.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/213.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trigon_of_infestation.txt b/res/cardsfolder/trigon_of_infestation.txt deleted file mode 100644 index 1e22765caf8..00000000000 --- a/res/cardsfolder/trigon_of_infestation.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trigon of Infestation -ManaCost:4 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ PutCounter | Cost$ G G T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Token | Cost$ 2 T SubCounter<1/CHARGE> | TokenImage$ G 1 1 Insect Infect | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Infect | SpellDescription$ Put a 1/1 green Insect creature token with infect onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trigon_of_infestation.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trigon_of_mending.txt b/res/cardsfolder/trigon_of_mending.txt deleted file mode 100644 index 056c8fb3425..00000000000 --- a/res/cardsfolder/trigon_of_mending.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trigon of Mending -ManaCost:2 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ PutCounter | Cost$ W W T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ GainLife | Cost$ 2 T SubCounter<1/CHARGE> | LifeAmount$ 3 | ValidTgts$ Player | TgtPrompt$ Choose a player to gain 3 life | SpellDescription$ Target player gains 3 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trigon_of_mending.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/215.jpg -End diff --git a/res/cardsfolder/trigon_of_rage.txt b/res/cardsfolder/trigon_of_rage.txt deleted file mode 100644 index 9e81f5ea283..00000000000 --- a/res/cardsfolder/trigon_of_rage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Trigon of Rage -ManaCost:2 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ PutCounter | Cost$ R R T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Pump | Cost$ 2 T SubCounter<1/CHARGE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ 3 | SpellDescription$ Target creature gets +3/+0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trigon_of_rage.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/216.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trigon_of_thought.txt b/res/cardsfolder/trigon_of_thought.txt deleted file mode 100644 index f4c192083fe..00000000000 --- a/res/cardsfolder/trigon_of_thought.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trigon of Thought -ManaCost:5 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ PutCounter | Cost$ U U T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -A:AB$ Draw | Cost$ 2 T SubCounter<1/CHARGE> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trigon_of_thought.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/217.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trinket_mage.txt b/res/cardsfolder/trinket_mage.txt deleted file mode 100644 index 8e6c1520a58..00000000000 --- a/res/cardsfolder/trinket_mage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trinket Mage -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Artifact.cmcLE1 | ChangeNum$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trinket_mage.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/39.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trip_noose.txt b/res/cardsfolder/trip_noose.txt deleted file mode 100644 index 9e19356b8fd..00000000000 --- a/res/cardsfolder/trip_noose.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trip Noose -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Tap | Cost$ 2 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trip_noose.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/266.jpg -End diff --git a/res/cardsfolder/trip_wire.txt b/res/cardsfolder/trip_wire.txt deleted file mode 100644 index 5d6c935e66e..00000000000 --- a/res/cardsfolder/trip_wire.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trip Wire -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Creature.withHorsemanship | TgtPrompt$ Select target creature with horsemanship | SpellDescription$ Destroy target creature with horsemanship. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/trip_wire.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/156.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/triskelavus.txt b/res/cardsfolder/triskelavus.txt deleted file mode 100644 index 9c42e8b4a27..00000000000 --- a/res/cardsfolder/triskelavus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Triskelavus -ManaCost:7 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -K:Flying -K:etbCounter:P1P1:3 -A:AB$ Token | Cost$ 1 SubCounter<1/P1P1> | TokenAmount$ 1 | TokenName$ Triskelavite | TokenTypes$ Artifact,Creature,Triskelavite | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ 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." | TokenAbilities$ ABDamage -SVar:ABDamage:AB$DealDamage | Cost$ Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/triskelavus.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/266.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/triskelion.txt b/res/cardsfolder/triskelion.txt deleted file mode 100644 index 976f30b9b76..00000000000 --- a/res/cardsfolder/triskelion.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Triskelion -ManaCost:6 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -K:etbCounter:P1P1:3 -A:AB$ DealDamage | Cost$ SubCounter<1/P1P1> | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/triskelion.jpg -SetInfo:M11|Rare|http://magiccards.info/scans/en/m11/218.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/269.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/372.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/triumph_of_the_hordes.txt b/res/cardsfolder/triumph_of_the_hordes.txt deleted file mode 100644 index 07cc86d7835..00000000000 --- a/res/cardsfolder/triumph_of_the_hordes.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Triumph of the Hordes -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 G G | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | KW$ Trample & Infect | SpellDescription$ 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.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/triumph_of_the_hordes.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trokin_high_guard.txt b/res/cardsfolder/trokin_high_guard.txt deleted file mode 100644 index 926468add15..00000000000 --- a/res/cardsfolder/trokin_high_guard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trokin High Guard -ManaCost:3 W -Types:Creature Human Knight -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6496.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/146.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/troll_ascetic.txt b/res/cardsfolder/troll_ascetic.txt deleted file mode 100644 index 40bc178581d..00000000000 --- a/res/cardsfolder/troll_ascetic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Troll Ascetic -ManaCost:1 G G -Types:Creature Troll Shaman -Text:no text -PT:3/2 -A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card49828.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/135.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/305.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/troll_horn_cameo.txt b/res/cardsfolder/troll_horn_cameo.txt deleted file mode 100644 index a92e6094262..00000000000 --- a/res/cardsfolder/troll_horn_cameo.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Troll-Horn Cameo -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/troll_horn_cameo.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trolls_of_tel_jilad.txt b/res/cardsfolder/trolls_of_tel_jilad.txt deleted file mode 100644 index cf3a659d373..00000000000 --- a/res/cardsfolder/trolls_of_tel_jilad.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Trolls of Tel-Jilad -ManaCost:5 G G -Types:Creature Troll Shaman -Text:no text -PT:5/6 -A:AB$ Regenerate | Cost$ 1 G | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature. | SpellDescription$ Regenerate target green creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trolls_of_tel_jilad.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tromp_the_domains.txt b/res/cardsfolder/tromp_the_domains.txt deleted file mode 100644 index 5c8d83a8091..00000000000 --- a/res/cardsfolder/tromp_the_domains.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tromp the Domains -ManaCost:5 G -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 5 G | ValidCards$ Creature.YouCtrl | NumAtt$ +X | NumDef$ +X | KW$ Trample | SpellDescription$ Domain - Until end of turn, creatures you control gain trample and get +1/+1 for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card116726.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tropical_island.txt b/res/cardsfolder/tropical_island.txt deleted file mode 100644 index 4b8cf2b2201..00000000000 --- a/res/cardsfolder/tropical_island.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tropical Island -ManaCost:no cost -Types:Land Forest Island -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tropical_island.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/293.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/299.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/303.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/299.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tropical_storm.txt b/res/cardsfolder/tropical_storm.txt deleted file mode 100644 index 27d15ced132..00000000000 --- a/res/cardsfolder/tropical_storm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tropical Storm -ManaCost:X G -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ X G | ValidCards$ Creature.withFlying | NumDmg$ X | SubAbility$ SVar=DBDamage | SpellDescription$ CARDNAME deals X damage to each creature with flying and 1 additional damage to each blue creature. -SVar:DBDamage:DB$DamageAll | ValidCards$ Creature.Blue | NumDmg$ 1 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tropical_storm.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/troublesome_spirit.txt b/res/cardsfolder/troublesome_spirit.txt deleted file mode 100644 index 6539a26e59a..00000000000 --- a/res/cardsfolder/troublesome_spirit.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Troublesome Spirit -ManaCost:2 U U -Types:Creature Spirit -Text:no text -PT:3/4 -K:Flying -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ At the beginning of your end step, tap all lands you control. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Land.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/troublesome_spirit.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/true_conviction.txt b/res/cardsfolder/true_conviction.txt deleted file mode 100644 index 09e67959fa3..00000000000 --- a/res/cardsfolder/true_conviction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:True Conviction -ManaCost:3 W W W -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Lifelink & Double Strike:No Condition:Creatures you control have double strike and lifelink. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/true_conviction.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trumpet_blast.txt b/res/cardsfolder/trumpet_blast.txt deleted file mode 100644 index 3df0aeb39f8..00000000000 --- a/res/cardsfolder/trumpet_blast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Trumpet Blast -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 R | ValidCards$ Creature.attacking | NumAtt$ 2 | SpellDescription$ Attacking creatures get +2/+0 until end of turn -SVar:Rarity:Common -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/trumpet_blast.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/98.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/160.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trusted_advisor.txt b/res/cardsfolder/trusted_advisor.txt deleted file mode 100644 index a1702d62b05..00000000000 --- a/res/cardsfolder/trusted_advisor.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Trusted Advisor -ManaCost:U -Types:Creature Human Advisor -Text:no text -PT:1/2 -K:HandSize + 2 Self -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBounce | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, return a blue creature you control to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Choose target blue creature | Mandatory$ True | ValidTgts$ Creature.Blue+YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trusted_advisor.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trusty_machete.txt b/res/cardsfolder/trusty_machete.txt deleted file mode 100644 index 4eacc1f51b5..00000000000 --- a/res/cardsfolder/trusty_machete.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Trusty Machete -ManaCost:1 -Types:Artifact Equipment -Text:Equipped creature gets +2/+1. -K:eqPump 2:+2/+1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trusty_machete.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/trygon_predator.txt b/res/cardsfolder/trygon_predator.txt deleted file mode 100644 index ab0ff214d78..00000000000 --- a/res/cardsfolder/trygon_predator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Trygon Predator -ManaCost:1 G U -Types:Creature Beast -Text:no text -PT:2/3 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | CombatDamage$ True | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may destroy target artifact or enchantment that player controls. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact.YouDontCtrl,Enchantment.YouDontCtrl | TgtPrompt$ Select target artifact or enchantment you don't control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/trygon_predator.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tsabo_tavoc.txt b/res/cardsfolder/tsabo_tavoc.txt deleted file mode 100644 index 5b2bf9e4688..00000000000 --- a/res/cardsfolder/tsabo_tavoc.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Tsabo Tavoc -ManaCost:5 B R -Types:Legendary Creature Horror -Text:no text -PT:7/4 -K:First Strike -K:Protection:Creature.Legendary:protection from legendary creatures -A:AB$ Destroy | Cost$ B B T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | NoRegen$ True | SpellDescription$ Destroy target legendary creature. It can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tsabo_tavoc.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/281.jpg -End diff --git a/res/cardsfolder/tsunami.txt b/res/cardsfolder/tsunami.txt deleted file mode 100644 index 51f25ab4282..00000000000 --- a/res/cardsfolder/tsunami.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tsunami -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 G | ValidCards$ Island | SpellDescription$ Destroy all Islands. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tsunami.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/130.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/130.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/196.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/162.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/129.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tukatongue_thallid.txt b/res/cardsfolder/tukatongue_thallid.txt deleted file mode 100644 index bdf3ea97a25..00000000000 --- a/res/cardsfolder/tukatongue_thallid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tukatongue Thallid -ManaCost:G -Types:Creature Fungus -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ TriggeredCardController | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tukatongue_thallid.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tuknir_deathlock.txt b/res/cardsfolder/tuknir_deathlock.txt deleted file mode 100644 index 4df836775cb..00000000000 --- a/res/cardsfolder/tuknir_deathlock.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tuknir Deathlock -ManaCost:R R G G -Types:Legendary Creature Human Wizard -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ R G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Target creature gets +2/+2 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tuknir_deathlock.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/307.jpg -End diff --git a/res/cardsfolder/tuktuk_grunts.txt b/res/cardsfolder/tuktuk_grunts.txt deleted file mode 100644 index 12d4cfc7855..00000000000 --- a/res/cardsfolder/tuktuk_grunts.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tuktuk Grunts -ManaCost:4 R -Types:Creature Goblin Warrior Ally -Text:no text -PT:2/2 -K:Haste -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tuktuk_grunts.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tuktuk_the_explorer.txt b/res/cardsfolder/tuktuk_the_explorer.txt deleted file mode 100644 index 7620ae78568..00000000000 --- a/res/cardsfolder/tuktuk_the_explorer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Tuktuk the Explorer -ManaCost:2 R -Types:Legendary Creature Goblin -Text: -PT:1/1 -K:Haste -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put a legendary 5/5 colorless Goblin Golem artifact creature token named Tuktuk the Returned onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Tuktuk the Returned | TokenTypes$ Legendary,Artifact,Creature,Goblin,Golem | TokenOwner$ TriggeredCardController | TokenColors$ Colorless | TokenPower$ 5 | TokenToughness$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tuktuk_the_explorer.jpg -SetInfo:ROE|Rare|http://magiccards.info/scans/en/roe/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tumble_magnet.txt b/res/cardsfolder/tumble_magnet.txt deleted file mode 100644 index 301735e20cc..00000000000 --- a/res/cardsfolder/tumble_magnet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tumble Magnet -ManaCost:3 -Types:Artifact -Text:no text -K:etbCounter:CHARGE:3 -A:AB$ Tap | Cost$ T SubCounter<1/CHARGE> | ValidTgts$ Creature,Artifact | TgtPrompt$ Select target artifact or creature | SpellDescription$ Tap target artifact or creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tumble_magnet.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/218.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tundra.txt b/res/cardsfolder/tundra.txt deleted file mode 100644 index 7e7068932ff..00000000000 --- a/res/cardsfolder/tundra.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Tundra -ManaCost:no cost -Types:Land Plains Island -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/tundra.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/294.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/300.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/304.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/300.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tundra_wolves.txt b/res/cardsfolder/tundra_wolves.txt deleted file mode 100644 index 3c683683805..00000000000 --- a/res/cardsfolder/tundra_wolves.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Tundra Wolves -ManaCost:W -Types:Creature Wolf -Text:no text -PT:1/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tundra_wolves.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/54.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/209.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/342.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/303.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/54.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tunnel.txt b/res/cardsfolder/tunnel.txt deleted file mode 100644 index 7c49cbd22f6..00000000000 --- a/res/cardsfolder/tunnel.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Tunnel -ManaCost:R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ R | ValidTgts$ Creature.Wall | TgtPrompt$ Select target Wall | NoRegen$ True | SpellDescription$ Destroy target Wall. It can't be regenerated. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tunnel.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/179.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/180.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/180.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/245.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/tunneler_wurm.txt b/res/cardsfolder/tunneler_wurm.txt deleted file mode 100644 index d5123980a0a..00000000000 --- a/res/cardsfolder/tunneler_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tunneler Wurm -ManaCost:6 G G -Types:Creature Wurm -Text:no text -PT:6/6 -A:AB$ Regenerate | Cost$ Discard<1/Card> | Defined$ Self | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/tunneler_wurm.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turn_aside.txt b/res/cardsfolder/turn_aside.txt deleted file mode 100644 index 541d65a9c91..00000000000 --- a/res/cardsfolder/turn_aside.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Turn Aside -ManaCost:U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Permanent.YouCtrl | SpellDescription$ Counter target spell that targets a permanent you control. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_aside.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turn_the_tide.txt b/res/cardsfolder/turn_the_tide.txt deleted file mode 100644 index 20f2ca5eae8..00000000000 --- a/res/cardsfolder/turn_the_tide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Turn the Tide -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 U | ValidCards$ Creature.YouDontCtrl | IsCurse$ True | NumAtt$ -2 | SpellDescription$ Creatures your opponents control get -2/-0 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_the_tide.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turn_to_dust.txt b/res/cardsfolder/turn_to_dust.txt deleted file mode 100644 index 65c79e4aeb1..00000000000 --- a/res/cardsfolder/turn_to_dust.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Turn to Dust -ManaCost:G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ G | ValidTgts$ Equipment | TgtPrompt$ Select target Equipment | SubAbility$ SVar=DBMana | SpellDescription$ Destroy target Equipment. Add G to your mana pool. -SVar:DBMana:DB$Mana | Produced$ G | Amount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_to_dust.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turn_to_mist.txt b/res/cardsfolder/turn_to_mist.txt deleted file mode 100644 index cbe533cc4a0..00000000000 --- a/res/cardsfolder/turn_to_mist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Turn to Mist -ManaCost:1 WU -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 WU | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature | RememberTargets$ True | ForgetOtherTargets$ True | TgtPrompt$ Select target creature | SubAbility$ SVar=DelTrig | SpellDescription$ Exile target creature. Return that card to the battlefield under its owner's control at end of turn. -SVar:DelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | TriggerDescription$ Return exiled card to the battlefield. -SVar:TrigReturn:AB$ ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_to_mist.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turn_to_slag.txt b/res/cardsfolder/turn_to_slag.txt deleted file mode 100644 index 4bad2f21798..00000000000 --- a/res/cardsfolder/turn_to_slag.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Turn to Slag -ManaCost:3 R R -Types:Sorcery -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turn_to_slag.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turnabout.txt b/res/cardsfolder/turnabout.txt deleted file mode 100644 index 1c72482d706..00000000000 --- a/res/cardsfolder/turnabout.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Turnabout -ManaCost:2 U U -Types:Instant -Text: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. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/turnabout.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turntimber_grove.txt b/res/cardsfolder/turntimber_grove.txt deleted file mode 100644 index 9054c004c7f..00000000000 --- a/res/cardsfolder/turntimber_grove.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Turntimber Grove -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/turntimber_grove.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turntimber_ranger.txt b/res/cardsfolder/turntimber_ranger.txt deleted file mode 100644 index 63d744fb383..00000000000 --- a/res/cardsfolder/turntimber_ranger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Turntimber Ranger -ManaCost:3 G G -Types:Creature Elf Scout Ally -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME 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 CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigToken | Secondary$ True | TriggerDescription$ Whenever CARDNAME 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 CARDNAME. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/turntimber_ranger.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/191.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/turtleshell_changeling.txt b/res/cardsfolder/turtleshell_changeling.txt deleted file mode 100644 index d3286cd1a28..00000000000 --- a/res/cardsfolder/turtleshell_changeling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Turtleshell Changeling -ManaCost:3 U -Types:Creature Shapeshifter -Text:no text -PT:1/4 -K:Changeling -A:AB$ Pump | Cost$ 1 U | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/turtleshell_changeling.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twiddle.txt b/res/cardsfolder/twiddle.txt deleted file mode 100644 index 5e914809cd4..00000000000 --- a/res/cardsfolder/twiddle.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Twiddle -ManaCost:U -Types:Instant -Text:no text -A:SP$ TapOrUntap | Cost$ U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/twiddle.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/111.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/86.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/86.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/107.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/130.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/109.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twigwalker.txt b/res/cardsfolder/twigwalker.txt deleted file mode 100644 index 8166d13ec62..00000000000 --- a/res/cardsfolder/twigwalker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Twigwalker -ManaCost:2 G -Types:Creature Insect -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 1 G Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 2 | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ Up to two target creatures each get +2/+2 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/twigwalker.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twilight_drover.txt b/res/cardsfolder/twilight_drover.txt deleted file mode 100644 index 07f139dab23..00000000000 --- a/res/cardsfolder/twilight_drover.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Twilight Drover -ManaCost:2 W -Types:Creature Spirit -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.token | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature token leaves the battlefield, put a +1/+1 counter on CARDNAME. -A:AB$ Token$ | Cost$ 2 W SubCounter<1/P1P1> | TokenAmount$ 2 | TokenName$ Spirit | TokenTypes$ Creature,Spirit | TokenOwner$ You | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | SpellDescription$ Put two 1/1 white Spirit creature tokens with flying onto the battlefield. -SVar:TrigPutCounter:AB$ PutCounter | Cost$ 0 | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/twilight_drover.jpg -SVar:Rarity:Rare -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/33.jpg -End diff --git a/res/cardsfolder/twilight_mire.txt b/res/cardsfolder/twilight_mire.txt deleted file mode 100644 index 23b1d724e45..00000000000 --- a/res/cardsfolder/twilight_mire.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Twilight Mire -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ BG T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -A:AB$ Mana | Cost$ BG T | Produced$ B G | SpellDescription$ Add B G to your mana pool. -A:AB$ Mana | Cost$ BG T | Produced$ B | Amount$ 2 | SpellDescription$ Add B B to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/twilight_mire.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twinblade_slasher.txt b/res/cardsfolder/twinblade_slasher.txt deleted file mode 100644 index 6a306c5789c..00000000000 --- a/res/cardsfolder/twinblade_slasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Twinblade Slasher -ManaCost:G -Types:Creature Elf Warrior -Text:Activate this ability only once each turn. -PT:1/1 -A:AB$ Pump | Cost$ 1 G | NumAtt$ +2 | NumDef$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. Activate this ability only once each turn. -K:Wither -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/twinblade_slasher.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twincast.txt b/res/cardsfolder/twincast.txt deleted file mode 100644 index 79290cc3e9d..00000000000 --- a/res/cardsfolder/twincast.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Twincast -ManaCost:U U -Types:Instant -Text:no text -A:SP$ CopySpell | Cost$ U U | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/twincast.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/78.jpg -SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/60.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twisted_abomination.txt b/res/cardsfolder/twisted_abomination.txt deleted file mode 100644 index cae38647915..00000000000 --- a/res/cardsfolder/twisted_abomination.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Twisted Abomination -ManaCost:5 B -Types:Creature Zombie Mutant -Text:no text -PT:5/3 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -K:TypeCycling:Swamp:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/twisted_abomination.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/76.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twisted_experiment.txt b/res/cardsfolder/twisted_experiment.txt deleted file mode 100644 index 99f0495e6f9..00000000000 --- a/res/cardsfolder/twisted_experiment.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Twisted Experiment -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+3/-1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/twisted_experiment.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twisted_image.txt b/res/cardsfolder/twisted_image.txt deleted file mode 100644 index 813700afad5..00000000000 --- a/res/cardsfolder/twisted_image.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Twisted Image -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch target creature's power and toughness until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/twisted_image.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/twitch.txt b/res/cardsfolder/twitch.txt deleted file mode 100644 index 64c8eb2e32b..00000000000 --- a/res/cardsfolder/twitch.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Twitch -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature, or land | SubAbility$ SVar=DBDraw | SpellDescription$ You may tap or untap target artifact, creature, or land. -SVar:DBDraw:DB$Draw | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/twitch.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/99.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/43.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/typhoon.txt b/res/cardsfolder/typhoon.txt deleted file mode 100644 index 5729bce0724..00000000000 --- a/res/cardsfolder/typhoon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Typhoon -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 G | Defined$ Opponent | NumDmg$ X | SpellDescription$ Typhoon deals damage to each opponent equal to the number of Islands that player controls. -SVar:X:Count$Valid Island.YouDontCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/typhoon.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/123.jpg -End diff --git a/res/cardsfolder/tyrranax.txt b/res/cardsfolder/tyrranax.txt deleted file mode 100644 index 9266a76752b..00000000000 --- a/res/cardsfolder/tyrranax.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Tyrranax -ManaCost:4 G G -Types:Creature Beast -Text:no text -PT:5/4 -A:AB$ Pump | Cost$ 1 G | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ CARDNAME gets -1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/tyrranax.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/98.jpg -End diff --git a/res/cardsfolder/uktabi_drake.txt b/res/cardsfolder/uktabi_drake.txt deleted file mode 100644 index 507098cb835..00000000000 --- a/res/cardsfolder/uktabi_drake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Uktabi Drake -ManaCost:G -Types:Creature Drake -Text:no text -PT:2/1 -K:Flying -K:Haste -K:Echo:1 G G -SVar:PlayMain1:TRUE -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/uktabi_drake.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uktabi_efreet.txt b/res/cardsfolder/uktabi_efreet.txt deleted file mode 100644 index caa844542c5..00000000000 --- a/res/cardsfolder/uktabi_efreet.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Uktabi Efreet -ManaCost:2 G G -Types:Creature Efreet -Text:no text -PT:5/4 -K:Cumulative upkeep:G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/uktabi_efreet.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uktabi_faerie.txt b/res/cardsfolder/uktabi_faerie.txt deleted file mode 100644 index 60a1079d855..00000000000 --- a/res/cardsfolder/uktabi_faerie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Uktabi Faerie -ManaCost:1 G -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -A:AB$ Destroy | Cost$ 3 G Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/uktabi_faerie.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/145.jpg -End diff --git a/res/cardsfolder/uktabi_orangutan.txt b/res/cardsfolder/uktabi_orangutan.txt deleted file mode 100644 index 456e45d6747..00000000000 --- a/res/cardsfolder/uktabi_orangutan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Uktabi Orangutan -ManaCost:2 G -Types:Creature Ape -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/uktabi_orangutan.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/73.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/260.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uktabi_wildcats.txt b/res/cardsfolder/uktabi_wildcats.txt deleted file mode 100644 index d4ffba87879..00000000000 --- a/res/cardsfolder/uktabi_wildcats.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Uktabi Wildcats -ManaCost:4 G -Types:Creature Cat -Text:no text -PT:*/* -K:stSetPT:Count$NumTypeYouCtrl.Forest:Count$NumTypeYouCtrl.Forest:Uktabi Wildcats's power and toughness are each equal to the number of Forests you control. -A:AB$ Regenerate | Cost$ G Sac<1/Forest> | SpellDescription$ Regenerate CARDNAME. -SVar:BuffedBy:Forest -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/uktabi_wildcats.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/261.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/146.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ulamog_the_infinite_gyre.txt b/res/cardsfolder/ulamog_the_infinite_gyre.txt deleted file mode 100644 index 16d4dea7355..00000000000 --- a/res/cardsfolder/ulamog_the_infinite_gyre.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Ulamog, the Infinite Gyre -ManaCost:11 -Types:Legendary Creature Eldrazi -Text:no text -PT:10/10 -K:Indestructible -K:Annihilator 4 -K:When CARDNAME is put into a graveyard from anywhere, reveal CARDNAME and its owner shuffles his or her graveyard into his or her library. -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When you cast CARDNAME, destroy target permanent. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/ulamog_the_infinite_gyre.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/12.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ulamogs_crusher.txt b/res/cardsfolder/ulamogs_crusher.txt deleted file mode 100644 index 96210e8923f..00000000000 --- a/res/cardsfolder/ulamogs_crusher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ulamog's Crusher -ManaCost:8 -Types:Creature Eldrazi -Text:no text -PT:8/8 -K:Annihilator 2 -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ulamogs_crusher.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/13.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/umara_raptor.txt b/res/cardsfolder/umara_raptor.txt deleted file mode 100644 index 11ea4874fc4..00000000000 --- a/res/cardsfolder/umara_raptor.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Umara Raptor -ManaCost:2 U -Types:Creature Bird Ally -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Ally.Other+YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Ally enters the battlefield under your control, you may put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Ally -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/umara_raptor.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/umbra_stalker.txt b/res/cardsfolder/umbra_stalker.txt deleted file mode 100644 index 881ff65045f..00000000000 --- a/res/cardsfolder/umbra_stalker.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Umbra Stalker -ManaCost:4 B B B -Types:Creature Elemental -Text: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. -PT:1/1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/umbra_stalker.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/umbral_mantle.txt b/res/cardsfolder/umbral_mantle.txt deleted file mode 100644 index a5387fbcd53..00000000000 --- a/res/cardsfolder/umbral_mantle.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Umbral Mantle -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature has "3, Untap: This creature gets +2/+2 until end of turn.". -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/umbral_mantle.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/umezawas_jitte.txt b/res/cardsfolder/umezawas_jitte.txt deleted file mode 100644 index 9d54a56c86f..00000000000 --- a/res/cardsfolder/umezawas_jitte.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Umezawa's Jitte -ManaCost:2 -Types:Legendary Artifact Equipment -Text:no text -K:eqPump 2:0/0 -T:Mode$ DamageDone | ValidSource$ Creature.AttachedBy | ValidTarget$ Creature,Player,Planeswalker | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage, put two charge counters on CARDNAME. -A:AB$ Pump | Cost$ SubCounter<1/CHARGE> | Defined$ Equipped | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ Equipped creature gets +2/+2 until end of turn. -A:AB$ Pump | Cost$ SubCounter<1/CHARGE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Target creature gets -1/-1 until end of turn. -A:AB$ GainLife | Cost$ SubCounter<1/CHARGE> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/umezawas_jitte.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/163.jpg -End diff --git a/res/cardsfolder/unbender_tine.txt b/res/cardsfolder/unbender_tine.txt deleted file mode 100644 index 2e03b6f313e..00000000000 --- a/res/cardsfolder/unbender_tine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unbender Tine -ManaCost:2 U W -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ T | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent. | SpellDescription$ Untap another target permanent. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/unbender_tine.jpg -SVar:Rarity:Uncommon -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/15.jpg -End diff --git a/res/cardsfolder/unburden.txt b/res/cardsfolder/unburden.txt deleted file mode 100644 index 335513fea80..00000000000 --- a/res/cardsfolder/unburden.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unburden -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 1 B B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unburden.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uncle_istvan.txt b/res/cardsfolder/uncle_istvan.txt deleted file mode 100644 index 1286e3231d8..00000000000 --- a/res/cardsfolder/uncle_istvan.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Uncle Istvan -ManaCost:1 B B B -Types:Creature Human -Text:Prevent all damage that would be dealt to CARDNAME by creatures. -PT:1/3 -K:PreventAllDamageBy Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/uncle_istvan.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/51.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/16.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uncontrollable_anger.txt b/res/cardsfolder/uncontrollable_anger.txt deleted file mode 100644 index 7504bae2f50..00000000000 --- a/res/cardsfolder/uncontrollable_anger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Uncontrollable Anger -ManaCost:2 R R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/CARDNAME attacks each turn if able.:Enchanted creature gets +2/+2 and attacks each turn if able. -K:Flash -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/uncontrollable_anger.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/195.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undead_gladiator.txt b/res/cardsfolder/undead_gladiator.txt deleted file mode 100644 index 2b30d24bcda..00000000000 --- a/res/cardsfolder/undead_gladiator.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undead Gladiator -ManaCost:1 B B -Types:Creature Zombie Barbarian -Text:no text -PT:3/1 -K:Cycling:1 B -A:AB$ ChangeZone | Cost$ 1 B Discard<1/Card> | Origin$ Graveyard | Destination$ Hand | ActivatingZone$ Graveyard | ActivatingPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Return CARDNAME from your graveyard to your hand. Activate this ability only during your upkeep. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/undead_gladiator.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undead_leotau.txt b/res/cardsfolder/undead_leotau.txt deleted file mode 100644 index d25e682485b..00000000000 --- a/res/cardsfolder/undead_leotau.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undead Leotau -ManaCost:5 B -Types:Creature Zombie Cat -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -K:Unearth:2 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/undead_leotau.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/90.jpg -End diff --git a/res/cardsfolder/undead_slayer.txt b/res/cardsfolder/undead_slayer.txt deleted file mode 100644 index ac3a2057959..00000000000 --- a/res/cardsfolder/undead_slayer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undead Slayer -ManaCost:2 W -Types:Creature Human Cleric -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ W T | ValidTgts$ Creature.Skeleton,Creature.Vampire,Creature.Zombie | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target Skeleton, Vampire or Zombie creature. | SpellDescription$ Exile target Skeleton, Vampire or Zombie. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undead_slayer.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undead_warchief.txt b/res/cardsfolder/undead_warchief.txt deleted file mode 100644 index 2901c5cb768..00000000000 --- a/res/cardsfolder/undead_warchief.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Undead Warchief -ManaCost:2 B B -Types:Creature Zombie -Text:Zombie spells you cast cost 1 less to cast. -PT:1/1 -K:CostChange:Player:Less:1:Spell:All:Zombie:NoSpecial -K:stPumpAll:Creature.Zombie+YouCtrl:2/1:No Condition:Zombie creatures you control get +2/+1. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undead_warchief.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/78.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undercity_shade.txt b/res/cardsfolder/undercity_shade.txt deleted file mode 100644 index 1cef9df9da0..00000000000 --- a/res/cardsfolder/undercity_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undercity Shade -ManaCost:4 B -Types:Creature Shade -Text:no text -PT:1/1 -K:Fear -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undercity_shade.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/110.jpg -End diff --git a/res/cardsfolder/underground_river.txt b/res/cardsfolder/underground_river.txt deleted file mode 100644 index 8ef2327ef12..00000000000 --- a/res/cardsfolder/underground_river.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Underground River -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBPain | SpellDescription$ Add B to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/underground_river.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/350.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/446.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/326.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/357.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/362.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/underground_sea.txt b/res/cardsfolder/underground_sea.txt deleted file mode 100644 index 72b455147e0..00000000000 --- a/res/cardsfolder/underground_sea.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Underground Sea -ManaCost:no cost -Types:Land Island Swamp -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/underground_sea.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/295.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/301.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/305.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undergrowth.txt b/res/cardsfolder/undergrowth.txt deleted file mode 100644 index a073f766b69..00000000000 --- a/res/cardsfolder/undergrowth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Undergrowth -ManaCost:G -Types:Instant -Text:no text -A:SP$ Fog | Cost$ G | SpellDescription$ Prevent all combat damage that would be dealt this turn. -A:SP$ Effect | Cost$ G 2 R | Name$ Undergrowth Effect | Keywords$ KWPump | SpellDescription$ If its additional cost was paid, CARDNAME doesn't affect combat damage that would be dealt by red creatures. -SVar:KWPump:stPumpAll:Creature.nonRed:0/0/HIDDEN Prevent all combat damage that would be dealt by CARDNAME.:no Condition:Prevent all combat damage this turn except that from red creatures. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/undergrowth.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/87.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/undermine.txt b/res/cardsfolder/undermine.txt deleted file mode 100644 index 7528d607a96..00000000000 --- a/res/cardsfolder/undermine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Undermine -ManaCost:U U B -Types:Instant -Text:no text -A:SP$ Counter | Cost$ U U B | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDrain | Destination$ Graveyard | SpellDescription$ Counter target spell. Its controller loses 3 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/undermine.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undertaker.txt b/res/cardsfolder/undertaker.txt deleted file mode 100644 index 6b82d6500ba..00000000000 --- a/res/cardsfolder/undertaker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undertaker -ManaCost:1 B -Types:Creature Human Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ B T Discard<1/Card> | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return target creature card from your graveyard to your hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/undertaker.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/53.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undertow.txt b/res/cardsfolder/undertow.txt deleted file mode 100644 index 7c4a4e8f37c..00000000000 --- a/res/cardsfolder/undertow.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Undertow -ManaCost:2 U -Types:Enchantment -Text:Creatures with islandwalk can be blocked as though they didn't have islandwalk. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undertow.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/underworld_dreams.txt b/res/cardsfolder/underworld_dreams.txt deleted file mode 100644 index ce5d0ecb3dc..00000000000 --- a/res/cardsfolder/underworld_dreams.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Underworld Dreams -ManaCost:B B B -Types:Enchantment -Text:no text -T:Mode$ Drawn | ValidCard$ Card.YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever an opponent draws a card, CARDNAME deals 1 damage to him or her. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/underworld_dreams.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/168.jpg -SetInfo:M10|Rare|http://magiccards.info/scans/en/m10/115.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/38.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/167.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undiscovered_paradise.txt b/res/cardsfolder/undiscovered_paradise.txt deleted file mode 100644 index 1e0a36a6724..00000000000 --- a/res/cardsfolder/undiscovered_paradise.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Undiscovered Paradise -ManaCost:no cost -Types:Land -Text:Whenever you tap CARDNAME for mana, return it to it's owner's hand during the controller's next untap phase. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/undiscovered_paradise.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undo.txt b/res/cardsfolder/undo.txt deleted file mode 100644 index 7de13b4d142..00000000000 --- a/res/cardsfolder/undo.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Undo -ManaCost:1 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 1 U U | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return two target creatures to their owners' hands. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undo.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/59.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/58.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/47.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undying_beast.txt b/res/cardsfolder/undying_beast.txt deleted file mode 100644 index 39228d3cff7..00000000000 --- a/res/cardsfolder/undying_beast.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Undying Beast -ManaCost:3 B -Types:Creature Beast -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, put CARDNAME on top of its owner's library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4242.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/undying_rage.txt b/res/cardsfolder/undying_rage.txt deleted file mode 100644 index 12e6b4e1b60..00000000000 --- a/res/cardsfolder/undying_rage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Undying Rage -ManaCost:2 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/HIDDEN CARDNAME can't block.:Enchanted creature gets +2/+2 and can't block. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/undying_rage.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unearth.txt b/res/cardsfolder/unearth.txt deleted file mode 100644 index 80b1613abf0..00000000000 --- a/res/cardsfolder/unearth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unearth -ManaCost:B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with converted mana cost 3 or less in your graveyard | ValidTgts$ Creature.cmcLE3+YouCtrl | SpellDescription$ Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unearth.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unearthly_blizzard.txt b/res/cardsfolder/unearthly_blizzard.txt deleted file mode 100644 index b3d618af18b..00000000000 --- a/res/cardsfolder/unearthly_blizzard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unearthly Blizzard -ManaCost:2 R -Types:Sorcery Arcane -Text:no text -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 1 | TargetMax$ 3 | KW$ CARDNAME can't block. | IsCurse$ True | SpellDescription$ Up to three target creatures can't block this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unearthly_blizzard.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unfulfilled_desires.txt b/res/cardsfolder/unfulfilled_desires.txt deleted file mode 100644 index fd96156b89c..00000000000 --- a/res/cardsfolder/unfulfilled_desires.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Unfulfilled Desires -ManaCost:1 U B -Types:Enchantment -Text:no text -A:AB$ Draw | Cost$ 1 PayLife<1> | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unfulfilled_desires.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/345.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unhinge.txt b/res/cardsfolder/unhinge.txt deleted file mode 100644 index b05988e9401..00000000000 --- a/res/cardsfolder/unhinge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unhinge -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unhinge.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unholy_grotto.txt b/res/cardsfolder/unholy_grotto.txt deleted file mode 100644 index adee99d784c..00000000000 --- a/res/cardsfolder/unholy_grotto.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Unholy Grotto -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ B T | TgtPrompt$ Choose target Zombie card in your graveyard | ValidTgts$ Zombie.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target Zombie card from your graveyard on top of your library. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unholy_grotto.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/327.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unholy_strength.txt b/res/cardsfolder/unholy_strength.txt deleted file mode 100644 index cf2d1e43949..00000000000 --- a/res/cardsfolder/unholy_strength.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Unholy Strength -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unholy_strength.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/169.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/40.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/40.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/168.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/63.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/50.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/168.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/185.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/119.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/116.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/41.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unifying_theory.txt b/res/cardsfolder/unifying_theory.txt deleted file mode 100644 index 73328caef1f..00000000000 --- a/res/cardsfolder/unifying_theory.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Unifying Theory -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a player casts a spell, that player may pay 2. If the player does, he or she draws a card. -SVar:TrigDraw:AB$Draw | Cost$ 2 | Defined$ TriggeredPlayer | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unifying_theory.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unlikely_alliance.txt b/res/cardsfolder/unlikely_alliance.txt deleted file mode 100644 index e8282a919a7..00000000000 --- a/res/cardsfolder/unlikely_alliance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unlikely Alliance -ManaCost:1 W -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ 1 W | ValidTgts$ Creature.notattacking+notblocking | TgtPrompt$ Select target nonattacking, nonblocking creature | NumDef$ +2 | SpellDescription$ Target nonattacking, nonblocking creature gets +0/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unlikely_alliance.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unliving_psychopath.txt b/res/cardsfolder/unliving_psychopath.txt deleted file mode 100644 index 41966abd4e8..00000000000 --- a/res/cardsfolder/unliving_psychopath.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unliving Psychopath -ManaCost:2 B B -Types:Creature Zombie Assassin -Text:no text -PT:0/4 -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -A:AB$ Destroy | Cost$ B T | ValidTgts$ Creature.powerLTX | TgtPrompt$ Select target creature with power less than Unliving Psychopath's | SpellDescription$ Destroy target creature with power less than CARDNAME's power. -SVar:X:Count$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unliving_psychopath.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unmake.txt b/res/cardsfolder/unmake.txt deleted file mode 100644 index 663ca72e54f..00000000000 --- a/res/cardsfolder/unmake.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unmake -ManaCost:WB WB WB -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ WB WB WB | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unmake.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unmask.txt b/res/cardsfolder/unmask.txt deleted file mode 100644 index 863db5cb7c7..00000000000 --- a/res/cardsfolder/unmask.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Unmask -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B | ValidTgts$ Player | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | NumCards$ 1 | SpellDescription$ Target player reveals his or her hand. You choose a nonland card from it. That player discards that card. -SVar:AltCost:ExileFromHand<1/Card.Black>$You may exile one black card from your hand rather than pay CARDNAME's mana cost. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unmask.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unnatural_predation.txt b/res/cardsfolder/unnatural_predation.txt deleted file mode 100644 index 0864f0636d8..00000000000 --- a/res/cardsfolder/unnatural_predation.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unnatural Predation -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | KW$ Trample | SpellDescription$ Target creature gets +1/+1 and gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unnatural_predation.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unnatural_speed.txt b/res/cardsfolder/unnatural_speed.txt deleted file mode 100644 index 018c31efd53..00000000000 --- a/res/cardsfolder/unnatural_speed.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unnatural Speed -ManaCost:R -Types:Instant -Text:no text -A:SP$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unnatural_speed.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/197.jpg -End diff --git a/res/cardsfolder/unnerve.txt b/res/cardsfolder/unnerve.txt deleted file mode 100644 index 832079523f1..00000000000 --- a/res/cardsfolder/unnerve.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unnerve -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 3 B | Defined$ Opponent | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Each opponent discards two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unnerve.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unquestioned_authority.txt b/res/cardsfolder/unquestioned_authority.txt deleted file mode 100644 index e2a30ec8459..00000000000 --- a/res/cardsfolder/unquestioned_authority.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unquestioned Authority -ManaCost:2 W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from creatures -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unquestioned_authority.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unseen_walker.txt b/res/cardsfolder/unseen_walker.txt deleted file mode 100644 index 73ef4b3a741..00000000000 --- a/res/cardsfolder/unseen_walker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unseen Walker -ManaCost:1 G -Types:Creature Dryad -Text:no text -PT:1/1 -K:Forestwalk -A:AB$ Pump | Cost$ 1 G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Forestwalk | SpellDescription$ Target creature gains forestwalk until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unseen_walker.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/262.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/147.jpg -End diff --git a/res/cardsfolder/unspeakable_symbol.txt b/res/cardsfolder/unspeakable_symbol.txt deleted file mode 100644 index 81583ec8601..00000000000 --- a/res/cardsfolder/unspeakable_symbol.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unspeakable Symbol -ManaCost:1 B B -Types:Enchantment -Text:no text -A:AB$ PutCounter | Cost$ PayLife<3> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unspeakable_symbol.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unstable_hulk.txt b/res/cardsfolder/unstable_hulk.txt deleted file mode 100644 index 80924e4e137..00000000000 --- a/res/cardsfolder/unstable_hulk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Unstable Hulk -ManaCost:1 R R -Types:Creature Goblin Mutant -Text:no text -PT:2/2 -K:Morph:3 R R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is turned face up, it gets +6/+6 and gains trample until end of turn. You skip your next turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +6 | NumDef$ +6 | KW$ Trample | SubAbility$ SVar=DBSkipTurn -SVar:DBSkipTurn:DB$AddTurn | Defined$ Opponent | NumTurns$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_hulk.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unstable_mutation.txt b/res/cardsfolder/unstable_mutation.txt deleted file mode 100644 index aabfff019d5..00000000000 --- a/res/cardsfolder/unstable_mutation.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Unstable Mutation -ManaCost:U -Types:Enchantment Aura -Text:no text -K:enPump:+3/+3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, put a -1/-1 counter on that creature. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unstable_mutation.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/33.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/86.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/110.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/28.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unsummon.txt b/res/cardsfolder/unsummon.txt deleted file mode 100644 index 53145084c6c..00000000000 --- a/res/cardsfolder/unsummon.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Unsummon -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unsummon.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/112.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/87.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/87.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/108.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/132.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/111.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/122.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/78.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/79.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/103.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/87.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/37.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/untamed_might.txt b/res/cardsfolder/untamed_might.txt deleted file mode 100644 index 352a1708ec9..00000000000 --- a/res/cardsfolder/untamed_might.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Untamed Might -ManaCost:X G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ X G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/untamed_might.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/131.jpg -End diff --git a/res/cardsfolder/untamed_wilds.txt b/res/cardsfolder/untamed_wilds.txt deleted file mode 100644 index 3b97639a38b..00000000000 --- a/res/cardsfolder/untamed_wilds.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Untamed Wilds -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield. Then shuffle your library. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/untamed_wilds.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/279.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/163.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/124.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/117.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/89.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/263.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/197.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unwilling_recruit.txt b/res/cardsfolder/unwilling_recruit.txt deleted file mode 100644 index 45565506b5d..00000000000 --- a/res/cardsfolder/unwilling_recruit.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unwilling Recruit -ManaCost:X R R R -Types:Sorcery -Text:no text -A:SP$ GainControl | Cost$ X R R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Untap$ True | LoseControl$ EOT | SubAbility$ SVar=DBPump | SpellDescription$ Gain control of target creature until end of turn. Untap that creature. It gets +X/+0 and gains haste until end of turn. -SVar:DBPump:DB$Pump | Defined$ Targeted | NumAtt$ X | KW$ Haste -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unwilling_recruit.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unwinding_clock.txt b/res/cardsfolder/unwinding_clock.txt deleted file mode 100644 index 177ec3cad23..00000000000 --- a/res/cardsfolder/unwinding_clock.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unwinding Clock -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Artifact.YouCtrl:0/0/HIDDEN CARDNAME untaps during each other player's untap step.:No Condition:Untap all artifacts you control during each other player's untap step. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unwinding_clock.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unworthy_dead.txt b/res/cardsfolder/unworthy_dead.txt deleted file mode 100644 index c68702c4e40..00000000000 --- a/res/cardsfolder/unworthy_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Unworthy Dead -ManaCost:1 B -Types:Creature Skeleton -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/unworthy_dead.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/unyaro_bee_sting.txt b/res/cardsfolder/unyaro_bee_sting.txt deleted file mode 100644 index 4489d9b324f..00000000000 --- a/res/cardsfolder/unyaro_bee_sting.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Unyaro Bee Sting -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 G | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unyaro_bee_sting.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/148.jpg -End diff --git a/res/cardsfolder/unyaro_bees.txt b/res/cardsfolder/unyaro_bees.txt deleted file mode 100644 index 3b291ccd73e..00000000000 --- a/res/cardsfolder/unyaro_bees.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unyaro Bees -ManaCost:G G G -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ G | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ DealDamage | Cost$ 3 G Sac<1/CARDNAME> | Tgt$ TgtCP | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or player. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/unyaro_bees.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/231.jpg -End diff --git a/res/cardsfolder/unyaro_griffin.txt b/res/cardsfolder/unyaro_griffin.txt deleted file mode 100644 index 69fa6cfa505..00000000000 --- a/res/cardsfolder/unyaro_griffin.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Unyaro Griffin -ManaCost:3 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -A:AB$ Counter | Cost$ Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target Red Instant or Sorcery spell | ValidTgts$ Instant.Red,Sorcery.Red | SpellDescription$ Counter target red instant or sorcery spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/unyaro_griffin.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/49.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/updraft.txt b/res/cardsfolder/updraft.txt deleted file mode 100644 index 17f206c865d..00000000000 --- a/res/cardsfolder/updraft.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Updraft -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | NextUpkeep$ True | SpellDescription$ Draw a card at the beginning of the next upkeep. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/updraft.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/133.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/upheaval.txt b/res/cardsfolder/upheaval.txt deleted file mode 100644 index b26f772a517..00000000000 --- a/res/cardsfolder/upheaval.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Upheaval -ManaCost:4 U U -Types:Sorcery -Text:no text -A:SP$ ChangeZoneAll | Cost$ 4 U U | ChangeType$ Permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all permanents to their owners' hands. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/upheaval.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uproot.txt b/res/cardsfolder/uproot.txt deleted file mode 100644 index 16067792d49..00000000000 --- a/res/cardsfolder/uproot.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Uproot -ManaCost:3 G -Types:Sorcery Arcane -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | ValidTgts$ Land | TgtPrompt$ Select target land | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put target land on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/uproot.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/upwelling.txt b/res/cardsfolder/upwelling.txt deleted file mode 100644 index a383ea383f5..00000000000 --- a/res/cardsfolder/upwelling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Upwelling -ManaCost:3 G -Types:Enchantment -Text:Mana pools don't empty as steps and phases end. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/upwelling.jpg -SetInfo:SCG|Rare|http://magiccards.info/scans/en/sc/131.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/306.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ur_drago.txt b/res/cardsfolder/ur_drago.txt deleted file mode 100644 index c46f75d0972..00000000000 --- a/res/cardsfolder/ur_drago.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ur-Drago -ManaCost:3 U U B B -Types:Legendary Creature Elemental -Text:Creatures with swampwalk can be blocked as though they didn't have swampwalk. -PT:4/4 -K:First Strike -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ur_drago.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/308.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ur_golems_eye.txt b/res/cardsfolder/ur_golems_eye.txt deleted file mode 100644 index 4dd127b41ed..00000000000 --- a/res/cardsfolder/ur_golems_eye.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Ur-Golem's Eye -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/ur_golems_eye.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/155.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/314.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urabrask_the_hidden.txt b/res/cardsfolder/urabrask_the_hidden.txt deleted file mode 100644 index 4b698658d85..00000000000 --- a/res/cardsfolder/urabrask_the_hidden.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Urabrask the Hidden -ManaCost:3 R R -Types:Legendary Creature Praetor -Text:Creatures your opponents control enter the battlefield tapped. -PT:4/4 -K:stPumpAll:Creature.YouCtrl:0/0/Haste:No Condition:Creatures you control have haste. -SVar:PlayMain1:TRUE -SVar:BuffedBy:Creature -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/urabrask_the_hidden.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_drake.txt b/res/cardsfolder/urborg_drake.txt deleted file mode 100644 index b3eef13ec69..00000000000 --- a/res/cardsfolder/urborg_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urborg Drake -ManaCost:1 U B -Types:Creature Drake -Text:no text -PT:2/3 -K:Flying -K:CARDNAME attacks each turn if able. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_drake.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_elf.txt b/res/cardsfolder/urborg_elf.txt deleted file mode 100644 index ae34aa58c1c..00000000000 --- a/res/cardsfolder/urborg_elf.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Urborg Elf -ManaCost:1 G -Types:Creature Elf Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card26717.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_emissary.txt b/res/cardsfolder/urborg_emissary.txt deleted file mode 100644 index 10e48b69745..00000000000 --- a/res/cardsfolder/urborg_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Urborg Emissary -ManaCost:2 B -Types:Creature Human Wizard -Text:no text -PT:3/1 -K:Kicker:1 U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return target permanent to its owner's hand. -SVar:TrigKicker:AB$ChangeZone | Cost$ 0 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_emissary.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_justice.txt b/res/cardsfolder/urborg_justice.txt deleted file mode 100644 index 27e71eb9a7e..00000000000 --- a/res/cardsfolder/urborg_justice.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urborg Justice -ManaCost:B B -Types:Instant -Text:no text -A:SP$Sacrifice | Cost$ B B | ValidTgts$ Opponent | Amount$ X | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target opponent sacrifices a creature for each creature put into your graveyard from the battlefield this turn. -SVar:X:Count$ThisTurnEntered Graveyard from Battlefield Creature.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_justice.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_mindsucker.txt b/res/cardsfolder/urborg_mindsucker.txt deleted file mode 100644 index 9e391061b05..00000000000 --- a/res/cardsfolder/urborg_mindsucker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urborg Mindsucker -ManaCost:2 B -Types:Creature Horror -Text:no text -PT:2/2 -A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Opponent | SorcerySpeed$ True | NumCards$ 1 | Mode$ Random | SpellDescription$ Target opponent discards a card at random. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_mindsucker.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_phantom.txt b/res/cardsfolder/urborg_phantom.txt deleted file mode 100644 index 731a1f24ad7..00000000000 --- a/res/cardsfolder/urborg_phantom.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urborg Phantom -ManaCost:2 B -Types:Creature Spirit Minion -Text:no text -PT:3/1 -K:CARDNAME can't block. -A:AB$ Pump | Cost$ U | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt to and dealt by CARDNAME this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_phantom.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/132.jpg -End diff --git a/res/cardsfolder/urborg_shambler.txt b/res/cardsfolder/urborg_shambler.txt deleted file mode 100644 index 97195cb9a63..00000000000 --- a/res/cardsfolder/urborg_shambler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urborg Shambler -ManaCost:2 B B -Types:Creature Horror -Text:no text -PT:4/3 -K:stPumpAll:Creature.Black+Other:-1/-1:No Condition:Other black creatures get -1/-1. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_shambler.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_skeleton.txt b/res/cardsfolder/urborg_skeleton.txt deleted file mode 100644 index ad9a84aeed0..00000000000 --- a/res/cardsfolder/urborg_skeleton.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Urborg Skeleton -ManaCost:1 B -Types:Creature Skeleton -Text:no text -PT:0/1 -K:Kicker:3 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -K:etbCounter:P1P1:1:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_skeleton.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_stalker.txt b/res/cardsfolder/urborg_stalker.txt deleted file mode 100644 index efdeacb3f21..00000000000 --- a/res/cardsfolder/urborg_stalker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Urborg Stalker -ManaCost:3 B -Types:Creature Horror -Text:no text -PT:2/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.nonBlack+nonLand+YouCtrl | PresentCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigDamageYou | TriggerDescription$ At the beginning of each player's upkeep, if that player controls a nonblack, nonland permanent, CARDNAME deals 1 damage to that player. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Permanent.nonBlack+nonLand+YouDontCtrl | PresentCompare$ GE1 | TriggerZones$ Battlefield | Execute$ TrigDamageOpp | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, if that player controls a nonblack, nonland permanent, CARDNAME deals 1 damage to that player. -SVar:TrigDamageYou:AB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ 1 -SVar:TrigDamageOpp:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_stalker.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_syphon_mage.txt b/res/cardsfolder/urborg_syphon_mage.txt deleted file mode 100644 index 81d5a520171..00000000000 --- a/res/cardsfolder/urborg_syphon_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urborg Syphon-Mage -ManaCost:2 B -Types:Creature Human Spellshaper -Text:no text -PT:2/2 -A:AB$ LoseLife | Cost$ 2 B T Discard<1/Card> | LifeAmount$ 2 | Defined$ Opponent | SubAbility$ SVar=DBGainLife | SpellDescription$ Each other player loses 2 life. You gain life equal to the life lost this way. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card108798.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_tomb_of_yawgmoth.txt b/res/cardsfolder/urborg_tomb_of_yawgmoth.txt deleted file mode 100644 index cee4bebd196..00000000000 --- a/res/cardsfolder/urborg_tomb_of_yawgmoth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urborg, Tomb of Yawgmoth -ManaCost:no cost -Types:Legendary Land -Text:no text -K:stPumpAll:Land:0/0/Types=Swamp:No Condition:Each land is a Swamp in addition to its other land types. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_tomb_of_yawgmoth.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_uprising.txt b/res/cardsfolder/urborg_uprising.txt deleted file mode 100644 index ebc551fd7af..00000000000 --- a/res/cardsfolder/urborg_uprising.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urborg Uprising -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return up to two target creature cards from your graveyard to your hand. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_uprising.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urborg_volcano.txt b/res/cardsfolder/urborg_volcano.txt deleted file mode 100644 index 2ba1754edf4..00000000000 --- a/res/cardsfolder/urborg_volcano.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Urborg Volcano -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urborg_volcano.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/327.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uril_the_miststalker.txt b/res/cardsfolder/uril_the_miststalker.txt deleted file mode 100644 index 2c9a1b8c279..00000000000 --- a/res/cardsfolder/uril_the_miststalker.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Uril, the Miststalker -ManaCost:2 R G W -Types:Legendary Creature Beast -Text:no text -PT:5/5 -K:CARDNAME can't be the target of spells or abilities your opponents control. -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +2/+2 for each Aura attached to it. -SVar:X:Count$Valid Aura.Attached/Times.2 -SVar:EnchantMe:Multiple -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/uril_the_miststalker.jpg -SetInfo:ARB|Mythic|http://magiccards.info/scans/en/arb/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/ursapine.txt b/res/cardsfolder/ursapine.txt deleted file mode 100644 index 0b18aa9dc05..00000000000 --- a/res/cardsfolder/ursapine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Ursapine -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/ursapine.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/188.jpg -End diff --git a/res/cardsfolder/urzas_armor.txt b/res/cardsfolder/urzas_armor.txt deleted file mode 100644 index 8372c62c97f..00000000000 --- a/res/cardsfolder/urzas_armor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Urza's Armor -ManaCost:6 -Types:Artifact -Text:no text -K:stPreventDamage:You:Card:1:If a source would deal damage to you, prevent 1 of that damage. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_armor.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/313.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_blueprints.txt b/res/cardsfolder/urzas_blueprints.txt deleted file mode 100644 index c567dd8174b..00000000000 --- a/res/cardsfolder/urzas_blueprints.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urza's Blueprints -ManaCost:6 -Types:Artifact -Text:no text -A:AB$ Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. -K:Echo:6 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_blueprints.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_chalice.txt b/res/cardsfolder/urzas_chalice.txt deleted file mode 100644 index 263fea1f44a..00000000000 --- a/res/cardsfolder/urzas_chalice.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urza's Chalice -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Artifact | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts an artifact spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_chalice.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_factory.txt b/res/cardsfolder/urzas_factory.txt deleted file mode 100644 index d98cae841fb..00000000000 --- a/res/cardsfolder/urzas_factory.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Urza's Factory -ManaCost:no cost -Types:Land Urza's -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Token | Cost$ 7 T | TokenAmount$ 1 | TokenName$ Assembly-Worker | TokenTypes$ Artifact,Creature,Assembly-Worker | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a 2/2 colorless Assembly-Worker artifact creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_factory.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_guilt.txt b/res/cardsfolder/urzas_guilt.txt deleted file mode 100644 index 6ffc26a8580..00000000000 --- a/res/cardsfolder/urzas_guilt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urza's Guilt -ManaCost:2 U B -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U B | Defined$ Each | NumCards$ 2 | SpellDescription$ Each player draws two cards, then discards three cards, then loses 4 life. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | NumCards$ 3 | Mode$ TgtChoose | Defined$ Each | SubAbility$ SVar=DBLose -SVar:DBLose:DB$LoseLife | LifeAmount$ 4 | Defined$ Each -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_guilt.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_mine.txt b/res/cardsfolder/urzas_mine.txt deleted file mode 100644 index 706e923a208..00000000000 --- a/res/cardsfolder/urzas_mine.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Urza's Mine -ManaCost:no cost -Types:Land Urza's Mine -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Bonus $UrzaLands | BonusProduced$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_mine.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/328.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/447.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/327.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/75.jpg|4 -SetInfo:CHR|Common|http://magiccards.info/scans/en/ch/94.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_power_plant.txt b/res/cardsfolder/urzas_power_plant.txt deleted file mode 100644 index d911366afce..00000000000 --- a/res/cardsfolder/urzas_power_plant.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Urza's Power Plant -ManaCost:no cost -Types:Land Urza's Power-Plant -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Bonus$ UrzaLands | BonusProduced$ 1 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_power_plant.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/329.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/448.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/328.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/79.jpg|4 -SetInfo:CHR|Common|http://magiccards.info/scans/en/ch/98.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_rage.txt b/res/cardsfolder/urzas_rage.txt deleted file mode 100644 index a7c851ca1da..00000000000 --- a/res/cardsfolder/urzas_rage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Urza's Rage -ManaCost:2 R -Types:Instant -Text:no text -K:CARDNAME can't be countered. -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. If CARDNAME was kicked, instead it deals 10 damage to that creature or player and the damage can't be prevented. -A:SP$ DealDamage | Cost$ 10 R R | Tgt$ TgtCP | NumDmg$ 10 | NoPrevention$ True | SpellDescription$ Kicker 8 R (You may pay an additional 8 R as you cast this spell.) -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_rage.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/urzas_tower.txt b/res/cardsfolder/urzas_tower.txt deleted file mode 100644 index d77f7c65bd6..00000000000 --- a/res/cardsfolder/urzas_tower.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Urza's Tower -ManaCost:no cost -Types:Land Urza's Tower -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | Bonus$ UrzaLands | BonusProduced$ 2 | SpellDescription$ 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. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_tower.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/330.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/449.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/329.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/83.jpg|4 -SetInfo:CHR|Common|http://magiccards.info/scans/en/ch/102.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/uthden_troll.txt b/res/cardsfolder/uthden_troll.txt deleted file mode 100644 index f0a92e59e23..00000000000 --- a/res/cardsfolder/uthden_troll.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Uthden Troll -ManaCost:2 R -Types:Creature Troll -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ R | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/uthden_troll.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/181.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/182.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/246.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/71.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/181.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/utopia_mycon.txt b/res/cardsfolder/utopia_mycon.txt deleted file mode 100644 index dd391c718e4..00000000000 --- a/res/cardsfolder/utopia_mycon.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Utopia Mycon -ManaCost:G -Types:Creature Fungus -Text:no text -PT:0/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Mana | Cost$ Sac<1/Saproling> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Saproling> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Saproling> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Saproling> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ Sac<1/Saproling> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/utopia_mycon.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/utopia_tree.txt b/res/cardsfolder/utopia_tree.txt deleted file mode 100644 index 759566aed3b..00000000000 --- a/res/cardsfolder/utopia_tree.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Utopia Tree -ManaCost:1 G -Types:Creature Plant -Text:no text -PT:0/2 -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84434.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/219.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/utopia_vow.txt b/res/cardsfolder/utopia_vow.txt deleted file mode 100644 index c6b25ce8e57..00000000000 --- a/res/cardsfolder/utopia_vow.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Utopia Vow -ManaCost:1 G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:HIDDEN CARDNAME can't attack or block.:Enchanted creature can't attack or block. -K:stPumpEnchanted:Creature:0/0/SVar=ManaW & SVar=ManaU & SVar=ManaB & SVar=ManaR & SVar=ManaG:No Condition:Enchanted creature has "tap: Add one mana of any color to your mana pool." -SVar:ManaW:AB$Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:ManaU:AB$Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:ManaB:AB$Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:ManaR:AB$Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:ManaG:AB$Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/utopia_vow.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/utvara_scalper.txt b/res/cardsfolder/utvara_scalper.txt deleted file mode 100644 index 7bd06355eb7..00000000000 --- a/res/cardsfolder/utvara_scalper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Utvara Scalper -ManaCost:1 R -Types:Creature Goblin Scout -Text:no text -PT:1/2 -K:Flying -K:CARDNAME attacks each turn if able. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/utvara_scalper.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/uyo_silent_prophet.txt b/res/cardsfolder/uyo_silent_prophet.txt deleted file mode 100644 index d9ebb05df90..00000000000 --- a/res/cardsfolder/uyo_silent_prophet.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Uyo, Silent Prophet -ManaCost:4 U U -Types:Legendary Creature Moonfolk Wizard -Text:no text -PT:4/4 -K:Flying -A:AB$CopySpell | Cost$ 2 Return<2/Land.YouCtrl> | CostDesc$ 2, Return two lands you control to their owner's hand: | ValidTgts$ Instant,Sorcery | SpellDescription$ Copy target instant or sorcery spell. You may choose new targets for the copy. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/uyo_silent_prophet.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vacuumelt.txt b/res/cardsfolder/vacuumelt.txt deleted file mode 100644 index a0b82a69181..00000000000 --- a/res/cardsfolder/vacuumelt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vacuumelt -ManaCost:2 U -Types:Sorcery -Text:no text -K:Replicate 2 U -A:SP$ ChangeZone | Cost$ 2 U | ValidTgts$ Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to it's owners hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vacuumelt.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vaevictis_asmadi.txt b/res/cardsfolder/vaevictis_asmadi.txt deleted file mode 100644 index d1af721e8d5..00000000000 --- a/res/cardsfolder/vaevictis_asmadi.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vaevictis Asmadi -ManaCost:2 B B R R G G -Types:Legendary Creature Elder Dragon -Text:no text -PT:7/7 -K:Flying -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B R G -A:AB$ Pump | Cost$ B | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ G | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vaevictis_asmadi.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/309.jpg -End diff --git a/res/cardsfolder/vagrant_plowbeasts.txt b/res/cardsfolder/vagrant_plowbeasts.txt deleted file mode 100644 index 610bd02ba33..00000000000 --- a/res/cardsfolder/vagrant_plowbeasts.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vagrant Plowbeasts -ManaCost:5 G W -Types:Creature Beast -Text:no text -PT:6/6 -A:AB$ Regenerate | Cost$ 1 | ValidTgts$ Creature.powerGE5 | TgtPrompt$ Select target creature with power 5 or greater. | SpellDescription$ Regenerate target creature with power 5 or greater. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vagrant_plowbeasts.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valakut_fireboar.txt b/res/cardsfolder/valakut_fireboar.txt deleted file mode 100644 index a7c95043fe4..00000000000 --- a/res/cardsfolder/valakut_fireboar.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Valakut Fireboar -ManaCost:4 R -Types:Creature Elemental Boar -Text:no text -PT:1/7 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, switch its power and toughness until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ HIDDEN CARDNAME's power and toughness are switched -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/valakut_fireboar.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valakut_the_molten_pinnacle.txt b/res/cardsfolder/valakut_the_molten_pinnacle.txt deleted file mode 100644 index f138494418e..00000000000 --- a/res/cardsfolder/valakut_the_molten_pinnacle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Valakut, the Molten Pinnacle -ManaCost:no cost -Types:Land -Text:no text -K:CARDNAME enters the battlefield tapped. -T:Mode$ ChangesZone | ValidCard$ Mountain.YouCtrl | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigDamage | IsPresent$ Mountain.YouCtrl | PresentCompare$ GE6 | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Mountain enters the battlefield under your control, if you control at least five other Mountains, you may have CARDNAME deal 3 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | TgtPrompt$ Select target creature or player | NumDmg$ 3 -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/valakut_the_molten_pinnacle.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valeron_outlander.txt b/res/cardsfolder/valeron_outlander.txt deleted file mode 100644 index c06fc59d5b8..00000000000 --- a/res/cardsfolder/valeron_outlander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Valeron Outlander -ManaCost:G W -Types:Creature Human Scout -Text:no text -PT:2/2 -K:Protection from black -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/valeron_outlander.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valiant_guard.txt b/res/cardsfolder/valiant_guard.txt deleted file mode 100644 index 9d5c9779447..00000000000 --- a/res/cardsfolder/valiant_guard.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Valiant Guard -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:0/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/valiant_guard.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valley_rannet.txt b/res/cardsfolder/valley_rannet.txt deleted file mode 100644 index 3a64868b181..00000000000 --- a/res/cardsfolder/valley_rannet.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Valley Rannet -ManaCost:4 R G -Types:Creature Beast -Text:no text -PT:6/3 -K:TypeCycling:Forest:2 -K:TypeCycling:Mountain:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/valley_rannet.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valor.txt b/res/cardsfolder/valor.txt deleted file mode 100644 index b78e5c7076e..00000000000 --- a/res/cardsfolder/valor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Valor -ManaCost:3 W -Types:Creature Incarnation -Text:As long as Valor is in your graveyard and you control a Plains, creatures you control have First Strike. -PT:2/2 -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/jud/en-us/card33719.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/16.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/valorous_charge.txt b/res/cardsfolder/valorous_charge.txt deleted file mode 100644 index c3bd09a83ab..00000000000 --- a/res/cardsfolder/valorous_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Valorous Charge -ManaCost:1 W W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 1 W W | ValidCards$ Creature.White | NumAtt$ +2 | SpellDescription$ White creatures get +2/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4402.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/196.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_aristocrat.txt b/res/cardsfolder/vampire_aristocrat.txt deleted file mode 100644 index 8673123dacb..00000000000 --- a/res/cardsfolder/vampire_aristocrat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampire Aristocrat -ManaCost:2 B -Types:Creature Vampire Rogue -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Sac<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_aristocrat.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_bats.txt b/res/cardsfolder/vampire_bats.txt deleted file mode 100644 index bfeaed05f14..00000000000 --- a/res/cardsfolder/vampire_bats.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vampire Bats -ManaCost:B -Types:Creature Bat -Text:no text -PT:0/1 -K:Flying -A:AB$ Pump | Cost$ B | NumAtt$ +1 | ActivationLimit$ 2 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. Activate this ability no more than twice each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_bats.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/64.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/39.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/51.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_hexmage.txt b/res/cardsfolder/vampire_hexmage.txt deleted file mode 100644 index e0fbf3dee14..00000000000 --- a/res/cardsfolder/vampire_hexmage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vampire Hexmage -ManaCost:B B -Types:Creature Vampire Shaman -Text:Sacrifice Vampire Hexmage: Remove all counters from target permanent. -PT:2/1 -K:First Strike -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_hexmage.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_hounds.txt b/res/cardsfolder/vampire_hounds.txt deleted file mode 100644 index bf15263a622..00000000000 --- a/res/cardsfolder/vampire_hounds.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vampire Hounds -ManaCost:2 B -Types:Creature Vampire Hound -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ Discard<1/Creature> | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_hounds.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/77.jpg -End diff --git a/res/cardsfolder/vampire_lacerator.txt b/res/cardsfolder/vampire_lacerator.txt deleted file mode 100644 index e5bd24aab42..00000000000 --- a/res/cardsfolder/vampire_lacerator.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampire Lacerator -ManaCost:B -Types:Creature Vampire Warrior -Text:At the beginning of your upkeep, you lose 1 life unless an opponent has 10 or less life. -PT:2/2 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_lacerator.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/115.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_nighthawk.txt b/res/cardsfolder/vampire_nighthawk.txt deleted file mode 100644 index c8e9ae5278d..00000000000 --- a/res/cardsfolder/vampire_nighthawk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vampire Nighthawk -ManaCost:1 B B -Types:Creature Vampire Shaman -Text:no text -PT:2/3 -K:Flying -K:Deathtouch -K:Lifelink -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_nighthawk.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampire_nocturnus.txt b/res/cardsfolder/vampire_nocturnus.txt deleted file mode 100644 index a0e5e80332e..00000000000 --- a/res/cardsfolder/vampire_nocturnus.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vampire Nocturnus -ManaCost:1 B B B -Types:Creature Vampire -Text:no text -PT:3/3 -K:Play with the top card of your library revealed. -K:stPumpSelf:Permanent:2/1/Flying:TopCardOfLibraryIsBlack:As long as the top card of your library is black, CARDNAME and other Vampire creatures you control get +2/+1 and have flying. -K:stPumpAll:Creature.Vampire+Other+YouCtrl:2/1/Flying:TopCardOfLibraryIsBlack:no text -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampire_nocturnus.jpg -SetInfo:M10|Mythic|http://magiccards.info/scans/en/m10/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampires_bite.txt b/res/cardsfolder/vampires_bite.txt deleted file mode 100644 index b505da64839..00000000000 --- a/res/cardsfolder/vampires_bite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampire's Bite -ManaCost:B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 B B | Tgt$ TgtC | NumAtt$ 3 | NumDef$ 0 | KW$ Lifelink | SpellDescription$ Kicker 2 B (You may pay an additional 2 B as you cast this spell.) -A:SP$ Pump | Cost$ B | Tgt$ TgtC | NumAtt$ 3 | SpellDescription$ Target creature gets +3/+0 until end of turn. If CARDNAME was kicked, that creature gains lifelink until end of turn. (Damage dealt by the creature also causes its controller to gain that much life.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampires_bite.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_dragon.txt b/res/cardsfolder/vampiric_dragon.txt deleted file mode 100644 index 6e9e22d034a..00000000000 --- a/res/cardsfolder/vampiric_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vampiric Dragon -ManaCost:6 B R -Types:Creature Vampire Dragon -Text:no text -PT:5/5 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -A:AB$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_dragon.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_embrace.txt b/res/cardsfolder/vampiric_embrace.txt deleted file mode 100644 index b2245cd7eae..00000000000 --- a/res/cardsfolder/vampiric_embrace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampiric Embrace -ManaCost:2 B B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Flying & HIDDEN Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME.:Enchanted creature gets +2/+2 and has flying. Whenever a creature dealt damage by enchanted creature this turn is put into a graveyard, put a +1/+1 counter on that creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_embrace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_feast.txt b/res/cardsfolder/vampiric_feast.txt deleted file mode 100644 index b080d25ad96..00000000000 --- a/res/cardsfolder/vampiric_feast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampiric Feast -ManaCost:5 B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 5 B B | Tgt$ TgtCP | NumDmg$ 4 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 4 damage to target creature or player and you gain 4 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4243.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/37.jpg -End diff --git a/res/cardsfolder/vampiric_link.txt b/res/cardsfolder/vampiric_link.txt deleted file mode 100644 index c0fbd5a611b..00000000000 --- a/res/cardsfolder/vampiric_link.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vampiric Link -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever enchanted creature deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_link.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_sliver.txt b/res/cardsfolder/vampiric_sliver.txt deleted file mode 100644 index c834b19549e..00000000000 --- a/res/cardsfolder/vampiric_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vampiric Sliver -ManaCost:3 B -Types:Creature Sliver -Text:no text -PT:3/3 -K:stPumpAll:Creature.Sliver:0/0/Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME.:No Condition:All Sliver creatures have "Whenever a creature dealt damage by this creature this turn is put into a graveyard, put a +1/+1 counter on this creature." -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_sliver.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_spirit.txt b/res/cardsfolder/vampiric_spirit.txt deleted file mode 100644 index 320ca4a204f..00000000000 --- a/res/cardsfolder/vampiric_spirit.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vampiric Spirit -ManaCost:2 B B -Types:Creature Spirit -Text:no text -PT:4/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ When CARDNAME enters the battlefield, you lose 4 life. -SVar:TrigLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 4 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_spirit.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/170.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_touch.txt b/res/cardsfolder/vampiric_touch.txt deleted file mode 100644 index d967df590af..00000000000 --- a/res/cardsfolder/vampiric_touch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vampiric Touch -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 B | ValidTgts$ Opponent | NumDmg$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 2 damage to target opponent and you gain 2 life. -SVar:DBGainLife:DB$GainLife | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4244.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampiric_tutor.txt b/res/cardsfolder/vampiric_tutor.txt deleted file mode 100644 index 92d598e8b37..00000000000 --- a/res/cardsfolder/vampiric_tutor.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vampiric Tutor -ManaCost:B -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ B | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, then shuffle your library and put that card on top of it. You lose 2 life. | SubAbility$ SVar=DBLoseLife -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampiric_tutor.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/22.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vampirism.txt b/res/cardsfolder/vampirism.txt deleted file mode 100644 index 29533be408b..00000000000 --- a/res/cardsfolder/vampirism.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vampirism -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+0 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card at the beginning of the next turn's upkeep. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | NextUpkeep$ True -K:stPumpEnchanted:Creature:X/X:no Condition:Enchanted creature gets +1/+1 for each other creature you control. -K:stPumpAll:Creature.YouCtrl:-1/-1:no Condition:Other creatures you control get -1/-1. -SVar:X:Count$Valid Creature.YouCtrl -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vampirism.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vanquish.txt b/res/cardsfolder/vanquish.txt deleted file mode 100644 index 200656b9ca0..00000000000 --- a/res/cardsfolder/vanquish.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vanquish -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 W | ValidTgts$ Creature.blocking | TgtPrompt$ Select target blocking creature | SpellDescription$ Destroy target blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vanquish.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/20.jpg -End diff --git a/res/cardsfolder/vapor_snag.txt b/res/cardsfolder/vapor_snag.txt deleted file mode 100644 index 1b761b76c09..00000000000 --- a/res/cardsfolder/vapor_snag.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vapor Snag -ManaCost:U -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBDrain | SpellDescription$ Return target creature to its owner's hand. Its controller loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vapor_snag.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/varchilds_crusader.txt b/res/cardsfolder/varchilds_crusader.txt deleted file mode 100644 index 41f64ab63f6..00000000000 --- a/res/cardsfolder/varchilds_crusader.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Varchild's Crusader -ManaCost:3 R -Types:Creature Human Knight -Text:no text -PT:3/2 -A:AB$ Pump | Cost$ 0 | KW$ CARDNAME can't be blocked except by Walls. & HIDDEN At the beginning of the end step, sacrifice CARDNAME. | SpellDescription$ CARDNAME can't be blocked this turn except by Walls. Sacrifice CARDNAME at the beginning of the next end step. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/varchilds_crusader.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/120.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/vastwood_animist.txt b/res/cardsfolder/vastwood_animist.txt deleted file mode 100644 index c5d68fd9b01..00000000000 --- a/res/cardsfolder/vastwood_animist.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vastwood Animist -ManaCost:2 G -Types:Creature Elf Shaman Ally -Text:no text -PT:1/1 -A:AB$ Animate | Cost$ T | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Power$ X | Toughness$ X | Types$ Creature,Elemental | SpellDescription$ 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. -SVar:X:Count$Valid Ally.YouCtrl -SVar:RemRandomDeck:True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vastwood_animist.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vastwood_gorger.txt b/res/cardsfolder/vastwood_gorger.txt deleted file mode 100644 index 08913d2b5bc..00000000000 --- a/res/cardsfolder/vastwood_gorger.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vastwood Gorger -ManaCost:5 G -Types:Creature Wurm -Text:no text -PT:5/6 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vastwood_gorger.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/192.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vastwood_zendikon.txt b/res/cardsfolder/vastwood_zendikon.txt deleted file mode 100644 index 098c84b6d20..00000000000 --- a/res/cardsfolder/vastwood_zendikon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vastwood Zendikon -ManaCost:4 G -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:6/4:Creature,Elemental:Green:No Abilities:isPresent Card.AttachedBy:Enchanted land is a 6/4 green Elemental creature. It's still a land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land is put into a graveyard, return that card to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vastwood_zendikon.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/117.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vault_of_whispers.txt b/res/cardsfolder/vault_of_whispers.txt deleted file mode 100644 index 75df8d051b4..00000000000 --- a/res/cardsfolder/vault_of_whispers.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vault of Whispers -ManaCost:no cost -Types:Artifact Land -Text:(Vault of Whispers isn't a spell.) -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vault_of_whispers.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vault_skirge.txt b/res/cardsfolder/vault_skirge.txt deleted file mode 100644 index 69fb1ff92ef..00000000000 --- a/res/cardsfolder/vault_skirge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vault Skirge -ManaCost:1 PB -Types:Artifact Creature Imp -Text:no text -PT:1/1 -K:Flying -K:Lifelink -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vault_skirge.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vault_skyward.txt b/res/cardsfolder/vault_skyward.txt deleted file mode 100644 index 7b00a8a3d4f..00000000000 --- a/res/cardsfolder/vault_skyward.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vault Skyward -ManaCost:U -Types:Instant -Text:no text -A:SP$ Pump | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SubAbility$ SVar=DBUntap | SpellDescription$ Target creature gains flying until end of turn. Untap it. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vault_skyward.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vec_townships.txt b/res/cardsfolder/vec_townships.txt deleted file mode 100644 index fa3e55b8d58..00000000000 --- a/res/cardsfolder/vec_townships.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vec Townships -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. CARDNAME doesn't untap during your next untap step. | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://magiccards.info/scans/en/br/93.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/339.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vectis_agents.txt b/res/cardsfolder/vectis_agents.txt deleted file mode 100644 index 9bf1c1321ce..00000000000 --- a/res/cardsfolder/vectis_agents.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vectis Agents -ManaCost:3 U B -Types:Artifact Creature Human Rogue -Text:no text -PT:4/3 -A:AB$ Pump | Cost$ U B | NumAtt$ -2 | KW$ Unblockable | SpellDescription$ CARDNAME gets -2/-0 until end of turn and is unblockable this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vectis_agents.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/131.jpg -End diff --git a/res/cardsfolder/vectis_silencers.txt b/res/cardsfolder/vectis_silencers.txt deleted file mode 100644 index 90a5f2db9bb..00000000000 --- a/res/cardsfolder/vectis_silencers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vectis Silencers -ManaCost:2 U -Types:Artifact Creature Human Rogue -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ 2 B | KW$ Deathtouch | SpellDescription$ CARDNAME gains deathtouch until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vectis_silencers.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/62.jpg -End diff --git a/res/cardsfolder/vector_asp.txt b/res/cardsfolder/vector_asp.txt deleted file mode 100644 index 575453e4c5e..00000000000 --- a/res/cardsfolder/vector_asp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vector Asp -ManaCost:1 -Types:Artifact Creature Snake -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ B | KW$ Infect | SpellDescription$ CARDNAME gains infect until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vector_asp.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/219.jpg -End diff --git a/res/cardsfolder/vedalken_aethermage.txt b/res/cardsfolder/vedalken_aethermage.txt deleted file mode 100644 index 5ebf93624d2..00000000000 --- a/res/cardsfolder/vedalken_aethermage.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vedalken AEthermage -ManaCost:1 U -Types:Creature Vedalken Wizard -Text:no text -PT:1/2 -K:Flash -K:TypeCycling:Wizard:3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, return target Sliver to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Sliver | TgtPrompt$ Select target Sliver | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_aethermage.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_anatomist.txt b/res/cardsfolder/vedalken_anatomist.txt deleted file mode 100644 index 1898fc5b9cd..00000000000 --- a/res/cardsfolder/vedalken_anatomist.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vedalken Anatomist -ManaCost:2 U -Types:Creature Vedalken Wizard -Text:no text -PT:1/2 -A:AB$ PutCounter | Cost$ 2 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ M1M1 | CounterNum$ 1 | SubAbility$ SVar=DBTapOrUntap | IsCurse$ True | SpellDescription$ Put a -1/-1 counter on target creature. You may tap or untap that creature. -SVar:DBTapOrUntap:DB$TapOrUntap | Defined$ Targeted -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_anatomist.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/36.jpg -End diff --git a/res/cardsfolder/vedalken_archmage.txt b/res/cardsfolder/vedalken_archmage.txt deleted file mode 100644 index 50c84a4f5d0..00000000000 --- a/res/cardsfolder/vedalken_archmage.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vedalken Archmage -ManaCost:2 U U -Types:Creature Vedalken Wizard -Text:no text -PT:0/2 -T:Mode$ SpellCast | ValidCard$ Card.Artifact+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast an artifact spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_archmage.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_certarch.txt b/res/cardsfolder/vedalken_certarch.txt deleted file mode 100644 index 7f1dd7a87f3..00000000000 --- a/res/cardsfolder/vedalken_certarch.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vedalken Certarch -ManaCost:U -Types:Creature Vedalken Wizard -Text:no text -PT:1/1 -A:AB$ Tap | Cost$ T | ValidTgts$ Artifact,Creature,Land | TgtPrompt$ Select target artifact, creature or land. | IsPresent$ Artifact.YouCtrl | PresentCompare$ GE3 | PrecostDesc$ Metalcraft - | SpellDescription$ Tap target artifact, creature or land. Activate this ability only if you control three or more artifacts. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_certarch.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_dismisser.txt b/res/cardsfolder/vedalken_dismisser.txt deleted file mode 100644 index 50c1957b8bd..00000000000 --- a/res/cardsfolder/vedalken_dismisser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vedalken Dismisser -ManaCost:5 U -Types:Creature Vedlaken Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target creature on top of its owner's library. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_dismisser.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_entrancer.txt b/res/cardsfolder/vedalken_entrancer.txt deleted file mode 100644 index a63588b6f74..00000000000 --- a/res/cardsfolder/vedalken_entrancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vedalken Entrancer -ManaCost:3 U -Types:Creature Vedalken Wizard -Text:no text -A:AB$ Mill | Cost$ U T | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player puts the top two cards of his or her library into his or her graveyard. -PT:1/4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_entrancer.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_ghoul.txt b/res/cardsfolder/vedalken_ghoul.txt deleted file mode 100644 index 9b9b63c5cb7..00000000000 --- a/res/cardsfolder/vedalken_ghoul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vedalken Ghoul -ManaCost:U B -Types:Creature Vedalken Zombie -Text:no text -PT:1/1 -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | Execute$ TrigDrain | TriggerDescription$ Whenever CARDNAME becomes blocked, defending player loses 4 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ DefendingPlayer | LifeAmount$ 4 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_ghoul.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_heretic.txt b/res/cardsfolder/vedalken_heretic.txt deleted file mode 100644 index 591115a6af0..00000000000 --- a/res/cardsfolder/vedalken_heretic.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vedalken Heretic -ManaCost:U G -Types:Creature Vedalken Rogue -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_heretic.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/104.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_infuser.txt b/res/cardsfolder/vedalken_infuser.txt deleted file mode 100644 index da3d26d72d6..00000000000 --- a/res/cardsfolder/vedalken_infuser.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vedalken Infuser -ManaCost:3 U -Types:Creature Vedalken Wizard -Text:no text -PT:1/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a charge counter on target artifact. -SVar:TrigCounter:AB$PutCounter | Cost$ 0 | CounterType$ CHARGE | CounterNum$ 1 | ValidTgts$ Artifact | TgtPrompt$ Select target artifact -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_infuser.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_mastermind.txt b/res/cardsfolder/vedalken_mastermind.txt deleted file mode 100644 index 2b597318318..00000000000 --- a/res/cardsfolder/vedalken_mastermind.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vedalken Mastermind -ManaCost:U U -Types:Creature Vedalken Wizard -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ U T | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent you control to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card50834.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/40.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_orrery.txt b/res/cardsfolder/vedalken_orrery.txt deleted file mode 100644 index 1da9d35da8e..00000000000 --- a/res/cardsfolder/vedalken_orrery.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vedalken Orrery -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Card.nonLand+YouCtrl:0/0/HIDDEN Flash:No Condition:You may cast nonland cards as though they had flash. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_orrery.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_outlander.txt b/res/cardsfolder/vedalken_outlander.txt deleted file mode 100644 index 780f5337ab2..00000000000 --- a/res/cardsfolder/vedalken_outlander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vedalken Outlander -ManaCost:W U -Types:Artifact Creature Vedalken Scout -Text:no text -PT:2/2 -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_outlander.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_plotter.txt b/res/cardsfolder/vedalken_plotter.txt deleted file mode 100644 index 1bed0f1d6ce..00000000000 --- a/res/cardsfolder/vedalken_plotter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vedalken Plotter -ManaCost:2 U -Types:Creature Vedalken Wizard -Text:When Vedalken Plotter enters the battlefield, exchange control of target land you control and target land an opponent controls. -PT:1/1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_plotter.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vedalken_shackles.txt b/res/cardsfolder/vedalken_shackles.txt deleted file mode 100644 index a06ecc97111..00000000000 --- a/res/cardsfolder/vedalken_shackles.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vedalken Shackles -ManaCost:3 -Types:Artifact -Text:no text -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ 2 T | ValidTgts$ Creature.powerLEX | TgtPrompt$ Select target creature with power less than or equal to the number of Islands you control. | LoseControl$ Untap,LeavesPlay | SpellDescription$ Gain control of target creature with power less than or equal to the number of Islands you control for as long as CARDNAME remains tapped. -SVar:X:Count$TypeYouCtrl.Island -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vedalken_shackles.jpg -SetInfo:5DN|Rare|http://magiccards.info/scans/en/5dn/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veil_of_birds.txt b/res/cardsfolder/veil_of_birds.txt deleted file mode 100644 index 4931ac38106..00000000000 --- a/res/cardsfolder/veil_of_birds.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Veil of Birds -ManaCost:U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes a 1/1 Bird creature with flying. -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 1 | Toughness$ 1 | Keywords$ Flying | Types$ Creature,Bird | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/veil_of_birds.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veiled_apparition.txt b/res/cardsfolder/veiled_apparition.txt deleted file mode 100644 index 2c8fa5617f0..00000000000 --- a/res/cardsfolder/veiled_apparition.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Veiled Apparition -ManaCost:1 U -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 U." -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ Flying & At the beginning of your upkeep, sacrifice CARDNAME unless you pay 1 U | Types$ Creature,Illusion | OverwriteTypes$ True | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_apparition.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vein_drinker.txt b/res/cardsfolder/vein_drinker.txt deleted file mode 100644 index 1967cc81b85..00000000000 --- a/res/cardsfolder/vein_drinker.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Vein Drinker -ManaCost:4 B B -Types:Creature Vampire -Text:no text -PT:4/4 -K:Flying -K:Whenever a creature dealt damage by CARDNAME this turn is put into a graveyard, put a +1/+1 counter on CARDNAME. -A:AB$ DealDamage | Cost$ R T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SubAbility$ SVar=DamageThis | SpellDescription$ CARDNAME deals damage equal to its power to target creature. That creature deals damage equal to its power to CARDNAME. -SVar:DamageThis:DB$DealDamage | Defined$ Self | DamageSource$ Targeted | NumDmg$ Y -SVar:X:Count$CardPower -SVar:Y:Targeted$CardPower -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vein_drinker.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veinfire_borderpost.txt b/res/cardsfolder/veinfire_borderpost.txt deleted file mode 100644 index 1327fac90fd..00000000000 --- a/res/cardsfolder/veinfire_borderpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Veinfire Borderpost -ManaCost:1 B R -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -SVar:AltCost:1 Return<1/Land.Basic>$You may pay 1 and return a basic land you control to its owner's hand rather than pay Firewild Veinfire Borderpost's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/veinfire_borderpost.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veldrane_of_sengir.txt b/res/cardsfolder/veldrane_of_sengir.txt deleted file mode 100644 index 392bbefd32f..00000000000 --- a/res/cardsfolder/veldrane_of_sengir.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Veldrane of Sengir -ManaCost:5 B B -Types:Legendary Creature Human Rogue -Text:no text -PT:5/5 -A:AB$ Pump | Cost$ 1 B B | NumAtt$ -3 | KW$ Forestwalk | SpellDescription$ CARDNAME gets -3/-0 and gains forestwalk until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/veldrane_of_sengir.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/25.jpg -End diff --git a/res/cardsfolder/veldt.txt b/res/cardsfolder/veldt.txt deleted file mode 100644 index c6fade5fe75..00000000000 --- a/res/cardsfolder/veldt.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Veldt -ManaCost:no cost -Types:Land -Text:no text -K:stPumpSelf:Permanent:0/0/HIDDEN CARDNAME doesn't untap during your untap step.:isValid Permanent.countersGE1DEPLETION:CARDNAME doesn't untap during your untap step if it has a depletion counter on it. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add G to your mana pool. Put a depletion counter on CARDNAME. -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ 1 | SubAbility$ SVar=AddCounter | SpellDescription$ Add W to your mana pool. Put a depletion counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At the beginning of your upkeep, remove a depletion counter from CARDNAME. -SVar:TrigSubCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:AddCounter:DB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ DEPLETION | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/veldt.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/358.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venarian_gold.txt b/res/cardsfolder/venarian_gold.txt deleted file mode 100644 index 7d9c9726a54..00000000000 --- a/res/cardsfolder/venarian_gold.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Venarian Gold -ManaCost:X U U -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap enchanted creature and put X sleep counters on it. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ Enchanted | SubAbility$ SVar=DBPutCounter -SVar:DBPutCounter:DB$PutCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ SLEEP | CounterNum$ X -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, remove a sleep counter from that creature. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Enchanted | CounterType$ SLEEP | CounterNum$ 1 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/venarian_gold.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vendetta.txt b/res/cardsfolder/vendetta.txt deleted file mode 100644 index 24ef5568293..00000000000 --- a/res/cardsfolder/vendetta.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vendetta -ManaCost:B -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | NoRegen$ True | SubAbility$ SVar=DBLoseLife | SpellDescription$ Destroy target nonblack creature. It can't be regenerated. You lose life equal to that creature's toughness. -SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ X -SVar:X:Targeted$CardToughness -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vendetta.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/170.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/130.jpg -End diff --git a/res/cardsfolder/vendilion_clique.txt b/res/cardsfolder/vendilion_clique.txt deleted file mode 100644 index ab37b745d26..00000000000 --- a/res/cardsfolder/vendilion_clique.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vendilion Clique -ManaCost:1 U U -Types:Legendary Creature Faerie Wizard -Text:no text -PT:3/1 -K:Flying -K:Flash -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME 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. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Hand | Destination$ Library | ChangeType$ Card.nonLand | ChangeNum$ 1 | LibraryPosition$ -1 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | Defined$ Targeted | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vendilion_clique.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venerable_kumo.txt b/res/cardsfolder/venerable_kumo.txt deleted file mode 100644 index bede8acbf48..00000000000 --- a/res/cardsfolder/venerable_kumo.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Venerable Kumo -ManaCost:4 G -Types:Creature Spirit -Text:no text -PT:2/3 -K:Reach -K:Soulshift:4 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/venerable_kumo.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/248.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venerable_monk.txt b/res/cardsfolder/venerable_monk.txt deleted file mode 100644 index 4efe91c908b..00000000000 --- a/res/cardsfolder/venerable_monk.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Venerable Monk -ManaCost:2 W -Types:Creature Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83441.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/55.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/53.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/197.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/121.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/51.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/55.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/50.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venerated_teacher.txt b/res/cardsfolder/venerated_teacher.txt deleted file mode 100644 index 07c1db8f9c4..00000000000 --- a/res/cardsfolder/venerated_teacher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Venerated Teacher -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put two level counters on each creature you control with level up. -SVar:TrigPut:AB$PutCounterAll | Cost$ 0 | ValidCards$ Creature.YouCtrl+hasLevelUp | CounterType$ LEVEL | CounterNum$ 2 -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/venerated_teacher.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vengeance.txt b/res/cardsfolder/vengeance.txt deleted file mode 100644 index 2f0ff461cf2..00000000000 --- a/res/cardsfolder/vengeance.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vengeance -ManaCost:3 W -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 3 W | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | SpellDescription$ Destroy target tapped creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeance.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/147.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/29.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/28.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/198.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vengeful_dead.txt b/res/cardsfolder/vengeful_dead.txt deleted file mode 100644 index b7df41fcb4e..00000000000 --- a/res/cardsfolder/vengeful_dead.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vengeful Dead -ManaCost:3 B -Types:Creature Zombie -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME or another Zombie is put into a graveyard from the battlefield, each opponent loses 1 life. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Zombie.Other | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigLoseLife | TriggerDescription$ Whenever CARDNAME or another Zombie is put into a graveyard from the battlefield, each opponent loses 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeful_dead.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vengeful_dreams.txt b/res/cardsfolder/vengeful_dreams.txt deleted file mode 100644 index c7e5f2a6d32..00000000000 --- a/res/cardsfolder/vengeful_dreams.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vengeful Dreams -ManaCost:W W -Types:Instant -Text:As an additional cost to cast Vengeful Dreams, discard X cards.\r\n\r\nExile X target attacking creatures. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeful_dreams.jpg -SetInfo:TOR|Rare|http://magiccards.info/scans/en/tr/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vengeful_firebrand.txt b/res/cardsfolder/vengeful_firebrand.txt deleted file mode 100644 index bfd0b0e7a92..00000000000 --- a/res/cardsfolder/vengeful_firebrand.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vengeful Firebrand -ManaCost:3 R -Types:Creature Elemental Warrior -Text:no text -PT:5/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -K:stPumpSelf:Creature:0/0/Haste:isInGraveyard Warrior.YouCtrl:CARDNAME has haste as long as a Warrior card is in your graveyard. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vengeful_firebrand.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/111.jpg -End diff --git a/res/cardsfolder/vengevine.txt b/res/cardsfolder/vengevine.txt deleted file mode 100644 index d3d3d0964b3..00000000000 --- a/res/cardsfolder/vengevine.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vengevine -ManaCost:2 G G -Types:Creature Elemental -Text: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. -PT:4/3 -K:Haste -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/vengevine.jpg -SetInfo:ROE|Mythic|http://magiccards.info/scans/en/roe/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venomous_dragonfly.txt b/res/cardsfolder/venomous_dragonfly.txt deleted file mode 100644 index c934df5c6b7..00000000000 --- a/res/cardsfolder/venomous_dragonfly.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Venomous Dragonfly -ManaCost:3 G -Types:Creature Insect -Text:no text -PT:1/1 -K:Flying -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelTrigBlocked | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, destroy that creature at end of combat. -T:Mode$ AttackerBlocked | ValidCard$ Card.Self | ValidBlocker$ Creature | DelayedTrigger$ DelTrigBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, destroy that creature at end of combat. -SVar:DelTrigBlocked:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocked | TriggerDescription$ Destroy blocked creature at end of combat. -SVar:DelTrigBlocker:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigDestroyBlocker | TriggerDescription$ Destroy blocking creature at end of combat. -SVar:TrigDestroyBlocked:AB$Destroy | Cost$ 0 | Defined$ TriggeredAttacker -SVar:TrigDestroyBlocker:AB$Destroy | Cost$ 0 | Defined$ TriggeredBlocker -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/venomous_dragonfly.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venomous_vines.txt b/res/cardsfolder/venomous_vines.txt deleted file mode 100644 index 14e78c4de37..00000000000 --- a/res/cardsfolder/venomous_vines.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Venomous Vines -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G G | ValidTgts$ Permanent.enchanted | TgtPrompt$ Select target enchanted permanent | SpellDescription$ Destroy target enchanted permanent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/venomous_vines.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/136.jpg -End diff --git a/res/cardsfolder/venomspout_brackus.txt b/res/cardsfolder/venomspout_brackus.txt deleted file mode 100644 index 2544a2f57fb..00000000000 --- a/res/cardsfolder/venomspout_brackus.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Venomspout Brackus -ManaCost:6 G -Types:Creature Beast -Text:no text -PT:5/5 -A:AB$ DealDamage | Cost$ 1 G T | ValidTgts$ Creature.attacking+withFlying,Creature.blocking+withFlying | TgtPrompt$ Select target attacking or blocking creature with flying | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target attacking or blocking creature with flying. -K:Morph:3 G G -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/venomspout_brackus.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/295.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/venser_the_sojourner.txt b/res/cardsfolder/venser_the_sojourner.txt deleted file mode 100644 index 72d49221f0d..00000000000 --- a/res/cardsfolder/venser_the_sojourner.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Venser, the Sojourner -ManaCost:3 W U -Types:Planeswalker Venser -Text:no text -Loyalty:3 -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/venser_the_sojourner.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vensers_journal.txt b/res/cardsfolder/vensers_journal.txt deleted file mode 100644 index 3815b71d62f..00000000000 --- a/res/cardsfolder/vensers_journal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Venser's Journal -ManaCost:5 -Types:Artifact -Text:You have no maximum hand size. -K:HandSize = INF Self -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, you gain 1 life for each card in your hand. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ X -SVar:X:Count$InYourHand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vensers_journal.jpg -SetInfo:SOM|Rare|http://magiccards.info/scans/en/som/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vensers_sliver.txt b/res/cardsfolder/vensers_sliver.txt deleted file mode 100644 index b9d2d49bdb8..00000000000 --- a/res/cardsfolder/vensers_sliver.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Venser's Sliver -ManaCost:5 -Types:Artifact Creature Sliver -Text:no text -PT:3/3 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/tsp/en-us/card125866.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vent_sentinel.txt b/res/cardsfolder/vent_sentinel.txt deleted file mode 100644 index c07e3f5a475..00000000000 --- a/res/cardsfolder/vent_sentinel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vent Sentinel -ManaCost:3 R -Types:Creature Elemental -Text:no text -PT:2/4 -K:Defender -A:AB$ DealDamage | Cost$ 1 R T | Tgt$ TgtP | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target player equal to the number of creatures with defender you control. -SVar:X:Count$Valid Creature.withDefender+YouCtrl -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vent_sentinel.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verdant_catacombs.txt b/res/cardsfolder/verdant_catacombs.txt deleted file mode 100644 index 8d1a7e48b06..00000000000 --- a/res/cardsfolder/verdant_catacombs.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Verdant Catacombs -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Swamp,Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Swamp or Forest card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_catacombs.jpg -SetInfo:ZEN|Rare|http://magiccards.info/scans/en/zen/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verdant_eidolon.txt b/res/cardsfolder/verdant_eidolon.txt deleted file mode 100644 index 9348859e99c..00000000000 --- a/res/cardsfolder/verdant_eidolon.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Verdant Eidolon -ManaCost:3 G -Types:Creature Spirit -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ W | Amount$ 3 | SpellDescription$ Add W W W to your mana pool. -A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ U | Amount$ 3 | SpellDescription$ Add U U U to your mana pool. -A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ B | Amount$ 3 | SpellDescription$ Add B B B to your mana pool. -A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ R | Amount$ 3 | SpellDescription$ Add R R R to your mana pool. -A:AB$ Mana | Cost$ G Sac<1/CARDNAME> | Produced$ G | Amount$ 3 | SpellDescription$ Add G G G to your mana pool. -T:Mode$ SpellCast | ValidCard$ Card.MultiColor+YouCtrl | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a multicolored spell, you may return CARDNAME from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | Defined$ Self -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_eidolon.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verdant_field.txt b/res/cardsfolder/verdant_field.txt deleted file mode 100644 index 4f0e579b942..00000000000 --- a/res/cardsfolder/verdant_field.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Verdant Field -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stPumpEnchanted:Land:0/0/SVar=Pump:No Condition:Enchanted land has "tap: Target creature gets +1/+1 until end of turn." -SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_field.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/130.jpg -End diff --git a/res/cardsfolder/verdant_force.txt b/res/cardsfolder/verdant_force.txt deleted file mode 100644 index 9d503066fde..00000000000 --- a/res/cardsfolder/verdant_force.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Verdant Force -ManaCost:5 G G G -Types:Creature Elemental -Text:no text -PT:7/7 -T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each upkeep, put a 1/1 green Saproling creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenPower$ 1 | TokenToughness$ 1 | TokenColors$ Green -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_force.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/157.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/278.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/307.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verdant_touch.txt b/res/cardsfolder/verdant_touch.txt deleted file mode 100644 index 026f2a4a450..00000000000 --- a/res/cardsfolder/verdant_touch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Verdant Touch -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ Animate | Cost$ 1 G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SpellDescription$ Target land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) -SVar:Buyback:3 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_touch.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verdigris.txt b/res/cardsfolder/verdigris.txt deleted file mode 100644 index da04661768a..00000000000 --- a/res/cardsfolder/verdigris.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Verdigris -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/verdigris.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/158.jpg -End diff --git a/res/cardsfolder/verduran_emissary.txt b/res/cardsfolder/verduran_emissary.txt deleted file mode 100644 index 414b3067920..00000000000 --- a/res/cardsfolder/verduran_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Verduran Emissary -ManaCost:2 G -Types:Creature Human Wizard -Text:no text -PT:2/3 -K:Kicker:1 R -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, destroy target artifact. It can't be regenerated. -SVar:TrigKicker:AB$Destroy | Cost$ 0 | ValidTgts$ Artifact | NoRegen$ True | TgtPrompt$ Select target artifact -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_emissary.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/verduran_enchantress.txt b/res/cardsfolder/verduran_enchantress.txt deleted file mode 100644 index 3050d111d4b..00000000000 --- a/res/cardsfolder/verduran_enchantress.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Verduran Enchantress -ManaCost:1 G G -Types:Creature Human Druid -Text:no text -PT:0/2 -T:Mode$ SpellCast | ValidCard$ Card.Enchantment+YouCtrl | Execute$ TrigDraw | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever you cast an enchantment spell, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/verduran_enchantress.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/285.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/131.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/131.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/280.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/199.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/165.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/279.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/264.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/130.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vermiculos.txt b/res/cardsfolder/vermiculos.txt deleted file mode 100644 index b22ce1a5390..00000000000 --- a/res/cardsfolder/vermiculos.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vermiculos -ManaCost:4 B -Types:Creature Horror -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Artifact | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact enters the battlefield, CARDNAME gets +4/+4 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 4 | NumDef$ 4 -SVar:BuffedBy:Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vermiculos.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vernal_bloom.txt b/res/cardsfolder/vernal_bloom.txt deleted file mode 100644 index 717a8687dba..00000000000 --- a/res/cardsfolder/vernal_bloom.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vernal Bloom -ManaCost:3 G -Types:Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Forest | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 1 | Defined$ TriggeredPlayer -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vernal_bloom.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/286.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/281.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vernal_equinox.txt b/res/cardsfolder/vernal_equinox.txt deleted file mode 100644 index e3936658c27..00000000000 --- a/res/cardsfolder/vernal_equinox.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vernal Equinox -ManaCost:3 G -Types:Enchantment -Text:no text -K:stPumpAll:Creature,Enchantment:0/0/HIDDEN Flash:No Condition:Any player may cast creature and enchantment cards as though they had flash. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vernal_equinox.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vertigo_spawn.txt b/res/cardsfolder/vertigo_spawn.txt deleted file mode 100644 index a6f43cf31a5..00000000000 --- a/res/cardsfolder/vertigo_spawn.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vertigo Spawn -ManaCost:1 U -Types:Creature Illusion -Text:no text -PT:0/3 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME blocks a creature, tap that creature. That creature doesn't untap during its controller's next untap step. -SVar:TrigTap:AB$Tap | Cost$ 0 | Defined$ TriggeredAttacker | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vertigo_spawn.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vesper_ghoul.txt b/res/cardsfolder/vesper_ghoul.txt deleted file mode 100644 index 66060b527e4..00000000000 --- a/res/cardsfolder/vesper_ghoul.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Vesper Ghoul -ManaCost:2 B -Types:Creature Zombie Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T PayLife<1> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vesper_ghoul.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vesuvan_doppelganger.txt b/res/cardsfolder/vesuvan_doppelganger.txt deleted file mode 100644 index 178d72831dc..00000000000 --- a/res/cardsfolder/vesuvan_doppelganger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vesuvan Doppelganger -ManaCost:3 U U -Types:Creature Shapeshifter -Text:You may have CARDNAME 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." -PT:0/0 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/88.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/88.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/88.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_armorer.txt b/res/cardsfolder/veteran_armorer.txt deleted file mode 100644 index 61774b1da53..00000000000 --- a/res/cardsfolder/veteran_armorer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Veteran Armorer -ManaCost:1 W -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:stPumpAll:Creature.Other+YouCtrl:0/1:No Condition:Other creatures you control get +0/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card87950.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_armorsmith.txt b/res/cardsfolder/veteran_armorsmith.txt deleted file mode 100644 index 66cb726a579..00000000000 --- a/res/cardsfolder/veteran_armorsmith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Veteran Armorsmith -ManaCost:W W -Types:Creature Human Soldier -Text:no text -PT:2/3 -K:stPumpAll:Creature.Soldier+Other+YouCtrl:0/1:No Condition:Other soldier creatures you control get +0/+1. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/veteran_armorsmith.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_brawlers.txt b/res/cardsfolder/veteran_brawlers.txt deleted file mode 100644 index 54240089191..00000000000 --- a/res/cardsfolder/veteran_brawlers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Veteran Brawlers -ManaCost:1 R -Types:Creature Human Soldier -Text:no text -PT:4/4 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack.:isPresent Land.untapped+YouDontCtrl:CARDNAME can't attack if defending player controls an untapped land. -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't block.:isPresent Land.untapped+YouCtrl:CARDNAME can't can't block if you control an untapped land. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/veteran_brawlers.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/106.jpg -End diff --git a/res/cardsfolder/veteran_cavalier.txt b/res/cardsfolder/veteran_cavalier.txt deleted file mode 100644 index cc165b60469..00000000000 --- a/res/cardsfolder/veteran_cavalier.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Veteran Cavalier -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card84622.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/30.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_explorer.txt b/res/cardsfolder/veteran_explorer.txt deleted file mode 100644 index 42923d99df2..00000000000 --- a/res/cardsfolder/veteran_explorer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Veteran Explorer -ManaCost:G -Types:Creature Human Soldier Scout -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, 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. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Defined$ Each | ChangeNum$ 2 | Shuffle$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/veteran_explorer.jpg -SetInfo:WTH|Uncommon|http://magiccards.info/scans/en/wl/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_of_the_depths.txt b/res/cardsfolder/veteran_of_the_depths.txt deleted file mode 100644 index fb8714e8586..00000000000 --- a/res/cardsfolder/veteran_of_the_depths.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Veteran of the Depths -ManaCost:3 W -Types:Creature Merfolk Soldier -Text:no text -PT:2/2 -T:Mode$ Taps | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigBuff | TriggerDescription$ Whenever CARDNAME becomes tapped, you may put a +1/+1 counter on it. -SVar:TrigBuff:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/veteran_of_the_depths.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veteran_swordsmith.txt b/res/cardsfolder/veteran_swordsmith.txt deleted file mode 100644 index 9479deeda89..00000000000 --- a/res/cardsfolder/veteran_swordsmith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Veteran Swordsmith -ManaCost:2 W -Types:Creature Human Soldier -Text:no text -PT:3/2 -K:stPumpAll:Creature.Soldier+Other+YouCtrl:1/0:No Condition:Other Soldier creatures you control get +1/+0. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/veteran_swordsmith.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/veterans_reflexes.txt b/res/cardsfolder/veterans_reflexes.txt deleted file mode 100644 index b5b0d0115b0..00000000000 --- a/res/cardsfolder/veterans_reflexes.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Veteran's Reflexes -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SubAbility$ SVar=DBUntap | SpellDescription$ Target creature gets +1/+1 until end of turn. Untap that creature. -SVar:DBUntap:DB$Untap | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/veterans_reflexes.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/23.jpg -End diff --git a/res/cardsfolder/vex.txt b/res/cardsfolder/vex.txt deleted file mode 100644 index 641bc8720ff..00000000000 --- a/res/cardsfolder/vex.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vex -ManaCost:2 U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 2 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SubAbility$ SVar=DBDraw | SpellDescription$ Counter target spell. That spell's controller may draw a card. -SVar:DBDraw:DB$Draw | Defined$ TargetedController | NumCards$ 1 | OptionalDecider$ TargetedController -#believe it or not, the OptionalDecider thing works. I wouldn't have believed it if I wouldn't have tested it myself. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vex.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vexing_beetle.txt b/res/cardsfolder/vexing_beetle.txt deleted file mode 100644 index 702ee92e242..00000000000 --- a/res/cardsfolder/vexing_beetle.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vexing Beetle -ManaCost:4 G -Types:Creature Insect -Text:no text -PT:3/3 -K:CARDNAME can't be countered. -K:stPumpSelf:Creature:3/3:isNotPresent Creature.YouDontCtrl:CARDNAME gets +3/+3 as long as no opponent controls a creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vexing_beetle.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_bladescout.txt b/res/cardsfolder/viashino_bladescout.txt deleted file mode 100644 index 1b9002e4ff8..00000000000 --- a/res/cardsfolder/viashino_bladescout.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viashino Bladescout -ManaCost:1 R R -Types:Creature Viashino Scout -Text:no text -PT:2/1 -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gains first strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_bladescout.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/185.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_cutthroat.txt b/res/cardsfolder/viashino_cutthroat.txt deleted file mode 100644 index 05366570249..00000000000 --- a/res/cardsfolder/viashino_cutthroat.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Viashino Cutthroat -ManaCost:2 R R -Types:Creature Viashino -Text:no text -PT:5/3 -K:Haste -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of the end step, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_cutthroat.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_fangtail.txt b/res/cardsfolder/viashino_fangtail.txt deleted file mode 100644 index 574c74a6edd..00000000000 --- a/res/cardsfolder/viashino_fangtail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Fangtail -ManaCost:2 R R -Types:Creature Viashino Warrior -Text:no text -PT:3/3 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_fangtail.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_grappler.txt b/res/cardsfolder/viashino_grappler.txt deleted file mode 100644 index 8dd15471729..00000000000 --- a/res/cardsfolder/viashino_grappler.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Grappler -ManaCost:2 R -Types:Creature Viashino -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ G | KW$ Trample | SpellDescription$ CARDNAME gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_grappler.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/179.jpg -End diff --git a/res/cardsfolder/viashino_heretic.txt b/res/cardsfolder/viashino_heretic.txt deleted file mode 100644 index c50277ce83d..00000000000 --- a/res/cardsfolder/viashino_heretic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viashino Heretic -ManaCost:2 R -Types:Creature Viashino -Text:no text -PT:1/3 -A:AB$ Destroy | Cost$ 1 R T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ SVar=DBDamage | SpellDescription$ Destroy target artifact. CARDNAME deals damage to that artifact's controller equal to the artifact's converted mana cost. -SVar:DBDamage:DB$DealDamage | Defined$ TargetedController | NumDmg$ X -SVar:X:Targeted$CardManaCost -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_heretic.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/95.jpg -End diff --git a/res/cardsfolder/viashino_outrider.txt b/res/cardsfolder/viashino_outrider.txt deleted file mode 100644 index 66aaff0ee89..00000000000 --- a/res/cardsfolder/viashino_outrider.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Outrider -ManaCost:2 R -Types:Creature Viashino -Text:no text -PT:4/3 -K:Echo:2 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_outrider.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_sandscout.txt b/res/cardsfolder/viashino_sandscout.txt deleted file mode 100644 index a51f466f395..00000000000 --- a/res/cardsfolder/viashino_sandscout.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Viashino Sandscout -ManaCost:1 R -Types:Creature Viashino Scout -Text:no text -PT:2/1 -K:Haste -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of the end step, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_sandscout.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/96.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/246.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_sandstalker.txt b/res/cardsfolder/viashino_sandstalker.txt deleted file mode 100644 index f30711dded3..00000000000 --- a/res/cardsfolder/viashino_sandstalker.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Viashino Sandstalker -ManaCost:1 R R -Types:Creature Viashino Warrior -Text:no text -PT:4/2 -K:Haste -T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ At the beginning of the end step, return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Self | Origin$ Battlefield | Destination$ Hand -SVar:PlayMain1:TRUE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_sandstalker.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/230.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/100.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_skeleton.txt b/res/cardsfolder/viashino_skeleton.txt deleted file mode 100644 index 554cb700bb0..00000000000 --- a/res/cardsfolder/viashino_skeleton.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viashino Skeleton -ManaCost:3 R -Types:Creature Viashino Skeleton -Text:no text -PT:2/1 -A:AB$ Regenerate | Cost$ 1 B Discard<1/Card> | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_skeleton.jpg -SVar:Rarity:Common -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/118.jpg -End diff --git a/res/cardsfolder/viashino_slasher.txt b/res/cardsfolder/viashino_slasher.txt deleted file mode 100644 index 317b3f630ae..00000000000 --- a/res/cardsfolder/viashino_slasher.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Slasher -ManaCost:1 R -Types:Creature Viashino Warrior -Text:no text -PT:1/2 -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_slasher.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/149.jpg -End diff --git a/res/cardsfolder/viashino_slaughtermaster.txt b/res/cardsfolder/viashino_slaughtermaster.txt deleted file mode 100644 index c96b345a3e3..00000000000 --- a/res/cardsfolder/viashino_slaughtermaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viashino Slaughtermaster -ManaCost:1 R -Types:Creature Viashino Warrior -Text:no text -PT:1/1 -K:Double Strike -A:AB$ Pump | Cost$ B G | NumAtt$ +1 | NumDef$ +1 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_slaughtermaster.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/73.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_spearhunter.txt b/res/cardsfolder/viashino_spearhunter.txt deleted file mode 100644 index 1e56612c365..00000000000 --- a/res/cardsfolder/viashino_spearhunter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Spearhunter -ManaCost:2 R -Types:Creature Viashino Warrior -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_spearhunter.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_warrior.txt b/res/cardsfolder/viashino_warrior.txt deleted file mode 100644 index c956a2aeb26..00000000000 --- a/res/cardsfolder/viashino_warrior.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viashino Warrior -ManaCost:3 R -Types:Creature Viashino Warrior -Text:no text -PT:4/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card12974.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/213.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashino_weaponsmith.txt b/res/cardsfolder/viashino_weaponsmith.txt deleted file mode 100644 index b0b6ba41eb7..00000000000 --- a/res/cardsfolder/viashino_weaponsmith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viashino Weaponsmith -ManaCost:3 R -Types:Creature Viashino -Text:no text -PT:2/2 -T:Mode$ Blocks | ValidCard$ Creature | ValidBlocked$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigBlockedPump | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, CARDNAME get +2/+2 until end of turn. -SVar:TrigBlockedPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashino_weaponsmith.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viashivan_dragon.txt b/res/cardsfolder/viashivan_dragon.txt deleted file mode 100644 index 262be58197b..00000000000 --- a/res/cardsfolder/viashivan_dragon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viashivan Dragon -ManaCost:2 R R G G -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Pump | Cost$ G | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/viashivan_dragon.jpg -SetInfo:VIS|Rare|http://magiccards.info/scans/en/vi/140.jpg -End diff --git a/res/cardsfolder/vibrating_sphere.txt b/res/cardsfolder/vibrating_sphere.txt deleted file mode 100644 index 282db5edace..00000000000 --- a/res/cardsfolder/vibrating_sphere.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vibrating Sphere -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature.YouCtrl:+2/+0:isYourTurn:As long as it's your turn, creatures you control get +2/+0. -K:stPumpAll:Creature.YouCtrl:-0/-2:notYourTurn:As long as it's not your turn, creatures you control get -0/-2. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vibrating_sphere.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/320.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vicious_hunger.txt b/res/cardsfolder/vicious_hunger.txt deleted file mode 100644 index 2f49b8e2397..00000000000 --- a/res/cardsfolder/vicious_hunger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vicious Hunger -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 2 | SubAbility$ SVar=DBGainLife | SpellDescription$ CARDNAME deals 2 damage to target creature and you gain 2 life. -SVar:DBGainLife:DB$GainLife | Defined$ You | LifeAmount$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vicious_hunger.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/171.jpg -SetInfo:NMS|Common|http://magiccards.info/scans/en/ne/74.jpg -End diff --git a/res/cardsfolder/vicious_kavu.txt b/res/cardsfolder/vicious_kavu.txt deleted file mode 100644 index 023315af826..00000000000 --- a/res/cardsfolder/vicious_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vicious Kavu -ManaCost:1 B R -Types:Creature Kavu -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vicious_kavu.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/victorious_destruction.txt b/res/cardsfolder/victorious_destruction.txt deleted file mode 100644 index 043ef99b283..00000000000 --- a/res/cardsfolder/victorious_destruction.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Victorious Destruction -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SubAbility$ SVar=DBDrain | SpellDescription$ Destroy target artifact or land. Its controller loses 1 life. -SVar:DBDrain:DB$LoseLife | Defined$ TargetedController | LifeAmount$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/victorious_destruction.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/victorys_herald.txt b/res/cardsfolder/victorys_herald.txt deleted file mode 100644 index b2a915016d3..00000000000 --- a/res/cardsfolder/victorys_herald.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Victory's Herald -ManaCost:3 W W W -Types:Creature Angel -Text:no text -PT:4/4 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, attacking creatures gain flying and lifelink until end of turn. -SVar:TrigPump:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.attacking | KW$ Flying & Lifelink -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/victorys_herald.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/victual_sliver.txt b/res/cardsfolder/victual_sliver.txt deleted file mode 100644 index 19e38666b6e..00000000000 --- a/res/cardsfolder/victual_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Victual Sliver -ManaCost:W G -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Sliver:0/0/SVar=GainLife:no Condition:All Slivers have "2, Sacrifice this permanent: You gain 4 life." -SVar:GainLife:AB$GainLife | Cost$ 2 Sac<1/CARDNAME> | LifeAmount$ 4 | Defined$ You | SpellDescription$ You gain 4 life. -SVar:BuffedBy:Sliver -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/victual_sliver.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vigean_intuition.txt b/res/cardsfolder/vigean_intuition.txt deleted file mode 100644 index cbdec27d635..00000000000 --- a/res/cardsfolder/vigean_intuition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vigean Intuition -ManaCost:3 G U -Types:Instant -Text:no text -A:SP$ ChooseType | Cost$ 3 G U | Defined$ You | Type$ Card | SubAbility$ SVar=DBDig | SpellDescription$ 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.) -SVar:DBDig:DB$Dig | DigNum$ 4 | Reveal$ True | ChangeNum$ All | ChangeValid$ Card.ChosenType | DestinationZone2$ Graveyard -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigean_intuition.jpg -SetInfo:DIS|Uncommon|http://magiccards.info/scans/en/di/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vigil_for_the_lost.txt b/res/cardsfolder/vigil_for_the_lost.txt deleted file mode 100644 index 576fe5b4421..00000000000 --- a/res/cardsfolder/vigil_for_the_lost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vigil for the Lost -ManaCost:3 W -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | Execute$ TrigGainLife | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature you control is put into a graveyard from the battlefield, you may pay X. If you do, you gain X life. -SVar:TrigGainLife:AB$GainLife | Cost$ X | LifeAmount$ X -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigil_for_the_lost.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vigilance.txt b/res/cardsfolder/vigilance.txt deleted file mode 100644 index d7291298831..00000000000 --- a/res/cardsfolder/vigilance.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vigilance -ManaCost:W -Types:Enchantment Aura -Text:Enchanted creature has vigilance. -K:Enchant creature -K:enPump:Vigilance -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilance.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vigilant_drake.txt b/res/cardsfolder/vigilant_drake.txt deleted file mode 100644 index b56b2bcd57a..00000000000 --- a/res/cardsfolder/vigilant_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vigilant Drake -ManaCost:4 U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -A:AB$ Untap | Cost$ 2 U | SpellDescription$ Untap CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilant_drake.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/46.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/109.jpg -End diff --git a/res/cardsfolder/vigilant_martyr.txt b/res/cardsfolder/vigilant_martyr.txt deleted file mode 100644 index b8cc2a0f236..00000000000 --- a/res/cardsfolder/vigilant_martyr.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vigilant Martyr -ManaCost:W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -A:AB$ Counter | Cost$ W W T Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | TargetValidTargeting$ Enchantment | SpellDescription$ Counter target spell that targets an enchantment. -SVar:RemRandomDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilant_martyr.jpg -SVar:Rarity:Uncommon -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/249.jpg -End diff --git a/res/cardsfolder/vigilant_sentry.txt b/res/cardsfolder/vigilant_sentry.txt deleted file mode 100644 index 45639e5e7dd..00000000000 --- a/res/cardsfolder/vigilant_sentry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vigilant Sentry -ManaCost:1 W W -Types:Creature Human Nomad -Text:no text -PT:2/2 -K:stPumpSelf:Creature:1/1/SVar=Pump:Threshold:Threshold - As long as seven or more cards are in your graveyard, Vigilant Sentry gets +1/+1 and has "Tap: Target attacking or blocking creature gets +3/+3 until end of turn." -SVar:Pump:AB$Pump | Cost$ T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumAtt$ +3 | NumDef$ +3 | SpellDescription$ Target attacking or blocking creature gets +3/+3 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigilant_sentry.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vile_deacon.txt b/res/cardsfolder/vile_deacon.txt deleted file mode 100644 index e39f7c6e4a4..00000000000 --- a/res/cardsfolder/vile_deacon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vile Deacon -ManaCost:2 B B -Types:Creature Human Cleric -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +X/+X until end of turn, where X is the number of Clerics on the battlefield. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ X | NumDef$ X -SVar:X:Count$Valid Cleric -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vile_deacon.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vile_requiem.txt b/res/cardsfolder/vile_requiem.txt deleted file mode 100644 index 35436e9bb56..00000000000 --- a/res/cardsfolder/vile_requiem.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vile Requiem -ManaCost:2 B B -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ 1 B Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ X | ValidTgts$ Creature.nonBlack | NoRegen$ True | TgtPrompt$ Select target nonblack creature | SpellDescription$ Destroy up to X target nonblack creatures, where X is the number of verse counters on CARDNAME. They can't be regenerated. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vile_requiem.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/village_elder.txt b/res/cardsfolder/village_elder.txt deleted file mode 100644 index 3cfb7a2626d..00000000000 --- a/res/cardsfolder/village_elder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Village Elder -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ G T Sac<1/Forest> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/village_elder.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/villainous_ogre.txt b/res/cardsfolder/villainous_ogre.txt deleted file mode 100644 index 0be52547dbd..00000000000 --- a/res/cardsfolder/villainous_ogre.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Villainous Ogre -ManaCost:2 B -Types:Creature Ogre Warrior -Text:no text -PT:3/2 -K:CARDNAME can't block. -K:stPumpSelf:Card:0/0/SVar=ABRegen:isPresent Demon.YouCtrl:As long as you control a Demon, CARDNAME has "B: Regenerate CARDNAME." -SVar:ABRegen:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card80520.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/148.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vindicate.txt b/res/cardsfolder/vindicate.txt deleted file mode 100644 index 8641bd3feb4..00000000000 --- a/res/cardsfolder/vindicate.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vindicate -ManaCost:1 W B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 W B | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Destroy target permanent. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vindicate.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/126.jpg -End diff --git a/res/cardsfolder/vindictive_mob.txt b/res/cardsfolder/vindictive_mob.txt deleted file mode 100644 index 7b479bb8b37..00000000000 --- a/res/cardsfolder/vindictive_mob.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vindictive Mob -ManaCost:4 B B -Types:Creature Human Berserker -Text:CARDNAME can't be blocked by Saprolings. -PT:5/5 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 | Defined$ You | SacValid$ Creature -K:CantBeBlockedBy Saproling -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vindictive_mob.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vine_dryad.txt b/res/cardsfolder/vine_dryad.txt deleted file mode 100644 index 3743e10120c..00000000000 --- a/res/cardsfolder/vine_dryad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vine Dryad -ManaCost:3 G -Types:Creature Dryad -Text:no text -PT:1/3 -K:Flash -K:Forestwalk -SVar:AltCost:ExileFromHand<1/Card.Green>$You may exile one green card from your hand rather than pay CARDNAME's mana cost. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vine_dryad.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vine_trellis.txt b/res/cardsfolder/vine_trellis.txt deleted file mode 100644 index 130c1904c00..00000000000 --- a/res/cardsfolder/vine_trellis.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vine Trellis -ManaCost:1 G -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19624.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/287.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vinelasher_kudzu.txt b/res/cardsfolder/vinelasher_kudzu.txt deleted file mode 100644 index f022799356c..00000000000 --- a/res/cardsfolder/vinelasher_kudzu.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vinelasher Kudzu -ManaCost:1 G -Types:Creature Plant -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:BuffedBy:Land -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vinelasher_kudzu.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/189.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vines_of_vastwood.txt b/res/cardsfolder/vines_of_vastwood.txt deleted file mode 100644 index febcf92f8a0..00000000000 --- a/res/cardsfolder/vines_of_vastwood.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vines of Vastwood -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ CARDNAME can't be the target of spells or abilities your opponents control. | SpellDescription$ Target creature can't be the target of spells or abilities your opponents control this turn. If CARDNAME was kicked, that creature gets +4/+4 until end of turn. -A:SP$ Pump | Cost$ G G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | KW$ CARDNAME can't be the target of spells or abilities your opponents control. | SpellDescription$ Kicker G (You may pay an additional G as you cast this spell.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vines_of_vastwood.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/193.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vintara_snapper.txt b/res/cardsfolder/vintara_snapper.txt deleted file mode 100644 index 7c7dfddcfed..00000000000 --- a/res/cardsfolder/vintara_snapper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vintara Snapper -ManaCost:G G -Types:Creature Turtle -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/Shroud:isNotPresent Land.untapped+YouCtrl:Vintara Snapper has shroud as long as you control no untapped lands. (It can't be the target of spells or abilities.) -SVar:BuffedBy:Spell -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vintara_snapper.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/violent_outburst.txt b/res/cardsfolder/violent_outburst.txt deleted file mode 100644 index 77ac44b54f2..00000000000 --- a/res/cardsfolder/violent_outburst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Violent Outburst -ManaCost:1 R G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 1 R G | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | SpellDescription$ Creatures you control get +1/+0 until end of turn. -K:Cascade -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/violent_outburst.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/violent_ultimatum.txt b/res/cardsfolder/violent_ultimatum.txt deleted file mode 100644 index fcf66adb3e5..00000000000 --- a/res/cardsfolder/violent_ultimatum.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Violent Ultimatum -ManaCost:B B R R R G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ B B R R R G G | TargetMin$ 3 | TargetMax$ 3 | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SpellDescription$ Destroy three target permanents. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/violent_ultimatum.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/206.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/violet_pall.txt b/res/cardsfolder/violet_pall.txt deleted file mode 100644 index f6f84484064..00000000000 --- a/res/cardsfolder/violet_pall.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Violet Pall -ManaCost:4 B -Types:Tribal Instant Faerie -Text:no text -A:SP$ Destroy | Cost$ 4 B | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creature | SubAbility$ SVar=DBToken | SpellDescription$ Destroy target nonblack creature. Put a 1/1 black Faerie Rogue creature token with flying onto the battlefield. -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Faerie Rogue | TokenTypes$ Creature,Faerie,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/violet_pall.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/81.jpg -End diff --git a/res/cardsfolder/viral_drake.txt b/res/cardsfolder/viral_drake.txt deleted file mode 100644 index bf5638ce77d..00000000000 --- a/res/cardsfolder/viral_drake.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viral Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:1/4 -K:Flying -K:Infect -A:AB$ Proliferate | Cost$ 3 U | SpellDescription$ Proliferate. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viral_drake.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridescent_wisps.txt b/res/cardsfolder/viridescent_wisps.txt deleted file mode 100644 index ac08599472b..00000000000 --- a/res/cardsfolder/viridescent_wisps.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viridescent Wisps -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +0 | SubAbility$ SVar=DBDraw | SpellDescription$ Target creature becomes green and gets +1/+0 until end of turn. Draw a card. -SVar:DBDraw:DB$Draw | SubAbility$ SVar=DBGreen | NumCards$ 1 -SVar:DBGreen:DB$Animate | Colors$ Green | OverwriteColors$ True | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridescent_wisps.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_acolyte.txt b/res/cardsfolder/viridian_acolyte.txt deleted file mode 100644 index 8049a6e8fc2..00000000000 --- a/res/cardsfolder/viridian_acolyte.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Viridian Acolyte -ManaCost:G -Types:Creature Elf Shaman -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ 1 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_acolyte.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_betrayers.txt b/res/cardsfolder/viridian_betrayers.txt deleted file mode 100644 index 875cfb16ba9..00000000000 --- a/res/cardsfolder/viridian_betrayers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viridian Betrayers -ManaCost:1 G G -Types:Creature Elf Warrior -Text:no text -PT:3/1 -K:stPumpSelf:Creature:0/0/Infect:OppPoisoned: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.) -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_betrayers.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_claw.txt b/res/cardsfolder/viridian_claw.txt deleted file mode 100644 index 5a37891a5ff..00000000000 --- a/res/cardsfolder/viridian_claw.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Viridian Claw -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +1/+0 and has first strike. -K:eqPump 1:+1/+0/First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_claw.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_corrupter.txt b/res/cardsfolder/viridian_corrupter.txt deleted file mode 100644 index 8f31d56348a..00000000000 --- a/res/cardsfolder/viridian_corrupter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viridian Corrupter -ManaCost:1 G G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -K:Infect -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_corrupter.jpg -SetInfo:MBS|Uncommon|http://magiccards.info/scans/en/mbs/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_emissary.txt b/res/cardsfolder/viridian_emissary.txt deleted file mode 100644 index f62842aef8c..00000000000 --- a/res/cardsfolder/viridian_emissary.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viridian Emissary -ManaCost:1 G -Types:Creature Elf Scout -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_emissary.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_harvest.txt b/res/cardsfolder/viridian_harvest.txt deleted file mode 100644 index 2c48cddeeba..00000000000 --- a/res/cardsfolder/viridian_harvest.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viridian Harvest -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant Artifact -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigGainLife | TriggerDescription$ When enchanted artifact is put into a graveyard, you gain 6 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 6 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_harvest.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_joiner.txt b/res/cardsfolder/viridian_joiner.txt deleted file mode 100644 index df2da099648..00000000000 --- a/res/cardsfolder/viridian_joiner.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Viridian Joiner -ManaCost:2 G -Types:Creature Elf Druid -Text:no text -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add an amount of G to your mana pool equal to Viridian Joiner's power. -SVar:X:Count$CardPower -PT:1/2 -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_joiner.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_longbow.txt b/res/cardsfolder/viridian_longbow.txt deleted file mode 100644 index f4a5a80733e..00000000000 --- a/res/cardsfolder/viridian_longbow.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viridian Longbow -ManaCost:1 -Types:Artifact Equipment -Text:no text -K:eqPump 3:0/0 -K:stPumpEquipped:Creature:0/0/SVar=Damage:No Condition:Equipped creature has "Tap: This creature deals 1 damage to target creature or player." -SVar:Damage:AB$DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_longbow.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_lorebearers.txt b/res/cardsfolder/viridian_lorebearers.txt deleted file mode 100644 index a2b3320626f..00000000000 --- a/res/cardsfolder/viridian_lorebearers.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viridian Lorebearers -ManaCost:3 G -Types:Creature Elf Shaman -Text:no text -PT:3/3 -A:AB$ Pump | Cost$ 3 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of artifacts your opponents control. -SVar:X:Count$TypeOppCtrl.Artifact -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_lorebearers.jpg -SetInfo:5DN|Uncommon|http://magiccards.info/scans/en/5dn/99.jpg -End diff --git a/res/cardsfolder/viridian_revel.txt b/res/cardsfolder/viridian_revel.txt deleted file mode 100644 index d8924e73803..00000000000 --- a/res/cardsfolder/viridian_revel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viridian Revel -ManaCost:1 G G -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Artifact.YouDontCtrl | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an artifact is put into an opponent's graveyard from the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_revel.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_scout.txt b/res/cardsfolder/viridian_scout.txt deleted file mode 100644 index eba0d04829d..00000000000 --- a/res/cardsfolder/viridian_scout.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viridian Scout -ManaCost:3 G -Types:Creature Elf Warrior Scout -Text:no text -PT:1/2 -A:AB$ DealDamage | Cost$ 2 G Sac<1/CARDNAME> | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature with flying. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_scout.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_shaman.txt b/res/cardsfolder/viridian_shaman.txt deleted file mode 100644 index 11c2acb8766..00000000000 --- a/res/cardsfolder/viridian_shaman.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Viridian Shaman -ManaCost:2 G -Types:Creature Elf Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_shaman.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/139.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/280.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/308.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viridian_zealot.txt b/res/cardsfolder/viridian_zealot.txt deleted file mode 100644 index 9135d1c48a4..00000000000 --- a/res/cardsfolder/viridian_zealot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viridian Zealot -ManaCost:G G -Types:Creature Elf Warrior -Text:no text -PT:2/1 -A:AB$ Destroy | Cost$ 1 G Sac<1/CARDNAME> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/viridian_zealot.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/90.jpg -End diff --git a/res/cardsfolder/virtues_ruin.txt b/res/cardsfolder/virtues_ruin.txt deleted file mode 100644 index 90648409ffb..00000000000 --- a/res/cardsfolder/virtues_ruin.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Virtue's Ruin -ManaCost:2 B -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 B | ValidCards$ Creature.White | SpellDescription$ Destroy all white creatures. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://serv2.tcgimages.eu/img/cards/Portal/virtues_ruin.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/39.jpg -End diff --git a/res/cardsfolder/virtuous_charge.txt b/res/cardsfolder/virtuous_charge.txt deleted file mode 100644 index 9c04bb028ee..00000000000 --- a/res/cardsfolder/virtuous_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Virtuous Charge -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10596.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/virulent_sliver.txt b/res/cardsfolder/virulent_sliver.txt deleted file mode 100644 index f361ed38b9a..00000000000 --- a/res/cardsfolder/virulent_sliver.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Virulent Sliver -ManaCost:G -Types:Creature Sliver -Text:no text -#All Sliver creatures have poisonous 1. -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/Poisonous 1:no Condition:All Sliver creatures have poisonous 1. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/virulent_sliver.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/virulent_wound.txt b/res/cardsfolder/virulent_wound.txt deleted file mode 100644 index 85224b33cf7..00000000000 --- a/res/cardsfolder/virulent_wound.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Virulent Wound -ManaCost:B -Types:Instant -Text:no text -A:SP$ PutCounter | Cost$ B | Tgt$ TgtC | CounterType$ M1M1 | CounterNum$ 1 | IsCurse$ True | SubAbility$ SVar=DB | SpellDescription$ Put a -1/-1 counter on target creature. When that creature is put into a graveyard this turn, its controller gets a poison counter. -SVar:DB:DB$Pump | KW$ HIDDEN If CARDNAME is put into a graveyard this turn, its controller gets a poison counter. | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/virulent_wound.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/visara_the_dreadful.txt b/res/cardsfolder/visara_the_dreadful.txt deleted file mode 100644 index b1a756e10bb..00000000000 --- a/res/cardsfolder/visara_the_dreadful.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Visara the Dreadful -ManaCost:3 B B B -Types:Legendary Creature Gorgon -Text:no text -PT:5/5 -K:Flying -A:AB$ Destroy | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SpellDescription$ Destroy target creature. It can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39863.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/179.jpg -End diff --git a/res/cardsfolder/viscera_dragger.txt b/res/cardsfolder/viscera_dragger.txt deleted file mode 100644 index 60eb1c63e06..00000000000 --- a/res/cardsfolder/viscera_dragger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viscera Dragger -ManaCost:3 B -Types:Creature Zombie Ogre Warrior -Text:no text -PT:3/3 -K:Cycling:2 -K:Unearth:1 B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viscera_dragger.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viscera_seer.txt b/res/cardsfolder/viscera_seer.txt deleted file mode 100644 index fd59c7c21e1..00000000000 --- a/res/cardsfolder/viscera_seer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viscera Seer -ManaCost:B -Types:Creature Vampire Wizard -Text:no text -PT:1/1 -A:AB$ Scry | Cost$ Sac<1/Creature> | ScryNum$ 1 | SpellDescription$ 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.) -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viscera_seer.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/viscerid_armor.txt b/res/cardsfolder/viscerid_armor.txt deleted file mode 100644 index 0ef6bd92d78..00000000000 --- a/res/cardsfolder/viscerid_armor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viscerid Armor -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+1 -A:AB$ ChangeZone | Cost$ 1 U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viscerid_armor.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/60.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/viscerid_deepwalker.txt b/res/cardsfolder/viscerid_deepwalker.txt deleted file mode 100644 index 1d9f494f14a..00000000000 --- a/res/cardsfolder/viscerid_deepwalker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Viscerid Deepwalker -ManaCost:4 U -Types:Creature Homarid Warrior -Text:no text -PT:2/3 -K:Suspend:4:U -A:AB$ Pump | Cost$ U | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viscerid_deepwalker.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/91.jpg -End diff --git a/res/cardsfolder/viscid_lemures.txt b/res/cardsfolder/viscid_lemures.txt deleted file mode 100644 index fbc28884654..00000000000 --- a/res/cardsfolder/viscid_lemures.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Viscid Lemures -ManaCost:4 B -Types:Creature Spirit -Text:no text -PT:4/3 -A:AB$ Pump | Cost$ 0 | NumAtt$ -1 | KW$ Swampwalk | SpellDescription$ CARDNAME gets -1/-0 and gains swampwalk until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/viscid_lemures.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/141.jpg -End diff --git a/res/cardsfolder/viseling.txt b/res/cardsfolder/viseling.txt deleted file mode 100644 index a5224efa135..00000000000 --- a/res/cardsfolder/viseling.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Viseling -ManaCost:4 -Types:Artifact Creature Construct -Text:no text -PT:2/2 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ GT4 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each opponent's upkeep, CARDNAME deals X damage to that player, where X is the number of cards in his or her hand minus 4. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/Minus.4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/viseling.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vision_skeins.txt b/res/cardsfolder/vision_skeins.txt deleted file mode 100644 index 985dc0aa6da..00000000000 --- a/res/cardsfolder/vision_skeins.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vision Skeins -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 U | Defined$ Each | NumCards$ 2 | SpellDescription$ Each player draws two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vision_skeins.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/36.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/visions.txt b/res/cardsfolder/visions.txt deleted file mode 100644 index eee4bae8831..00000000000 --- a/res/cardsfolder/visions.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Visions -ManaCost:W -Types:Sorcery -Text:no text -A:SP$ Dig | Cost$ W | ValidTgts$ Player | TgtPrompt$ Select target player | DigNum$ 5 | NoMove$ True | SubAbility$ SVar=DBShuffle | SpellDescription$ Look at the top five cards of target player's library. You may then have that player shuffle that library. -SVar:DBShuffle:DB$Shuffle | Defined$ Targeted | Optional$ True -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/visions.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/304.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/210.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vital_splicer.txt b/res/cardsfolder/vital_splicer.txt deleted file mode 100644 index 1b3170b7ed7..00000000000 --- a/res/cardsfolder/vital_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vital Splicer -ManaCost:3 G -Types:Creature Human Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 3/3 colorless Golem artifact creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -A:AB$ Regenerate | Cost$ 1 | ValidTgts$ Golem.YouCtrl | TgtPrompt$ Select target Golem you control. | SpellDescription$ Regenerate target Golem you control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vital_splicer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vital_surge.txt b/res/cardsfolder/vital_surge.txt deleted file mode 100644 index e5900a3843c..00000000000 --- a/res/cardsfolder/vital_surge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vital Surge -ManaCost:1 G -Types:Instant Arcane -Text:(Note: Splice into Arcane is not functional) -A:SP$ GainLife | Cost$ 1 G | LifeAmount$ 3 | SpellDescription$ You gain 3 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vital_surge.jpg -SetInfo:BOK|Common|http://magiccards.info/scans/en/bok/150.jpg -End diff --git a/res/cardsfolder/vitality_charm.txt b/res/cardsfolder/vitality_charm.txt deleted file mode 100644 index 98b084afaba..00000000000 --- a/res/cardsfolder/vitality_charm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vitality Charm -ManaCost:G -Types:Instant -Text:no text -A:SP$ Token | Cost$ G | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | PrecostDesc$ Choose one - | SpellDescription$ Put a 1/1 green Insect creature token onto the battlefield; -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | NumAtt$ +1 | NumDef$ +1 | KW$ Trample | TgtPrompt$ Select target creature | PrecostDesc$ or | SpellDescription$ target creature gets +1/+1 and gains trample until end of turn; -A:SP$ Regenerate | Cost$ G | ValidTgts$ Beast | TgtPrompt$ Select target Beast | PrecostDesc$ or | SpellDescription$ regenerate target Beast. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vitality_charm.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/296.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vitalize.txt b/res/cardsfolder/vitalize.txt deleted file mode 100644 index 95c35bce604..00000000000 --- a/res/cardsfolder/vitalize.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vitalize -ManaCost:G -Types:Instant -Text:no text -A:SP$ UntapAll | Cost$ G | ValidCards$ Creature.YouCtrl | SpellDescription$ Untap all creatures you control. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vitalize.jpg -SetInfo:WTH|Common|http://magiccards.info/scans/en/wl/87.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vitalizing_cascade.txt b/res/cardsfolder/vitalizing_cascade.txt deleted file mode 100644 index 1f2c3105821..00000000000 --- a/res/cardsfolder/vitalizing_cascade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vitalizing Cascade -ManaCost:X G W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ X G W | Defined$ You | LifeAmount$ X | SubAbility$ SVar=DBGain3 | SpellDescription$ You gain X plus 3 life. -SVar:DBGain3:DB$GainLife | LifeAmount$ 3 | Defined$ You -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vitalizing_cascade.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/346.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vitalizing_wind.txt b/res/cardsfolder/vitalizing_wind.txt deleted file mode 100644 index f6161061767..00000000000 --- a/res/cardsfolder/vitalizing_wind.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vitalizing Wind -ManaCost:8 G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 8 G | ValidCards$ Creature.YouCtrl | NumAtt$ +7 | NumDef$ +7 | SpellDescription$ Creatures you control get +7/+7 until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/pr/en-us/card24677.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vitaspore_thallid.txt b/res/cardsfolder/vitaspore_thallid.txt deleted file mode 100644 index dfe46c57c0e..00000000000 --- a/res/cardsfolder/vitaspore_thallid.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Vitaspore Thallid -ManaCost:1 G -Types:Creature Fungus -Text:no text -PT:1/1 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a spore counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ SPORE | CounterNum$ 1 | SpellDescription$ Put a spore counter on CARDNAME. -A:AB$ Token | Cost$ SubCounter<3/SPORE> | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -A:AB$ Pump | Cost$ Sac<1/Saproling> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vitaspore_thallid.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/143.jpg -End diff --git a/res/cardsfolder/vithian_renegades.txt b/res/cardsfolder/vithian_renegades.txt deleted file mode 100644 index 9b33cbedbe2..00000000000 --- a/res/cardsfolder/vithian_renegades.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vithian Renegades -ManaCost:1 R G -Types:Creature Human Shaman -Text:no text -PT:3/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vithian_renegades.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vithian_stinger.txt b/res/cardsfolder/vithian_stinger.txt deleted file mode 100644 index b47bea85ca8..00000000000 --- a/res/cardsfolder/vithian_stinger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vithian Stinger -ManaCost:2 R -Types:Creature Human Shaman -Text:no text -PT:0/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -K:Unearth:1 R -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vithian_stinger.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vitu_ghazi_the_city_tree.txt b/res/cardsfolder/vitu_ghazi_the_city_tree.txt deleted file mode 100644 index 99ba58c4212..00000000000 --- a/res/cardsfolder/vitu_ghazi_the_city_tree.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vitu-Ghazi, the City-Tree -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Token | Cost$ 2 G W T | TokenAmount$ 1 | TokenName$ Saproling | TokenTypes$ Creature,Saproling | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Saproling creature token onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vitu_ghazi_the_city_tree.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivid_crag.txt b/res/cardsfolder/vivid_crag.txt deleted file mode 100644 index e7f256aad34..00000000000 --- a/res/cardsfolder/vivid_crag.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vivid Crag -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:2 -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivid_crag.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivid_creek.txt b/res/cardsfolder/vivid_creek.txt deleted file mode 100644 index c078d3c85de..00000000000 --- a/res/cardsfolder/vivid_creek.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vivid Creek -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:2 -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivid_creek.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivid_grove.txt b/res/cardsfolder/vivid_grove.txt deleted file mode 100644 index d8b11251339..00000000000 --- a/res/cardsfolder/vivid_grove.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vivid Grove -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:2 -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivid_grove.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivid_marsh.txt b/res/cardsfolder/vivid_marsh.txt deleted file mode 100644 index 92202342e26..00000000000 --- a/res/cardsfolder/vivid_marsh.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vivid Marsh -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:2 -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivid_marsh.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/278.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivid_meadow.txt b/res/cardsfolder/vivid_meadow.txt deleted file mode 100644 index ce408fb7283..00000000000 --- a/res/cardsfolder/vivid_meadow.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Vivid Meadow -ManaCost:no cost -Types:Land -Text:no text -K:etbCounter:CHARGE:2 -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T SubCounter<1/CHARGE> | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivid_meadow.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivify.txt b/res/cardsfolder/vivify.txt deleted file mode 100644 index 565d3c77b99..00000000000 --- a/res/cardsfolder/vivify.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vivify -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Animate | Cost$ 2 G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Creature | SubAbility$ SVar=DBDraw | SpellDescription$ Until end of turn, target land becomes a 3/3 creature that's still a land. Draw a card. -SVar:DBDraw:DB$Draw | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivify.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vivisection.txt b/res/cardsfolder/vivisection.txt deleted file mode 100644 index e6616d57fc7..00000000000 --- a/res/cardsfolder/vivisection.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vivisection -ManaCost:3 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 3 U Sac<1/Creature> | NumCards$ 3 | SpellDescription$ Draw three cards. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vivisection.jpg -SetInfo:MBS|Common|http://magiccards.info/scans/en/mbs/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vizzerdrix.txt b/res/cardsfolder/vizzerdrix.txt deleted file mode 100644 index 88600e418bd..00000000000 --- a/res/cardsfolder/vizzerdrix.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vizzerdrix -ManaCost:6 U -Types:Creature Rabbit Beast -Text:no text -PT:6/6 -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card94911.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/59.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9eb/7.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_hypnotist.txt b/res/cardsfolder/vodalian_hypnotist.txt deleted file mode 100644 index deab4cd9eca..00000000000 --- a/res/cardsfolder/vodalian_hypnotist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vodalian Hypnotist -ManaCost:1 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_hypnotist.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_knights.txt b/res/cardsfolder/vodalian_knights.txt deleted file mode 100644 index f5eae00819e..00000000000 --- a/res/cardsfolder/vodalian_knights.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vodalian Knights -ManaCost:1 U U -Types:Creature Merfolk Knight -Text:no text -PT:2/2 -K:First Strike -K:CARDNAME can't attack unless defending player controls an Island. -K:When you control no Islands, sacrifice CARDNAME. -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:NeedsToPlay:Island.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_knights.jpg -SetInfo:FEM|Rare|http://magiccards.info/scans/en/fe/58.jpg -End diff --git a/res/cardsfolder/vodalian_mage.txt b/res/cardsfolder/vodalian_mage.txt deleted file mode 100644 index 9d9b3565271..00000000000 --- a/res/cardsfolder/vodalian_mage.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vodalian Mage -ManaCost:2 U -Types:Creature Merfolk Wizard -Text:no text -PT:1/1 -A:AB$ Counter | Cost$ U T | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 1 | SpellDescription$ Counter target spell unless its controller pays 1. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_mage.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/59.jpg|3 -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_merchant.txt b/res/cardsfolder/vodalian_merchant.txt deleted file mode 100644 index 2cd86991a3e..00000000000 --- a/res/cardsfolder/vodalian_merchant.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vodalian Merchant -ManaCost:1 U -Types:Creature Merfolk -Text:no text -PT:1/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card, then discard a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card26296.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_serpent.txt b/res/cardsfolder/vodalian_serpent.txt deleted file mode 100644 index faa014d31d6..00000000000 --- a/res/cardsfolder/vodalian_serpent.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vodalian Serpent -ManaCost:3 U -Types:Creature Serpent -Text:no text -PT:2/2 -K:CARDNAME can't attack unless defending player controls an Island. -K:Kicker:2 -K:etbCounter:P1P1:4:isValid Card.kicked:If CARDNAME was kicked, it enters the battlefield with four +1/+1 counters on it. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_serpent.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_soldiers.txt b/res/cardsfolder/vodalian_soldiers.txt deleted file mode 100644 index 9967ce30bde..00000000000 --- a/res/cardsfolder/vodalian_soldiers.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vodalian Soldiers -ManaCost:1 U -Types:Creature Merfolk Soldier -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fe/en-us/card1901.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/134.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/104.jpg -SetInfo:FEM|Common|http://magiccards.info/scans/en/fe/62.jpg|4 -End \ No newline at end of file diff --git a/res/cardsfolder/vodalian_zombie.txt b/res/cardsfolder/vodalian_zombie.txt deleted file mode 100644 index f65f348834e..00000000000 --- a/res/cardsfolder/vodalian_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vodalian Zombie -ManaCost:U B -Types:Creature Merfolk Zombie -Text:no text -PT:2/2 -K:Protection from green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vodalian_zombie.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_duty.txt b/res/cardsfolder/voice_of_duty.txt deleted file mode 100644 index 23c5f412ee1..00000000000 --- a/res/cardsfolder/voice_of_duty.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of Duty -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -K:Protection from green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_duty.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/23.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_grace.txt b/res/cardsfolder/voice_of_grace.txt deleted file mode 100644 index 42402654c66..00000000000 --- a/res/cardsfolder/voice_of_grace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of Grace -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_grace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_law.txt b/res/cardsfolder/voice_of_law.txt deleted file mode 100644 index bffe5ab4df4..00000000000 --- a/res/cardsfolder/voice_of_law.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of Law -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_law.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_reason.txt b/res/cardsfolder/voice_of_reason.txt deleted file mode 100644 index 86e37071961..00000000000 --- a/res/cardsfolder/voice_of_reason.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of Reason -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -K:Protection from blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_reason.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_the_woods.txt b/res/cardsfolder/voice_of_the_woods.txt deleted file mode 100644 index fdf62b41033..00000000000 --- a/res/cardsfolder/voice_of_the_woods.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of the Woods -ManaCost:3 G G -Types:Creature Elf -Text:no text -PT:2/2 -A:AB$ Token | Cost$ tapXType<5/Elf> | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenColors$ Green | TokenPower$ 7 | TokenToughness$ 7 | TokenKeywords$ Trample |SpellDescription$ Put a 7/7 green Elemental creature token with trample onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_the_woods.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/297.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voice_of_truth.txt b/res/cardsfolder/voice_of_truth.txt deleted file mode 100644 index b0c18f283c4..00000000000 --- a/res/cardsfolder/voice_of_truth.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voice of Truth -ManaCost:3 W -Types:Creature Angel -Text:no text -PT:2/2 -K:Flying -K:Protection from white -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voice_of_truth.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voices_from_the_void.txt b/res/cardsfolder/voices_from_the_void.txt deleted file mode 100644 index 5998f66f49b..00000000000 --- a/res/cardsfolder/voices_from_the_void.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voices from the Void -ManaCost:4 B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 4 B | ValidTgts$ Player | NumCards$ X | Mode$ TgtChoose | SpellDescription$ Domain - Target player discards a card for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voices_from_the_void.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/55.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voidmage_prodigy.txt b/res/cardsfolder/voidmage_prodigy.txt deleted file mode 100644 index 616d18bf341..00000000000 --- a/res/cardsfolder/voidmage_prodigy.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Voidmage Prodigy -ManaCost:U U -Types:Creature Human Wizard -Text:no text -PT:2/1 -K:Morph:U -A:AB$ Counter | Cost$ U U Sac<1/Wizard> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | SpellDescription$ Counter target spell. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/voidmage_prodigy.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/120.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voidslime.txt b/res/cardsfolder/voidslime.txt deleted file mode 100644 index ff1405ceb81..00000000000 --- a/res/cardsfolder/voidslime.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Voidslime -ManaCost:G U U -Types:Instant -Text:no text -A:SP$ Counter | Cost$ G U U | TargetType$ Spell,Activated,Triggered | TgtPrompt$ Select target spell or ability | ValidTgts$ Card | SpellDescription$ Counter target spell, activated ability, or triggered ability. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/voidslime.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_awakening.txt b/res/cardsfolder/volcanic_awakening.txt deleted file mode 100644 index e11d519536f..00000000000 --- a/res/cardsfolder/volcanic_awakening.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Awakening -ManaCost:4 R R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R R | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_awakening.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/186.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_dragon.txt b/res/cardsfolder/volcanic_dragon.txt deleted file mode 100644 index 1f09092f2b2..00000000000 --- a/res/cardsfolder/volcanic_dragon.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Volcanic Dragon -ManaCost:4 R R -Types:Creature Dragon -Text:no text -PT:4/4 -K:Flying -K:Haste -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21020.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/122.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/201.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/159.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/214.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_eruption.txt b/res/cardsfolder/volcanic_eruption.txt deleted file mode 100644 index 97e48ce8bed..00000000000 --- a/res/cardsfolder/volcanic_eruption.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Volcanic Eruption -ManaCost:X U U U -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ X U U U | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Mountain | TgtPrompt$ Select target Mountain | SpellDescription$ Destroy X target Mountains. CARDNAME deals damage to each creature and each player equal to the number of Mountains destroyed this way. | SubAbility$ SVar=DB -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Land -SVar:DB:DB$DamageAll | NumDmg$X | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_eruption.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/89.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/89.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/89.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/112.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_fallout.txt b/res/cardsfolder/volcanic_fallout.txt deleted file mode 100644 index 628f2a59873..00000000000 --- a/res/cardsfolder/volcanic_fallout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Fallout -ManaCost:1 R R -Types:Instant -Text:no text -K:CARDNAME can't be countered. -A:SP$ DamageAll | Cost$ 1 R R | NumDmg$ 2 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. | SpellDescription$ CARDNAME deals 2 damage to each creature and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_fallout.jpg -SetInfo:CFX|Uncommon|http://magiccards.info/scans/en/cfx/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_geyser.txt b/res/cardsfolder/volcanic_geyser.txt deleted file mode 100644 index fdebb36a27f..00000000000 --- a/res/cardsfolder/volcanic_geyser.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Volcanic Geyser -ManaCost:X R R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ X R R | Tgt$ TgtCP | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target creature or player. -SVar:X:Count$xPaid -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_geyser.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/215.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/202.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_hammer.txt b/res/cardsfolder/volcanic_hammer.txt deleted file mode 100644 index c2d6f5c1627..00000000000 --- a/res/cardsfolder/volcanic_hammer.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Volcanic Hammer -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 1 R | Tgt$ TgtCP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p2/en-us/card6593.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/231.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/226.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/160.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/226.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/119.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_island.txt b/res/cardsfolder/volcanic_island.txt deleted file mode 100644 index 623dd8c3cc0..00000000000 --- a/res/cardsfolder/volcanic_island.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Island -ManaCost:no cost -Types:Land Island Mountain -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_island.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/302.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/306.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_spray.txt b/res/cardsfolder/volcanic_spray.txt deleted file mode 100644 index 3f9f22bbc20..00000000000 --- a/res/cardsfolder/volcanic_spray.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Spray -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | ValidDescription$ each creature without flying and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying and each player. -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | ValidDescription$ each creature without flying and each player. | Flashback$ True | CostDesc$ Flashback 1 R | SpellDescription$ (You may cast this card from your graveyard for its flashback cost. Then exile it.) -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_spray.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_strength.txt b/res/cardsfolder/volcanic_strength.txt deleted file mode 100644 index e83e0eda2f5..00000000000 --- a/res/cardsfolder/volcanic_strength.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Strength -ManaCost:1 R -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_strength.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volcanic_submersion.txt b/res/cardsfolder/volcanic_submersion.txt deleted file mode 100644 index 041784da0e6..00000000000 --- a/res/cardsfolder/volcanic_submersion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volcanic Submersion -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 4 R | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SpellDescription$ Destroy target artifact or land. -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcanic_submersion.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/121.jpg -End diff --git a/res/cardsfolder/volcano_imp.txt b/res/cardsfolder/volcano_imp.txt deleted file mode 100644 index 1e5f4b92d4c..00000000000 --- a/res/cardsfolder/volcano_imp.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Volcano Imp -ManaCost:3 B -Types:Creature Imp -Text:no text -PT:2/2 -K:Flying -A:AB$ Pump | Cost$ 1 R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/volcano_imp.jpg -SetInfo:PLS|Common|http://magiccards.info/scans/en/ps/56.jpg -End diff --git a/res/cardsfolder/volition_reins.txt b/res/cardsfolder/volition_reins.txt deleted file mode 100644 index ab42563ae47..00000000000 --- a/res/cardsfolder/volition_reins.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Volition Reins -ManaCost:3 U U U -Types:Enchantment Aura -Text:You control enchanted permanent. -K:Enchant permanent -T:Mode$ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Card.AttachedBy+tapped | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, if enchanted permanent is tapped, untap it. -SVar:TrigUntap:AB$Untap | Cost$ 0 | Defined$ Enchanted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/volition_reins.jpg -SetInfo:SOM|Uncommon|http://magiccards.info/scans/en/som/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volrath_the_fallen.txt b/res/cardsfolder/volrath_the_fallen.txt deleted file mode 100644 index d1eadd40ba4..00000000000 --- a/res/cardsfolder/volrath_the_fallen.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Volrath the Fallen -ManaCost:3 B B B -Types:Legendary Creature Shapeshifter -Text:no text -PT:6/4 -A:AB$ Pump | Cost$ 1 B Discard<1/Creature> | NumAtt$ +X | NumDef$ +X | SpellDescription$ CARDNAME gets +X/+X until end of turn, where X is the discarded card's converted mana cost. -SVar:X:Discarded$CardManaCost -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volrath_the_fallen.jpg -SetInfo:NMS|Rare|http://magiccards.info/scans/en/ne/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volraths_dungeon.txt b/res/cardsfolder/volraths_dungeon.txt deleted file mode 100644 index e033e3ee8a5..00000000000 --- a/res/cardsfolder/volraths_dungeon.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Volrath's Dungeon -ManaCost:2 B B -Types:Enchantment -Text:no text -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_dungeon.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volraths_gardens.txt b/res/cardsfolder/volraths_gardens.txt deleted file mode 100644 index 003d61d44b1..00000000000 --- a/res/cardsfolder/volraths_gardens.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volrath's Gardens -ManaCost:1 G -Types:Enchantment -Text:no text -A:AB$ GainLife | Cost$ 2 tapXType<1/Creature> | LifeAmount$ 2 | SorcerySpeed$ True | SpellDescription$ You gain 2 life. Activate this ability only any time you could cast a sorcery. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_gardens.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/74.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volraths_stronghold.txt b/res/cardsfolder/volraths_stronghold.txt deleted file mode 100644 index 8bcedcbdf07..00000000000 --- a/res/cardsfolder/volraths_stronghold.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Volrath's Stronghold -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ ChangeZone | Cost$ 1 B T | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Library | SpellDescription$ Put target creature card from your graveyard on top of your library. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/volraths_stronghold.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/volt_charge.txt b/res/cardsfolder/volt_charge.txt deleted file mode 100644 index 5f41e2c395e..00000000000 --- a/res/cardsfolder/volt_charge.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volt Charge -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DBProliferate | SpellDescription$ CARDNAME 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.) -SVar:DBProliferate:DB$Proliferate -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/volt_charge.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voltaic_construct.txt b/res/cardsfolder/voltaic_construct.txt deleted file mode 100644 index 2f758a65ebb..00000000000 --- a/res/cardsfolder/voltaic_construct.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voltaic Construct -ManaCost:4 -Types:Artifact Creature Golem Construct -Text:no text -PT:2/2 -A:AB$ Untap | Cost$ 2 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature | SpellDescription$ Untap target artifact creature. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voltaic_construct.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/156.jpg -End diff --git a/res/cardsfolder/voltaic_key.txt b/res/cardsfolder/voltaic_key.txt deleted file mode 100644 index 3c2acb5f87a..00000000000 --- a/res/cardsfolder/voltaic_key.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Voltaic Key -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ Untap | Cost$ 1 T | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Untap target artifact. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voltaic_key.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/219.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/314.jpg -End diff --git a/res/cardsfolder/volunteer_militia.txt b/res/cardsfolder/volunteer_militia.txt deleted file mode 100644 index 188473a41ee..00000000000 --- a/res/cardsfolder/volunteer_militia.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Volunteer Militia -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10483.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/148.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voracious_cobra.txt b/res/cardsfolder/voracious_cobra.txt deleted file mode 100644 index 1afe91bd85d..00000000000 --- a/res/cardsfolder/voracious_cobra.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Voracious Cobra -ManaCost:2 R G -Types:Creature Snake -Text:no text -PT:2/2 -K:First Strike -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, destroy that creature. It can't be regenerated. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ TriggeredTarget -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/voracious_cobra.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/288.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voracious_hatchling.txt b/res/cardsfolder/voracious_hatchling.txt deleted file mode 100644 index 9c10245ffe7..00000000000 --- a/res/cardsfolder/voracious_hatchling.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Voracious Hatchling -ManaCost:3 WB -Types:Creature Elemental -Text:no text -PT:6/6 -K:etbCounter:M1M1:4 -K:Lifelink -T:Mode$ SpellCast | ValidCard$ Card.White | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a white spell, remove a -1/-1 counter from CARDNAME. -T:Mode$ SpellCast | ValidCard$ Card.Black | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a black spell, remove a -1/-1 counter from CARDNAME. -SVar:TrigRemoveCounter:AB$RemoveCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:BuffedBy:Spell.White,Spell.Black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Voracious_Hatchling.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vorinclex_voice_of_hunger.txt b/res/cardsfolder/vorinclex_voice_of_hunger.txt deleted file mode 100644 index 22765ac003a..00000000000 --- a/res/cardsfolder/vorinclex_voice_of_hunger.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Vorinclex, Voice of Hunger -ManaCost:6 G G -Types:Legendary Creature Praetor -Text:no text -PT:7/6 -K:Trample -T:Mode$ TapsForMana | ValidCard$ Land.YouCtrl | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ Whenever you tap a land for mana, add one mana to your mana pool of any type that land produced. -SVar:TrigMana:AB$ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ You -T:Mode$ TapsForMana | ValidCard$ Land.YouDontCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent taps a land for mana, that land doesn't untap during its controller's next untap step. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredCard | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/vorinclex_voice_of_hunger.jpg -SetInfo:NPH|Mythic|http://magiccards.info/scans/en/nph/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vorosh_the_hunter.txt b/res/cardsfolder/vorosh_the_hunter.txt deleted file mode 100644 index 584e8ab315d..00000000000 --- a/res/cardsfolder/vorosh_the_hunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vorosh, the Hunter -ManaCost:3 G U B -Types:Legendary Creature Dragon -Text:no text -PT:6/6 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may pay 2 G. If you do, put six +1/+1 counters on Vorosh. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 2 G | Defined$ Self | CounterType$ P1P1 | CounterNum$ 6 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vorosh_the_hunter.jpg -SetInfo:PLC|Rare|http://magiccards.info/scans/en/pc/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vorrac_battlehorns.txt b/res/cardsfolder/vorrac_battlehorns.txt deleted file mode 100644 index a502eca3bb5..00000000000 --- a/res/cardsfolder/vorrac_battlehorns.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vorrac Battlehorns -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature has trample and can't be blocked by more than one creature. -K:eqPump 1:Trample & HIDDEN CARDNAME can't be blocked by more than one creature. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vorrac_battlehorns.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/271.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/votary_of_the_conclave.txt b/res/cardsfolder/votary_of_the_conclave.txt deleted file mode 100644 index b810774b158..00000000000 --- a/res/cardsfolder/votary_of_the_conclave.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Votary of the Conclave -ManaCost:W -Types:Creature Human Soldier -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ 2 G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/votary_of_the_conclave.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/voyager_drake.txt b/res/cardsfolder/voyager_drake.txt deleted file mode 100644 index 471ba7507a3..00000000000 --- a/res/cardsfolder/voyager_drake.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Voyager Drake -ManaCost:3 U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -K:Multikicker U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlying | TriggerDescription$ When CARDNAME enters the battlefield, up to X target creatures gain flying until end of turn, where X is the number of times CARDNAME was kicked. -SVar:TrigFlying:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ X | KW$ Flying | TgtPrompt$ Select target creature -SVar:X:Count$TimesKicked -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Voyager_Drake.jpg -SetInfo:WWK|Uncommon|http://magiccards.info/scans/en/wwk/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vug_lizard.txt b/res/cardsfolder/vug_lizard.txt deleted file mode 100644 index 9f98cf2c052..00000000000 --- a/res/cardsfolder/vug_lizard.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vug Lizard -ManaCost:1 R R -Types:Creature Lizard -Text:no text -PT:3/4 -K:Mountainwalk -K:Echo:1 R R -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vug_lizard.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_battlegear.txt b/res/cardsfolder/vulshok_battlegear.txt deleted file mode 100644 index 35c748f11ed..00000000000 --- a/res/cardsfolder/vulshok_battlegear.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vulshok Battlegear -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +3/+3. -K:eqPump 3:+3/+3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_battlegear.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/272.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_berserker.txt b/res/cardsfolder/vulshok_berserker.txt deleted file mode 100644 index b8b76181724..00000000000 --- a/res/cardsfolder/vulshok_berserker.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vulshok Berserker -ManaCost:3 R -Types:Creature Human Berserker -Text:no text -PT:3/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card5585.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/159.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_gauntlets.txt b/res/cardsfolder/vulshok_gauntlets.txt deleted file mode 100644 index 9a3a9e3e1ea..00000000000 --- a/res/cardsfolder/vulshok_gauntlets.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Vulshok Gauntlets -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +4/+2 and doesn't untap during its controller's untap step. -K:eqPump 3:+4/+2/CARDNAME doesn't untap during your untap step. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_gauntlets.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/273.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_heartstoker.txt b/res/cardsfolder/vulshok_heartstoker.txt deleted file mode 100644 index 06dd398dcd5..00000000000 --- a/res/cardsfolder/vulshok_heartstoker.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vulshok Heartstoker -ManaCost:2 R -Types:Creature Human Shaman -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_heartstoker.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/107.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_morningstar.txt b/res/cardsfolder/vulshok_morningstar.txt deleted file mode 100644 index 8ad728772e7..00000000000 --- a/res/cardsfolder/vulshok_morningstar.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vulshok Morningstar -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2. -K:eqPump 2:+2/+2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_morningstar.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/157.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_refugee.txt b/res/cardsfolder/vulshok_refugee.txt deleted file mode 100644 index 0f4ceeb6873..00000000000 --- a/res/cardsfolder/vulshok_refugee.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vulshok Refugee -ManaCost:1 R R -Types:Creature Human Warrior -Text:no text -PT:3/2 -K:Protection from red -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_refugee.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/101.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_replica.txt b/res/cardsfolder/vulshok_replica.txt deleted file mode 100644 index 1cf6e120a44..00000000000 --- a/res/cardsfolder/vulshok_replica.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Vulshok Replica -ManaCost:3 -Types:Artifact Creature Berserker -Text:no text -PT:3/1 -A:AB$ DealDamage | Cost$ 1 R Sac<1/CARDNAME> | Tgt$ TgtP | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulshok_replica.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/221.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/vulshok_sorcerer.txt b/res/cardsfolder/vulshok_sorcerer.txt deleted file mode 100644 index 6ba8cd2a0d8..00000000000 --- a/res/cardsfolder/vulshok_sorcerer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Vulshok Sorcerer -ManaCost:1 R R -Types:Creature Human Shaman -Text:no text -PT:1/1 -K:Haste -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ Vulshok Sorcerer deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5dn/en-us/card51177.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/80.jpg -End diff --git a/res/cardsfolder/vulturous_zombie.txt b/res/cardsfolder/vulturous_zombie.txt deleted file mode 100644 index 73eb09912b9..00000000000 --- a/res/cardsfolder/vulturous_zombie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Vulturous Zombie -ManaCost:3 B G -Types:Creature Plant Zombie -Text:no text -PT:3/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Card.YouDontOwn | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a card is put into an opponent's graveyard from anywhere, put a +1/+1 counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/vulturous_zombie.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/238.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wail_of_the_nim.txt b/res/cardsfolder/wail_of_the_nim.txt deleted file mode 100644 index 7c80c129681..00000000000 --- a/res/cardsfolder/wail_of_the_nim.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wail of the Nim -ManaCost:2 B -Types:Instant -Text:no text -A:SP$ RegenerateAll | Cost$ 2 B | ValidCards$ Creature.YouCtrl | PrecostDesc$ Choose one - | SpellDescription$ Regenerate each creature you control; -A:SP$ DamageAll | Cost$ 2 B | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 | SpellDescription$ or CARDNAME deals 1 damage to each creature and each player. -A:SP$ RegenerateAll | Cost$ 2 B B | ValidCards$ Creature.YouCtrl | SubAbility$ SVar=DBDamageAll | PrecostDesc$ Entwine B | SpellDescription$ (Choose both if you pay the entwine cost.) -SVar:DBDamageAll:DB$ DamageAll | ValidCards$ Creature | ValidPlayers$ Each | NumDmg$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wail_of_the_nim.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waiting_in_the_weeds.txt b/res/cardsfolder/waiting_in_the_weeds.txt deleted file mode 100644 index cb9c89a6ffc..00000000000 --- a/res/cardsfolder/waiting_in_the_weeds.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Waiting in the Weeds -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 1 G G | TokenAmount$ ForestYou | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SubAbility$ SVar=DBToken | SpellDescription$ Each player puts a 1/1 green Cat creature token onto the battlefield for each untapped Forest he or she controls. -SVar:DBToken:DB$Token | TokenAmount$ ForestOpp | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ Opponent | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:ForestYou:Count$Valid Forest.untapped+YouCtrl -SVar:ForestOpp:Count$Valid Forest.untapped+YouDontCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/waiting_in_the_weeds.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/266.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/150.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wake_of_vultures.txt b/res/cardsfolder/wake_of_vultures.txt deleted file mode 100644 index ac30f6dd0be..00000000000 --- a/res/cardsfolder/wake_of_vultures.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wake of Vultures -ManaCost:3 B -Types:Creature Bird -Text:no text -PT:3/1 -K:Flying -A:AB$ Regenerate | Cost$ 1 B Sac<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_of_vultures.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wake_thrasher.txt b/res/cardsfolder/wake_thrasher.txt deleted file mode 100644 index 10c0fe44116..00000000000 --- a/res/cardsfolder/wake_thrasher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wake Thrasher -ManaCost:2 U -Types:Creature Merfolk Soldier -Text:no text -PT:1/1 -T:Mode$ Untaps | ValidCard$ Permanent.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a permanent you control becomes untapped, CARDNAME gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +1 | NumDef$ +1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_thrasher.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wakestone_gargoyle.txt b/res/cardsfolder/wakestone_gargoyle.txt deleted file mode 100644 index fbcd9471a22..00000000000 --- a/res/cardsfolder/wakestone_gargoyle.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wakestone Gargoyle -ManaCost:3 W -Types:Creature Gargoyle -Text:no text -PT:3/4 -K:Defender -K:Flying -A:AB$ PumpAll | Cost$ 1 W | ValidCards$ Creature.YouCtrl+withDefender | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | SpellDescription$ Creatures you control with defender can attack this turn as though they didn't have defender. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wakestone_gargoyle.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waking_nightmare.txt b/res/cardsfolder/waking_nightmare.txt deleted file mode 100644 index c038b564ec8..00000000000 --- a/res/cardsfolder/waking_nightmare.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Waking Nightmare -ManaCost:2 B -Types:Sorcery Arcane -Text:no text -A:SP$ Discard | Cost$ 2 B | ValidTgts$ Player | NumCards$ 2 | Mode$ TgtChoose | SpellDescription$ Target player discards two cards. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/waking_nightmare.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walker_of_secret_ways.txt b/res/cardsfolder/walker_of_secret_ways.txt deleted file mode 100644 index 56b22519d45..00000000000 --- a/res/cardsfolder/walker_of_secret_ways.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Walker of Secret Ways -ManaCost:2 U -Types:Creature Human Ninja -Text:no text -PT:1/2 -A:AB$ ChangeZone | Cost$ 1 U Return<1/Creature.attacking+unblocked+YouCtrl> | CostDesc$ Ninjutsu 1 U | ActivatingZone$ Hand | Origin$ Hand | Ninjutsu$ True | Destination$ Battlefield | Defined$ Self | SpellDescription$ (2 U U, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.) -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigReveal | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, look at that player's hand. -SVar:TrigReveal:AB$RevealHand | Cost$ 0 | Defined$ Opponent -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/walker_of_secret_ways.jpg -SetInfo:BOK|Uncommon|http://magiccards.info/scans/en/bok/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walker_of_the_grove.txt b/res/cardsfolder/walker_of_the_grove.txt deleted file mode 100644 index 2f3692ca947..00000000000 --- a/res/cardsfolder/walker_of_the_grove.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Walker of the Grove -ManaCost:6 G G -Types:Creature Elemental -Text:no text -PT:7/7 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME leaves the battlefield, put a 4/4 green Elemental creature token onto the battlefield. -K:Evoke:4 G -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Green | TokenPower$ 4 | TokenToughness$ 4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/walker_of_the_grove.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_archive.txt b/res/cardsfolder/walking_archive.txt deleted file mode 100644 index 3c1b5009997..00000000000 --- a/res/cardsfolder/walking_archive.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Walking Archive -ManaCost:3 -Types:Artifact Creature Golem -Text:no text -PT:1/1 -K:etbCounter:P1P1:1 -K:Defender -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigYouDraw | TriggerDescription$ At the beginning of each player's upkeep, that player draws a card for each +1/+1 counter on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigOppDraw | Secondary$ True | TriggerDescription$ At the beginning of each player's upkeep, that player draws a card for each +1/+1 counter on CARDNAME. -A:AB$ PutCounter | Cost$ 2 W U | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:TrigYouDraw:AB$Draw | Cost$ 0 | NumCards$ X | Defined$ You -SVar:TrigOppDraw:AB$Draw | Cost$ 0 | NumCards$ X | Defined$ Opponent -SVar:X:Count$CardCounters.P1P1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_archive.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_atlas.txt b/res/cardsfolder/walking_atlas.txt deleted file mode 100644 index 912dda52bd9..00000000000 --- a/res/cardsfolder/walking_atlas.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Walking Atlas -ManaCost:2 -Types:Artifact Creature Construct -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Land | ChangeNum$ 1 | OptionalDecider$ You | SpellDescription$ You may put a land card from your hand onto the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/Walking_Atlas.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_dead.txt b/res/cardsfolder/walking_dead.txt deleted file mode 100644 index c0c92c606cf..00000000000 --- a/res/cardsfolder/walking_dead.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Walking Dead -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:1/1 -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_dead.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_desecration.txt b/res/cardsfolder/walking_desecration.txt deleted file mode 100644 index 65b29952dcf..00000000000 --- a/res/cardsfolder/walking_desecration.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Walking Desecration -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:1/1 -A:AB$ ChooseType | Cost$ B T | Defined$ You | Type$ Creature | SubAbility$ SVar=DBPumpAll | SpellDescription$ Creatures of the creature type of your choice attack this turn if able. -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.ChosenType | IsCurse$ True | KW$ HIDDEN CARDNAME attacks each turn if able. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_desecration.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_dream.txt b/res/cardsfolder/walking_dream.txt deleted file mode 100644 index 327e3495baf..00000000000 --- a/res/cardsfolder/walking_dream.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Walking Dream -ManaCost:3 U -Types:Creature Illusion -Text:no text -PT:3/3 -K:Unblockable -K:stPumpSelf:Creature:0/0/CARDNAME doesn't untap during your untap step.:OppCreatureInPlayGE/2:CARDNAME doesn't untap during your untap step if an opponent controls two or more creatures. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_dream.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/walking_wall.txt b/res/cardsfolder/walking_wall.txt deleted file mode 100644 index 5e1db65d9be..00000000000 --- a/res/cardsfolder/walking_wall.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Walking Wall -ManaCost:4 -Types:Artifact Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Pump | Cost$ 3 | NumAtt$ +3 | NumDef$ -1 | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | ActivationLimit$ 1 | SpellDescription$ CARDNAME get +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. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/walking_wall.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/321.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_air.txt b/res/cardsfolder/wall_of_air.txt deleted file mode 100644 index bc5cd5f74c9..00000000000 --- a/res/cardsfolder/wall_of_air.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Wall of Air -ManaCost:1 U U -Types:Creature Wall -Text:no text -PT:1/5 -K:Flying -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card135274.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/113.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/90.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/90.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/111.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/135.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/113.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/124.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/105.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/90.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_blood.txt b/res/cardsfolder/wall_of_blood.txt deleted file mode 100644 index aa6b6a76dad..00000000000 --- a/res/cardsfolder/wall_of_blood.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Blood -ManaCost:2 B -Types:Creature Wall -Text:no text -PT:0/2 -K:Defender -A:AB$ Pump | Cost$ PayLife<1> | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_blood.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/82.jpg -End diff --git a/res/cardsfolder/wall_of_blossoms.txt b/res/cardsfolder/wall_of_blossoms.txt deleted file mode 100644 index be291fedc7c..00000000000 --- a/res/cardsfolder/wall_of_blossoms.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Blossoms -ManaCost:1 G -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/st/en-us/card5265.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_bone.txt b/res/cardsfolder/wall_of_bone.txt deleted file mode 100644 index 0995c0e4d0b..00000000000 --- a/res/cardsfolder/wall_of_bone.txt +++ /dev/null @@ -1,18 +0,0 @@ -Name:Wall of Bone -ManaCost:2 B -Types:Creature Skeleton Wall -Text:no text -PT:1/4 -K:Defender -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_bone.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/41.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/41.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/169.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/65.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/52.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/119.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/42.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_brambles.txt b/res/cardsfolder/wall_of_brambles.txt deleted file mode 100644 index 37d7eacc604..00000000000 --- a/res/cardsfolder/wall_of_brambles.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Wall of Brambles -ManaCost:2 G -Types:Creature Plant Wall -Text:no text -PT:2/3 -K:Defender -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_brambles.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/132.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/132.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/200.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/166.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/131.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_denial.txt b/res/cardsfolder/wall_of_denial.txt deleted file mode 100644 index 4918341f28c..00000000000 --- a/res/cardsfolder/wall_of_denial.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Denial -ManaCost:1 W U -Types:Creature Wall -Text:no text -PT:0/8 -K:Defender -K:Flying -K:Shroud -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_denial.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/16.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_diffusion.txt b/res/cardsfolder/wall_of_diffusion.txt deleted file mode 100644 index e740c8f3e83..00000000000 --- a/res/cardsfolder/wall_of_diffusion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Diffusion -ManaCost:1 R -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -K:CARDNAME can block creatures with shadow as though they didn't have shadow. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_diffusion.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/211.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_distortion.txt b/res/cardsfolder/wall_of_distortion.txt deleted file mode 100644 index cf62fbc0e8a..00000000000 --- a/res/cardsfolder/wall_of_distortion.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Distortion -ManaCost:2 B B -Types:Creature Wall -Text:no text -PT:1/3 -K:Defender -A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | SorcerySpeed$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only any time you could cast a sorcery. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_distortion.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_earth.txt b/res/cardsfolder/wall_of_earth.txt deleted file mode 100644 index 0cd20eb6b51..00000000000 --- a/res/cardsfolder/wall_of_earth.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wall of Earth -ManaCost:1 R -Types:Creature Wall -Text:no text -PT:0/6 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_earth.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_essence.txt b/res/cardsfolder/wall_of_essence.txt deleted file mode 100644 index b813807350b..00000000000 --- a/res/cardsfolder/wall_of_essence.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Essence -ManaCost:1 W -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ DamageDone | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigGain | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME is dealt combat damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_essence.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_faith.txt b/res/cardsfolder/wall_of_faith.txt deleted file mode 100644 index 8a376a7b35e..00000000000 --- a/res/cardsfolder/wall_of_faith.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Faith -ManaCost:3 W -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_faith.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/40.jpg -End diff --git a/res/cardsfolder/wall_of_fire.txt b/res/cardsfolder/wall_of_fire.txt deleted file mode 100644 index dc47e674c0d..00000000000 --- a/res/cardsfolder/wall_of_fire.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Wall of Fire -ManaCost:1 R R -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_fire.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/182.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/183.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/227.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/273.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/248.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/247.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/162.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/216.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/182.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/182.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_frost.txt b/res/cardsfolder/wall_of_frost.txt deleted file mode 100644 index 9345d27ae5f..00000000000 --- a/res/cardsfolder/wall_of_frost.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Frost -ManaCost:1 U U -Types:Creature Wall -Text:no text -PT:0/7 -K:Defender -T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_frost.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/79.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_granite.txt b/res/cardsfolder/wall_of_granite.txt deleted file mode 100644 index 7b713207d38..00000000000 --- a/res/cardsfolder/wall_of_granite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wall of Granite -ManaCost:2 R -Types:Creature Wall -Text:no text -PT:0/7 -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_granite.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_heat.txt b/res/cardsfolder/wall_of_heat.txt deleted file mode 100644 index 630d8754445..00000000000 --- a/res/cardsfolder/wall_of_heat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wall of Heat -ManaCost:2 R -Types:Creature Wall -Text:no text -PT:2/6 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_heat.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_hope.txt b/res/cardsfolder/wall_of_hope.txt deleted file mode 100644 index 6c1ab9ffafe..00000000000 --- a/res/cardsfolder/wall_of_hope.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Hope -ManaCost:W -Types:Creature Wall -Text:no text -PT:0/3 -K:Defender -T:Mode$ DamageDone | DamageSource$ Any | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever CARDNAME is dealt damage, you gain that much life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_hope.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/24.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_ice.txt b/res/cardsfolder/wall_of_ice.txt deleted file mode 100644 index 677be1f2718..00000000000 --- a/res/cardsfolder/wall_of_ice.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wall of Ice -ManaCost:2 G -Types:Creature Wall -Text:no text -PT:0/7 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2250.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/133.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/133.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/132.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/167.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_junk.txt b/res/cardsfolder/wall_of_junk.txt deleted file mode 100644 index ffec09fac22..00000000000 --- a/res/cardsfolder/wall_of_junk.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Junk -ManaCost:2 -Types:Artifact Creature Wall -Text:no text -PT:0/7 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Opponent | Execute$ TrigBounce | TriggerDescription$ Return CARDNAME to it's owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_junk.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_kelp.txt b/res/cardsfolder/wall_of_kelp.txt deleted file mode 100644 index 75748054a13..00000000000 --- a/res/cardsfolder/wall_of_kelp.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Kelp -ManaCost:U U -Types:Creature Wall -Text:no text -PT:0/3 -K:Defender -A:AB$ Token | Cost$ U U T | TokenAmount$ 1 | TokenName$ Plant Wall | TokenTypes$ Creature,Plant,Wall | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 0 | TokenToughness$ 1 | TokenKeywords$ Defender | SpellDescription$ Put a 0/1 blue Plant Wall creature token with defender named Kelp onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/hm/en-us/card2959.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_lava.txt b/res/cardsfolder/wall_of_lava.txt deleted file mode 100644 index b4429b14ff8..00000000000 --- a/res/cardsfolder/wall_of_lava.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Lava -ManaCost:1 R R -Types:Creature Wall -Text:no text -PT:1/3 -K:Defender -A:AB$ Pump | Cost$ R | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_lava.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/223.jpg -End diff --git a/res/cardsfolder/wall_of_light.txt b/res/cardsfolder/wall_of_light.txt deleted file mode 100644 index bc8fe2c9e29..00000000000 --- a/res/cardsfolder/wall_of_light.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Light -ManaCost:2 W -Types:Creature Wall -Text:no text -PT:1/5 -K:Defender -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_light.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_mulch.txt b/res/cardsfolder/wall_of_mulch.txt deleted file mode 100644 index b4ebe5ba956..00000000000 --- a/res/cardsfolder/wall_of_mulch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Mulch -ManaCost:1 G -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -A:AB$ Draw | Cost$ G Sac<1/Wall> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_mulch.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/298.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_omens.txt b/res/cardsfolder/wall_of_omens.txt deleted file mode 100644 index f754b6a2cdd..00000000000 --- a/res/cardsfolder/wall_of_omens.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Omens -ManaCost:1 W -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_omens.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_opposition.txt b/res/cardsfolder/wall_of_opposition.txt deleted file mode 100644 index db708940ea0..00000000000 --- a/res/cardsfolder/wall_of_opposition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Opposition -ManaCost:3 R R -Types:Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Pump | Cost$ 1 | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_opposition.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/168.jpg -End diff --git a/res/cardsfolder/wall_of_pine_needles.txt b/res/cardsfolder/wall_of_pine_needles.txt deleted file mode 100644 index 30ac27290dd..00000000000 --- a/res/cardsfolder/wall_of_pine_needles.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Pine Needles -ManaCost:3 G -Types:Creature Plant Wall -Text:no text -PT:3/3 -K:Defender -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_pine_needles.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_putrid_flesh.txt b/res/cardsfolder/wall_of_putrid_flesh.txt deleted file mode 100644 index bbe70197018..00000000000 --- a/res/cardsfolder/wall_of_putrid_flesh.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Putrid Flesh -ManaCost:2 B -Types:Creature Wall -Text:Prevent all damage that would be dealt to Wall of Putrid Flesh by enchanted creatures. -PT:2/4 -K:Defender -K:Protection from white -K:PreventAllDamageBy Creature.enchanted -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_putrid_flesh.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/41.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_razors.txt b/res/cardsfolder/wall_of_razors.txt deleted file mode 100644 index 38d7c41e978..00000000000 --- a/res/cardsfolder/wall_of_razors.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Razors -ManaCost:1 R -Types:Creature Wall -Text:no text -PT:4/1 -K:Defender -K:First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_razors.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_resistance.txt b/res/cardsfolder/wall_of_resistance.txt deleted file mode 100644 index 676d1131ec5..00000000000 --- a/res/cardsfolder/wall_of_resistance.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wall of Resistance -ManaCost:1 W -Types:Creature Wall -Text:no text -PT:0/3 -K:Flying -K:Defender -T:Mode$ DamageDone | ValidTarget$ Card.Self | DelayedTrigger$ DelTrig | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each end step, if CARDNAME was dealt damage this turn, put a +0/+1 counter on it. -SVar:DelTrig:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ Each | Execute$ TrigPutCounter | Secondary$ True | IsPresent$ Card.Self | TriggerDescription$ At the beginning of each end step, if Wall of Resistance was dealt damage this turn, put a +0/+1 counter on it. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P0P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_resistance.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/250.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_reverence.txt b/res/cardsfolder/wall_of_reverence.txt deleted file mode 100644 index 0b3887c9a14..00000000000 --- a/res/cardsfolder/wall_of_reverence.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Reverence -ManaCost:3 W -Types:Creature Spirit Wall -Text:At the beginning of your end step, you may gain life equal to the power of target creature you control. -PT:1/6 -K:Defender -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_reverence.jpg -SetInfo:CFX|Rare|http://magiccards.info/scans/en/cfx/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_roots.txt b/res/cardsfolder/wall_of_roots.txt deleted file mode 100644 index f40caef5aa5..00000000000 --- a/res/cardsfolder/wall_of_roots.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Roots -ManaCost:1 G -Types:Creature Plant Wall -Text:no text -PT:0/5 -K:Defender -A:AB$ Mana | Cost$ AddCounter<1/M0M1> | Produced$ G | ActivationLimit$ 1 | SpellDescription$ Add G to your mana pool. Activate this ability only once each turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_roots.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/151.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_souls.txt b/res/cardsfolder/wall_of_souls.txt deleted file mode 100644 index ca117f50b9f..00000000000 --- a/res/cardsfolder/wall_of_souls.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Souls -ManaCost:1 B -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ DamageDone | ValidTarget$ Card.Self | Execute$ TrigDamage | CombatDamage$ True | TriggerDescription$ Whenever CARDNAME is dealt combat damage, it deals that much damage to target opponent. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumDmg$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_souls.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_spears.txt b/res/cardsfolder/wall_of_spears.txt deleted file mode 100644 index 012263f598d..00000000000 --- a/res/cardsfolder/wall_of_spears.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wall of Spears -ManaCost:3 -Types:Artifact Creature Wall -Text:no text -PT:2/3 -K:Defender -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_spears.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/320.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/407.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/42.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/374.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/323.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_stone.txt b/res/cardsfolder/wall_of_stone.txt deleted file mode 100644 index fca55951c62..00000000000 --- a/res/cardsfolder/wall_of_stone.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Wall of Stone -ManaCost:1 R R -Types:Creature Wall -Text:no text -PT:0/8 -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_stone.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/232.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/183.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/184.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/274.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/249.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/183.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_swords.txt b/res/cardsfolder/wall_of_swords.txt deleted file mode 100644 index 5a4865bfe62..00000000000 --- a/res/cardsfolder/wall_of_swords.txt +++ /dev/null @@ -1,21 +0,0 @@ -Name:Wall of Swords -ManaCost:3 W -Types:Creature Wall -Text:no text -PT:3/5 -K:Flying -K:Defender -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card132120.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/56.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/226.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/228.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/55.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/305.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/199.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/57.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/51.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/227.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/343.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_tanglecord.txt b/res/cardsfolder/wall_of_tanglecord.txt deleted file mode 100644 index 638338135d6..00000000000 --- a/res/cardsfolder/wall_of_tanglecord.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Tanglecord -ManaCost:2 -Types:Artifact Creature Wall -Text:no text -PT:0/6 -K:Defender -A:AB$ Pump | Cost$ G | KW$ Reach | SpellDescription$ CARDNAME gains reach until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_tanglecord.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/222.jpg -End diff --git a/res/cardsfolder/wall_of_tears.txt b/res/cardsfolder/wall_of_tears.txt deleted file mode 100644 index 53f8f53afda..00000000000 --- a/res/cardsfolder/wall_of_tears.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Tears -ManaCost:1 U -Types:Creature Wall -Text:no text -PT:0/4 -K:Defender -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature | DelayedTrigger$ DelayedTrig | TriggerDescription$ Whenever CARDNAME blocks a creature, return that creature to its owner's hand at end of combat. -SVar:DelayedTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return blocked creature to its owner's hand at end of combat. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ TriggeredAttacker -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_tears.jpg -SetInfo:STH|Uncommon|http://magiccards.info/scans/en/sh/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_tombstones.txt b/res/cardsfolder/wall_of_tombstones.txt deleted file mode 100644 index f9107bf0bcb..00000000000 --- a/res/cardsfolder/wall_of_tombstones.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wall of Tombstones -ManaCost:1 B -Types:Creature Wall -Text:no text -PT:0/1 -K:Defender -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTough | TriggerDescription$ At the beginning of your upkeep, CARDNAME's toughness becomes 1 plus the number of creature cards in your graveyard. -SVar:TrigTough:AB$Animate | Cost$ 0 | Toughness$ X | Permanent$ True -SVar:X:Count$TypeInYourYard.Creature/Plus.1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_tombstones.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_vines.txt b/res/cardsfolder/wall_of_vines.txt deleted file mode 100644 index f36fa4f0017..00000000000 --- a/res/cardsfolder/wall_of_vines.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wall of Vines -ManaCost:G -Types:Creature Plant Wall -Text:no text -PT:0/3 -K:Defender -K:Reach -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_vines.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_water.txt b/res/cardsfolder/wall_of_water.txt deleted file mode 100644 index 9e3fa6cafec..00000000000 --- a/res/cardsfolder/wall_of_water.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wall of Water -ManaCost:1 U U -Types:Creature Wall -Text:no text -PT:0/5 -K:Defender -A:AB$ Pump | Cost$ U | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_water.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/91.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/91.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/91.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/114.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_wonder.txt b/res/cardsfolder/wall_of_wonder.txt deleted file mode 100644 index 99446bf7808..00000000000 --- a/res/cardsfolder/wall_of_wonder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wall of Wonder -ManaCost:2 U U -Types:Creature Wall -Text:no text -PT:1/5 -K:Defender -A:AB$ Pump | Cost$ 2 U U | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | NumAtt$ +4 | NumDef$ -4 | SpellDescription$ CARDNAME gets +4/-4 until end of turn and can attack this turn as though it didn't have defender. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_wonder.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/112.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wall_of_wood.txt b/res/cardsfolder/wall_of_wood.txt deleted file mode 100644 index 518fc08e814..00000000000 --- a/res/cardsfolder/wall_of_wood.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wall of Wood -ManaCost:G -Types:Creature Wall -Text:no text -PT:0/3 -K:Defender -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129773.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/134.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/134.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/168.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/309.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/133.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wallop.txt b/res/cardsfolder/wallop.txt deleted file mode 100644 index faf1414c1c3..00000000000 --- a/res/cardsfolder/wallop.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wallop -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 G | ValidTgts$ Creature.Blue+withFlying,Creature.Black+withFlying | TgtPrompt$ Select target blue or black creature with flying | SpellDescription$ Destroy target blue or black creature with flying. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wallop.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/223.jpg -End diff --git a/res/cardsfolder/wand_of_the_elements.txt b/res/cardsfolder/wand_of_the_elements.txt deleted file mode 100644 index cd6d704e82d..00000000000 --- a/res/cardsfolder/wand_of_the_elements.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wand of the Elements -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ Token | Cost$ T Sac<1/Island> | TokenImage$ U 2 2 Elemental Flying | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Blue | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying| SpellDescription$ Put a 2/2 blue Elemental creature token with flying onto the battlefield. -A:AB$ Token | Cost$ T Sac<1/Mountain> | TokenImage$ R 3 3 Elemental | TokenAmount$ 1 | TokenName$ Elemental | TokenTypes$ Creature,Elemental | TokenOwner$ You | TokenColors$ Red | TokenPower$ 3 | TokenToughness$ 3 | SpellDescription$ Put a 3/3 red Elemental creature token onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wand_of_the_elements.jpg -SetInfo:DST|Rare|http://magiccards.info/scans/en/ds/158.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wanderbrine_rootcutters.txt b/res/cardsfolder/wanderbrine_rootcutters.txt deleted file mode 100644 index a96bc10ab2a..00000000000 --- a/res/cardsfolder/wanderbrine_rootcutters.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wanderbrine Rootcutters -ManaCost:2 UB UB -Types:Creature Merfolk Rogue -Text:CARDNAME can't be blocked by green creatures. -PT:3/3 -K:CantBeBlockedBy Creature.Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderbrine_rootcutters.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/178.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wanderers_twig.txt b/res/cardsfolder/wanderers_twig.txt deleted file mode 100644 index 1400bfa9a8e..00000000000 --- a/res/cardsfolder/wanderers_twig.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wanderer's Twig -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 1 Sac<1/CARDNAME> | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, reveal that card, and put it into your hand. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderers_twig.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/265.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wanderguard_sentry.txt b/res/cardsfolder/wanderguard_sentry.txt deleted file mode 100644 index f7ee11b5bb5..00000000000 --- a/res/cardsfolder/wanderguard_sentry.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wanderguard Sentry -ManaCost:4 U -Types:Creature Drone -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderguard_sentry.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/56.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wandering_goblins.txt b/res/cardsfolder/wandering_goblins.txt deleted file mode 100644 index 41a4f618c34..00000000000 --- a/res/cardsfolder/wandering_goblins.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wandering Goblins -ManaCost:2 R -Types:Creature Goblin Warrior -Text:no text -PT:0/3 -A:AB$ Pump | Cost$ 3 | NumAtt$ +X | PrecostDesc$ Domain - | SpellDescription$ Wandering Goblins gets +1/+0 until end of turn for each basic land type among lands you control. -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_goblins.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/76.jpg -End diff --git a/res/cardsfolder/wandering_graybeard.txt b/res/cardsfolder/wandering_graybeard.txt deleted file mode 100644 index dc5831ef16c..00000000000 --- a/res/cardsfolder/wandering_graybeard.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wandering Graybeard -ManaCost:3 W W -Types:Creature Giant Wizard -Text: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. -PT:4/4 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_graybeard.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/27.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wandering_ones.txt b/res/cardsfolder/wandering_ones.txt deleted file mode 100644 index 2c0aeb7b5a9..00000000000 --- a/res/cardsfolder/wandering_ones.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wandering Ones -ManaCost:U -Types:Creature Spirit -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/chk/en-us/card50345.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wandering_stream.txt b/res/cardsfolder/wandering_stream.txt deleted file mode 100644 index f7999528117..00000000000 --- a/res/cardsfolder/wandering_stream.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wandering Stream -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ GainLife | Cost$ 2 G | LifeAmount$ X | SpellDescription$ Domain - You gain 2 life for each basic land type among lands you control. -SVar:X:Count$Domain/Times.2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/in/en-us/card23119.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/224.jpg -End diff --git a/res/cardsfolder/wanderlust.txt b/res/cardsfolder/wanderlust.txt deleted file mode 100644 index 6f35e1163a7..00000000000 --- a/res/cardsfolder/wanderlust.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Wanderlust -ManaCost:2 G -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderlust.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/135.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/135.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/201.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/169.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/134.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wanderwine_hub.txt b/res/cardsfolder/wanderwine_hub.txt deleted file mode 100644 index 24502126809..00000000000 --- a/res/cardsfolder/wanderwine_hub.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wanderwine Hub -ManaCost:no cost -Types:Land -Text:As CARDNAME enters the battlefield, you may reveal a Merfolk card from your hand. If you don't, CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add U to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderwine_hub.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wanderwine_prophets.txt b/res/cardsfolder/wanderwine_prophets.txt deleted file mode 100644 index 4ad37970b48..00000000000 --- a/res/cardsfolder/wanderwine_prophets.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wanderwine Prophets -ManaCost:4 U U -Types:Creature Merfolk Wizard -Text:no text -PT:4/4 -K:Champion:Merfolk -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigAddTurn | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may sacrifice a Merfolk. If you do, take an extra turn after this one. -SVar:TrigAddTurn:AB$AddTurn | Cost$ Sac<1/Creature.Merfolk> | NumTurns$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderwine_prophets.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waning_wurm.txt b/res/cardsfolder/waning_wurm.txt deleted file mode 100644 index baac8afeb9b..00000000000 --- a/res/cardsfolder/waning_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Waning Wurm -ManaCost:3 B -Types:Creature Zombie Wurm -Text:no text -PT:7/6 -K:Vanishing:2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/waning_wurm.jpg -SetInfo:PLC|Uncommon|http://magiccards.info/scans/en/pc/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/war_chariot.txt b/res/cardsfolder/war_chariot.txt deleted file mode 100644 index d705d89091e..00000000000 --- a/res/cardsfolder/war_chariot.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:War Chariot -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample | SpellDescription$ Target creature gains trample until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_chariot.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/323.jpg -End diff --git a/res/cardsfolder/war_dance.txt b/res/cardsfolder/war_dance.txt deleted file mode 100644 index 1165d8f7829..00000000000 --- a/res/cardsfolder/war_dance.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:War Dance -ManaCost:G -Types:Enchantment -Text:no text -A:AB$ Pump | Cost$ Sac<1/CARDNAME> | NumAtt$ +X | NumDef$ +X | ValidTgts$ Creature | TgtPrompt$ Select target creature. | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of verse counters on CARDNAME. -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -SVar:X:Count$CardCounters.VERSE -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_dance.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/war_mammoth.txt b/res/cardsfolder/war_mammoth.txt deleted file mode 100644 index 9ded8dec748..00000000000 --- a/res/cardsfolder/war_mammoth.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:War Mammoth -ManaCost:3 G -Types:Creature Elephant -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/5e/en-us/card4023.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/136.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/136.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/202.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/170.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/135.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/136.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/war_priest_of_thune.txt b/res/cardsfolder/war_priest_of_thune.txt deleted file mode 100644 index d565b6a3ced..00000000000 --- a/res/cardsfolder/war_priest_of_thune.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:War Priest of Thune -ManaCost:1 W -Types:Creature Human Cleric -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may destroy target enchantment. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_priest_of_thune.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/war_report.txt b/res/cardsfolder/war_report.txt deleted file mode 100644 index c63ccb482a7..00000000000 --- a/res/cardsfolder/war_report.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:War Report -ManaCost:3 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 3 W | LifeAmount$ X | SpellDescription$ You gain life equal to the number of creatures on the battlefield plus the number of artifacts on the battlefield. -SVar:X:Count$Valid Creature/Plus.Y -SVar:Y:Count$Valid Artifact -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_report.jpg -SetInfo:NPH|Common|http://magiccards.info/scans/en/nph/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/war_spike_changeling.txt b/res/cardsfolder/war_spike_changeling.txt deleted file mode 100644 index fca756c74b9..00000000000 --- a/res/cardsfolder/war_spike_changeling.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:War-Spike Changeling -ManaCost:3 R -Types:Creature Shapeshifter -Text:no text -PT:3/3 -K:Changeling -A:AB$ Pump | Cost$ R | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_spike_changeling.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/112.jpg -End diff --git a/res/cardsfolder/war_torch_goblin.txt b/res/cardsfolder/war_torch_goblin.txt deleted file mode 100644 index bd3bba19162..00000000000 --- a/res/cardsfolder/war_torch_goblin.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:War-Torch Goblin -ManaCost:R -Types:Creature Goblin Warrior -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ R Sac<1/CARDNAME> | ValidTgts$ Creature.blocking | TgtPrompt$ Select target blocking creature | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target blocking creature. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/war_torch_goblin.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warbreak_trumpeter.txt b/res/cardsfolder/warbreak_trumpeter.txt deleted file mode 100644 index 28a5be23fbf..00000000000 --- a/res/cardsfolder/warbreak_trumpeter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Warbreak Trumpeter -ManaCost:R -Types:Creature Goblin -Text:no text -PT:1/1 -K:Morph:X X R -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is turned face up, put X 1/1 red Goblin creature tokens onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Goblin | TokenTypes$ Creature,Goblin | TokenOwner$ You | TokenColors$ Red | TokenPower$ 1 | TokenToughness$ 1 -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warbreak_trumpeter.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wargate.txt b/res/cardsfolder/wargate.txt deleted file mode 100644 index 18ba286946e..00000000000 --- a/res/cardsfolder/wargate.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wargate -ManaCost:X G W U -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ X G W U | Origin$ Library | Destination$ Battlefield | ChangeType$ Permanent.cmcLEX | ChangeNum$ 1 | SpellDescription$ Search your library for a permanent card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wargate.jpg -SetInfo:ARB|Rare|http://magiccards.info/scans/en/arb/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warlords_axe.txt b/res/cardsfolder/warlords_axe.txt deleted file mode 100644 index cba995ad658..00000000000 --- a/res/cardsfolder/warlords_axe.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Warlord's Axe -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature gets +3/+1. -K:eqPump 4:+3/+1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warlords_axe.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/220.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warmonger.txt b/res/cardsfolder/warmonger.txt deleted file mode 100755 index 4194cc2efde..00000000000 --- a/res/cardsfolder/warmonger.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Warmonger -ManaCost:3 R -Types:Creature Minotaur Monger -Text:no text -PT:3/3 -A:AB$ DamageAll | Cost$ 2 | NumDmg$ 1 | ValidCards$ Creature.withoutFlying | ValidPlayers$ Each | AnyPlayer$ True | ValidDescription$ each creature without flying and and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature without flying and each player. Any player may activate this ability. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warmonger.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warmongers_chariot.txt b/res/cardsfolder/warmongers_chariot.txt deleted file mode 100644 index 6648bc1afdb..00000000000 --- a/res/cardsfolder/warmongers_chariot.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Warmonger's Chariot -ManaCost:2 -Types:Artifact Equipment -Text:Equipped creature gets +2/+2. -K:eqPump 3:+2/+2 -K:stPumpEquipped:Creature.withDefender:0/0/HIDDEN CARDNAME can attack as though it didn't have defender.:no Condition:As long as equipped creature has defender, it can attack as though it didn't have defender. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warmongers_chariot.jpg -SetInfo:ROE|Uncommon|http://magiccards.info/scans/en/roe/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warmth.txt b/res/cardsfolder/warmth.txt deleted file mode 100644 index 708259efe0f..00000000000 --- a/res/cardsfolder/warmth.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Warmth -ManaCost:1 W -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever an opponent casts a red spell, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warmth.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/263.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warning.txt b/res/cardsfolder/warning.txt deleted file mode 100644 index f95600a7a13..00000000000 --- a/res/cardsfolder/warning.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Warning -ManaCost:W -Types:Instant -Text:no text -A:SP$ Pump | Cost$ W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | KW$ HIDDEN Prevent all combat damage that would be dealt by CARDNAME. | SpellDescription$ Prevent all combat damage that would be dealt by target attacking creature this turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/warning.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/279.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warp_artifact.txt b/res/cardsfolder/warp_artifact.txt deleted file mode 100644 index e0d894e6e29..00000000000 --- a/res/cardsfolder/warp_artifact.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Warp Artifact -ManaCost:B B -Types:Enchantment Aura -Text:no text -K:Enchant Artifact Curse -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted artifact's controller, CARDNAME deals 1 damage to that player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ EnchantedController | NumDmg$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/warp_artifact.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/42.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/42.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/66.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/53.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/43.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/42.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warpath.txt b/res/cardsfolder/warpath.txt deleted file mode 100755 index aad0f6eccd7..00000000000 --- a/res/cardsfolder/warpath.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Warpath -ManaCost:3 R -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ 3 R | NumDmg$ 3 | ValidCards$ Creature.blocked,Creature.blocking | ValidDescription$ each blocked and blocking creature. | SpellDescription$ CARDNAME deals 3 damage to each blocked and blocking creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/warpath.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/226.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warpath_ghoul.txt b/res/cardsfolder/warpath_ghoul.txt deleted file mode 100644 index 8814b9ff187..00000000000 --- a/res/cardsfolder/warpath_ghoul.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Warpath Ghoul -ManaCost:2 B -Types:Creature Zombie -Text:no text -PT:3/2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/warpath_ghoul.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warped_devotion.txt b/res/cardsfolder/warped_devotion.txt deleted file mode 100644 index 91396d991a2..00000000000 --- a/res/cardsfolder/warped_devotion.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Warped Devotion -ManaCost:2 B -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Permanent | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ Whenever a permanent is returned to a player's hand, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | NumCards$ 1 | Mode$ TgtChoose | Defined$ TriggeredCardOwner -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/warped_devotion.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/172.jpg -SetInfo:PLS|Uncommon|http://magiccards.info/scans/en/ps/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warped_researcher.txt b/res/cardsfolder/warped_researcher.txt deleted file mode 100644 index fd3183e64fc..00000000000 --- a/res/cardsfolder/warped_researcher.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Warped Researcher -ManaCost:4 U -Types:Creature Wizard Mutant -Text:no text -PT:3/4 -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, CARDNAME gains flying and shroud until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Flying & Shroud -SVar:Picture:http://www.wizards.com/global/images/magic/general/warped_researcher.jpg -SVar:Rarity:Uncommon -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/56.jpg -End diff --git a/res/cardsfolder/warren_instigator.txt b/res/cardsfolder/warren_instigator.txt deleted file mode 100644 index 84d16870900..00000000000 --- a/res/cardsfolder/warren_instigator.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Warren Instigator -ManaCost:R R -Types:Creature Goblin -Text:no text -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigChange | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may put a Goblin creature card from your hand onto the battlefield. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.Goblin | ChangeNum$ 1 -PT:1/1 -K:Double Strike -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/warren_instigator.jpg -SetInfo:ZEN|Mythic|http://magiccards.info/scans/en/zen/154.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warren_scourge_elf.txt b/res/cardsfolder/warren_scourge_elf.txt deleted file mode 100644 index dfe3a71d6bc..00000000000 --- a/res/cardsfolder/warren_scourge_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Warren-Scourge Elf -ManaCost:1 G -Types:Creature Elf Warrior -Text:no text -PT:1/1 -K:Protection from Goblins -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/warren_scourge_elf.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/241.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warrior_angel.txt b/res/cardsfolder/warrior_angel.txt deleted file mode 100644 index 74a5587721b..00000000000 --- a/res/cardsfolder/warrior_angel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Warrior Angel -ManaCost:4 W W -Types:Creature Angel Warrior -Text:no text -PT:3/4 -K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/warrior_angel.jpg -SetInfo:STH|Rare|http://magiccards.info/scans/en/sh/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warriors_charge.txt b/res/cardsfolder/warriors_charge.txt deleted file mode 100644 index a38df87ed43..00000000000 --- a/res/cardsfolder/warriors_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Warrior's Charge -ManaCost:2 W -Types:Sorcery -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4407.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/200.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/warriors_honor.txt b/res/cardsfolder/warriors_honor.txt deleted file mode 100644 index 1f36665b7b3..00000000000 --- a/res/cardsfolder/warriors_honor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Warrior's Honor -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 W | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control get +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/warriors_honor.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/124.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/53.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/53.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/warthog.txt b/res/cardsfolder/warthog.txt deleted file mode 100644 index f27e5238cbe..00000000000 --- a/res/cardsfolder/warthog.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Warthog -ManaCost:1 G G -Types:Creature Boar -Text:no text -PT:3/2 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/6e/en-us/card16458.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/74.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/267.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wasp_lancer.txt b/res/cardsfolder/wasp_lancer.txt deleted file mode 100644 index be771fe40d0..00000000000 --- a/res/cardsfolder/wasp_lancer.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wasp Lancer -ManaCost:UB UB UB -Types:Creature Faerie Soldier -Text:no text -PT:3/2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wasp_lancer.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/179.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waste_away.txt b/res/cardsfolder/waste_away.txt deleted file mode 100644 index 55145106a03..00000000000 --- a/res/cardsfolder/waste_away.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Waste Away -ManaCost:4 B -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 4 B Discard<1/Card> | NumAtt$ -5 | NumDef$ -5 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Target creature gets -5/-5 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/waste_away.jpg -SetInfo:TOR|Common|http://magiccards.info/scans/en/tr/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wasteland.txt b/res/cardsfolder/wasteland.txt deleted file mode 100644 index 63d17c5dfa8..00000000000 --- a/res/cardsfolder/wasteland.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wasteland -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonbasic land. | Cost$ T Sac<1/CARDNAME> | SpellDescription$ Destroy target nonbasic land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wasteland.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/340.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/watcher_sliver.txt b/res/cardsfolder/watcher_sliver.txt deleted file mode 100644 index 63fcee05856..00000000000 --- a/res/cardsfolder/watcher_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Watcher Sliver -ManaCost:3 W -Types:Creature Sliver -Text:no text -PT:2/2 -K:stPumpAll:Creature.Sliver:0/2:no Condition:All Sliver creatures get +0/+2. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/watcher_sliver.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/45.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/watchwing_scarecrow.txt b/res/cardsfolder/watchwing_scarecrow.txt deleted file mode 100644 index c37fadc9c13..00000000000 --- a/res/cardsfolder/watchwing_scarecrow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Watchwing Scarecrow -ManaCost:4 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/4 -K:stPumpSelf:Creature:0/0/Flying:isPresent Creature.Blue+YouCtrl:Watchwing Scarecrow has flying as long as you control a blue creature. -K:stPumpSelf:Creature:0/0/Vigilance:isPresent Creature.White+YouCtrl:Watchwing Scarecrow has vigilance as long as you control a white creature. -SVar:BuffedBy:Creature.White,Creature.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/watchwing_scarecrow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/268.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/watchwolf.txt b/res/cardsfolder/watchwolf.txt deleted file mode 100644 index face16c179a..00000000000 --- a/res/cardsfolder/watchwolf.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Watchwolf -ManaCost:W G -Types:Creature Wolf -Text:no text -PT:3/3 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83625.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/239.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/water_elemental.txt b/res/cardsfolder/water_elemental.txt deleted file mode 100644 index ba7cb5e9472..00000000000 --- a/res/cardsfolder/water_elemental.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Water Elemental -ManaCost:3 U U -Types:Creature Elemental -Text:no text -PT:5/4 -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21040.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/92.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/92.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/115.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/92.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/60.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/water_servant.txt b/res/cardsfolder/water_servant.txt deleted file mode 100644 index 6f95ee8e8b4..00000000000 --- a/res/cardsfolder/water_servant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Water Servant -ManaCost:2 U U -Types:Creature Elemental -Text:no text -PT:3/4 -A:AB$ Pump | Cost$ U | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. -A:AB$ Pump | Cost$ U | NumAtt$ -1 | NumDef$ +1 | SpellDescription$ CARDNAME gets -1/+1 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/water_servant.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/80.jpg -End diff --git a/res/cardsfolder/water_wurm.txt b/res/cardsfolder/water_wurm.txt deleted file mode 100644 index 2ce15835f77..00000000000 --- a/res/cardsfolder/water_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Water Wurm -ManaCost:U -Types:Creature Wurm -Text:no text -PT:1/1 -K:stPumpSelf:Creature:0/1:isPresent Island.YouDontCtrl:Water Wurm gets +0/+1 as long as an opponent controls an Island. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/water_wurm.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/37.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waterfront_bouncer.txt b/res/cardsfolder/waterfront_bouncer.txt deleted file mode 100644 index 48aee1274eb..00000000000 --- a/res/cardsfolder/waterfront_bouncer.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Waterfront Bouncer -ManaCost:1 U -Types:Creature Merfolk Spellshaper -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ U T Discard<1/Card> | ValidTgts$ Creature | TgtPrompt$ Select target Creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature to its owner's hand. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/waterfront_bouncer.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waterspout_elemental.txt b/res/cardsfolder/waterspout_elemental.txt deleted file mode 100644 index a2dbaa1cd9d..00000000000 --- a/res/cardsfolder/waterspout_elemental.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Waterspout Elemental -ManaCost:3 U U -Types:Creature Elemental -Text:no text -PT:3/4 -K:Flying -K:Kicker:U -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigKicker | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, return all other creatures to their owners' hands and you skip your next turn. -SVar:TrigKicker:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Creature.Other | Origin$ Battlefield | Destination$ Hand | SubAbility$ SVar=DBSkipTurn -SVar:DBSkipTurn:DB$AddTurn | NumTurns$ 1 | Defined$ Opponent -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/waterspout_elemental.jpg -SetInfo:PLS|Rare|http://magiccards.info/scans/en/ps/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waterspout_weavers.txt b/res/cardsfolder/waterspout_weavers.txt deleted file mode 100644 index 07c6962be84..00000000000 --- a/res/cardsfolder/waterspout_weavers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Waterspout Weavers -ManaCost:3 U U -Types:Creature Merfolk Wizard -Text: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. -PT:3/3 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/waterspout_weavers.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waterveil_cavern.txt b/res/cardsfolder/waterveil_cavern.txt deleted file mode 100644 index 7c8584dda3d..00000000000 --- a/res/cardsfolder/waterveil_cavern.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Waterveil Cavern -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add U to your mana pool. CARDNAME doesn't untap during your next untap step. -A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ SVar=DBStayTapped | SpellDescription$ Add B to your mana pool. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/waterveil_cavern.jpg -SetInfo:CHK|Uncommon|http://magiccards.info/scans/en/chk/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/watery_grave.txt b/res/cardsfolder/watery_grave.txt deleted file mode 100644 index 132d27f58be..00000000000 --- a/res/cardsfolder/watery_grave.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Watery Grave -ManaCost:no cost -Types:Land Island Swamp -Text:As CARDNAME enters the battlefield, you may pay 2 life. If you don't, CARDNAME enters the battlefield tapped. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83731.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/286.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wave_elemental.txt b/res/cardsfolder/wave_elemental.txt deleted file mode 100644 index 0ca6942f8a8..00000000000 --- a/res/cardsfolder/wave_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wave Elemental -ManaCost:2 U U -Types:Creature Elemental -Text:no text -PT:2/3 -A:AB$ Tap | Cost$ Sac<1/CARDNAME> | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Choose target creatures without flying | ValidTgts$ Creature.withoutFlying | SpellDescription$ Tap up to three target creatures without flying. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_elemental.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wave_of_indifference.txt b/res/cardsfolder/wave_of_indifference.txt deleted file mode 100644 index fb0c9c69b1f..00000000000 --- a/res/cardsfolder/wave_of_indifference.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wave of Indifference -ManaCost:X R -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ X R | KW$ HIDDEN CARDNAME can't block. | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ X target creatures can't block this turn. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_indifference.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wave_of_terror.txt b/res/cardsfolder/wave_of_terror.txt deleted file mode 100644 index 3a7e1a8da6f..00000000000 --- a/res/cardsfolder/wave_of_terror.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wave of Terror -ManaCost:2 B -Types:Enchantment -Text:no text -K:Cumulative upkeep:1 -T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDestroyAll | TriggerDescription$ At the beginning of your draw step, destroy each creature with converted mana cost equal to the number of age counters on CARDNAME. They can't be regenerated. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Creature.cmcEQX | NoRegen$ True -SVar:X:Count$CardCounters.AGE -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wave_of_terror.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/28.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waveskimmer_aven.txt b/res/cardsfolder/waveskimmer_aven.txt deleted file mode 100644 index 2d6c6c43865..00000000000 --- a/res/cardsfolder/waveskimmer_aven.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Waveskimmer Aven -ManaCost:2 G W U -Types:Creature Bird Soldier -Text:no text -PT:2/4 -K:Flying -K:Exalted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/waveskimmer_aven.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/207.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wayfarers_bauble.txt b/res/cardsfolder/wayfarers_bauble.txt deleted file mode 100644 index ec6f9e8def9..00000000000 --- a/res/cardsfolder/wayfarers_bauble.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wayfarer's Bauble -ManaCost:1 -Types:Artifact -Text:no text -A:AB$ ChangeZone | Cost$ 2 T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card and put that card onto the battlefield tapped. Then shuffle your library. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wayfarers_bauble.jpg -SetInfo:5DN|Common|http://magiccards.info/scans/en/5dn/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wayfaring_giant.txt b/res/cardsfolder/wayfaring_giant.txt deleted file mode 100644 index 9ba23a53c79..00000000000 --- a/res/cardsfolder/wayfaring_giant.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wayfaring Giant -ManaCost:5 W -Types:Creature Giant -Text:Domain - Wayfaring Giant gets +1/+1 for each basic land type among lands you control. -PT:1/3 -K:stPumpSelf:Creature:X/X:no Condition:no text -SVar:X:Count$Domain -SVar:BuffedBy:Plains,Island,Swamp,Mountain,Forest -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wayfaring_giant.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/waylay.txt b/res/cardsfolder/waylay.txt deleted file mode 100644 index 2b4d66564cd..00000000000 --- a/res/cardsfolder/waylay.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Waylay -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ Token | Cost$ 2 W | TokenAmount$ 3 | TokenName$ Knight | TokenTypes$ Creature,Knight | TokenOwner$ You | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ At the beginning of the end step, exile CARDNAME. | SpellDescription$ Put three 2/2 white Knight creature tokens onto the battlefield. Exile them at the beginning of the next cleanup step. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/waylay.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wayward_soul.txt b/res/cardsfolder/wayward_soul.txt deleted file mode 100644 index c5751d7abf4..00000000000 --- a/res/cardsfolder/wayward_soul.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wayward Soul -ManaCost:2 U U -Types:Creature Spirit -Text:no text -PT:3/2 -K:Flying -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination $ Library | LibraryPosition$ 0 | SpellDescription$ Put CARDNAME on top of its owner's library. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ex/en-us/card5273.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weakness.txt b/res/cardsfolder/weakness.txt deleted file mode 100644 index d9c13c37a97..00000000000 --- a/res/cardsfolder/weakness.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Weakness -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:-2/-1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/weakness.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/43.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/43.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/67.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/54.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/121.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/44.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weakstone.txt b/res/cardsfolder/weakstone.txt deleted file mode 100644 index a594917e32c..00000000000 --- a/res/cardsfolder/weakstone.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Weakstone -ManaCost:4 -Types:Artifact -Text:no text -K:stPumpAll:Creature.attacking:-1/0:No Condition:Attacking creatures get -1/-0. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/weakstone.jpg -SetInfo:ATQ|Uncommon|http://magiccards.info/scans/en/aq/43.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weathered_wayfarer.txt b/res/cardsfolder/weathered_wayfarer.txt deleted file mode 100644 index 5bc33023372..00000000000 --- a/res/cardsfolder/weathered_wayfarer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Weathered Wayfarer -ManaCost:W -Types:Creature Human Nomad Cleric -Text:no text -PT:1/1 -A:AB$ ChangeZone | Cost$ W T | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 1 | IsPresent$ Land.YouDontCtrl | PresentCompare$ GTX | SpellDescription$ 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. -SVar:X:Count$Valid Land.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83311.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/59.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weatherseed_elf.txt b/res/cardsfolder/weatherseed_elf.txt deleted file mode 100644 index 4963d56a3c6..00000000000 --- a/res/cardsfolder/weatherseed_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Weatherseed Elf -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Forestwalk | SpellDescription$ Target creature gains forestwalk until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/weatherseed_elf.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/115.jpg -End diff --git a/res/cardsfolder/weatherseed_faeries.txt b/res/cardsfolder/weatherseed_faeries.txt deleted file mode 100644 index cfe0ced145f..00000000000 --- a/res/cardsfolder/weatherseed_faeries.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Weatherseed Faeries -ManaCost:2 U -Types:Creature Faerie -Text:no text -PT:2/1 -K:Flying -K:Protection from red -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/weatherseed_faeries.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weatherseed_treefolk.txt b/res/cardsfolder/weatherseed_treefolk.txt deleted file mode 100644 index fde09a6ae68..00000000000 --- a/res/cardsfolder/weatherseed_treefolk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Weatherseed Treefolk -ManaCost:2 G G G -Types:Creature Treefolk -Text:no text -PT:5/3 -K:Trample -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, return CARDNAME to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/weatherseed_treefolk.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/116.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/web.txt b/res/cardsfolder/web.txt deleted file mode 100644 index 5cb47ab2c4a..00000000000 --- a/res/cardsfolder/web.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Web -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+0/+2/Reach -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/web.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/137.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/137.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/171.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/281.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/136.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wee_dragonauts.txt b/res/cardsfolder/wee_dragonauts.txt deleted file mode 100644 index 5cd3e42db07..00000000000 --- a/res/cardsfolder/wee_dragonauts.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wee Dragonauts -ManaCost:1 U R -Types:Creature Faerie Wizard -Text:no text -PT:1/3 -K:Flying -T:Mode$ SpellCast | ValidCard$ Instant.YouCtrl,Sorcery.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell, CARDNAME gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:BuffedBy:Instant,Sorcery -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wee_dragonauts.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/137.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weed_pruner_poplar.txt b/res/cardsfolder/weed_pruner_poplar.txt deleted file mode 100644 index c938bcdb373..00000000000 --- a/res/cardsfolder/weed_pruner_poplar.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Weed-Pruner Poplar -ManaCost:4 B -Types:Creature Treefolk Assassin -Text:no text -PT:3/3 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, target creature other than CARDNAME gets -1/-1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/weed_pruner_poplar.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_ambush_force.txt b/res/cardsfolder/wei_ambush_force.txt deleted file mode 100644 index 2ce5a8c1795..00000000000 --- a/res/cardsfolder/wei_ambush_force.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wei Ambush Force -ManaCost:1 B -Types:Creature Human Soldier -Text:no text -PT:1/1 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +2/+0 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 2 -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Three_Kingdoms/wei_ambush_force.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_elite_companions.txt b/res/cardsfolder/wei_elite_companions.txt deleted file mode 100644 index dfd232b235e..00000000000 --- a/res/cardsfolder/wei_elite_companions.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wei Elite Companions -ManaCost:4 B -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:Horsemanship -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wei_elite_companions.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/87.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_infantry.txt b/res/cardsfolder/wei_infantry.txt deleted file mode 100644 index 82258fdc8cc..00000000000 --- a/res/cardsfolder/wei_infantry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wei Infantry -ManaCost:1 B -Types:Creature Human Soldier -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10519.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_night_raiders.txt b/res/cardsfolder/wei_night_raiders.txt deleted file mode 100644 index be0ac2e7a13..00000000000 --- a/res/cardsfolder/wei_night_raiders.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wei Night Raiders -ManaCost:2 B B -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Horsemanship -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that player discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wei_night_raiders.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_scout.txt b/res/cardsfolder/wei_scout.txt deleted file mode 100644 index d0682921bd1..00000000000 --- a/res/cardsfolder/wei_scout.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wei Scout -ManaCost:1 B -Types:Creature Human Soldier Scout -Text:no text -PT:1/1 -K:Horsemanship -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wei_scout.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/90.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wei_strike_force.txt b/res/cardsfolder/wei_strike_force.txt deleted file mode 100644 index cf53b41e099..00000000000 --- a/res/cardsfolder/wei_strike_force.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wei Strike Force -ManaCost:2 B -Types:Creature Human Soldier -Text:no text -PT:2/1 -K:Horsemanship -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wei_strike_force.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/91.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/weirding_shaman.txt b/res/cardsfolder/weirding_shaman.txt deleted file mode 100644 index 37427653c2c..00000000000 --- a/res/cardsfolder/weirding_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Weirding Shaman -ManaCost:1 B -Types:Creature Goblin -Text:no text -PT:2/1 -A:AB$ Token | Cost$ 3 B Sac<1/Goblin> | TokenAmount$ 2 | TokenName$ Goblin | TokenTypes$ Creature,Goblin,Rogue | TokenOwner$ You | TokenColors$ Black | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put two 1/1 black Goblin Rogue creature tokens onto the battlefield. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/weirding_shaman.jpg -SetInfo:MOR|Rare|http://magiccards.info/scans/en/mt/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/welding_jar.txt b/res/cardsfolder/welding_jar.txt deleted file mode 100644 index b2690ebca71..00000000000 --- a/res/cardsfolder/welding_jar.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Welding Jar -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ Regenerate | Cost$ Sac<1/CARDNAME> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. | SpellDescription$ Regenerate target artifact. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/welding_jar.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/274.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/welkin_guide.txt b/res/cardsfolder/welkin_guide.txt deleted file mode 100644 index 1e6dbaa810e..00000000000 --- a/res/cardsfolder/welkin_guide.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Welkin Guide -ManaCost:4 W -Types:Creature Bird Cleric -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature gets +2/+2 and gains flying until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Tgt$ TgtC | NumAtt$ 2 | NumDef$ 2 | KW$ Flying -SVar:Picture:http://www.wizards.com/global/images/magic/general/welkin_guide.jpg -SVar:Rarity:Common -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/30.jpg -End diff --git a/res/cardsfolder/welkin_hawk.txt b/res/cardsfolder/welkin_hawk.txt deleted file mode 100644 index 71ef7461d7a..00000000000 --- a/res/cardsfolder/welkin_hawk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Welkin Hawk -ManaCost:1 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may search your library for a card named CARDNAME, reveal that card, put it into your hand, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedWelkin Hawk | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/welkin_hawk.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/welkin_tern.txt b/res/cardsfolder/welkin_tern.txt deleted file mode 100644 index d9ef3253206..00000000000 --- a/res/cardsfolder/welkin_tern.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Welkin Tern -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:2/1 -K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/welkin_tern.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/well_laid_plans.txt b/res/cardsfolder/well_laid_plans.txt deleted file mode 100644 index bcb58b314a4..00000000000 --- a/res/cardsfolder/well_laid_plans.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Well-Laid Plans -ManaCost:2 U -Types:Enchantment -Text:Prevent all damage that would be dealt to a creature by another creature if they share a color. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/well_laid_plans.jpg -SetInfo:INV|Rare|http://magiccards.info/scans/en/in/88.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/well_of_discovery.txt b/res/cardsfolder/well_of_discovery.txt deleted file mode 100644 index e2d1e2a7ab5..00000000000 --- a/res/cardsfolder/well_of_discovery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Well of Discovery -ManaCost:6 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Land.untapped+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigDraw | TriggerDescription$ At the beginning of your end step, if you control no untapped lands, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | NumCards$ 1 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/well_of_discovery.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/140.jpg -End diff --git a/res/cardsfolder/well_of_life.txt b/res/cardsfolder/well_of_life.txt deleted file mode 100644 index b8e0d3165ec..00000000000 --- a/res/cardsfolder/well_of_life.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Well of Life -ManaCost:4 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Land.untapped+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your end step, if you control no untapped lands, you gain 2 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | LifeAmount$ 2 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/well_of_life.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/141.jpg -End diff --git a/res/cardsfolder/wellspring.txt b/res/cardsfolder/wellspring.txt deleted file mode 100644 index 6038a8ad458..00000000000 --- a/res/cardsfolder/wellspring.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wellspring -ManaCost:1 G W -Types:Enchantment Aura -Text:no text -K:Enchant Land -T:Mode$ ChangesZone | ValidCard$ Card.Self | Execute$ TrigGainControl | Origin$ Any | Destination$ Battlefield | TriggerDescription$ When CARDNAME 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. -SVar:TrigGainControl:AB$GainControl | Cost$ 0 | Defined$ Enchanted | LoseControl$ EOT -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainControl2 | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, untap enchanted land. You gain control of that land until end of turn. -SVar:TrigGainControl2:AB$GainControl | Cost$ 0 | Defined$ Enchanted | LoseControl$ EOT | SubAbility$ DBUntap -SVar:DBUntap:DB$Untap | Defined$ Enchanted -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wellspring.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/348.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wellwisher.txt b/res/cardsfolder/wellwisher.txt deleted file mode 100644 index 7ef907ef84d..00000000000 --- a/res/cardsfolder/wellwisher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wellwisher -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/1 -A:AB$ GainLife | Cost$ T | LifeAmount$ X | SpellDescription$ You gain 1 life for each Elf on the battlefield. -SVar:X:Count$TypeOnBattlefield.Elf -SVar:BuffedBy:Elf -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39497.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/300.jpg -End diff --git a/res/cardsfolder/werebear.txt b/res/cardsfolder/werebear.txt deleted file mode 100644 index 83fe88299de..00000000000 --- a/res/cardsfolder/werebear.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Werebear -ManaCost:1 G -Types:Creature Human Bear Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -K:stPumpSelf:Creature:3/3:Threshold:Threshold - Werebear gets +3/+3 as long as seven or more cards are in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/werebear.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/282.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/western_paladin.txt b/res/cardsfolder/western_paladin.txt deleted file mode 100644 index e408375fec7..00000000000 --- a/res/cardsfolder/western_paladin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Western Paladin -ManaCost:2 B B -Types:Creature Zombie Knight -Text:no text -PT:3/3 -A:AB$ Destroy | Cost$ B B T | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature | SpellDescription$ Destroy target white creature. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/western_paladin.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/173.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/168.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/170.jpg -End diff --git a/res/cardsfolder/whalebone_glider.txt b/res/cardsfolder/whalebone_glider.txt deleted file mode 100644 index 8ca2dde48e8..00000000000 --- a/res/cardsfolder/whalebone_glider.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whalebone Glider -ManaCost:2 -Types:Artifact -Text:no text -A:AB$ Pump | Cost$ 2 T | ValidTgts$ Creature.powerLE3 | TgtPrompt$ Select target creature with power 3 or less | KW$ Flying | SpellDescription$ Target creature with power 3 or less gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whalebone_glider.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/324.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wheel_and_deal.txt b/res/cardsfolder/wheel_and_deal.txt deleted file mode 100644 index e6e0ae548e2..00000000000 --- a/res/cardsfolder/wheel_and_deal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wheel and Deal -ManaCost:3 U -Types:Instant -Text:no text -A:SP$ Discard | Cost$ 3 U | ValidTgts$ Opponent | TargetMin$ 0 | Mode$ Hand | SpellDescription$ Any number of target opponents each discards his or her hand and draws seven cards. | SubAbility$ SVar=DBDrawOpp -SVar:DBDrawOpp:DB$Draw | Defined$ Targeted | NumCards$ 7 | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wheel_and_deal.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/121.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wheel_of_fortune.txt b/res/cardsfolder/wheel_of_fortune.txt deleted file mode 100644 index 4e899751742..00000000000 --- a/res/cardsfolder/wheel_of_fortune.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wheel of Fortune -ManaCost:2 R -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 2 R | Mode$ Hand | Defined$ Each | SubAbility$ SVar=DBEachDraw | SpellDescription$ Each player discards his or her hand and draws seven cards. -SVar:DBEachDraw:DB$Draw | Defined$ Each | NumCards$ 7 -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wheel_of_fortune.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/184.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/185.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/184.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/184.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wheel_of_torture.txt b/res/cardsfolder/wheel_of_torture.txt deleted file mode 100644 index bb5158f28ec..00000000000 --- a/res/cardsfolder/wheel_of_torture.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wheel of Torture -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Opponent | IsPresent$ Card.YouDontCtrl | PresentZone$ Hand | PresentCompare$ LT3 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each opponent's upkeep, CARDNAME deals X damage to that player, where X is 3 minus the number of cards in his or her hand. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ Opponent | NumDmg$ X -SVar:X:Count$InOppHand/NMinus.3 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wheel_of_torture.jpg -SetInfo:ULG|Rare|http://magiccards.info/scans/en/ul/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/where_ancients_tread.txt b/res/cardsfolder/where_ancients_tread.txt deleted file mode 100644 index 78c7b179fb7..00000000000 --- a/res/cardsfolder/where_ancients_tread.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Where Ancients Tread -ManaCost:4 R -Types:Enchantment -Text:no text -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.powerGE5+YouCtrl | OptionalDecider$ You | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature with power 5 or greater enters the battlefield under your control, you may have CARDNAME deal 5 damage to target creature or player. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Tgt$ TgtCP | NumDmg$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/where_ancients_tread.jpg -SetInfo:ALA|Rare|http://magiccards.info/scans/en/ala/122.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whetstone.txt b/res/cardsfolder/whetstone.txt deleted file mode 100644 index c70571386b2..00000000000 --- a/res/cardsfolder/whetstone.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whetstone -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ Mill | Cost$ 3 | NumCards$ 2 | Defined$ Each | SpellDescription$ Each player puts the top two cards of his or her library into his or her graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/whetstone.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/316.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whetwheel.txt b/res/cardsfolder/whetwheel.txt deleted file mode 100644 index 0ddced6489e..00000000000 --- a/res/cardsfolder/whetwheel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Whetwheel -ManaCost:4 -Types:Artifact -Text:no text -K:Morph:3 -A:AB$ Mill | Cost$ X X T | NumCards$ X | ValidTgts$ Player | TgtPrompt$ Select target player | SpellDescription$ Target player puts the top X cards of his or her library into his or her graveyard. -SVar:X:Count$xPaid -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/whetwheel.jpg -SetInfo:FUT|Rare|http://magiccards.info/scans/en/fut/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whimwader.txt b/res/cardsfolder/whimwader.txt deleted file mode 100644 index ca7bef2b9b1..00000000000 --- a/res/cardsfolder/whimwader.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whimwader -ManaCost:4 U -Types:Creature Elemental -Text:no text -PT:6/4 -K:CARDNAME can't attack unless defending player controls a blue permanent. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whimwader.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whip_sergeant.txt b/res/cardsfolder/whip_sergeant.txt deleted file mode 100644 index ddba86e2abb..00000000000 --- a/res/cardsfolder/whip_sergeant.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Whip Sergeant -ManaCost:2 R -Types:Creature Human Soldier -Text:no text -PT:2/1 -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Haste | SpellDescription$ Target creature gains haste until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whip_sergeant.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/107.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/227.jpg -End diff --git a/res/cardsfolder/whip_silk.txt b/res/cardsfolder/whip_silk.txt deleted file mode 100644 index 33d3cd18d23..00000000000 --- a/res/cardsfolder/whip_silk.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Whip Silk -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Reach -A:AB$ ChangeZone | Cost$ G | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whip_silk.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/225.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whip_spine_drake.txt b/res/cardsfolder/whip_spine_drake.txt deleted file mode 100644 index afa6ae8a29b..00000000000 --- a/res/cardsfolder/whip_spine_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Whip-Spine Drake -ManaCost:3 U U -Types:Creature Drake -Text:no text -PT:3/3 -K:Flying -K:Morph:2 W -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whip_spine_drake.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whipcorder.txt b/res/cardsfolder/whipcorder.txt deleted file mode 100644 index 261a890b138..00000000000 --- a/res/cardsfolder/whipcorder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Whipcorder -ManaCost:W W -Types:Creature Human Soldier Rebel -Text:no text -PT:2/2 -K:Morph:W -A:AB$ Tap | Cost$ W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whipcorder.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/60.jpg -End diff --git a/res/cardsfolder/whipflare.txt b/res/cardsfolder/whipflare.txt deleted file mode 100644 index 86b25a9d925..00000000000 --- a/res/cardsfolder/whipflare.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whipflare -ManaCost:1 R -Types:Sorcery -Text:no text -A:SP$ DamageAll | Cost$ 1 R | NumDmg$ 2 | ValidCards$ Creature.nonArtifact | ValidDescription$ each nonartifact creature. | SpellDescription$ CARDNAME deals 2 damage to each nonartifact creature. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whipflare.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/102.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whipstitched_zombie.txt b/res/cardsfolder/whipstitched_zombie.txt deleted file mode 100644 index 77ca10f2527..00000000000 --- a/res/cardsfolder/whipstitched_zombie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whipstitched Zombie -ManaCost:1 B -Types:Creature Zombie -Text:no text -PT:2/2 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay B -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whipstitched_zombie.jpg -SetInfo:PCY|Common|http://magiccards.info/scans/en/pr/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whiptail_moloch.txt b/res/cardsfolder/whiptail_moloch.txt deleted file mode 100644 index 083d96fc584..00000000000 --- a/res/cardsfolder/whiptail_moloch.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Whiptail Moloch -ManaCost:4 R -Types:Creature Lizard -Text:no text -PT:6/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 3 damage to target creature you control. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | ValidTgts$ Creature.YouCtrl | NumDmg$ 3 | TgtPrompt$ Select target creature you control -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whiptail_moloch.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/79.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whiptail_wurm.txt b/res/cardsfolder/whiptail_wurm.txt deleted file mode 100644 index 5975a047a0f..00000000000 --- a/res/cardsfolder/whiptail_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whiptail Wurm -ManaCost:6 G -Types:Creature Wurm -Text:no text -PT:8/5 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20230.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/149.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whiptongue_frog.txt b/res/cardsfolder/whiptongue_frog.txt deleted file mode 100644 index 887c7c7330d..00000000000 --- a/res/cardsfolder/whiptongue_frog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whiptongue Frog -ManaCost:2 U -Types:Creature Frog -Text:no text -PT:1/3 -A:AB$ Pump | Cost$ U | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ex/en-us/card6057.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/52.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whirling_catapult.txt b/res/cardsfolder/whirling_catapult.txt deleted file mode 100644 index 68e07859b85..00000000000 --- a/res/cardsfolder/whirling_catapult.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whirling Catapult -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ DamageAll | Cost$ 2 ExileFromTop<2/Card> | NumDmg$ 1 | ValidCards$ Creature.withFlying | ValidPlayers$ Each | ValidDescription$ each creature with flying and each player. | SpellDescription$ CARDNAME deals 1 damage to each creature with flying and each player. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whirling_catapult.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whirling_dervish.txt b/res/cardsfolder/whirling_dervish.txt deleted file mode 100644 index 3f137e6d9ff..00000000000 --- a/res/cardsfolder/whirling_dervish.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Whirling Dervish -ManaCost:G G -Types:Creature Human Monk -Text:At the beginning of the end step, if Whirling Dervish dealt damage to an opponent this turn, put a +1/+1 counter on it. -PT:1/1 -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whirling_dervish.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/203.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/90.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/172.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whirlpool_drake.txt b/res/cardsfolder/whirlpool_drake.txt deleted file mode 100644 index 6621193b712..00000000000 --- a/res/cardsfolder/whirlpool_drake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whirlpool Drake -ManaCost:3 U -Types:Creature Drake -Text:When CARDNAME enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards.\r\n\r\nWhen CARDNAME is put into a graveyard from the battlefield, shuffle the cards from your hand into your library, then draw that many cards. -PT:2/2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whirlpool_drake.jpg -SetInfo:APC|Uncommon|http://magiccards.info/scans/en/ap/34.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whirlpool_rider.txt b/res/cardsfolder/whirlpool_rider.txt deleted file mode 100644 index 7d6bc582483..00000000000 --- a/res/cardsfolder/whirlpool_rider.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whirlpool Rider -ManaCost:1 U -Types:Creature Merfolk -Text:When CARDNAME enters the battlefield, shuffle the cards from your hand into your library, then draw that many cards. -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ap/en-us/card27670.jpg -SetInfo:APC|Common|http://magiccards.info/scans/en/ap/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whirlwind.txt b/res/cardsfolder/whirlwind.txt deleted file mode 100644 index cd8c61c73d0..00000000000 --- a/res/cardsfolder/whirlwind.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Whirlwind -ManaCost:2 G G -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 G G | ValidCards$ Creature.withFlying | SpellDescription$ Destroy all creatures with flying. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/whirlwind.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/283.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/150.jpg -End diff --git a/res/cardsfolder/whispering_shade.txt b/res/cardsfolder/whispering_shade.txt deleted file mode 100644 index 9d443bfdfd1..00000000000 --- a/res/cardsfolder/whispering_shade.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Whispering Shade -ManaCost:3 B -Types:Creature Shade -Text:no text -PT:1/1 -K:Swampwalk -A:AB$ Pump | Cost$ B | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whispering_shade.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/167.jpg -End diff --git a/res/cardsfolder/whispering_specter.txt b/res/cardsfolder/whispering_specter.txt deleted file mode 100644 index 7a62ef4dd6b..00000000000 --- a/res/cardsfolder/whispering_specter.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Whispering Specter -ManaCost:1 B B -Types:Creature Specter -Text:no text -PT:1/1 -K:Flying -K:Infect -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | OptionalDecider$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME 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. -SVar:TrigDiscard:AB$Discard | Cost$ Sac<1/CARDNAME> | Defined$ Opponent | NumCards$ X | Mode$ TgtChoose -SVar:X:Count$OppPoisonCounters -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whispering_specter.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/77.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whispers_of_the_muse.txt b/res/cardsfolder/whispers_of_the_muse.txt deleted file mode 100644 index b5d312a57e6..00000000000 --- a/res/cardsfolder/whispers_of_the_muse.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Whispers of the Muse -ManaCost:U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ U | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Buyback:5 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/whispers_of_the_muse.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/103.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/35.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whispersilk_cloak.txt b/res/cardsfolder/whispersilk_cloak.txt deleted file mode 100644 index e5f0b44c1df..00000000000 --- a/res/cardsfolder/whispersilk_cloak.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Whispersilk Cloak -ManaCost:3 -Types:Artifact Equipment -Text:Equipped creature is unblockable and has shroud. -K:eqPump 2:HIDDEN Unblockable & Shroud -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whispersilk_cloak.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/221.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/221.jpg -SetInfo:DST|Common|http://magiccards.info/scans/en/ds/160.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/345.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/white_knight.txt b/res/cardsfolder/white_knight.txt deleted file mode 100644 index 35e3faba342..00000000000 --- a/res/cardsfolder/white_knight.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:White Knight -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:First Strike -K:Protection from black -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/white_knight.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/227.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/229.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/27.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/344.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/306.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/39.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/41.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/228.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/white_mana_battery.txt b/res/cardsfolder/white_mana_battery.txt deleted file mode 100644 index 1d712912078..00000000000 --- a/res/cardsfolder/white_mana_battery.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:White Mana Battery -ManaCost:4 -Types:Artifact -Text:no text -A:AB$ PutCounter | Cost$ 2 T | CounterType$ CHARGE | CounterNum$ 1 | SpellDescription$ Put a charge counter on CARDNAME. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/white_mana_battery.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/375.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/white_scarab.txt b/res/cardsfolder/white_scarab.txt deleted file mode 100644 index 3519f40a6a1..00000000000 --- a/res/cardsfolder/white_scarab.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:White Scarab -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:CARDNAME can't be blocked by white creatures. -K:stPumpEnchanted:Creature:2/2:isPresent Permanent.White+YouDontCtrl:Enchanted creature gets +2/+2 as long as an opponent controls a white permanent. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/white_scarab.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/280.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/white_shield_crusader.txt b/res/cardsfolder/white_shield_crusader.txt deleted file mode 100644 index bdd75da7244..00000000000 --- a/res/cardsfolder/white_shield_crusader.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:White Shield Crusader -ManaCost:W W -Types:Creature Human Knight -Text:no text -PT:2/1 -K:Protection from black -A:AB$ Pump | Cost$ W | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -A:AB$ Pump | Cost$ W W | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/csp/en-us/card121216.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/24.jpg -End diff --git a/res/cardsfolder/white_suns_zenith.txt b/res/cardsfolder/white_suns_zenith.txt deleted file mode 100644 index da008ed6da0..00000000000 --- a/res/cardsfolder/white_suns_zenith.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:White Sun's Zenith -ManaCost:X W W W -Types:Instant -Text:no text -A:SP$ Token | Cost$ X W W W | TokenAmount$ X | TokenName$ Cat | TokenTypes$ Creature,Cat | TokenOwner$ You | TokenColors$ White | TokenPower$ 2 | TokenToughness$ 2 | SubAbility$ SVar=DBShuffle | SpellDescription$ Put X 2/2 white Cat creature tokens onto the battlefield. Shuffle CARDNAME into its owner's library. -SVar:X:Count$xPaid -SVar:DBShuffle:DB$ChangeZone | Origin$ Stack | Destination$ Library | Shuffle$ True -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/white_suns_zenith.jpg -SetInfo:MBS|Rare|http://magiccards.info/scans/en/mbs/19.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/white_ward.txt b/res/cardsfolder/white_ward.txt deleted file mode 100644 index 42adc1471fb..00000000000 --- a/res/cardsfolder/white_ward.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:White Ward -ManaCost:W -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:Protection from white:Enchanted creature has protection from white. This effect doesn't remove White Ward. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/white_ward.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/228.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/230.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/229.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/307.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/229.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whitemane_lion.txt b/res/cardsfolder/whitemane_lion.txt deleted file mode 100644 index 747587f2137..00000000000 --- a/res/cardsfolder/whitemane_lion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Whitemane Lion -ManaCost:1 W -Types:Creature Cat -Text:no text -PT:2/2 -K:Flash -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a creature you control to its owner's hand. -SVar:TrigChange:AB$ChangeZone | Origin$ Battlefield | Destination$ Hand | Cost$ 0 | Hidden$ True | Mandatory$ True | ChangeType$ Creature.YouCtrl -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whitemane_lion.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/22.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/whitesuns_passage.txt b/res/cardsfolder/whitesuns_passage.txt deleted file mode 100644 index 63eb9b54732..00000000000 --- a/res/cardsfolder/whitesuns_passage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Whitesun's Passage -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ GainLife | Cost$ 1 W | LifeAmount$ 5 | SpellDescription$ You gain 5 life. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/whitesuns_passage.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/27.jpg -End diff --git a/res/cardsfolder/wicked_pact.txt b/res/cardsfolder/wicked_pact.txt deleted file mode 100644 index d05ae859864..00000000000 --- a/res/cardsfolder/wicked_pact.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wicked Pact -ManaCost:1 B B -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 B B | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature.nonBlack | TgtPrompt$ Select target nonblack creatures | SubAbility$ SVar=DBLoseLife | SpellDescription$ Destroy two target nonblack creatures. You lose 5 life. -SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 5 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wicked_pact.jpg -SetInfo:S99|Rare|http://magiccards.info/scans/en/st/92.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/40.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wicked_reward.txt b/res/cardsfolder/wicked_reward.txt deleted file mode 100644 index 6e5d7682200..00000000000 --- a/res/cardsfolder/wicked_reward.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wicked Reward -ManaCost:1 B -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 B Sac<1/Creature> | ValidTgts$ Creature | TgtPrompt$ Select target creature. | NumAtt$ +4 | NumDef$ +2 | SpellDescription$ Target creature gets +4/+2 until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wicked_reward.jpg -SetInfo:VIS|Common|http://magiccards.info/scans/en/vi/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wicker_warcrawler.txt b/res/cardsfolder/wicker_warcrawler.txt deleted file mode 100644 index 2a1ba5e06cf..00000000000 --- a/res/cardsfolder/wicker_warcrawler.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wicker Warcrawler -ManaCost:5 -Types:Artifact Creature Scarecrow -Text:no text -PT:6/6 -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, put a -1/-1 counter on it at end of combat. -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, put a -1/-1 counter on it at end of combat. -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | Execute$ TrigAddCounter | TriggerDescription$ Put a -1/-1 counter on CARDNAME. -SVar:TrigAddCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wicker_warcrawler.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/269.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wickerbough_elder.txt b/res/cardsfolder/wickerbough_elder.txt deleted file mode 100644 index cd8d342c35b..00000000000 --- a/res/cardsfolder/wickerbough_elder.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wickerbough Elder -ManaCost:3 G -Types:Creature Treefolk Shaman -Text:no text -PT:4/4 -K:etbCounter:M1M1:1 -A:AB$ Destroy | Cost$ G SubCounter<1/M1M1> | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SpellDescription$ Destroy target artifact or enchantment. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wickerbough_elder.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/80.jpg -End diff --git a/res/cardsfolder/wielding_the_green_dragon.txt b/res/cardsfolder/wielding_the_green_dragon.txt deleted file mode 100644 index 4227a00735a..00000000000 --- a/res/cardsfolder/wielding_the_green_dragon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wielding the Green Dragon -ManaCost:1 G -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +4 | NumDef$ +4 | SpellDescription$ Target creature gets +4/+4 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wielding_the_green_dragon.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_aesthir.txt b/res/cardsfolder/wild_aesthir.txt deleted file mode 100644 index 362468f8177..00000000000 --- a/res/cardsfolder/wild_aesthir.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wild Aesthir -ManaCost:2 W -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:First Strike -A:AB$ Pump | Cost$ W W | NumAtt$ +2 | ActivationLimit$ 1 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. Activate this ability only once each turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_aesthir.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/154.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/wild_cantor.txt b/res/cardsfolder/wild_cantor.txt deleted file mode 100644 index 33bc53630e2..00000000000 --- a/res/cardsfolder/wild_cantor.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wild Cantor -ManaCost:RG -Types:Creature Human Druid -Text:no text -PT:1/1 -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ B | SpellDescription$ Add B to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ R | SpellDescription$ Add R to your mana pool. -A:AB$ Mana | Cost$ Sac<1/CARDNAME> | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_cantor.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/149.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_colos.txt b/res/cardsfolder/wild_colos.txt deleted file mode 100644 index d6dc8c76c1e..00000000000 --- a/res/cardsfolder/wild_colos.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wild Colos -ManaCost:2 R -Types:Creature Goat Beast -Text:no text -PT:2/2 -K:Haste -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/cg/en-us/card15198.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_elephant.txt b/res/cardsfolder/wild_elephant.txt deleted file mode 100644 index f22239f573f..00000000000 --- a/res/cardsfolder/wild_elephant.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wild Elephant -ManaCost:3 G -Types:Creature Elephant -Text:no text -PT:3/3 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3423.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_griffin.txt b/res/cardsfolder/wild_griffin.txt deleted file mode 100644 index bb53ca4713a..00000000000 --- a/res/cardsfolder/wild_griffin.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wild Griffin -ManaCost:2 W -Types:Creature Griffin -Text:no text -PT:2/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/10e/en/card129557.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/40.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/150.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/31.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_growth.txt b/res/cardsfolder/wild_growth.txt deleted file mode 100644 index b30216970ab..00000000000 --- a/res/cardsfolder/wild_growth.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Wild Growth -ManaCost:G -Types:Enchantment Aura -Text:no text -K:Enchant Land -T:Mode$ TapsForMana | ValidCard$ Card.AttachedBy | Execute$ TrigMana | TriggerDescription$ 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). -SVar:TrigMana:AB$Mana | Cost$ 0 | Produced$ G | Amount$ 1 | Defined$ TriggeredCardController -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_growth.jpg -SetInfo:LEA|Common|http://magiccards.info/scans/en/al/138.jpg -SetInfo:LEB|Common|http://magiccards.info/scans/en/be/138.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/282.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/204.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/173.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/165.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/268.jpg -SetInfo:3ED|Common|http://magiccards.info/scans/en/rv/137.jpg -SetInfo:2ED|Common|http://magiccards.info/scans/en/un/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_jhovall.txt b/res/cardsfolder/wild_jhovall.txt deleted file mode 100644 index 9a2ef52ec8b..00000000000 --- a/res/cardsfolder/wild_jhovall.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wild Jhovall -ManaCost:3 R -Types:Creature Cat -Text:no text -PT:3/3 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mm/en-us/card19605.jpg -SetInfo:MMQ|Common|http://magiccards.info/scans/en/mm/227.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_leotau.txt b/res/cardsfolder/wild_leotau.txt deleted file mode 100644 index 23660e9e825..00000000000 --- a/res/cardsfolder/wild_leotau.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wild Leotau -ManaCost:2 G G -Types:Creature Cat -Text:no text -PT:5/4 -K:At the beginning of your upkeep, sacrifice CARDNAME unless you pay G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_leotau.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_mongrel.txt b/res/cardsfolder/wild_mongrel.txt deleted file mode 100644 index cd4b018630a..00000000000 --- a/res/cardsfolder/wild_mongrel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wild Mongrel -ManaCost:1 G -Types:Creature Hound -Text:no text -PT:2/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card29777.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/283.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_nacatl.txt b/res/cardsfolder/wild_nacatl.txt deleted file mode 100644 index 239a15137d8..00000000000 --- a/res/cardsfolder/wild_nacatl.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wild Nacatl -ManaCost:G -Types:Creature Cat Warrior -Text:no text -PT:1/1 -K:stPumpSelf:Creature:1/1:isPresent Mountain.YouCtrl:CARDNAME gets +1/+1 as long as you control a Mountain. -K:stPumpSelf:Creature:1/1:isPresent Plains.YouCtrl:CARDNAME gets +1/+1 as long as you control a Plains. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_nacatl.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_ox.txt b/res/cardsfolder/wild_ox.txt deleted file mode 100644 index 2bafc1f003f..00000000000 --- a/res/cardsfolder/wild_ox.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wild Ox -ManaCost:3 G -Types:Creature Ox -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card20227.jpg -SetInfo:PO2|Uncommon|http://magiccards.info/scans/en/po2/90.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/151.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_research.txt b/res/cardsfolder/wild_research.txt deleted file mode 100644 index c274edc07a9..00000000000 --- a/res/cardsfolder/wild_research.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wild Research -ManaCost:2 R -Types:Enchantment -Text:no text -A:AB$ ChangeZone | Cost$ 1 W | Origin$ Library | Destination$ Hand | ChangeType$ Enchantment | ChangeNum$ 1 | Shuffle$ True | SubAbility$ SVar=DBDiscard | SpellDescription$ 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. -A:AB$ ChangeZone | Cost$ 1 U | Origin$ Library | Destination$ Hand | ChangeType$ Instant | ChangeNum$ 1 | Shuffle$ True | SubAbility$ SVar=DBDiscard | SpellDescription$ 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. -SVar:DBDiscard:DB$Discard | Defined$ You | NumCards$ 1 | Mode$ Random -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_research.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/72.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wild_wurm.txt b/res/cardsfolder/wild_wurm.txt deleted file mode 100644 index f6df0b884a6..00000000000 --- a/res/cardsfolder/wild_wurm.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wild Wurm -ManaCost:3 R -Types:Creature Wurm -Text:no text -PT:5/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigFlipACoin | TriggerDescription$ When CARDNAME enters the battlefield, flip a coin. If you lose the flip, return CARDNAME to its owner's hand. -SVar:TrigFlipACoin:AB$FlipACoin | Cost$ 0 | LoseSubAbility$ DBChange -SVar:DBChange:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wild_wurm.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/212.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wilderness_elemental.txt b/res/cardsfolder/wilderness_elemental.txt deleted file mode 100644 index 1d1bb394fcf..00000000000 --- a/res/cardsfolder/wilderness_elemental.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wilderness Elemental -ManaCost:1 R G -Types:Creature Elemental -Text:no text -PT:*/3 -K:Trample -K:stSetPT:Count$Valid Land.nonBasic+YouDontCtrl:3:CARDNAME's power is equal to the number of nonbasic lands your opponents control. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wilderness_elemental.jpg -SetInfo:CSP|Uncommon|http://magiccards.info/scans/en/cs/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wilderness_hypnotist.txt b/res/cardsfolder/wilderness_hypnotist.txt deleted file mode 100644 index 24d8ab6efdf..00000000000 --- a/res/cardsfolder/wilderness_hypnotist.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wilderness Hypnotist -ManaCost:2 U U -Types:Creature Merfolk Wizard -Text:no text -PT:1/3 -A:AB$ Pump | Cost$ T | NumAtt$ -2 | ValidTgts$ Creature.Red,Creature.Green | TgtPrompt$ Select target red or green creature | IsCurse$ True | SpellDescription$ Target red or green creature gets -2/-0 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wilderness_hypnotist.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/32.jpg -End diff --git a/res/cardsfolder/wildfield_borderpost.txt b/res/cardsfolder/wildfield_borderpost.txt deleted file mode 100644 index b8610ff8729..00000000000 --- a/res/cardsfolder/wildfield_borderpost.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wildfield Borderpost -ManaCost:1 G W -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add W to your mana pool. -SVar:AltCost:1 Return<1/Land.Basic>$You may pay 1 and return a basic land you control to its owner's hand rather than pay Wildfield Borderpost's mana cost. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wildfield_borderpost.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/80.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wildfire.txt b/res/cardsfolder/wildfire.txt deleted file mode 100644 index d752d52a9c9..00000000000 --- a/res/cardsfolder/wildfire.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wildfire -ManaCost:4 R R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 4 R R | Defined$ Each | SacValid$ Land | Amount$ 4 | SpellDescription$ Each player sacrifices four lands. CARDNAME deals 4 damage to each creature. | SubAbility$ SVar=DBDamage -SVar:DBDamage:DB$ DamageAll | NumDmg$ 4 | ValidCards$ Creature -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wildfire.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/228.jpg -SetInfo:PO2|Rare|http://magiccards.info/scans/en/po2/120.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/228.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/228.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wildfire_emissary.txt b/res/cardsfolder/wildfire_emissary.txt deleted file mode 100644 index 4647c00c0df..00000000000 --- a/res/cardsfolder/wildfire_emissary.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wildfire Emissary -ManaCost:3 R -Types:Creature Efreet -Text:no text -PT:2/4 -K:Protection from white -A:AB$ Pump | Cost$ 1 R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wildfire_emissary.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/203.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/72.jpg -End diff --git a/res/cardsfolder/wildheart_invoker.txt b/res/cardsfolder/wildheart_invoker.txt deleted file mode 100644 index 2a447419ef6..00000000000 --- a/res/cardsfolder/wildheart_invoker.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wildheart Invoker -ManaCost:2 G G -Types:Creature Elf Shaman -Text:no text -PT:4/3 -A:AB$ Pump | Cost$ 8 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +5 | NumDef$ +5 | KW$ Trample | SpellDescription$ Target creature gets +5/+5 and gains trample until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wildheart_invoker.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/213.jpg -End diff --git a/res/cardsfolder/wildsize.txt b/res/cardsfolder/wildsize.txt deleted file mode 100644 index dbca5da7196..00000000000 --- a/res/cardsfolder/wildsize.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wildsize -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Trample | SpellDescription$ Target creature gets +2/+2 and gains trample until end of turn. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card107097.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/98.jpg -End diff --git a/res/cardsfolder/wildslayer_elves.txt b/res/cardsfolder/wildslayer_elves.txt deleted file mode 100644 index c3f15d35410..00000000000 --- a/res/cardsfolder/wildslayer_elves.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wildslayer Elves -ManaCost:3 G -Types:Creature Elf Warrior -Text:no text -PT:3/3 -K:Wither -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wildslayer_elves.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/will_o_the_wisp.txt b/res/cardsfolder/will_o_the_wisp.txt deleted file mode 100644 index b4b0754f11f..00000000000 --- a/res/cardsfolder/will_o_the_wisp.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Will-o'-the-Wisp -ManaCost:B -Types:Creature Spirit -Text:no text -PT:0/1 -K:Flying -A:AB$ Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83411.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/44.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/44.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/55.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/169.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/45.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/willow_dryad.txt b/res/cardsfolder/willow_dryad.txt deleted file mode 100644 index af53257f723..00000000000 --- a/res/cardsfolder/willow_dryad.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Willow Dryad -ManaCost:G -Types:Creature Dryad -Text:no text -PT:1/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/po/en-us/card4325.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/willow_elf.txt b/res/cardsfolder/willow_elf.txt deleted file mode 100644 index 93061a763cc..00000000000 --- a/res/cardsfolder/willow_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Willow Elf -ManaCost:G -Types:Creature Elf -Text:no text -PT:1/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/p3/en-us/card21051.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/152.jpg -SetInfo:S00|Common|http://magiccards.info/scans/en/st2k/20.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/willow_faerie.txt b/res/cardsfolder/willow_faerie.txt deleted file mode 100644 index 936393dbde5..00000000000 --- a/res/cardsfolder/willow_faerie.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Willow Faerie -ManaCost:1 G -Types:Creature Faerie -Text:no text -PT:1/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/hm/en-us/card2982.jpg -SetInfo:HML|Common|http://magiccards.info/scans/en/hl/73.jpg|2 -End \ No newline at end of file diff --git a/res/cardsfolder/willow_priestess.txt b/res/cardsfolder/willow_priestess.txt deleted file mode 100644 index 2778d51a088..00000000000 --- a/res/cardsfolder/willow_priestess.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Willow Priestess -ManaCost:2 G G -Types:Creature Faerie Druid -Text:no text -A:AB$ ChangeZone | Cost$ T | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent.Faerie | ChangeNum$ 1 | SpellDescription$ You may put a Faerie permanent card from your hand onto the battlefield. -A:AB$ Pump | Cost$ 2 G | ValidTgts$ Creature.Green | TgtPrompt$ Select target green creature | KW$ Protection from black | SpellDescription$ Target green creature gains protection from black until end of turn. -PT:2/2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/willow_priestess.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/willow_satyr.txt b/res/cardsfolder/willow_satyr.txt deleted file mode 100644 index 829cef0ca4a..00000000000 --- a/res/cardsfolder/willow_satyr.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Willow Satyr -ManaCost:2 G G -Types:Creature Satyr -Text:no text -PT:1/1 -K:You may choose not to untap CARDNAME during your untap step. -A:AB$ GainControl | Cost$ T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature. | LoseControl$ Untap,LeavesPlay,LoseControl | SpellDescription$ Gain control of target legendary creature for as long as you control CARDNAME and CARDNAME remains tapped. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/willow_satyr.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wilt_leaf_cavaliers.txt b/res/cardsfolder/wilt_leaf_cavaliers.txt deleted file mode 100644 index 066278a912f..00000000000 --- a/res/cardsfolder/wilt_leaf_cavaliers.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wilt-Leaf Cavaliers -ManaCost:GW GW GW -Types:Creature Elf Knight -Text:no text -PT:3/4 -K:Vigilance -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wilt_leaf_cavaliers.jpg -SetInfo:SHM|Uncommon|http://magiccards.info/scans/en/shm/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wilt_leaf_liege.txt b/res/cardsfolder/wilt_leaf_liege.txt deleted file mode 100644 index fe93d821760..00000000000 --- a/res/cardsfolder/wilt_leaf_liege.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wilt-Leaf Liege -ManaCost:1 GW GW GW -Types:Creature Elf Knight -Text:no text -PT:4/4 -K: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. -K:stPumpAll:Creature.Green+Other+YouCtrl:1/1:No Condition:Other green creatures you control get +1/+1. -K:stPumpAll:Creature.White+Other+YouCtrl:1/1:No Condition:Other white creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wilt_leaf_liege.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/245.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wind_dancer.txt b/res/cardsfolder/wind_dancer.txt deleted file mode 100644 index 43fd5cd944a..00000000000 --- a/res/cardsfolder/wind_dancer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wind Dancer -ManaCost:1 U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wind_dancer.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/104.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/113.jpg -End diff --git a/res/cardsfolder/wind_drake.txt b/res/cardsfolder/wind_drake.txt deleted file mode 100644 index ea0eda66517..00000000000 --- a/res/cardsfolder/wind_drake.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Wind Drake -ManaCost:2 U -Types:Creature Drake -Text:no text -PT:2/2 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83334.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/114.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/105.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/114.jpg -SetInfo:POR|Common|http://magiccards.info/scans/en/po/78.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/112.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/81.jpg -SetInfo:6ED|Common|http://magiccards.info/scans/en/6e/106.jpg -SetInfo:S99|Common|http://magiccards.info/scans/en/st/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wind_sail.txt b/res/cardsfolder/wind_sail.txt deleted file mode 100644 index ea15f35d194..00000000000 --- a/res/cardsfolder/wind_sail.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wind Sail -ManaCost:1 U -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 1 U | TargetMin$ 1 | TargetMax$ 2 | KW$ Flying | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ One or two target creatures gain flying until end of turn. -SVar:Rarity:Common -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal_Second_Age/wind_sail.jpg -SetInfo:PO2|Common|http://magiccards.info/scans/en/po2/60.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wind_shear.txt b/res/cardsfolder/wind_shear.txt deleted file mode 100644 index 50ceac2cde1..00000000000 --- a/res/cardsfolder/wind_shear.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wind Shear -ManaCost:2 G -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ 2 G | ValidCards$ Creature.withFlying+attacking | NumAtt$ -2 | NumDef$ -2 | SubAbility$ DBDebuff | IsCurse$ True | SpellDescription$ Attacking creatures with flying get -2/-2 and lose flying until end of turn. -SVar:DBDebuff:DB$ DebuffAll | ValidCards$ Creature.withFlying+attacking | Keywords$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wind_shear.jpg -SetInfo:VIS|Uncommon|http://magiccards.info/scans/en/vi/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wind_zendikon.txt b/res/cardsfolder/wind_zendikon.txt deleted file mode 100644 index 95b05ebee4d..00000000000 --- a/res/cardsfolder/wind_zendikon.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wind Zendikon -ManaCost:U -Types:Enchantment Aura -Text:no text -K:Enchant Land -K:stAnimateEnchanted:Land:2/2/Flying:Creature,Elemental:Blue:No Abilities:isPresent Card.AttachedBy:Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.AttachedBy | Execute$ TrigChangeZone | TriggerDescription$ When enchanted land is put into a graveyard, return that card to its owner's hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wind_zendikon.jpg -SetInfo:WWK|Common|http://magiccards.info/scans/en/wwk/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windborn_muse.txt b/res/cardsfolder/windborn_muse.txt deleted file mode 100644 index 397d41f0684..00000000000 --- a/res/cardsfolder/windborn_muse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Windborn Muse -ManaCost:3 W -Types:Creature Spirit -Text:Creatures can't attack you unless their controller pays 2 for each creature he or she controls that's attacking you. -PT:2/3 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/windborn_muse.jpg -SetInfo:LGN|Rare|http://magiccards.info/scans/en/le/28.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windborne_charge.txt b/res/cardsfolder/windborne_charge.txt deleted file mode 100644 index 85eede0a84f..00000000000 --- a/res/cardsfolder/windborne_charge.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Windborne Charge -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ Pump | Cost$ 2 W W | TargetMin$ 2 | TargetMax$ 2 | KW$ Flying | NumAtt$ +2 | NumDef$ +2 | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SpellDescription$ Two target creatures you control each get +2/+2 and gain flying until end of turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/windborne_charge.jpg -SetInfo:ZEN|Uncommon|http://magiccards.info/scans/en/zen/38.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windbrisk_raptor.txt b/res/cardsfolder/windbrisk_raptor.txt deleted file mode 100644 index f29fec6801f..00000000000 --- a/res/cardsfolder/windbrisk_raptor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Windbrisk Raptor -ManaCost:5 W W -Types:Creature Bird -Text:no text -PT:5/7 -K:Flying -K:stPumpAll:Creature.attacking+YouCtrl:0/0/Lifelink:No Condition:Attacking creatures you control have lifelink. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/windbrisk_raptor.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windfall.txt b/res/cardsfolder/windfall.txt deleted file mode 100644 index 32af11a7864..00000000000 --- a/res/cardsfolder/windfall.txt +++ /dev/null @@ -1,8 +0,0 @@ -Name:Windfall -ManaCost:2 U -Types:Sorcery -Text:Each player discards his or her hand, then draws cards equal to the greatest number of cards a player discarded this way. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/windfall.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/111.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winding_wurm.txt b/res/cardsfolder/winding_wurm.txt deleted file mode 100644 index 95574ce4462..00000000000 --- a/res/cardsfolder/winding_wurm.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Winding Wurm -ManaCost:4 G -Types:Creature Wurm -Text:no text -PT:6/6 -K:Echo:4 G -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/winding_wurm.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windreaper_falcon.txt b/res/cardsfolder/windreaper_falcon.txt deleted file mode 100644 index ee13abe6f26..00000000000 --- a/res/cardsfolder/windreaper_falcon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Windreaper Falcon -ManaCost:1 R G -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Protection from blue -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/windreaper_falcon.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/349.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windreaver.txt b/res/cardsfolder/windreaver.txt deleted file mode 100644 index 35e6f337d35..00000000000 --- a/res/cardsfolder/windreaver.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Windreaver -ManaCost:3 W U -Types:Creature Elemental -Text:no text -PT:1/3 -K:Flying -A:AB$ Pump | Cost$ W | KW$ Vigilance | SpellDescription$ Windreaver gains vigilance until end of turn. -A:AB$ Pump | Cost$ W | NumDef$ +1 | SpellDescription$ Windreaver gets +0/+1 until end of turn. -A:AB$ Pump | Cost$ U | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. -A:AB$ ChangeZone | Cost$ U | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:RemAIDeck:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/windreaver.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/138.jpg -End diff --git a/res/cardsfolder/windrider_eel.txt b/res/cardsfolder/windrider_eel.txt deleted file mode 100644 index 1a39df149aa..00000000000 --- a/res/cardsfolder/windrider_eel.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Windrider Eel -ManaCost:3 U -Types:Creature Fish -Text:no text -PT:2/2 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, CARDNAME gets +2/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ +2 | NumDef$ +2 -SVar:BuffedBy:Land -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/windrider_eel.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/78.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winds_of_change.txt b/res/cardsfolder/winds_of_change.txt deleted file mode 100644 index 47a86812e2f..00000000000 --- a/res/cardsfolder/winds_of_change.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Winds of Change -ManaCost:R -Types:Sorcery -Text:Each player shuffles the cards from his or her hand into his or her library, then draws that many cards. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/winds_of_change.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/275.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/250.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/162.jpg -SetInfo:LEG|Uncommon|http://magiccards.info/scans/en/lg/169.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winds_of_rath.txt b/res/cardsfolder/winds_of_rath.txt deleted file mode 100644 index 60c5c2935f8..00000000000 --- a/res/cardsfolder/winds_of_rath.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Winds of Rath -ManaCost:3 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 3 W W | ValidCards$ Creature.unenchanted | NoRegen$ True | SpellDescription$ Destroy all creatures that aren't enchanted. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/winds_of_rath.jpg -SetInfo:TMP|Rare|http://magiccards.info/scans/en/tp/264.jpg -End diff --git a/res/cardsfolder/windscouter.txt b/res/cardsfolder/windscouter.txt deleted file mode 100644 index c28b1b07af2..00000000000 --- a/res/cardsfolder/windscouter.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Windscouter -ManaCost:3 U -Types:Creature Human Scout -Text:no text -PT:3/3 -K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -T:Mode$ Blocks | ValidCard$ Card.Self | DelayedTrigger$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, return it to its owner's hand at end of combat. (Return it only if it's on the battlefield.) -SVar:DelTrig:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Each | Execute$ TrigBounce | TriggerDescription$ Return CARDNAME to it's owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/windscouter.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windseeker_centaur.txt b/res/cardsfolder/windseeker_centaur.txt deleted file mode 100644 index a15b9302c92..00000000000 --- a/res/cardsfolder/windseeker_centaur.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Windseeker Centaur -ManaCost:1 R R -Types:Creature Centaur -Text:no text -PT:2/2 -K:Vigilance -SVar:Rarity:Special -SVar:Picture:http://www.wizards.com/global/images/magic/general/windseeker_centaur.jpg -SetInfo:MBP|Special|http://magiccards.info/scans/en/mbp/3.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windstorm.txt b/res/cardsfolder/windstorm.txt deleted file mode 100644 index b010a039b51..00000000000 --- a/res/cardsfolder/windstorm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Windstorm -ManaCost:X G -Types:Instant -Text:no text -A:SP$ DamageAll | Cost$ X G | ValidCards$ Creature.withFlying | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature with flying. -SVar:X:Count$xPaid -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/windstorm.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/205.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windswept_heath.txt b/res/cardsfolder/windswept_heath.txt deleted file mode 100644 index fc71f29a149..00000000000 --- a/res/cardsfolder/windswept_heath.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Windswept Heath -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest,Plains | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest or Plains card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/windswept_heath.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/328.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/windwright_mage.txt b/res/cardsfolder/windwright_mage.txt deleted file mode 100644 index a0d4e66c224..00000000000 --- a/res/cardsfolder/windwright_mage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Windwright Mage -ManaCost:W U B -Types:Artifact Creature Human Wizard -Text:no text -PT:2/2 -K:Lifelink -K:stPumpSelf:Creature:0/0/Flying:isInGraveyard Artifact.YouCtrl:CARDNAME has flying as long as an artifact card is in your graveyard. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/windwright_mage.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/208.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wing_puncture.txt b/res/cardsfolder/wing_puncture.txt deleted file mode 100644 index 9e5347a6e3e..00000000000 --- a/res/cardsfolder/wing_puncture.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wing Puncture -ManaCost:G -Types:Instant -Text:no text -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_puncture.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wing_shards.txt b/res/cardsfolder/wing_shards.txt deleted file mode 100644 index c8d7b080aa7..00000000000 --- a/res/cardsfolder/wing_shards.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wing Shards -ManaCost:1 W W -Types:Instant -Text:no text -A:SP$ Sacrifice | Cost$ 1 W W | ValidTgts$ Player | SacValid$ Creature.attacking | SacMessage$ Creature | SpellDescription$ Target player sacrifices an attacking creature. -K:Storm -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_shards.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/25.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wing_snare.txt b/res/cardsfolder/wing_snare.txt deleted file mode 100644 index 35227181786..00000000000 --- a/res/cardsfolder/wing_snare.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wing Snare -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 G | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Destroy target creature with flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_snare.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/288.jpg -SetInfo:ULG|Uncommon|http://magiccards.info/scans/en/ul/117.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/283.jpg -End diff --git a/res/cardsfolder/wing_splicer.txt b/res/cardsfolder/wing_splicer.txt deleted file mode 100644 index bdf64395f04..00000000000 --- a/res/cardsfolder/wing_splicer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wing Splicer -ManaCost:3 U -Types:Creature Human Artificer -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 3/3 colorless Golem artifact creature token onto the battlefield. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Golem | TokenTypes$ Artifact,Creature,Golem | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 3 | TokenToughness$ 3 -K:stPumpAll:Creature.Golem+YouCtrl:0/0/Flying:No Condition:Golem creatures you control have flying. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_splicer.jpg -SetInfo:NPH|Uncommon|http://magiccards.info/scans/en/nph/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wing_storm.txt b/res/cardsfolder/wing_storm.txt deleted file mode 100644 index 8174920809b..00000000000 --- a/res/cardsfolder/wing_storm.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wing Storm -ManaCost:2 G -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 2 G | Defined$ Opponent | NumDmg$ XOpp | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME deals damage to each player equal to twice the number of creatures with flying that player controls. -SVar:DBDealDamage:DB$DealDamage | Cost$ 0 | Defined$ You | NumDmg$ XYou -SVar:XOpp:Count$Valid Creature.withFlying+YouDontCtrl/Times.2 -SVar:XYou:Count$Valid Creature.withFlying+YouCtrl/Times.2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wing_storm.jpg -SetInfo:PCY|Uncommon|http://magiccards.info/scans/en/pr/135.jpg -End diff --git a/res/cardsfolder/wingbeat_warrior.txt b/res/cardsfolder/wingbeat_warrior.txt deleted file mode 100644 index 90b461d9ea2..00000000000 --- a/res/cardsfolder/wingbeat_warrior.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wingbeat Warrior -ManaCost:2 W -Types:Creature Bird Soldier Warrior -Text:no text -PT:2/1 -K:Flying -K:Morph:2 W -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, target creature gains first strike until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wingbeat_warrior.jpg -SetInfo:LGN|Common|http://magiccards.info/scans/en/le/29.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winged_coatl.txt b/res/cardsfolder/winged_coatl.txt deleted file mode 100644 index 6955b45264b..00000000000 --- a/res/cardsfolder/winged_coatl.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Winged Coatl -ManaCost:1 G U -Types:Creature Snake -Text:no text -PT:1/1 -K:Flash -K:Flying -K:Deathtouch -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/winged_coatl.jpg -SetInfo:ARB|Common|http://magiccards.info/scans/en/arb/105.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winged_sliver.txt b/res/cardsfolder/winged_sliver.txt deleted file mode 100644 index 30ac572c1b0..00000000000 --- a/res/cardsfolder/winged_sliver.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Winged Sliver -ManaCost:1 U -Types:Creature Sliver -Text:no text -PT:1/1 -K:stPumpAll:Creature.Sliver:0/0/Flying:No Condition:All Sliver creatures have flying. -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/winged_sliver.jpg -SetInfo:TMP|Common|http://magiccards.info/scans/en/tp/106.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wingrattle_scarecrow.txt b/res/cardsfolder/wingrattle_scarecrow.txt deleted file mode 100644 index f9d24f932d2..00000000000 --- a/res/cardsfolder/wingrattle_scarecrow.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wingrattle Scarecrow -ManaCost:3 -Types:Artifact Creature Scarecrow -Text:no text -PT:2/2 -K:stPumpSelf:Creature:0/0/Flying:isPresent Creature.Blue+YouCtrl:CARDNAME has flying as long as you control a blue creature. -K:stPumpSelf:Creature:0/0/Persist:isPresent Creature.Black+YouCtrl:CARDNAME has persist as long as you control a black creature. -SVar:BuffedBy:Creature.Black,Creature.Blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wingrattle_scarecrow.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/270.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wings_of_aesthir.txt b/res/cardsfolder/wings_of_aesthir.txt deleted file mode 100644 index 8be4e65ec7e..00000000000 --- a/res/cardsfolder/wings_of_aesthir.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wings of Aesthir -ManaCost:W U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+0/Flying & First Strike -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wings_of_aesthir.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/383.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wings_of_hope.txt b/res/cardsfolder/wings_of_hope.txt deleted file mode 100644 index ff54abe8e2d..00000000000 --- a/res/cardsfolder/wings_of_hope.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wings of Hope -ManaCost:W U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+1/+3/Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wings_of_hope.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/289.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wings_of_velis_vel.txt b/res/cardsfolder/wings_of_velis_vel.txt deleted file mode 100644 index 290b69536e0..00000000000 --- a/res/cardsfolder/wings_of_velis_vel.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wings of Velis Vel -ManaCost:1 U -Types:Tribal Instant Shapeshifter -Text:no text -K:Changeling -A:SP$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Power$ 4 | Toughness$ 4 | Keywords$ Flying & HIDDEN Changeling| SpellDescription$ Target creature becomes 4/4, gains all creature types, and gains flying until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wings_of_velis_vel.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winnower_patrol.txt b/res/cardsfolder/winnower_patrol.txt deleted file mode 100644 index 28dc6a4b4de..00000000000 --- a/res/cardsfolder/winnower_patrol.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Winnower Patrol -ManaCost:2 G -Types:Creature Elf Warrior -Text: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. -PT:3/2 -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/winnower_patrol.jpg -SetInfo:MOR|Common|http://magiccards.info/scans/en/mt/139.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winter_orb.txt b/res/cardsfolder/winter_orb.txt deleted file mode 100644 index 9ae1b237cb2..00000000000 --- a/res/cardsfolder/winter_orb.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Winter Orb -ManaCost:2 -Types:Artifact -Text:Players can't untap more than one land during their untap steps. (NOTE: The ruling for this card was changed.) -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/winter_orb.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/275.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/277.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/408.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/376.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/280.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/276.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winter_sky.txt b/res/cardsfolder/winter_sky.txt deleted file mode 100644 index 461a3cc582b..00000000000 --- a/res/cardsfolder/winter_sky.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Winter Sky -ManaCost:R -Types:Sorcery -Text:no text -A:SP$ FlipACoin | Cost$ R | WinSubAbility$ DBDamageAll | LoseSubAbility$ DBDraw | SpellDescription$ Flip a coin. If you win the flip, CARDNAME deals 1 damage to each creature and each player. If you lose the flip, each player draws a card. -SVar:DBDamageAll:DB$DamageAll | NumDmg$ 1 | ValidCards$ Creature | ValidPlayers$ Each | ValidDescription$ each creature and each player. -SVar:DBDraw:DB$Draw | Defined$ Each -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/winter_sky.jpg -SetInfo:HML|Rare|http://magiccards.info/scans/en/hl/100.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wintermoon_mesa.txt b/res/cardsfolder/wintermoon_mesa.txt deleted file mode 100644 index 1bec5cb7729..00000000000 --- a/res/cardsfolder/wintermoon_mesa.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wintermoon Mesa -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Tap | Cost$ 2 T Sac<1/CARDNAME> | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select target land | ValidTgts$ Land | SpellDescription$ Tap two target lands. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wintermoon_mesa.jpg -SetInfo:PCY|Rare|http://magiccards.info/scans/en/pr/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/winters_grasp.txt b/res/cardsfolder/winters_grasp.txt deleted file mode 100644 index c0ec9757baa..00000000000 --- a/res/cardsfolder/winters_grasp.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Winter's Grasp -ManaCost:1 G G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 1 G G | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Destroy target land. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/winters_grasp.jpg -SetInfo:TMP|Uncommon|http://magiccards.info/scans/en/tp/159.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/120.jpg -End diff --git a/res/cardsfolder/winters_night.txt b/res/cardsfolder/winters_night.txt deleted file mode 100644 index cb9a46de555..00000000000 --- a/res/cardsfolder/winters_night.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Winter's Night -ManaCost:R G W -Types:World Enchantment -Text:no text -T:Mode$ TapsForMana | ValidCard$ Land.Snow | Execute$ TrigMana | TriggerZones$ Battlefield | TriggerDescription$ 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. -SVar:TrigMana:AB$ManaReflected | Cost$ 0 | ColorOrType$ Type | Valid$ Defined.Triggered | ReflectProperty$ Produced | Defined$ TriggeredPlayer | SubAbility$ SVar=DBPump -SVar:DBPump:DB$Pump | Defined$ TriggeredCard | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/winters_night.jpg -SetInfo:ALL|Rare|http://magiccards.info/scans/en/ai/199.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wipe_away.txt b/res/cardsfolder/wipe_away.txt deleted file mode 100644 index 7a862128180..00000000000 --- a/res/cardsfolder/wipe_away.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wipe Away -ManaCost:1 U U -Types:Instant -Text:no text -K:Split second -A:SP$ ChangeZone | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent to its owner's hand. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wipe_away.jpg -SetInfo:TSP|Uncommon|http://magiccards.info/scans/en/ts/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wipe_clean.txt b/res/cardsfolder/wipe_clean.txt deleted file mode 100644 index 39b9cf87292..00000000000 --- a/res/cardsfolder/wipe_clean.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wipe Clean -ManaCost:1 W -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target enchantment. -K:Cycling:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wipe_clean.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirecat.txt b/res/cardsfolder/wirecat.txt deleted file mode 100644 index 113b68db7d2..00000000000 --- a/res/cardsfolder/wirecat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wirecat -ManaCost:4 -Types:Artifact Creature Cat -Text:no text -PT:4/3 -K:stPumpSelf:Creature:0/0/HIDDEN CARDNAME can't attack or block.:isPresent Enchantment:Wirecat can't attack or block if an enchantment is on the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirecat.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/317.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirefly_hive.txt b/res/cardsfolder/wirefly_hive.txt deleted file mode 100644 index 831555be59c..00000000000 --- a/res/cardsfolder/wirefly_hive.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirefly Hive -ManaCost:3 -Types:Artifact -Text:no text -A:AB$ FlipACoin | Cost$ 3 T | WinSubAbility$ DBToken | LoseSubAbility$ DBDestroyAll | SpellDescription$ 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. -SVar:DBDestroyAll:DB$DestroyAll | ValidCards$ Permanent.namedWirefly -SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenName$ Wirefly | TokenTypes$ Creature,Artifact,Insect | TokenOwner$ You | TokenColors$ Colorless | TokenPower$ 2 | TokenToughness$ 2 | TokenKeywords$ Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirefly_hive.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_channeler.txt b/res/cardsfolder/wirewood_channeler.txt deleted file mode 100644 index 09fd456b537..00000000000 --- a/res/cardsfolder/wirewood_channeler.txt +++ /dev/null @@ -1,17 +0,0 @@ -Name:Wirewood Channeler -ManaCost:3 G -Types:Creature Elf Druid -Text:no text -PT:2/2 -A:AB$ Mana | Cost$ T | Produced$ B | Amount$ X | SpellDescription$ Add B to your mana pool for each Elf on the battlefield. -A:AB$ Mana | Cost$ T | Produced$ W | Amount$ X | SpellDescription$ Add W to your mana pool for each Elf on the battlefield. -A:AB$ Mana | Cost$ T | Produced$ U | Amount$ X | SpellDescription$ Add U to your mana pool for each Elf on the battlefield. -A:AB$ Mana | Cost$ T | Produced$ G | Amount$ X | SpellDescription$ Add G to your mana pool for each Elf on the battlefield. -A:AB$ Mana | Cost$ T | Produced$ R | Amount$ X | SpellDescription$ Add R to your mana pool for each Elf on the battlefield. -SVar:X:Count$Valid Elf -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_channeler.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/144.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_elf.txt b/res/cardsfolder/wirewood_elf.txt deleted file mode 100644 index adb408c9a23..00000000000 --- a/res/cardsfolder/wirewood_elf.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wirewood Elf -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/2 -A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add G to your mana pool. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/ons/en-us/card39828.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/301.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_guardian.txt b/res/cardsfolder/wirewood_guardian.txt deleted file mode 100644 index e54a80819fa..00000000000 --- a/res/cardsfolder/wirewood_guardian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wirewood Guardian -ManaCost:5 G G -Types:Creature Elf Mutant -Text:no text -PT:6/6 -K:TypeCycling:Forest:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_guardian.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_herald.txt b/res/cardsfolder/wirewood_herald.txt deleted file mode 100644 index 9d756023a27..00000000000 --- a/res/cardsfolder/wirewood_herald.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirewood Herald -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, you may search your library for an Elf card, reveal that card, put it into your hand, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card.Elf | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_herald.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/302.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_hivemaster.txt b/res/cardsfolder/wirewood_hivemaster.txt deleted file mode 100644 index 9e2a7e9026b..00000000000 --- a/res/cardsfolder/wirewood_hivemaster.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirewood Hivemaster -ManaCost:1 G -Types:Creature Elf -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Elf.nonToken+Other | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMakeToken | TriggerDescription$ Whenever another nontoken Elf enters the battlefield, you may put a 1/1 green Insect creature token onto the battlefield. -SVar:TrigMakeToken:AB$Token | Cost$ 0 | TokenAmount$ 1 | TokenName$ Insect | TokenTypes$ Creature,Insect | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_hivemaster.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/145.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_lodge.txt b/res/cardsfolder/wirewood_lodge.txt deleted file mode 100644 index 676cbe5155d..00000000000 --- a/res/cardsfolder/wirewood_lodge.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirewood Lodge -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Untap | Cost$ G T | ValidTgts$ Elf | TgtPrompt$ Select target Elf | SpellDescription$ Untap target Elf. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_lodge.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/329.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_pride.txt b/res/cardsfolder/wirewood_pride.txt deleted file mode 100644 index 875af17ff71..00000000000 --- a/res/cardsfolder/wirewood_pride.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wirewood Pride -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ +X | SpellDescription$ Target creature gets +X/+X until end of turn, where X is the number of Elves on the battlefield. -SVar:X:Count$TypeOnBattlefield.Elf -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_pride.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/303.jpg -End diff --git a/res/cardsfolder/wirewood_savage.txt b/res/cardsfolder/wirewood_savage.txt deleted file mode 100644 index b537dc1b3d4..00000000000 --- a/res/cardsfolder/wirewood_savage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirewood Savage -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Beast | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever a Beast enters the battlefield, you may draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_savage.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/304.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wirewood_symbiote.txt b/res/cardsfolder/wirewood_symbiote.txt deleted file mode 100644 index b822a018194..00000000000 --- a/res/cardsfolder/wirewood_symbiote.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wirewood Symbiote -ManaCost:G -Types:Creature Insect -Text:no text -PT:1/1 -A:AB$ Untap | Cost$ Return<1/Elf> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ActivationLimit$ 1 | SpellDescription$ Untap target creature. Activate this ability only once each turn. -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wirewood_symbiote.jpg -SetInfo:SCG|Uncommon|http://magiccards.info/scans/en/sc/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wispmare.txt b/res/cardsfolder/wispmare.txt deleted file mode 100644 index 16a1eeedc45..00000000000 --- a/res/cardsfolder/wispmare.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wispmare -ManaCost:2 W -Types:Creature Elemental -Text:no text -PT:1/3 -K:Flying -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target enchantment. -K:Evoke:W -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+evoked | Execute$ TrigSac | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it by it's evoke cost, sacrifice it. -SVar:TrigSac:AB$Sacrifice | Cost$ 0 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wispmare.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/48.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wistful_selkie.txt b/res/cardsfolder/wistful_selkie.txt deleted file mode 100644 index 86b1d68250d..00000000000 --- a/res/cardsfolder/wistful_selkie.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wistful Selkie -ManaCost:GU GU GU -Types:Creature Merfolk Wizard -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. -SVar:TrigDraw:AB$Draw | Cost$ 0 | Defined$ You | NumCards$ 1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wistful_selkie.jpg -SetInfo:EVE|Uncommon|http://magiccards.info/scans/en/eve/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wistful_thinking.txt b/res/cardsfolder/wistful_thinking.txt deleted file mode 100644 index 258ccd49717..00000000000 --- a/res/cardsfolder/wistful_thinking.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wistful Thinking -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ Draw | Cost$ 2 U | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws two cards, then discards four cards. | SubAbility$ SVar=DBDiscard -SVar:DBDiscard:DB$Discard | Defined$ Targeted | NumCards$ 4 | Mode$ TgtChoose -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wistful_thinking.jpg -SetInfo:PLC|Common|http://magiccards.info/scans/en/pc/53.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/witch_hunter.txt b/res/cardsfolder/witch_hunter.txt deleted file mode 100644 index 4045e751bf2..00000000000 --- a/res/cardsfolder/witch_hunter.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Witch Hunter -ManaCost:2 W W -Types:Creature Human Cleric -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | NumDmg$ 1 | Tgt$ TgtP | SpellDescription$ CARDNAME deals 1 damage to target player. -A:AB$ ChangeZone | Cost$ 1 W W T | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target creature you don't control to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/witch_hunter.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/92.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/17.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/witch_maw_nephilim.txt b/res/cardsfolder/witch_maw_nephilim.txt deleted file mode 100644 index 7d524237e82..00000000000 --- a/res/cardsfolder/witch_maw_nephilim.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Witch-Maw Nephilim -ManaCost:G W U B -Types:Creature Nephilim -Text:Whenever CARDNAME attacks, it gains trample until end of turn if its power is 10 or greater. -PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cast a spell, you may put two +1/+1 counters on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 -SVar:BuffedBy:Spell -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/witch_maw_nephilim.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/138.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/witchs_mist.txt b/res/cardsfolder/witchs_mist.txt deleted file mode 100644 index 84269827a62..00000000000 --- a/res/cardsfolder/witchs_mist.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Witch's Mist -ManaCost:2 B -Types:Enchantment -Text:no text -A:AB$ Destroy | Cost$ 2 B T | ValidTgts$ Creature.wasDealtDamageThisTurn | TgtPrompt$ Select target creature that was dealt damage this turn | SpellDescription$ Destroy target creature that was dealt damage this turn. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/witchs_mist.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withered_wretch.txt b/res/cardsfolder/withered_wretch.txt deleted file mode 100644 index 58ab56b3e9c..00000000000 --- a/res/cardsfolder/withered_wretch.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Withered Wretch -ManaCost:B B -Types:Creature Zombie Cleric -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ 1 | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in a graveyard | ValidTgts$ Card | SpellDescription$ Exile target card from a graveyard. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/withered_wretch.jpg -SetInfo:LGN|Uncommon|http://magiccards.info/scans/en/le/86.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withering_boon.txt b/res/cardsfolder/withering_boon.txt deleted file mode 100644 index 8976546ac25..00000000000 --- a/res/cardsfolder/withering_boon.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Withering Boon -ManaCost:1 B -Types:Instant -Text:no text -A:SP$ Counter | Cost$ 1 B PayLife<3> | TargetType$ Spell | TgtPrompt$ Select target Creature spell | ValidTgts$ Creature | SpellDescription$ Counter target creature spell. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_boon.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withering_gaze.txt b/res/cardsfolder/withering_gaze.txt deleted file mode 100644 index 58baa296a5d..00000000000 --- a/res/cardsfolder/withering_gaze.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Withering Gaze -ManaCost:2 U -Types:Sorcery -Text:no text -A:SP$ RevealHand | Cost$ 2 U | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ SVar=DBDraw | SpellDescription$ Target opponent reveals his or her hand. You draw a card for each Forest and green card in it. -SVar:DBDraw:DB$Draw | NumCards$ X -SVar:X:Count$TypeInOppHand.Forest/Plus.Y -SVar:Y:Count$GreenInOppHand -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_gaze.jpg -SetInfo:POR|Uncommon|http://magiccards.info/scans/en/po/79.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withering_hex.txt b/res/cardsfolder/withering_hex.txt deleted file mode 100644 index eb1b7762a9d..00000000000 --- a/res/cardsfolder/withering_hex.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Withering Hex -ManaCost:B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ Cycled | ValidCard$ Card | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever a player cycles a card, put a plague counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ PLAGUE | CounterNum$ 1 -K:stPumpEnchanted:Creature:X/X:no condition:Enchanted creature gets -1/-1 for each plague counter on CARDNAME. -SVar:X:Count$CardCounters.PLAGUE/Times.-1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/withering_hex.jpg -SetInfo:ONS|Uncommon|http://magiccards.info/scans/en/on/181.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withstand.txt b/res/cardsfolder/withstand.txt deleted file mode 100644 index a2f6489c231..00000000000 --- a/res/cardsfolder/withstand.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Withstand -ManaCost:2 W -Types:Instant -Text:no text -A:SP$ PreventDamage | Cost$ 2 W | Tgt$ TgtCP | Amount$ 3 | SubAbility$ SVar=DBDraw | SpellDescription$ Prevent the next 3 damage that would be dealt to target creature or player this turn. Draw a card. -SVar:DBDraw:DB$Draw | Cost$ 0 | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/withstand.jpg -SetInfo:GPT|Common|http://magiccards.info/scans/en/gp/21.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/withstand_death.txt b/res/cardsfolder/withstand_death.txt deleted file mode 100644 index 79a1ee3278f..00000000000 --- a/res/cardsfolder/withstand_death.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Withstand Death -ManaCost:G -Types:Instant -Text:no text -A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN Indestructible | SpellDescription$ Target creature is indestructible this turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/withstand_death.jpg -SetInfo:SOM|Common|http://magiccards.info/scans/en/som/134.jpg -End diff --git a/res/cardsfolder/wits_end.txt b/res/cardsfolder/wits_end.txt deleted file mode 100644 index 45ed9ef3332..00000000000 --- a/res/cardsfolder/wits_end.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wit's End -ManaCost:5 B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ 5 B B | Mode$ Hand | ValidTgts$ Player | SpellDescription$ Target player discards his or her hand. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card107562.jpg -SetInfo:DIS|Rare|http://magiccards.info/scans/en/di/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wizard_mentor.txt b/res/cardsfolder/wizard_mentor.txt deleted file mode 100644 index bbec53067f5..00000000000 --- a/res/cardsfolder/wizard_mentor.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wizard Mentor -ManaCost:2 U -Types:Creature Wizard -Text:no text -PT:2/2 -A:AB$ ChangeZone | Cost$ T | Origin$ Battlefield | Destination$ Hand | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature. | SubAbility$ SVar=DBChangeZone | SpellDescription$ Return CARDNAME and target creature you control to owner's hand. -SVar:DBChangeZone:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wizard_mentor.jpg -SetInfo:USG|Common|http://magiccards.info/scans/en/us/112.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wizard_replica.txt b/res/cardsfolder/wizard_replica.txt deleted file mode 100644 index bda070d8873..00000000000 --- a/res/cardsfolder/wizard_replica.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wizard Replica -ManaCost:3 -Types:Artifact Creature Wizard -Text:no text -PT:1/3 -K:Flying -A:AB$ Counter | Cost$ U Sac<1/CARDNAME> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays 2. -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wizard_replica.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/275.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wizards_school.txt b/res/cardsfolder/wizards_school.txt deleted file mode 100644 index 79971f7d88e..00000000000 --- a/res/cardsfolder/wizards_school.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wizards' School -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ 1 T | Produced$ U | SpellDescription$ Add U to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ W | SpellDescription$ Add W to your mana pool. -A:AB$ Mana | Cost$ 2 T | Produced$ B | SpellDescription$ Add B to your mana pool. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wizards_school.jpg -SetInfo:HML|Uncommon|http://magiccards.info/scans/en/hl/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wizened_cenn.txt b/res/cardsfolder/wizened_cenn.txt deleted file mode 100644 index 5d318018487..00000000000 --- a/res/cardsfolder/wizened_cenn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wizened Cenn -ManaCost:W W -Types:Creature Kithkin Cleric -Text:no text -PT:2/2 -K:stPumpAll:Creature.Kithkin+Other+YouCtrl:1/1:No Condition:Other Kithkin creatures you control get +1/+1. -SVar:PlayMain1:TRUE -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wizened_cenn.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/49.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woebearer.txt b/res/cardsfolder/woebearer.txt deleted file mode 100644 index 9abea3253d7..00000000000 --- a/res/cardsfolder/woebearer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Woebearer -ManaCost:4 B -Types:Creature Zombie -Text:no text -PT:2/3 -K:Fear -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigReturn | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may return target creature card from your graveyard to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/woebearer.jpg -SetInfo:MRD|Uncommon|http://magiccards.info/scans/en/mi/83.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wojek_embermage.txt b/res/cardsfolder/wojek_embermage.txt deleted file mode 100644 index a8ed30d3eee..00000000000 --- a/res/cardsfolder/wojek_embermage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wojek Embermage -ManaCost:3 R -Types:Creature Human Wizard -Text:no text -PT:1/2 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wojek_embermage.jpg -SetInfo:RAV|Uncommon|http://magiccards.info/scans/en/rav/152.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wolf_skull_shaman.txt b/res/cardsfolder/wolf_skull_shaman.txt deleted file mode 100644 index 1a87b05b9a3..00000000000 --- a/res/cardsfolder/wolf_skull_shaman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wolf-Skull Shaman -ManaCost:1 G -Types:Creature Elf Shaman -Text:Kinship - At the beginning of your upkeep, you may look at the top card of your library. If it shares a creature type with CARDNAME, you may reveal it. If you do, put a 2/2 green Wolf creature token onto the battlefield. -PT:2/2 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wolf_skull_shaman.jpg -SetInfo:MOR|Uncommon|http://magiccards.info/scans/en/mt/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wolfbriar_elemental.txt b/res/cardsfolder/wolfbriar_elemental.txt deleted file mode 100644 index 99274a6c07d..00000000000 --- a/res/cardsfolder/wolfbriar_elemental.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wolfbriar Elemental -ManaCost:2 G G -Types:Creature Elemental -Text:no text -PT:4/4 -K:Multikicker G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, put a 2/2 green Wolf creature token onto the battlefield for each time it was kicked. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenAmount$ X | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 -SVar:X:Count$TimesKicked -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wolfbriar_elemental.jpg -SetInfo:WWK|Rare|http://magiccards.info/scans/en/wwk/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wolverine_pack.txt b/res/cardsfolder/wolverine_pack.txt deleted file mode 100644 index 636e03c8216..00000000000 --- a/res/cardsfolder/wolverine_pack.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wolverine Pack -ManaCost:2 G G -Types:Creature Wolverine -Text:no text -PT:2/4 -K:Rampage 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wolverine_pack.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/206.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wonder.txt b/res/cardsfolder/wonder.txt deleted file mode 100644 index 09be342b525..00000000000 --- a/res/cardsfolder/wonder.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wonder -ManaCost:3 U -Types:Creature Incarnation -Text:As long as Wonder is in your graveyard and you control an Island, creatures you control have Flying. -PT:2/2 -K:Flying -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wonder.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/54.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wood_elves.txt b/res/cardsfolder/wood_elves.txt deleted file mode 100644 index e5df66750b3..00000000000 --- a/res/cardsfolder/wood_elves.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Wood Elves -ManaCost:2 G -Types:Creature Elf Scout -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for a Forest card and put that card onto the battlefield. Then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.Forest | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wood_elves.jpg -SetInfo:8ED|Common|http://magiccards.info/scans/en/8e/289.jpg -SetInfo:7ED|Common|http://magiccards.info/scans/en/7e/284.jpg -SetInfo:EXO|Common|http://magiccards.info/scans/en/ex/130.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/121.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/283.jpg -SetInfo:S99|Uncommon|http://magiccards.info/scans/en/st/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodcloaker.txt b/res/cardsfolder/woodcloaker.txt deleted file mode 100644 index 69cd56d1ad5..00000000000 --- a/res/cardsfolder/woodcloaker.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Woodcloaker -ManaCost:5 G -Types:Creature Elf -Text:no text -PT:3/3 -K:Morph:2 G G -T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME is turned face up, target creature gains trample until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Trample -SVar:PlayMain1:TRUE -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodcloaker.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/134.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wooded_bastion.txt b/res/cardsfolder/wooded_bastion.txt deleted file mode 100644 index b717bd74e69..00000000000 --- a/res/cardsfolder/wooded_bastion.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wooded Bastion -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ GW T | Produced$ W | Amount$ 2 | SpellDescription$ Add W W to your mana pool. -A:AB$ Mana | Cost$ GW T | Produced$ W G | SpellDescription$ Add W G to your mana pool. -A:AB$ Mana | Cost$ GW T | Produced$ G | Amount$ 2 | SpellDescription$ Add G G to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wooded_bastion.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/281.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wooded_foothills.txt b/res/cardsfolder/wooded_foothills.txt deleted file mode 100644 index c9799978982..00000000000 --- a/res/cardsfolder/wooded_foothills.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wooded Foothills -ManaCost:no cost -Types:Land -Text:no text -A:AB$ ChangeZone | Cost$ T PayLife<1> Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | ChangeType$ Mountain,Forest | ChangeNum$ 1 | SpellDescription$ Search your library for a Mountain or Forest card and put it onto the battlefield. Then shuffle your library. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wooded_foothills.jpg -SetInfo:ONS|Rare|http://magiccards.info/scans/en/on/330.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wooden_sphere.txt b/res/cardsfolder/wooden_sphere.txt deleted file mode 100644 index fddb2d0cb3c..00000000000 --- a/res/cardsfolder/wooden_sphere.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Wooden Sphere -ManaCost:1 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a green spell, you may pay 1. If you do, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 1 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wooden_sphere.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/321.jpg -SetInfo:LEA|Uncommon|http://magiccards.info/scans/en/al/276.jpg -SetInfo:LEB|Uncommon|http://magiccards.info/scans/en/be/278.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/324.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/409.jpg -SetInfo:4ED|Uncommon|http://magiccards.info/scans/en/4e/377.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/318.jpg -SetInfo:3ED|Uncommon|http://magiccards.info/scans/en/rv/281.jpg -SetInfo:2ED|Uncommon|http://magiccards.info/scans/en/un/277.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodfall_primus.txt b/res/cardsfolder/woodfall_primus.txt deleted file mode 100644 index e7ed010dcd6..00000000000 --- a/res/cardsfolder/woodfall_primus.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Woodfall Primus -ManaCost:5 G G G -Types:Creature Treefolk Shaman -Text:no text -PT:6/6 -K:Trample -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target noncreature permanent. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Permanent.nonCreature | TgtPrompt$ Select a noncreature permanent. -K:Persist -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodfall_primus.jpg -SetInfo:SHM|Rare|http://magiccards.info/scans/en/shm/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodland_changeling.txt b/res/cardsfolder/woodland_changeling.txt deleted file mode 100644 index 04e9694e5b4..00000000000 --- a/res/cardsfolder/woodland_changeling.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Woodland Changeling -ManaCost:1 G -Types:Creature Shapeshifter -Text:no text -PT:2/2 -K:Changeling -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodland_changeling.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/242.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodland_druid.txt b/res/cardsfolder/woodland_druid.txt deleted file mode 100644 index 5f1daf879f8..00000000000 --- a/res/cardsfolder/woodland_druid.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Woodland Druid -ManaCost:G -Types:Creature Human Druid -Text:no text -PT:1/2 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card29772.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/284.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodland_guidance.txt b/res/cardsfolder/woodland_guidance.txt deleted file mode 100644 index 5298f83c799..00000000000 --- a/res/cardsfolder/woodland_guidance.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Woodland Guidance -ManaCost:3 G -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 G | ValidTgts$ Card.YouCtrl | Origin$ Graveyard | Destination$ Hand | SubAbility$ SVar=DBClash | spellDescription$ Return target card from your graveyard to your hand. Clash with an opponent. If you win, untap all Forests you control. -SVar:DBClash:DB$Clash | WinSubAbility$ DBUntap -SVar:DBUntap:DB$UntapAll | ValidCards$ Forest.YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodland_guidance.jpg -SetInfo:LRW|Uncommon|http://magiccards.info/scans/en/lw/243.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodlurker_mimic.txt b/res/cardsfolder/woodlurker_mimic.txt deleted file mode 100644 index bfe0e5b275c..00000000000 --- a/res/cardsfolder/woodlurker_mimic.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Woodlurker Mimic -ManaCost:1 BG -Types:Creature Shapeshifter -Text:no text -PT:2/1 -T:Mode$ SpellCast | ValidCard$ Card.Black+Green | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a spell that's both black and green, CARDNAME becomes 4/5 and gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) -SVar:TrigAnimate:AB$Animate | Cost$ 0 | Defined$ Self | Power$ 4 | Toughness$ 5 | Keywords$ Wither -SVar:BuffedBy:Spell.Black+Green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodlurker_mimic.jpg -SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodripper.txt b/res/cardsfolder/woodripper.txt deleted file mode 100644 index 1f4cd205a62..00000000000 --- a/res/cardsfolder/woodripper.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Woodripper -ManaCost:3 G G -Types:Creature Beast -Text:no text -PT:4/6 -A:AB$ Destroy | Cost$ 1 SubCounter<1/FADE> | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. -K:Fading:3 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodripper.jpg -SetInfo:NMS|Uncommon|http://magiccards.info/scans/en/ne/125.jpg -End diff --git a/res/cardsfolder/woodwraith_corrupter.txt b/res/cardsfolder/woodwraith_corrupter.txt deleted file mode 100644 index 39f61bd0457..00000000000 --- a/res/cardsfolder/woodwraith_corrupter.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Woodwraith Corrupter -ManaCost:3 B B G -Types:Creature Elemental Horror -Text:no text -PT:3/6 -A:AB$ Animate | Cost$ 1 B G T | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental,Horror | Colors$ Black,Green | Permanent$ True | SpellDescription$ Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodwraith_corrupter.jpg -SetInfo:RAV|Rare|http://magiccards.info/scans/en/rav/240.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woodwraith_strangler.txt b/res/cardsfolder/woodwraith_strangler.txt deleted file mode 100644 index c47d358a31f..00000000000 --- a/res/cardsfolder/woodwraith_strangler.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Woodwraith Strangler -ManaCost:2 B G -Types:Creature Plant Zombie -Text:no text -PT:2/2 -A:AB$ Regenerate | Cost$ ExileFromGrave<1/Creature> | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woodwraith_strangler.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/241.jpg -End - diff --git a/res/cardsfolder/woolly_mammoths.txt b/res/cardsfolder/woolly_mammoths.txt deleted file mode 100644 index bb59b24b317..00000000000 --- a/res/cardsfolder/woolly_mammoths.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Woolly Mammoths -ManaCost:1 G G -Types:Creature Elephant -Text:no text -PT:3/2 -K:stPumpSelf:Creature:0/0/Trample:isPresent Land.Snow+YouCtrl:Woolly Mammoths has trample as long as you control a snow land. -SVar:BuffedBy:Land.Snow -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woolly_mammoths.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/166.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woolly_spider.txt b/res/cardsfolder/woolly_spider.txt deleted file mode 100644 index 165e09d056d..00000000000 --- a/res/cardsfolder/woolly_spider.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Woolly Spider -ManaCost:1 G G -Types:Creature Spider -Text:no text -PT:2/3 -K:Reach -T:Mode$ Blocks | ValidCard$ Card.Self | ValidBlocked$ Creature.withFlying | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature with flying, CARDNAME gets +0/+2 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumDef$ 2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/woolly_spider.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/167.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/woolly_thoctar.txt b/res/cardsfolder/woolly_thoctar.txt deleted file mode 100644 index ee22190c825..00000000000 --- a/res/cardsfolder/woolly_thoctar.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Woolly Thoctar -ManaCost:R G W -Types:Creature Beast -Text:no text -PT:5/4 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/woolly_thoctar.jpg -SetInfo:ALA|Uncommon|http://magiccards.info/scans/en/ala/209.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/word_of_binding.txt b/res/cardsfolder/word_of_binding.txt deleted file mode 100644 index af7748ca2f3..00000000000 --- a/res/cardsfolder/word_of_binding.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Word of Binding -ManaCost:X B B -Types:Sorcery -Text:no text -A:SP$ Tap | Cost$ X B B | TargetMin$ 0 | TargetMax$ MaxTgts | ValidTgts$ Creature | TgtPrompt$ Select target Creatures | SpellDescription$ Tap X target creatures. -# It may seem wrong to not use X in the target, but since the Targets are what defines X, it's redundant (and not supported by the code) -SVar:X:Targeted$Amount -SVar:MaxTgts:Count$Valid Creature -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/word_of_binding.jpg -SetInfo:DRK|Common|http://magiccards.info/scans/en/dk/17.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/word_of_blasting.txt b/res/cardsfolder/word_of_blasting.txt deleted file mode 100644 index 643b900eae7..00000000000 --- a/res/cardsfolder/word_of_blasting.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Word of Blasting -ManaCost:1 R -Types:Instant -Text:no text -A:SP$ Destroy | Cost$ 1 R | ValidTgts$ Wall | TgtPrompt$ Select target Wall | SubAbility$ SVar=DBDamage| SpellDescription$ Destroy target Wall. It can't be regenerated. CARDNAME deals damage equal to that Wall's converted mana cost to the Wall's controller. -SVar:DBDamage:DB$DealDamage | NumDmg$ X | Defined$ TargetedController -SVar:X:Targeted$CardManaCost -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/word_of_blasting.jpg -SetInfo:5ED|Uncommon|http://magiccards.info/scans/en/5e/276.jpg -SetInfo:MMQ|Uncommon|http://magiccards.info/scans/en/mm/228.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/224.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/word_of_seizing.txt b/res/cardsfolder/word_of_seizing.txt deleted file mode 100644 index 7bdcfaa85ee..00000000000 --- a/res/cardsfolder/word_of_seizing.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Word of Seizing -ManaCost:3 R R -Types:Instant -Text:no text -K:Split second -A:SP$ GainControl | Cost$ 3 R R | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Untap target permanent and gain control of it until end of turn. It gains haste until end of turn. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/word_of_seizing.jpg -SetInfo:TSP|Rare|http://magiccards.info/scans/en/ts/188.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/words_of_wisdom.txt b/res/cardsfolder/words_of_wisdom.txt deleted file mode 100644 index 8bbfa55f07b..00000000000 --- a/res/cardsfolder/words_of_wisdom.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Words of Wisdom -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Draw | Cost$ 1 U | NumCards$ 2 | SubAbility$ SVar=DBDraw | SpellDescription$ You draw two cards, then each other player draws a card. -SVar:DBDraw:DB$Draw | Defined$ Opponent | NumCards$ 1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/od/en-us/card31779.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/workhorse.txt b/res/cardsfolder/workhorse.txt deleted file mode 100644 index 58bc7616430..00000000000 --- a/res/cardsfolder/workhorse.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Workhorse -ManaCost:6 -Types:Artifact Creature Horse -Text:no text -PT:0/0 -K:etbCounter:P1P1:4 -A:AB$ Mana | Cost$ SubCounter<1/P1P1> | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/workhorse.jpg -SetInfo:EXO|Rare|http://magiccards.info/scans/en/ex/142.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worldgorger_dragon.txt b/res/cardsfolder/worldgorger_dragon.txt deleted file mode 100644 index be388a14b5f..00000000000 --- a/res/cardsfolder/worldgorger_dragon.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Worldgorger Dragon -ManaCost:3 R R R -Types:Creature Nightmare Dragon -Text:no text -PT:7/7 -K:Flying -K:Trample -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile all other permanents you control. -SVar:TrigExile:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Permanent.YouCtrl+Other | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to the battlefield under their owners' control. -SVar:TrigReturn:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Exile | Destination$ Battlefield | Defined$ Remembered -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/worldgorger_dragon.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worldly_counsel.txt b/res/cardsfolder/worldly_counsel.txt deleted file mode 100644 index 97b5194c4ce..00000000000 --- a/res/cardsfolder/worldly_counsel.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Worldly Counsel -ManaCost:1 U -Types:Instant -Text:no text -A:SP$ Dig | Cost$ 1 U | DigNum$ X | SpellDescription$ 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. -SVar:X:Count$Domain -SVar:RemAIDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/worldly_counsel.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/89.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/39.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worldly_tutor.txt b/res/cardsfolder/worldly_tutor.txt deleted file mode 100644 index 31c9bec95da..00000000000 --- a/res/cardsfolder/worldly_tutor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Worldly Tutor -ManaCost:G -Types:Instant -Text:no text -A:SP$ ChangeZone | Cost$ G | Origin$ Library | Destination$ Library | LibraryPosition$ 0 | ChangeType$ Creature | ChangeNum$ 1 | SpellDescription$ Search your library for a creature card and reveal that card. Shuffle your library, then put the card on top of it. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/mi/en-us/card3424.jpg -SetInfo:6ED|Uncommon|http://magiccards.info/scans/en/6e/269.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/153.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worldslayer.txt b/res/cardsfolder/worldslayer.txt deleted file mode 100644 index 4b4f56e8352..00000000000 --- a/res/cardsfolder/worldslayer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Worldslayer -ManaCost:5 -Types:Artifact Equipment -Text:no text -K:eqPump 5:+0/+0 -T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | Execute$ TrigDestroyAll | TriggerZones$ Battlefield | CombatDamage$ True | TriggerDescription$ Whenever equipped creature deals combat damage to a player, destroy all permanents other than CARDNAME. -SVar:TrigDestroyAll:AB$DestroyAll | Cost$ 0 | ValidCards$ Permanent.Other -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/worldslayer.jpg -SetInfo:MRD|Rare|http://magiccards.info/scans/en/mi/276.jpg -End diff --git a/res/cardsfolder/worm_harvest.txt b/res/cardsfolder/worm_harvest.txt deleted file mode 100644 index befa78513e8..00000000000 --- a/res/cardsfolder/worm_harvest.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Worm Harvest -ManaCost:2 BG BG BG -Types:Sorcery -Text:no text -A:SP$ Token | Cost$ 2 BG BG BG | TokenAmount$ X | TokenName$ Worm | TokenTypes$ Creature,Worm | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 black and green Worm creature token onto the battlefield for each land card in your graveyard. -A:SP$ Token | Cost$ 2 BG BG BG Discard<1/Land> | ActivatingZone$ Graveyard | CostDesc$ Retrace | TokenAmount$ X | TokenName$ Worm | TokenTypes$ Creature,Worm | TokenOwner$ You | TokenColors$ Black,Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ (You may cast this card from your graveyard by discarding a land card in addition to paying its other costs.) -SVar:X:Count$TypeInYourYard.Land -SVar:Rarity:Rare -SVar:Picture:http://magiccards.info/scans/en/eve/131.jpg -SetInfo:EVE|Rare|http://magiccards.info/scans/en/eve/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormfang_behemoth.txt b/res/cardsfolder/wormfang_behemoth.txt deleted file mode 100644 index 7a3aa54de9d..00000000000 --- a/res/cardsfolder/wormfang_behemoth.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wormfang Behemoth -ManaCost:3 U U -Types:Creature Nightmare Fish Beast -Text:no text -PT:5/5 -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile all cards from your hand. -SVar:TrigExile:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Hand | Destination$ Exile | RememberTargets$ True | ForgetOtherTargets$ True -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Any | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled cards to their owner's hand. -SVar:TrigReturn:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Card | Origin$ Exile | Destination$ Hand | Defined$ Remembered -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_behemoth.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormfang_drake.txt b/res/cardsfolder/wormfang_drake.txt deleted file mode 100644 index 72a44f88db6..00000000000 --- a/res/cardsfolder/wormfang_drake.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Wormfang Drake -ManaCost:2 U -Types:Creature Nightmare Drake -Text:no text -PT:3/4 -K:Flying -K:Champion:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_drake.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormfang_manta.txt b/res/cardsfolder/wormfang_manta.txt deleted file mode 100644 index 053b43baf87..00000000000 --- a/res/cardsfolder/wormfang_manta.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wormfang Manta -ManaCost:5 U U -Types:Creature Nightmare Fish Beast -Text:no text -PT:6/1 -K:Flying -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigSkip | TriggerDescription$ When CARDNAME enters the battlefield, you skip your next turn. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigAdd | TriggerDescription$ When CARDNAME leaves the battlefield, you take an extra turn after this one. -SVar:TrigAdd:AB$AddTurn | Cost$ 0 | NumTurns$ 1 | Defined$ You -SVar:TrigSkip:AB$AddTurn | Cost$ 0 | NumTurns$ 1 | Defined$ Opponent -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_manta.jpg -SetInfo:JUD|Rare|http://magiccards.info/scans/en/ju/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormfang_newt.txt b/res/cardsfolder/wormfang_newt.txt deleted file mode 100644 index 3e3660e617b..00000000000 --- a/res/cardsfolder/wormfang_newt.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wormfang Newt -ManaCost:1 U -Types:Creature Nightmare Salamander Beast -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile a land you control. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | TargetMin$ 1 | ValidTgts$ Land.YouCtrl | TgtPrompt$ Choose target land you control | RememberTargets$ True | ForgetOtherTargets$ True -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_newt.jpg -SetInfo:JUD|Common|http://magiccards.info/scans/en/ju/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormfang_turtle.txt b/res/cardsfolder/wormfang_turtle.txt deleted file mode 100644 index 61c77d56e0b..00000000000 --- a/res/cardsfolder/wormfang_turtle.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wormfang Turtle -ManaCost:2 U -Types:Creature Nightmare Turtle Beast -Text:no text -PT:2/4 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile a land you control. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME leaves the battlefield, return the exiled card to the battlefield under its owner's control. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Exile | TargetMin$ 1 | ValidTgts$ Land.YouCtrl | TgtPrompt$ Choose target land you control | RememberTargets$ True | ForgetOtherTargets$ True -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormfang_turtle.jpg -SetInfo:JUD|Uncommon|http://magiccards.info/scans/en/ju/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wormwood_dryad.txt b/res/cardsfolder/wormwood_dryad.txt deleted file mode 100644 index ebbb1224c7e..00000000000 --- a/res/cardsfolder/wormwood_dryad.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wormwood Dryad -ManaCost:2 G -Types:Creature Dryad -Text:no text -PT:3/1 -A:AB$ Pump | Cost$ G | KW$ Forestwalk | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gains forestwalk until end of turn and deals 1 damage to you. -A:AB$ Pump | Cost$ B | KW$ Swampwalk | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gains swampwalk until end of turn and deals 1 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormwood_dryad.jpg -SetInfo:TSP|Common|http://magiccards.info/scans/en/ts/233.jpg -End diff --git a/res/cardsfolder/wormwood_treefolk.txt b/res/cardsfolder/wormwood_treefolk.txt deleted file mode 100644 index a621e397bcd..00000000000 --- a/res/cardsfolder/wormwood_treefolk.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wormwood Treefolk -ManaCost:3 G G -Types:Creature Treefolk -Text:no text -PT:4/4 -A:AB$ Pump | Cost$ G G | KW$ Forestwalk | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gains forestwalk until end of turn and deals 2 damage to you. -A:AB$ Pump | Cost$ B B | KW$ Swampwalk | SubAbility$ SVar=DBDealDamage | SpellDescription$ CARDNAME gains swampwalk until end of turn and deals 2 damage to you. -SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 2 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wormwood_treefolk.jpg -SetInfo:DRK|Rare|http://magiccards.info/scans/en/dk/55.jpg -End diff --git a/res/cardsfolder/worn_powerstone.txt b/res/cardsfolder/worn_powerstone.txt deleted file mode 100644 index cc76282869f..00000000000 --- a/res/cardsfolder/worn_powerstone.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Worn Powerstone -ManaCost:3 -Types:Artifact -Text:no text -K:CARDNAME enters the battlefield tapped. -A:AB$ Mana | Cost$ T | Produced$ 1 | Amount$ 2 | SpellDescription$ Add 2 to your mana pool. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/worn_powerstone.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/318.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worry_beads.txt b/res/cardsfolder/worry_beads.txt deleted file mode 100644 index 2e3216d1094..00000000000 --- a/res/cardsfolder/worry_beads.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Worry Beads -ManaCost:3 -Types:Artifact -Text:no text -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ At the beginning of each player's upkeep, that player puts the top card of his or her library into his or her graveyard. -SVar:TrigMill:AB$Mill | Cost$ 0 | Defined$ TriggeredPlayer | NumCards$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/worry_beads.jpg -SetInfo:MMQ|Rare|http://magiccards.info/scans/en/mm/315.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/worship.txt b/res/cardsfolder/worship.txt deleted file mode 100644 index 98022a7f64c..00000000000 --- a/res/cardsfolder/worship.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Worship -ManaCost:3 W -Types:Enchantment -Text:no text -K:stPumpSelf:Permanent:0/0/Damage that would reduce your life total to less than 1 reduces it to 1 instead.:isPresent Creature.YouCtrl:If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/worship.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/57.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/57.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/55.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/56.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wort_boggart_auntie.txt b/res/cardsfolder/wort_boggart_auntie.txt deleted file mode 100644 index efb0fd14d39..00000000000 --- a/res/cardsfolder/wort_boggart_auntie.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wort, Boggart Auntie -ManaCost:2 B R -Types:Legendary Creature Goblin Shaman -Text:no text -PT:3/3 -K:Fear -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may return target Goblin card from your graveyard to your hand. -SVar:TrigChangeZone:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target Goblin card in your graveyard | ValidTgts$ Goblin.YouCtrl -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wort_boggart_auntie.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/252.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wrap_in_flames.txt b/res/cardsfolder/wrap_in_flames.txt deleted file mode 100644 index 7130bc5e738..00000000000 --- a/res/cardsfolder/wrap_in_flames.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wrap in Flames -ManaCost:3 R -Types:Sorcery -Text:no text -A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ SVar=DBPump | SpellDescription$ CARDNAME deals 1 damage to each of up to three target creatures. Those creatures can't block this turn. -SVar:DBPump:DB$Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wrap_in_flames.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/173.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wrap_in_vigor.txt b/res/cardsfolder/wrap_in_vigor.txt deleted file mode 100644 index 34625beb2b1..00000000000 --- a/res/cardsfolder/wrap_in_vigor.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wrap in Vigor -ManaCost:1 G -Types:Instant -Text:no text -A:AB$RegenerateAll | Cost$ 1 G | ValidCards$ Creature.YouCtrl | SpellDescription$ Regenerate each creature you control. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130331.jpg -SetInfo:FUT|Common|http://magiccards.info/scans/en/fut/141.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wrath_of_god.txt b/res/cardsfolder/wrath_of_god.txt deleted file mode 100644 index 858bf8c30a3..00000000000 --- a/res/cardsfolder/wrath_of_god.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name:Wrath of God -ManaCost:2 W W -Types:Sorcery -Text:no text -A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature | NoRegen$ True | SpellDescription$ Destroy all creatures. They can't be regenerated. -SVar:Rarity:Rare -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83339.jpg -SetInfo:8ED|Rare|http://magiccards.info/scans/en/8e/58.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/229.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/231.jpg -SetInfo:7ED|Rare|http://magiccards.info/scans/en/7e/57.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/308.jpg -SetInfo:POR|Rare|http://magiccards.info/scans/en/po/202.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/56.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/61.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/54.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/230.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/345.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/230.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wrath_of_marit_lage.txt b/res/cardsfolder/wrath_of_marit_lage.txt deleted file mode 100644 index 452b13d694a..00000000000 --- a/res/cardsfolder/wrath_of_marit_lage.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wrath of Marit Lage -ManaCost:3 U U -Types:Enchantment -Text:Red creatures don't untap during their controllers' untap steps. -K:Permanents don't untap during their controllers' untap steps:Creature.Red -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, tap all red creatures. -SVar:TrigTapAll:AB$TapAll | Cost$ 0 | ValidCards$ Creature.Red -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wrath_of_marit_lage.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/115.jpg -SetInfo:ICE|Rare|http://magiccards.info/scans/en/ia/109.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wreak_havoc.txt b/res/cardsfolder/wreak_havoc.txt deleted file mode 100644 index be09d88ae32..00000000000 --- a/res/cardsfolder/wreak_havoc.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wreak Havoc -ManaCost:2 R G -Types:Sorcery -Text:no text -A:SP$ Destroy | Cost$ 2 R G | ValidTgts$ Artifact,Land | TgtPrompt$ Select target artifact or land | SpellDescription$ Destroy target artifact or land. -K:CARDNAME can't be countered. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wreak_havoc.jpg -SetInfo:GPT|Uncommon|http://magiccards.info/scans/en/gp/139.jpg -End diff --git a/res/cardsfolder/wrecking_ball.txt b/res/cardsfolder/wrecking_ball.txt deleted file mode 100644 index 9cde329d631..00000000000 --- a/res/cardsfolder/wrecking_ball.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wrecking Ball -ManaCost:2 B R -Types:Instant -Text:no text -A:SP$Destroy | Cost$ 2 B R | ValidTgts$ Creature,Land | TgtPrompt$ Select target creature or land | SpellDescription$ Destroy target creature or land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wrecking_ball.jpg -SetInfo:DIS|Common|http://magiccards.info/scans/en/di/139.jpg -End diff --git a/res/cardsfolder/wrench_mind.txt b/res/cardsfolder/wrench_mind.txt deleted file mode 100644 index c1470100fe4..00000000000 --- a/res/cardsfolder/wrench_mind.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wrench Mind -ManaCost:B B -Types:Sorcery -Text:no text -A:SP$ Discard | Cost$ B B | ValidTgts$ Player | NumCards$ 2 | UnlessType$ Artifact | Mode$ TgtChoose | SpellDescription$ Target player discards two cards unless he or she discards an artifact card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wrench_mind.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/84.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wrens_run_packmaster.txt b/res/cardsfolder/wrens_run_packmaster.txt deleted file mode 100644 index fb0bf757e9b..00000000000 --- a/res/cardsfolder/wrens_run_packmaster.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wren's Run Packmaster -ManaCost:3 G -Types:Creature Elf Warrior -Text:no text -PT:5/5 -K:stPumpAll:Wolf.YouCtrl:0/0/Deathtouch:No Condition:Each Wolf you control has deathtouch. (Any amount of damage it deals to a creature is enough to destroy that creature.) -K:Champion:Elf -A:AB$ Token | Cost$ 2 G | TokenAmount$ 1 | TokenName$ Wolf | TokenTypes$ Creature,Wolf | TokenOwner$ You | TokenColors$ Green | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a 2/2 green Wolf creature token onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wrens_run_packmaster.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/244.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wretched_anurid.txt b/res/cardsfolder/wretched_anurid.txt deleted file mode 100644 index a91ffcc7ae6..00000000000 --- a/res/cardsfolder/wretched_anurid.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wretched Anurid -ManaCost:1 B -Types:Creature Zombie Frog Beast -Text:no text -PT:3/3 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Whenever another creature enters the battlefield, you lose 1 life. -SVar:TrigLoseLife:AB$LoseLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:AntiBuffedBy:Creature -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wretched_anurid.jpg -SetInfo:ONS|Common|http://magiccards.info/scans/en/on/183.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_admiral.txt b/res/cardsfolder/wu_admiral.txt deleted file mode 100644 index 5fd9de1b000..00000000000 --- a/res/cardsfolder/wu_admiral.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wu Admiral -ManaCost:4 U -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:stPumpSelf:Creature:1/1:isPresent Island.YouDontCtrl:Wu Admiral gets +1/+1 as long as an opponent controls an Island. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_admiral.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_elite_cavalry.txt b/res/cardsfolder/wu_elite_cavalry.txt deleted file mode 100644 index 19c539a49e6..00000000000 --- a/res/cardsfolder/wu_elite_cavalry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wu Elite Cavalry -ManaCost:3 U -Types:Creature Human Soldier -Text:no text -PT:2/3 -K:Horsemanship -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_elite_cavalry.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/58.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_infantry.txt b/res/cardsfolder/wu_infantry.txt deleted file mode 100644 index e337bec28c8..00000000000 --- a/res/cardsfolder/wu_infantry.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Wu Infantry -ManaCost:1 U -Types:Creature Human Soldier -Text:no text -PT:2/1 -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10600.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/59.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_light_cavalry.txt b/res/cardsfolder/wu_light_cavalry.txt deleted file mode 100644 index dd799ff8507..00000000000 --- a/res/cardsfolder/wu_light_cavalry.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wu Light Cavalry -ManaCost:1 U -Types:Creature Human Soldier -Text:no text -PT:1/2 -K:Horsemanship -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_light_cavalry.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/60.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_longbowman.txt b/res/cardsfolder/wu_longbowman.txt deleted file mode 100644 index 0b2a2478acf..00000000000 --- a/res/cardsfolder/wu_longbowman.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wu Longbowman -ManaCost:2 U -Types:Creature Human Soldier Archer -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ CARDNAME deals 1 damage to target creature or player. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_longbowman.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/61.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_scout.txt b/res/cardsfolder/wu_scout.txt deleted file mode 100644 index 0c2b69bd6a2..00000000000 --- a/res/cardsfolder/wu_scout.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wu Scout -ManaCost:1 U -Types:Creature Human Soldier Scout -Text:no text -PT:1/1 -K:Horsemanship -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPeek | TriggerDescription$ When CARDNAME enters the battlefield, look at target opponent's hand. -SVar:TrigPeek:AB$RevealHand | Cost$ 0 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_scout.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_spy.txt b/res/cardsfolder/wu_spy.txt deleted file mode 100644 index 202555f26a8..00000000000 --- a/res/cardsfolder/wu_spy.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wu Spy -ManaCost:1 U -Types:Creature Human Soldier Rogue -Text:no text -PT:1/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top two cards of target player's library. Put one of them into his or her graveyard. -SVar:TrigDig:AB$Dig | Cost$ 0 | ValidTgts$ Player | DestinationZone$ Graveyard | DigNum$ 2 | LibraryPosition2 $ 0 -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_spy.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/63.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wu_warship.txt b/res/cardsfolder/wu_warship.txt deleted file mode 100644 index 801aa9ef239..00000000000 --- a/res/cardsfolder/wu_warship.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Wu Warship -ManaCost:2 U -Types:Creature Human Soldier -Text:no text -PT:3/3 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wu_warship.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/64.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wurmcoil_engine.txt b/res/cardsfolder/wurmcoil_engine.txt deleted file mode 100644 index 1acbc9e07c7..00000000000 --- a/res/cardsfolder/wurmcoil_engine.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Wurmcoil Engine -ManaCost:6 -Types:Artifact Creature Wurm -Text:no text -PT:6/6 -K:Deathtouch -K:Lifelink -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, 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. -SVar:TrigToken:AB$Token | Cost$ 0 | TokenImage$ C 3 3 Wurm Deathtouch | TokenColors$ Colorless | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Artifact,Creature,Wurm | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Deathtouch | SubAbility$ SVar=DBToken -SVar:DBToken:DB$Token | TokenImage$ C 3 3 Wurm Lifelink | TokenColors$ Colorless | TokenAmount$ 1 | TokenName$ Wurm | TokenTypes$ Artifact,Creature,Wurm | TokenPower$ 3 | TokenToughness$ 3 | TokenKeywords$ Lifelink -SVar:Rarity:Mythic -SVar:Picture:http://www.wizards.com/global/images/magic/general/wurmcoil_engine.jpg -SetInfo:SOM|Mythic|http://magiccards.info/scans/en/som/223.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wurms_tooth.txt b/res/cardsfolder/wurms_tooth.txt deleted file mode 100644 index 8a0c8aee1c4..00000000000 --- a/res/cardsfolder/wurms_tooth.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Wurm's Tooth -ManaCost:2 -Types:Artifact -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.Green | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigGainLife | TriggerDescription$ Whenever a player casts a green spell, you may gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/wurms_tooth.jpg -SetInfo:M11|Uncommon|http://magiccards.info/scans/en/m11/222.jpg -SetInfo:M10|Uncommon|http://magiccards.info/scans/en/m10/222.jpg -SetInfo:DST|Uncommon|http://magiccards.info/scans/en/ds/162.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/316.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/346.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wurmskin_forger.txt b/res/cardsfolder/wurmskin_forger.txt deleted file mode 100644 index 0565777b4db..00000000000 --- a/res/cardsfolder/wurmskin_forger.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Wurmskin Forger -ManaCost:5 G G -Types:Creature Elf Warrior -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, distribute three +1/+1 counters among one, two, or three target creatures. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter2 -SVar:PutCounter2:DB$PutCounter | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ SVar=PutCounter3 -SVar:PutCounter3:DB$PutCounter | Tgt$ TgtC | CounterType$ P1P1 | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wurmskin_forger.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wydwen_the_biting_gale.txt b/res/cardsfolder/wydwen_the_biting_gale.txt deleted file mode 100644 index 48373e28400..00000000000 --- a/res/cardsfolder/wydwen_the_biting_gale.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wydwen, the Biting Gale -ManaCost:2 U B -Types:Legendary Creature Faerie Wizard -Text:no text -PT:3/3 -K:Flying -K:Flash -A:AB$ ChangeZone | Cost$ U B PayLife<1> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/wydwen_the_biting_gale.jpg -SetInfo:LRW|Rare|http://magiccards.info/scans/en/lw/253.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/wyluli_wolf.txt b/res/cardsfolder/wyluli_wolf.txt deleted file mode 100644 index 34b5b98ae72..00000000000 --- a/res/cardsfolder/wyluli_wolf.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Wyluli Wolf -ManaCost:1 G -Types:Creature Wolf -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Target creature gets +1/+1 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/wyluli_wolf.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/207.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/270.jpg -SetInfo:ARN|Common|http://magiccards.info/scans/en/an/40.jpg|2 -End diff --git a/res/cardsfolder/xanthic_statue.txt b/res/cardsfolder/xanthic_statue.txt deleted file mode 100644 index 92c20a9e3ad..00000000000 --- a/res/cardsfolder/xanthic_statue.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Xanthic Statue -ManaCost:8 -Types:Artifact -Text:no text -A:AB$ Animate | Cost$ 5 | Defined$ Self | Power$ 8 | Toughness$ 8 | Types$ Creature,Artifact,Golem | Keywords$ Trample | SpellDescription$ Until end of turn, CARDNAME becomes an 8/8 Golem artifact creature with trample. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/xanthic_statue.jpg -SetInfo:WTH|Rare|http://magiccards.info/scans/en/wl/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/xenograft.txt b/res/cardsfolder/xenograft.txt deleted file mode 100644 index de6ae6938ae..00000000000 --- a/res/cardsfolder/xenograft.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Xenograft -ManaCost:4 U -Types:Enchantment -Text:no text -K:stPumpAll:Creature.YouCtrl:0/0/Types=ChosenType:No Condition:Each creature you control is the chosen type in addition to its other types. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/xenograft.jpg -SetInfo:NPH|Rare|http://magiccards.info/scans/en/nph/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/xiahou_dun_the_one_eyed.txt b/res/cardsfolder/xiahou_dun_the_one_eyed.txt deleted file mode 100644 index a2635fc8faa..00000000000 --- a/res/cardsfolder/xiahou_dun_the_one_eyed.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Xiahou Dun, the One-Eyed -ManaCost:2 B B -Types:Legendary Creature Human Soldier -Text:no text -PT:3/2 -K:Horsemanship -A:AB$ ChangeZone | Cost$ Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.Black+YouCtrl | TgtPrompt$ Select a target black card from your graveyard | ChangeNum$ 1 | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Return target black card from your graveyard to your hand. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/xiahou_dun_the_one_eyed.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/92.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/xira_arien.txt b/res/cardsfolder/xira_arien.txt deleted file mode 100644 index b1b126b258c..00000000000 --- a/res/cardsfolder/xira_arien.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Xira Arien -ManaCost:B R G -Types:Legendary Creature Insect Wizard -Text:no text -PT:1/2 -K:Flying -A:AB$ Draw | Cost$ B R G T | NumCards$ 1 | ValidTgts$ Player | TgtPrompt$ Choose a player | SpellDescription$ Target player draws a card. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/xira_arien.jpg -SetInfo:LEG|Rare|http://magiccards.info/scans/en/lg/310.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/xun_yu_wei_advisor.txt b/res/cardsfolder/xun_yu_wei_advisor.txt deleted file mode 100644 index 4cd68afb9f1..00000000000 --- a/res/cardsfolder/xun_yu_wei_advisor.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Xun Yu, Wei Advisor -ManaCost:1 B B -Types:Legendary Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | NumAtt$ +2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Target creature you control gets +2/+0 until end of turn. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/xun_yu_wei_advisor.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yamabushis_flame.txt b/res/cardsfolder/yamabushis_flame.txt deleted file mode 100644 index 5eef265ea27..00000000000 --- a/res/cardsfolder/yamabushis_flame.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yamabushi's Flame -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 3 | SubAbility$ SVar=DB | SpellDescription$ CARDNAME deals 3 damage to target creature or player. If a creature dealt damage this way would be put into a graveyard this turn, exile it instead. -SVar:DB:DB$Pump | KW$ HIDDEN If CARDNAME would be put into a graveyard this turn, exile it instead. | Defined$ Targeted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yamabushis_flame.jpg -SetInfo:CHK|Common|http://magiccards.info/scans/en/chk/198.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_ancients.txt b/res/cardsfolder/yavimaya_ancients.txt deleted file mode 100644 index cb1648bc145..00000000000 --- a/res/cardsfolder/yavimaya_ancients.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yavimaya Ancients -ManaCost:3 G G -Types:Creature Treefolk -Text:no text -PT:2/7 -A:AB$ Pump | Cost$ G | NumAtt$ +1 | NumDef$ -2 | SpellDescription$ CARDNAME gets +1/-2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_ancients.jpg -SetInfo:ALL|Common|http://magiccards.info/scans/en/ai/91.jpg|2 -End diff --git a/res/cardsfolder/yavimaya_ants.txt b/res/cardsfolder/yavimaya_ants.txt deleted file mode 100644 index 282ad71eaf3..00000000000 --- a/res/cardsfolder/yavimaya_ants.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Yavimaya Ants -ManaCost:2 G G -Types:Creature Insect -Text:no text -PT:5/1 -K:Trample -K:Haste -K:Cumulative upkeep:G G -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_ants.jpg -SetInfo:ALL|Uncommon|http://magiccards.info/scans/en/ai/93.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_barbarian.txt b/res/cardsfolder/yavimaya_barbarian.txt deleted file mode 100644 index 7e3b0f2721e..00000000000 --- a/res/cardsfolder/yavimaya_barbarian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yavimaya Barbarian -ManaCost:R G -Types:Creature Elf Barbarian -Text:no text -PT:2/2 -K:Protection from blue -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_barbarian.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/290.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_coast.txt b/res/cardsfolder/yavimaya_coast.txt deleted file mode 100644 index 2200461f845..00000000000 --- a/res/cardsfolder/yavimaya_coast.txt +++ /dev/null @@ -1,15 +0,0 @@ -Name:Yavimaya Coast -ManaCost:no cost -Types:Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ SVar=DBPain | SpellDescription$ Add U to your mana pool. CARDNAME deals 1 damage to you. -A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ SVar=DBPain | SpellDescription$ Add G to your mana pool. CARDNAME deals 1 damage to you. -SVar:DBPain:DB$DealDamage | NumDmg$ 1 | Defined$ You -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_coast.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/143.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/330.jpg -SetInfo:10E|Rare|http://magiccards.info/scans/en/10e/363.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_elder.txt b/res/cardsfolder/yavimaya_elder.txt deleted file mode 100644 index 2f797c70d4e..00000000000 --- a/res/cardsfolder/yavimaya_elder.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Yavimaya Elder -ManaCost:1 G G -Types:Creature Human Druid -Text:no text -PT:2/1 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigFetch | OptionalDecider$ You | TriggerDescription$ When CARDNAME is put into a graveyard from the battlefield, 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. -SVar:TrigFetch:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic | ChangeNum$ 2 -A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_elder.jpg -SetInfo:UDS|Common|http://magiccards.info/scans/en/ud/124.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_enchantress.txt b/res/cardsfolder/yavimaya_enchantress.txt deleted file mode 100644 index 47538a111ac..00000000000 --- a/res/cardsfolder/yavimaya_enchantress.txt +++ /dev/null @@ -1,16 +0,0 @@ -Name:Yavimaya Enchantress -ManaCost:2 G -Types:Creature Human Druid -Text:no text -PT:2/2 -K:stPumpSelf:Creature:X/X:no Condition:CARDNAME gets +1/+1 for each enchantment on the battlefield. -SVar:X:Count$Valid Enchantment -SVar:BuffedBy:Enchantment -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_enchantress.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/290.jpg -SetInfo:UDS|Uncommon|http://magiccards.info/scans/en/ud/125.jpg -SetInfo:10E|Uncommon|http://magiccards.info/scans/en/10e/310.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/284.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_gnats.txt b/res/cardsfolder/yavimaya_gnats.txt deleted file mode 100644 index 7a4bba18b18..00000000000 --- a/res/cardsfolder/yavimaya_gnats.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yavimaya Gnats -ManaCost:2 G -Types:Creature Insect -Text:no text -PT:0/1 -K:Flying -A:AB$ Regenerate | Cost$ G | SpellDescription$ Regenerate CARDNAME. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_gnats.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/168.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_granger.txt b/res/cardsfolder/yavimaya_granger.txt deleted file mode 100644 index f2106b29723..00000000000 --- a/res/cardsfolder/yavimaya_granger.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Yavimaya Granger -ManaCost:2 G -Types:Creature Elf -Text:no text -PT:2/2 -K:Echo:2 G -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a basic land card, put that card onto the battlefield tapped, then shuffle your library. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_granger.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/118.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_hollow.txt b/res/cardsfolder/yavimaya_hollow.txt deleted file mode 100644 index c33edaa365b..00000000000 --- a/res/cardsfolder/yavimaya_hollow.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yavimaya Hollow -ManaCost:no cost -Types:Legendary Land -Text:no text -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -A:AB$ Regenerate | Cost$ G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Regenerate target creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_hollow.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/143.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_kavu.txt b/res/cardsfolder/yavimaya_kavu.txt deleted file mode 100644 index 5fb4ee31a86..00000000000 --- a/res/cardsfolder/yavimaya_kavu.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yavimaya Kavu -ManaCost:2 R G -Types:Creature Kavu -Text:no text -PT:*/* -K:stSetPT:Count$Valid Creature.Red:Count$Valid Creature.Green: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. -SVar:BuffedBy:Creature.Red,Creature.Green -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_kavu.jpg -SetInfo:INV|Uncommon|http://magiccards.info/scans/en/in/291.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_scion.txt b/res/cardsfolder/yavimaya_scion.txt deleted file mode 100644 index 423595c2973..00000000000 --- a/res/cardsfolder/yavimaya_scion.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yavimaya Scion -ManaCost:4 G -Types:Creature Treefolk -Text:no text -PT:4/4 -K:Protection from artifacts -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimaya_scion.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/119.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimaya_wurm.txt b/res/cardsfolder/yavimaya_wurm.txt deleted file mode 100644 index f1a55b3bd10..00000000000 --- a/res/cardsfolder/yavimaya_wurm.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yavimaya Wurm -ManaCost:4 G G -Types:Creature Wurm -Text:no text -PT:6/4 -K:Trample -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/bd/en-us/card26631.jpg -SetInfo:M11|Common|http://magiccards.info/scans/en/m11/200.jpg -SetInfo:ULG|Common|http://magiccards.info/scans/en/ul/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yavimayas_embrace.txt b/res/cardsfolder/yavimayas_embrace.txt deleted file mode 100644 index 27c05bf9e83..00000000000 --- a/res/cardsfolder/yavimayas_embrace.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yavimaya's Embrace -ManaCost:5 G U U -Types:Enchantment Aura -Text:You control enchanted creature.\r\nEnchanted creature gets +2/+2 and has trample. -K:Enchant creature -K:enPump:+2/+2/Trample -K:enControlCreature -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yavimayas_embrace.jpg -SetInfo:APC|Rare|http://magiccards.info/scans/en/ap/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yawgmoth_demon.txt b/res/cardsfolder/yawgmoth_demon.txt deleted file mode 100644 index c9c58a826bd..00000000000 --- a/res/cardsfolder/yawgmoth_demon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Yawgmoth Demon -ManaCost:4 B B -Types:Creature Demon -Text: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. -PT:6/6 -K:Flying -K:First Strike -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoth_demon.jpg -SetInfo:9ED|Rare|http://magiccards.info/scans/en/9e/170.jpg -SetInfo:ATQ|Rare|http://magiccards.info/scans/en/aq/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yawgmoths_bargain.txt b/res/cardsfolder/yawgmoths_bargain.txt deleted file mode 100644 index 4a442582b5e..00000000000 --- a/res/cardsfolder/yawgmoths_bargain.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yawgmoth's Bargain -ManaCost:4 B B -Types:Enchantment -Text:Skip your draw step. -A:AB$ Draw | Cost$ PayLife<1> | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_bargain.jpg -SetInfo:UDS|Rare|http://magiccards.info/scans/en/ud/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yawgmoths_edict.txt b/res/cardsfolder/yawgmoths_edict.txt deleted file mode 100644 index 0b3b8a4fb28..00000000000 --- a/res/cardsfolder/yawgmoths_edict.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Yawgmoth's Edict -ManaCost:1 B -Types:Enchantment -Text:no text -T:Mode$ SpellCast | ValidCard$ Card.White+YouDontCtrl | TriggerZones$ Battlefield | Execute$ TrigDrain | TriggerDescription$ Whenever an opponent casts a white spell, that player loses 1 life and you gain 1 life. -SVar:TrigDrain:AB$LoseLife | Cost$ 0 | Defined$ Opponent | LifeAmount$ 1 | SubAbility$ SVar=DBGainLife -SVar:DBGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yawgmoths_edict.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/170.jpg -SetInfo:7ED|Uncommon|http://magiccards.info/scans/en/7e/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yawning_fissure.txt b/res/cardsfolder/yawning_fissure.txt deleted file mode 100644 index dc344268ca0..00000000000 --- a/res/cardsfolder/yawning_fissure.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Yawning Fissure -ManaCost:4 R -Types:Sorcery -Text:no text -A:SP$ Sacrifice | Cost$ 4 R | Defined$ Opponent | SacValid$ Land | SacMessage$ Land | SpellDescription$ Each opponent sacrifices a land. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yawning_fissure.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yellow_scarves_cavalry.txt b/res/cardsfolder/yellow_scarves_cavalry.txt deleted file mode 100644 index f87c2a48891..00000000000 --- a/res/cardsfolder/yellow_scarves_cavalry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yellow Scarves Cavalry -ManaCost:1 R -Types:Creature Human Soldier -Text:no text -PT:1/1 -K:Horsemanship -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yellow_scarves_cavalry.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/125.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yellow_scarves_general.txt b/res/cardsfolder/yellow_scarves_general.txt deleted file mode 100644 index bd44fa46c29..00000000000 --- a/res/cardsfolder/yellow_scarves_general.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yellow Scarves General -ManaCost:3 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:Horsemanship -K:CARDNAME can't block. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yellow_scarves_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/126.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yellow_scarves_troops.txt b/res/cardsfolder/yellow_scarves_troops.txt deleted file mode 100644 index fa8f1d237e4..00000000000 --- a/res/cardsfolder/yellow_scarves_troops.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yellow Scarves Troops -ManaCost:1 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10542.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/127.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yoke_of_the_damned.txt b/res/cardsfolder/yoke_of_the_damned.txt deleted file mode 100644 index cfcc32f8f8d..00000000000 --- a/res/cardsfolder/yoke_of_the_damned.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yoke of the Damned -ManaCost:1 B -Types:Enchantment Aura -Text:no text -K:Enchant Creature Curse -T:Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Creature | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When a creature is put into a graveyard from the battlefield, destroy enchanted creature. -SVar:TrigDestroy:AB$Destroy | Cost$ 0 | Defined$ Enchanted -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yoke_of_the_damned.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/57.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yoked_plowbeast.txt b/res/cardsfolder/yoked_plowbeast.txt deleted file mode 100644 index 0e8bf9cf9ee..00000000000 --- a/res/cardsfolder/yoked_plowbeast.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Yoked Plowbeast -ManaCost:5 W W -Types:Creature Beast -Text:no text -PT:5/5 -K:Cycling:2 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/yoked_plowbeast.jpg -SetInfo:ALA|Common|http://magiccards.info/scans/en/ala/31.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yomiji_who_bars_the_way.txt b/res/cardsfolder/yomiji_who_bars_the_way.txt deleted file mode 100644 index bc73b8ed4cc..00000000000 --- a/res/cardsfolder/yomiji_who_bars_the_way.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yomiji, Who Bars the Way -ManaCost:5 W W -Types:Legendary Creature Spirit -Text:no text -PT:4/4 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.Legendary+Other | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a legendary permanent other than CARDNAME is put into a graveyard from the battlefield, return that card to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yomiji_who_bars_the_way.jpg -SetInfo:BOK|Rare|http://magiccards.info/scans/en/bok/30.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yore_tiller_nephilim.txt b/res/cardsfolder/yore_tiller_nephilim.txt deleted file mode 100644 index a5d8639e883..00000000000 --- a/res/cardsfolder/yore_tiller_nephilim.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yore-Tiller Nephilim -ManaCost:W U B R -Types:Creature Nephilim -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, return target creature card from your graveyard to the battlefield tapped and attacking. -SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | Tapped$ True | Attacking$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yore_tiller_nephilim.jpg -SetInfo:GPT|Rare|http://magiccards.info/scans/en/gp/140.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yosei_the_morning_star.txt b/res/cardsfolder/yosei_the_morning_star.txt deleted file mode 100644 index b274e3864c3..00000000000 --- a/res/cardsfolder/yosei_the_morning_star.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yosei, the Morning Star -ManaCost:4 W W -Types:Legendary Creature Dragon Spirit -Text:When CARDNAME is put into a graveyard from the battlefield, target player skips his or her next untap step. Tap up to five target permanents that player controls. -PT:5/5 -K:Flying -SVar:RemAIDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yosei_the_morning_star.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/50.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yotian_soldier.txt b/res/cardsfolder/yotian_soldier.txt deleted file mode 100644 index 4dcff256f10..00000000000 --- a/res/cardsfolder/yotian_soldier.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Yotian Soldier -ManaCost:3 -Types:Artifact Creature Soldier -Text:no text -PT:1/4 -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/mrd/en-us/card46026.jpg -SetInfo:MRD|Common|http://magiccards.info/scans/en/mi/277.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/378.jpg -SetInfo:ATQ|Common|http://magiccards.info/scans/en/aq/44.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/young_wei_recruits.txt b/res/cardsfolder/young_wei_recruits.txt deleted file mode 100644 index 702c5b43d2c..00000000000 --- a/res/cardsfolder/young_wei_recruits.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Young Wei Recruits -ManaCost:1 B -Types:Creature Human Soldier -Text:no text -PT:2/2 -K:CARDNAME can't block. -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10584.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/94.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/youthful_knight.txt b/res/cardsfolder/youthful_knight.txt deleted file mode 100644 index cefa29c871b..00000000000 --- a/res/cardsfolder/youthful_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Youthful Knight -ManaCost:1 W -Types:Creature Human Knight -Text:no text -PT:2/1 -K:First Strike -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/youthful_knight.jpg -SetInfo:STH|Common|http://magiccards.info/scans/en/sh/125.jpg -SetInfo:10E|Common|http://magiccards.info/scans/en/10e/62.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yuan_shao_the_indecisive.txt b/res/cardsfolder/yuan_shao_the_indecisive.txt deleted file mode 100644 index 8e335e691be..00000000000 --- a/res/cardsfolder/yuan_shao_the_indecisive.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yuan Shao, the Indecisive -ManaCost:4 R -Types:Legendary Creature Human Soldier -Text:no text -PT:2/3 -K:Horsemanship -K:stPumpAll:Creature.YouCtrl:0/0/HIDDEN CARDNAME can't be blocked by more than one creature.:No Condition:Each creature you control can't be blocked by more than one creature. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/yuan_shao_the_indecisive.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/128.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yuan_shaos_infantry.txt b/res/cardsfolder/yuan_shaos_infantry.txt deleted file mode 100644 index 9c0060aa73a..00000000000 --- a/res/cardsfolder/yuan_shaos_infantry.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Yuan Shao's Infantry -ManaCost:3 R -Types:Creature Human Soldier -Text:no text -PT:2/2 -T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, CARDNAME is unblockable this combat. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | KW$ Unblockable -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yuan_shaos_infantry.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/129.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/yuki_onna.txt b/res/cardsfolder/yuki_onna.txt deleted file mode 100644 index f7bca9c9ebc..00000000000 --- a/res/cardsfolder/yuki_onna.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Yuki-Onna -ManaCost:3 R -Types:Creature Spirit -Text:no text -PT:3/1 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target artifact. -SVar:TrigDestroy:DB$Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact. -T:Mode$ SpellCast | ValidCard$ Spirit.YouCtrl,Arcane.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may return CARDNAME to its owner's hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand | Defined$ Self -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/yuki_onna.jpg -SetInfo:SOK|Uncommon|http://magiccards.info/scans/en/sok/120.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zap.txt b/res/cardsfolder/zap.txt deleted file mode 100644 index 432640623cf..00000000000 --- a/res/cardsfolder/zap.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zap -ManaCost:2 R -Types:Instant -Text:no text -A:SP$ DealDamage | Cost$ 2 R | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. | SubAbility$ SVar=DBDraw -SVar:DBDraw:DB$Draw | NumCards$ 1 | SpellDescription$ Draw a card. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zap.jpg -SetInfo:INV|Common|http://magiccards.info/scans/en/in/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zealots_en_dal.txt b/res/cardsfolder/zealots_en_dal.txt deleted file mode 100644 index 9596cbf4a52..00000000000 --- a/res/cardsfolder/zealots_en_dal.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zealots en-Dal -ManaCost:3 W -Types:Creature Human Soldier -Text:no text -PT:2/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.nonLand+White+YouCtrl | PresentCompare$ EQX | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ At the beginning of your upkeep, if all nonland permanents you control are white, you gain 1 life. -SVar:TrigGainLife:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ 1 -SVar:X:Count$Valid Permanent.nonLand+YouCtrl -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zealots_en_dal.jpg -SetInfo:EXO|Uncommon|http://magiccards.info/scans/en/ex/26.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zealous_guardian.txt b/res/cardsfolder/zealous_guardian.txt deleted file mode 100644 index 036a76f5000..00000000000 --- a/res/cardsfolder/zealous_guardian.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zealous Guardian -ManaCost:WU -Types:Creature Kithkin Soldier -Text:no text -PT:1/1 -K:Flash -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zealous_guardian.jpg -SetInfo:SHM|Common|http://magiccards.info/scans/en/shm/157.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zealous_persecution.txt b/res/cardsfolder/zealous_persecution.txt deleted file mode 100644 index 125553690e9..00000000000 --- a/res/cardsfolder/zealous_persecution.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zealous Persecution -ManaCost:W B -Types:Instant -Text:no text -A:SP$ PumpAll | Cost$ W B | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Until end of turn, creatures you control get +1/+1 and creatures your opponents control get -1/-1. | SubAbility$ SVar=DBPumpAll -SVar:DBPumpAll:DB$PumpAll | ValidCards$ Creature.YouDontCtrl | NumAtt$ -1 | NumDef$ -1 -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zealous_persecution.jpg -SetInfo:ARB|Uncommon|http://magiccards.info/scans/en/arb/85.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zebra_unicorn.txt b/res/cardsfolder/zebra_unicorn.txt deleted file mode 100644 index fa1a9937c93..00000000000 --- a/res/cardsfolder/zebra_unicorn.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zebra Unicorn -ManaCost:2 G W -Types:Creature Unicorn -Text:no text -PT:2/2 -T:Mode$ DamageDone | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. -SVar:TrigGain:AB$GainLife | Cost$ 0 | Defined$ You | LifeAmount$ X -SVar:X:TriggerCount$DamageAmount -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zebra_unicorn.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/350.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zektar_shrine_expedition.txt b/res/cardsfolder/zektar_shrine_expedition.txt deleted file mode 100644 index e06341dd4bb..00000000000 --- a/res/cardsfolder/zektar_shrine_expedition.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zektar Shrine Expedition -ManaCost:1 R -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ SubCounter<3/QUEST> Sac<1/CARDNAME> | TokenAmount$ 1 | TokenImage$ R 7 1 Elemental | TokenName$ Elemental | TokenColors$ Red | TokenTypes$ Creature,Elemental | TokenPower$ 7 | TokenToughness$ 1 | TokenKeywords$ Haste<>Trample<>At the beginning of the end step, exile CARDNAME. | TokenOwner$ You | TokenAmount$ 1 | SpellDescription$ 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. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigPutCounter | TriggerDescription$ Landfall - Whenever a land enters the battlefield under your control, you may put a quest counter on CARDNAME. -SVar:TrigPutCounter:AB$PutCounter | Cost$ 0 | Defined$ Self | CounterType$ QUEST | CounterNum$ 1 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/Zektar_Shrine_Expedition.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/155.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zendikar_farguide.txt b/res/cardsfolder/zendikar_farguide.txt deleted file mode 100644 index 508694ee894..00000000000 --- a/res/cardsfolder/zendikar_farguide.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zendikar Farguide -ManaCost:4 G -Types:Creature Elemental -Text:no text -PT:3/3 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zendikar_farguide.jpg -SetInfo:ZEN|Common|http://magiccards.info/scans/en/zen/194.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephid.txt b/res/cardsfolder/zephid.txt deleted file mode 100644 index 5a3743c671e..00000000000 --- a/res/cardsfolder/zephid.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zephid -ManaCost:4 U U -Types:Creature Illusion -Text:no text -PT:3/4 -K:Flying -K:Shroud -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zephid.jpg -SetInfo:USG|Rare|http://magiccards.info/scans/en/us/113.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephids_embrace.txt b/res/cardsfolder/zephids_embrace.txt deleted file mode 100644 index c4a94e3c356..00000000000 --- a/res/cardsfolder/zephids_embrace.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zephid's Embrace -ManaCost:2 U U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPump:+2/+2/Flying & Shroud -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zephids_embrace.jpg -SetInfo:USG|Uncommon|http://magiccards.info/scans/en/us/114.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephyr_falcon.txt b/res/cardsfolder/zephyr_falcon.txt deleted file mode 100644 index 945ad73b8f6..00000000000 --- a/res/cardsfolder/zephyr_falcon.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Zephyr Falcon -ManaCost:1 U -Types:Creature Bird -Text:no text -PT:1/1 -K:Flying -K:Vigilance -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2199.jpg -SetInfo:5ED|Common|http://magiccards.info/scans/en/5e/137.jpg -SetInfo:4ED|Common|http://magiccards.info/scans/en/4e/116.jpg -SetInfo:LEG|Common|http://magiccards.info/scans/en/lg/86.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephyr_net.txt b/res/cardsfolder/zephyr_net.txt deleted file mode 100644 index bfcf20ad8e1..00000000000 --- a/res/cardsfolder/zephyr_net.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zephyr Net -ManaCost:1 U -Types:Enchantment Aura -Text:no text -K:Enchant creature -K:enPumpCurse:Defender & Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zephyr_net.jpg -SetInfo:LRW|Common|http://magiccards.info/scans/en/lw/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephyr_spirit.txt b/res/cardsfolder/zephyr_spirit.txt deleted file mode 100644 index eb385f91e81..00000000000 --- a/res/cardsfolder/zephyr_spirit.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zephyr Spirit -ManaCost:5 U -Types:Creature Spirit -Text:no text -PT:0/6 -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigBounce | TriggerDescription$ When CARDNAME blocks, return it to its owner's hand. -SVar:TrigBounce:AB$ChangeZone | Cost$ 0 | Origin$ Battlefield | Destination$ Hand -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zephyr_spirit.jpg -SetInfo:RAV|Common|http://magiccards.info/scans/en/rav/76.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zephyr_sprite.txt b/res/cardsfolder/zephyr_sprite.txt deleted file mode 100644 index 3dc104d84b3..00000000000 --- a/res/cardsfolder/zephyr_sprite.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zephyr Sprite -ManaCost:U -Types:Creature Faerie -Text:no text -PT:1/1 -K:Flying -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zephyr_sprite.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/82.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhalfirin_commander.txt b/res/cardsfolder/zhalfirin_commander.txt deleted file mode 100644 index b98bf258c0b..00000000000 --- a/res/cardsfolder/zhalfirin_commander.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Zhalfirin Commander -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ Pump | Cost$ 1 W W | NumAtt$ +1 | NumDef$ +1 | ValidTgts$ Creature.Knight | TgtPrompt$ Select target Knight creature | SpellDescription$ Target Knight creature gets +1/+1 until end of turn. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhalfirin_commander.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/253.jpg -SetInfo:TSB|Special|http://magiccards.info/scans/en/tsts/18.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhalfirin_knight.txt b/res/cardsfolder/zhalfirin_knight.txt deleted file mode 100644 index 2059771e2ae..00000000000 --- a/res/cardsfolder/zhalfirin_knight.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zhalfirin Knight -ManaCost:2 W -Types:Creature Human Knight -Text:no text -PT:2/2 -K:Flanking -A:AB$ Pump | Cost$ W W | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhalfirin_knight.jpg -SetInfo:MIR|Common|http://magiccards.info/scans/en/mr/254.jpg -End diff --git a/res/cardsfolder/zhang_fei_fierce_warrior.txt b/res/cardsfolder/zhang_fei_fierce_warrior.txt deleted file mode 100644 index a8f82fc76fd..00000000000 --- a/res/cardsfolder/zhang_fei_fierce_warrior.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zhang Fei, Fierce Warrior -ManaCost:4 W W -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:4/4 -K:Vigilance -K:Horsemanship -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhang_fei_fierce_warrior.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/32.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhang_he_wei_general.txt b/res/cardsfolder/zhang_he_wei_general.txt deleted file mode 100644 index 4f8c21e13ec..00000000000 --- a/res/cardsfolder/zhang_he_wei_general.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zhang He, Wei General -ManaCost:3 B B -Types:Legendary Creature Human Soldier -Text:no text -PT:4/2 -K:Horsemanship -T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ Whenever CARDNAME attacks, each other creature you control gets +1/+0 until end of turn. -SVar:TrigPumpAll:AB$PumpAll | Cost$ 0 | ValidCards$ Creature.Other+YouCtrl | NumAtt$ +1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhang_he_wei_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/95.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhang_liao_hero_of_hefei.txt b/res/cardsfolder/zhang_liao_hero_of_hefei.txt deleted file mode 100644 index 93c4f521d19..00000000000 --- a/res/cardsfolder/zhang_liao_hero_of_hefei.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zhang Liao, Hero of Hefei -ManaCost:4 B B -Types:Legendary Creature Human Soldier -Text:no text -PT:3/3 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | Execute$ TrigDiscard | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, that opponent discards a card. -SVar:TrigDiscard:AB$Discard | Cost$ 0 | Defined$ Opponent | NumCards$ 1 | Mode$ TgtChoose -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhang_liao_hero_of_hefei.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/96.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhao_zilong_tiger_general.txt b/res/cardsfolder/zhao_zilong_tiger_general.txt deleted file mode 100644 index 67afbdeec2f..00000000000 --- a/res/cardsfolder/zhao_zilong_tiger_general.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zhao Zilong, Tiger General -ManaCost:3 W W -Types:Legendary Creature Human Soldier Warrior -Text:no text -PT:3/3 -K:Horsemanship -T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks, it gets +1/+1 until end of turn. -SVar:TrigPump:AB$Pump | Cost$ 0 | Defined$ Self | NumAtt$ 1 | NumDef$ 1 -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhao_zilong_tiger_general.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/33.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhou_yu_chief_commander.txt b/res/cardsfolder/zhou_yu_chief_commander.txt deleted file mode 100644 index a504c0f9e29..00000000000 --- a/res/cardsfolder/zhou_yu_chief_commander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zhou Yu, Chief Commander -ManaCost:5 U U -Types:Legendary Creature Human Soldier -Text:no text -PT:8/8 -K:CARDNAME can't attack unless defending player controls an Island. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhou_yu_chief_commander.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/65.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zhuge_jin_wu_strategist.txt b/res/cardsfolder/zhuge_jin_wu_strategist.txt deleted file mode 100644 index 30fa7a5a8f1..00000000000 --- a/res/cardsfolder/zhuge_jin_wu_strategist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zhuge Jin, Wu Strategist -ManaCost:1 U U -Types:Legendary Creature Human Advisor -Text:no text -PT:1/1 -A:AB$ Pump | Cost$ T | KW$ HIDDEN Unblockable | ValidTgts$ Creature | TgtPrompt$ Select target creature | PlayerTurn$ True | ActivatingPhases$ Upkeep->BeginCombat | SpellDescription$ Target creature is unblockable this turn. Activate this ability only during your turn, before attackers are declared. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zhuge_jin_wu_strategist.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/66.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zirilan_of_the_claw.txt b/res/cardsfolder/zirilan_of_the_claw.txt deleted file mode 100644 index da5cf71b02b..00000000000 --- a/res/cardsfolder/zirilan_of_the_claw.txt +++ /dev/null @@ -1,14 +0,0 @@ -Name:Zirilan of the Claw -ManaCost:3 R R -Types:Legendary Creature Viashino Shaman -Text:no text -PT:3/4 -A:AB$ ChangeZone | Cost$ 1 R R T | Origin$ Library | Destination$ Battlefield | ChangeType$ Dragon | ChangeNum$ 1 | Shuffle$ True | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | SpellDescription$ 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. -SVar:DBPump:DB$Pump | Defined$ Remembered | KW$ Haste | SubAbility$ DBDelTrig -SVar:DBDelTrig:DB$DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigExile -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Defined$ Remembered | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBCleanup -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zirilan_of_the_claw.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/204.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zo_zu_the_punisher.txt b/res/cardsfolder/zo_zu_the_punisher.txt deleted file mode 100644 index a7bd6d947ef..00000000000 --- a/res/cardsfolder/zo_zu_the_punisher.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zo-Zu the Punisher -ManaCost:1 R R -Types:Legendary Creature Goblin Warrior -Text:no text -PT:2/2 -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a land enters the battlefield, CARDNAME deals 2 damage to that land's controller. -SVar:TrigDamage:AB$DealDamage | Cost$ 0 | Defined$ TriggeredCardController | NumDmg$ 2 -SVar:RemRandomDeck:True -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zo_zu_the_punisher.jpg -SetInfo:CHK|Rare|http://magiccards.info/scans/en/chk/200.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_dog.txt b/res/cardsfolder/zodiac_dog.txt deleted file mode 100644 index 4158fc6cc2b..00000000000 --- a/res/cardsfolder/zodiac_dog.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Dog -ManaCost:2 R -Types:Creature Hound -Text:no text -PT:2/2 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10534.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/130.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_dragon.txt b/res/cardsfolder/zodiac_dragon.txt deleted file mode 100644 index a9779cbcd11..00000000000 --- a/res/cardsfolder/zodiac_dragon.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zodiac Dragon -ManaCost:7 R R -Types:Creature Dragon -Text:no text -PT:8/8 -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME is put into your graveyard from the battlefield, you may return it to your hand. -SVar:TrigReturn:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Hand -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zodiac_dragon.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/131.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_goat.txt b/res/cardsfolder/zodiac_goat.txt deleted file mode 100644 index cd1d5ec5a76..00000000000 --- a/res/cardsfolder/zodiac_goat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Goat -ManaCost:R -Types:Creature Goat -Text:no text -PT:1/1 -K:Mountainwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10540.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/132.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_horse.txt b/res/cardsfolder/zodiac_horse.txt deleted file mode 100644 index a94faaa7a4b..00000000000 --- a/res/cardsfolder/zodiac_horse.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Horse -ManaCost:3 G -Types:Creature Horse -Text:no text -PT:3/3 -K:Islandwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10598.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/159.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_monkey.txt b/res/cardsfolder/zodiac_monkey.txt deleted file mode 100644 index e1d54c07190..00000000000 --- a/res/cardsfolder/zodiac_monkey.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zodiac Monkey -ManaCost:1 G -Types:Creature Ape -Text:no text -PT:2/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83237.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/160.jpg -SetInfo:9ED|Common|http://magiccards.info/scans/en/9e/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_ox.txt b/res/cardsfolder/zodiac_ox.txt deleted file mode 100644 index 6dac8a993d6..00000000000 --- a/res/cardsfolder/zodiac_ox.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Ox -ManaCost:3 G -Types:Creature Ox -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10636.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/161.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_pig.txt b/res/cardsfolder/zodiac_pig.txt deleted file mode 100644 index 4c581e5700d..00000000000 --- a/res/cardsfolder/zodiac_pig.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Pig -ManaCost:3 B -Types:Creature Boar -Text:no text -PT:3/3 -K:Swampwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10586.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/97.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_rabbit.txt b/res/cardsfolder/zodiac_rabbit.txt deleted file mode 100644 index 7628c3025f9..00000000000 --- a/res/cardsfolder/zodiac_rabbit.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Rabbit -ManaCost:G -Types:Creature Rabbit -Text:no text -PT:1/1 -K:Forestwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10582.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/162.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_rat.txt b/res/cardsfolder/zodiac_rat.txt deleted file mode 100644 index f8043e7b64c..00000000000 --- a/res/cardsfolder/zodiac_rat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Rat -ManaCost:B -Types:Creature Rat -Text:no text -PT:1/1 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10564.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/98.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_rooster.txt b/res/cardsfolder/zodiac_rooster.txt deleted file mode 100644 index 3a65c831edf..00000000000 --- a/res/cardsfolder/zodiac_rooster.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Rooster -ManaCost:1 G -Types:Creature Bird -Text:no text -PT:2/1 -K:Plainswalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10506.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/163.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_snake.txt b/res/cardsfolder/zodiac_snake.txt deleted file mode 100644 index 398433617f9..00000000000 --- a/res/cardsfolder/zodiac_snake.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Snake -ManaCost:2 B -Types:Creature Snake -Text:no text -PT:2/2 -K:Swampwalk -SVar:Rarity:Common -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10608.jpg -SetInfo:PTK|Common|http://magiccards.info/scans/en/p3k/99.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zodiac_tiger.txt b/res/cardsfolder/zodiac_tiger.txt deleted file mode 100644 index 14e434923d3..00000000000 --- a/res/cardsfolder/zodiac_tiger.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zodiac Tiger -ManaCost:2 G G -Types:Creature Cat -Text:no text -PT:3/4 -K:Forestwalk -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/pk/en-us/card10594.jpg -SetInfo:PTK|Uncommon|http://magiccards.info/scans/en/p3k/164.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zoetic_cavern.txt b/res/cardsfolder/zoetic_cavern.txt deleted file mode 100644 index 7d4aa1316f5..00000000000 --- a/res/cardsfolder/zoetic_cavern.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zoetic Cavern -ManaCost:no cost -Types:Land -Text:no text -K:Morph:2 -A:AB$ Mana | Cost$ T | Produced$ 1 | SpellDescription$ Add 1 to your mana pool. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zoetic_cavern.jpg -SetInfo:FUT|Uncommon|http://magiccards.info/scans/en/fut/180.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zof_shade.txt b/res/cardsfolder/zof_shade.txt deleted file mode 100644 index 0b3960896e1..00000000000 --- a/res/cardsfolder/zof_shade.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zof Shade -ManaCost:3 B -Types:Creature Shade -Text:no text -PT:2/2 -A:AB$ Pump | Cost$ 2 B | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zof_shade.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/132.jpg -End diff --git a/res/cardsfolder/zombie_cannibal.txt b/res/cardsfolder/zombie_cannibal.txt deleted file mode 100644 index 808da1265ab..00000000000 --- a/res/cardsfolder/zombie_cannibal.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zombie Cannibal -ManaCost:B -Types:Creature Zombie -Text:no text -PT:1/1 -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may exile target card from that player's graveyard. -SVar:TrigExile:AB$ChangeZone | Cost$ 0 | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in your opponent's graveyard | ValidTgts$ Card.YouDontCtrl | SpellDescription$ Exile target card from your opponet's graveyard -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_cannibal.jpg -SetInfo:ODY|Common|http://magiccards.info/scans/en/od/169.jpg -End diff --git a/res/cardsfolder/zombie_cutthroat.txt b/res/cardsfolder/zombie_cutthroat.txt deleted file mode 100644 index 1754f253701..00000000000 --- a/res/cardsfolder/zombie_cutthroat.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zombie Cutthroat -ManaCost:3 B B -Types:Creature Zombie -Text:no text -PT:3/4 -K:Morph:PayLife<5> -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_cutthroat.jpg -SetInfo:SCG|Common|http://magiccards.info/scans/en/sc/81.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_goliath.txt b/res/cardsfolder/zombie_goliath.txt deleted file mode 100644 index c38989c300e..00000000000 --- a/res/cardsfolder/zombie_goliath.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Zombie Goliath -ManaCost:4 B -Types:Creature Zombie Giant -Text:no text -PT:4/3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_goliath.jpg -SetInfo:M10|Common|http://magiccards.info/scans/en/m10/123.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_infestation.txt b/res/cardsfolder/zombie_infestation.txt deleted file mode 100644 index efea8dc00b0..00000000000 --- a/res/cardsfolder/zombie_infestation.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zombie Infestation -ManaCost:1 B -Types:Enchantment -Text:no text -A:AB$ Token | Cost$ Discard<2/Card> | TokenImage$ B 2 2 Zombie | TokenAmount$ 1 | TokenName$ Zombie | TokenTypes$ Creature,Zombie | TokenOwner$ You | TokenColors$ Black | TokenPower$ 2 | TokenToughness$ 2 | SpellDescription$ Put a 2/2 black Zombie creature token onto the battlefield. -SVar:RemRandomDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_infestation.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/170.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_master.txt b/res/cardsfolder/zombie_master.txt deleted file mode 100644 index 66465d1a763..00000000000 --- a/res/cardsfolder/zombie_master.txt +++ /dev/null @@ -1,19 +0,0 @@ -Name:Zombie Master -ManaCost:1 B B -Types:Creature Zombie -Text:no text -PT:2/2 -K:stPumpAll:Zombie.Creature+Other:0/0/Swampwalk:no Condition:Other Zombie creatures have swampwalk. -K:stPumpAll:Zombie.Other:0/0/SVar=Pump:no Condition:Other Zombies have "B: Regenerate this permanent." -SVar:Pump:AB$Regenerate | Cost$ B | SpellDescription$ Regenerate CARDNAME. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_master.jpg -SetInfo:LEA|Rare|http://magiccards.info/scans/en/al/46.jpg -SetInfo:LEB|Rare|http://magiccards.info/scans/en/be/46.jpg -SetInfo:5ED|Rare|http://magiccards.info/scans/en/5e/69.jpg -SetInfo:4ED|Rare|http://magiccards.info/scans/en/4e/58.jpg -SetInfo:6ED|Rare|http://magiccards.info/scans/en/6e/162.jpg -SetInfo:3ED|Rare|http://magiccards.info/scans/en/rv/46.jpg -SetInfo:2ED|Rare|http://magiccards.info/scans/en/un/46.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_mob.txt b/res/cardsfolder/zombie_mob.txt deleted file mode 100644 index 7729bf49994..00000000000 --- a/res/cardsfolder/zombie_mob.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Zombie Mob -ManaCost:2 B B -Types:Creature Zombie -Text:no text -PT:2/0 -K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each creature card in your graveyard. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExileAll | TriggerDescription$ When CARDNAME enters the battlefield, exile all creature cards from your graveyard. -SVar:TrigExileAll:AB$ChangeZoneAll | Cost$ 0 | ChangeType$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Exile -SVar:X:Count$TypeInYourYard.Creature -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_mob.jpg -SetInfo:MIR|Uncommon|http://magiccards.info/scans/en/mr/51.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_musher.txt b/res/cardsfolder/zombie_musher.txt deleted file mode 100644 index 38bde861d43..00000000000 --- a/res/cardsfolder/zombie_musher.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Zombie Musher -ManaCost:3 B -Types:Snow Creature Zombie -Text:no text -PT:2/3 -K:Snow landwalk -A:AB$ Regenerate | Cost$ S | SpellDescription$ Regenerate CARDNAME. -SVar:RemAIDeck:True -SVar:RemRandomDeck:True -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_musher.jpg -SetInfo:CSP|Common|http://magiccards.info/scans/en/cs/75.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_outlander.txt b/res/cardsfolder/zombie_outlander.txt deleted file mode 100644 index f8fd5765ed7..00000000000 --- a/res/cardsfolder/zombie_outlander.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zombie Outlander -ManaCost:U B -Types:Creature Zombie Scout -Text:no text -PT:2/2 -K:Protection from green -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_outlander.jpg -SetInfo:CFX|Common|http://magiccards.info/scans/en/cfx/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombie_trailblazer.txt b/res/cardsfolder/zombie_trailblazer.txt deleted file mode 100644 index f62434560a2..00000000000 --- a/res/cardsfolder/zombie_trailblazer.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zombie Trailblazer -ManaCost:B B B -Types:Creature Zombie Scout -Text:no text -PT:2/2 -A:AB$ Animate | Cost$ tapXType<1/Zombie> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swmap | OverwriteTypes$ True | KeepSupertypes$ True | KeepCardTypes$ True | SpellDescription$ Target land becomes a Swamp until end of turn. -A:AB$ Pump | Cost$ tapXType<1/Zombie> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Swampwalk | SpellDescription$ Target creature gains swampwalk until end of turn. -SVar:RemAIDeck:True -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zombie_trailblazer.jpg -SetInfo:TOR|Uncommon|http://magiccards.info/scans/en/tr/89.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zombify.txt b/res/cardsfolder/zombify.txt deleted file mode 100644 index 34bd1de5bdf..00000000000 --- a/res/cardsfolder/zombify.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zombify -ManaCost:3 B -Types:Sorcery -Text:no text -A:SP$ ChangeZone | Cost$ 3 B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SpellDescription$ Return target creature card from your graveyard to the battlefield. -SVar:Rarity:Uncommon -SVar:Picture:http://resources.wizards.com/magic/cards/9ed/en-us/card83342.jpg -SetInfo:8ED|Uncommon|http://magiccards.info/scans/en/8e/174.jpg -SetInfo:ODY|Uncommon|http://magiccards.info/scans/en/od/171.jpg -SetInfo:9ED|Uncommon|http://magiccards.info/scans/en/9e/171.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zoologist.txt b/res/cardsfolder/zoologist.txt deleted file mode 100644 index 7bc8658bf40..00000000000 --- a/res/cardsfolder/zoologist.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zoologist -ManaCost:3 G -Types:Creature Human Druid -Text:no text -PT:1/2 -A:AB$ Dig | Cost$ 3 G T | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top card of your library. If it's a creature card, put it onto the battlefield. Otherwise, put it into your graveyard. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zoologist.jpg -SetInfo:ODY|Rare|http://magiccards.info/scans/en/od/285.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zuberi_golden_feather.txt b/res/cardsfolder/zuberi_golden_feather.txt deleted file mode 100644 index bd52ec17acf..00000000000 --- a/res/cardsfolder/zuberi_golden_feather.txt +++ /dev/null @@ -1,12 +0,0 @@ -Name:Zuberi, Golden Feather -ManaCost:4 W -Types:Legendary Creature Griffin -Text:no text -PT:3/3 -K:Flying -K:stPumpAll:Creature.Griffin+Other:1/1:No Condition:Other Griffin creatures get +1/+1. -SVar:PlayMain1:TRUE -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuberi_golden_feather.jpg -SetInfo:MIR|Rare|http://magiccards.info/scans/en/mr/255.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zulaport_enforcer.txt b/res/cardsfolder/zulaport_enforcer.txt deleted file mode 100644 index 678fe604f73..00000000000 --- a/res/cardsfolder/zulaport_enforcer.txt +++ /dev/null @@ -1,13 +0,0 @@ -Name:Zulaport Enforcer -ManaCost:B -Types:Creature Human Warrior -Text:no text -PT:1/1 -K:stSetPT:1:1:LevelGE1:3:3:LevelGE3:5:5:LEVEL 1-2 3/3 LEVEL 3+ 5/5 CARDNAME can't be blocked except by black creatures. -K:stPumpSelf:Creature.countersGE3LEVEL:0/0/HIDDEN CantBeBlockedBy Creature.nonBlack:No Condition:no text -K:Level up:4 -K:maxLevel:3 -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zulaport_enforcer.jpg -SetInfo:ROE|Common|http://magiccards.info/scans/en/roe/133.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zuo_ci_the_mocking_sage.txt b/res/cardsfolder/zuo_ci_the_mocking_sage.txt deleted file mode 100644 index 9718436d118..00000000000 --- a/res/cardsfolder/zuo_ci_the_mocking_sage.txt +++ /dev/null @@ -1,11 +0,0 @@ -Name:Zuo Ci, the Mocking Sage -ManaCost:1 G G -Types:Legendary Creature Human Advisor -Text:CARDNAME can't be blocked by creatures with horsemanship. -PT:1/2 -K:CantBeBlockedBy Creature.withHorsemanship -K:CARDNAME can't be the target of spells or abilities your opponents control. -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuo_ci_the_mocking_sage.jpg -SetInfo:PTK|Rare|http://magiccards.info/scans/en/p3k/165.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zur_the_enchanter.txt b/res/cardsfolder/zur_the_enchanter.txt deleted file mode 100644 index 51b19bfd8db..00000000000 --- a/res/cardsfolder/zur_the_enchanter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zur the Enchanter -ManaCost:1 W U B -Types:Legendary Creature Human Wizard -Text:Whenever CARDNAME 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. -PT:1/4 -K:Flying -SVar:Rarity:Rare -SVar:Picture:http://www.wizards.com/global/images/magic/general/zur_the_enchanter.jpg -SetInfo:CSP|Rare|http://magiccards.info/scans/en/cs/135.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zuran_enchanter.txt b/res/cardsfolder/zuran_enchanter.txt deleted file mode 100644 index 4b085e069cf..00000000000 --- a/res/cardsfolder/zuran_enchanter.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zuran Enchanter -ManaCost:1 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ Discard | Cost$ 2 B T | ValidTgts$ Player | PlayerTurn$ True | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Target player discards a card. Activate this ability only during your turn. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuran_enchanter.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/110.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zuran_orb.txt b/res/cardsfolder/zuran_orb.txt deleted file mode 100644 index ade85dc3620..00000000000 --- a/res/cardsfolder/zuran_orb.txt +++ /dev/null @@ -1,9 +0,0 @@ -Name:Zuran Orb -ManaCost:0 -Types:Artifact -Text:no text -A:AB$ GainLife | Cost$ Sac<1/Land> | LifeAmount$ 2 | SpellDescription$ You gain 2 life. -SVar:Rarity:Uncommon -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuran_orb.jpg -SetInfo:ICE|Uncommon|http://magiccards.info/scans/en/ia/325.jpg -End \ No newline at end of file diff --git a/res/cardsfolder/zuran_spellcaster.txt b/res/cardsfolder/zuran_spellcaster.txt deleted file mode 100644 index 93c3050cd64..00000000000 --- a/res/cardsfolder/zuran_spellcaster.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Zuran Spellcaster -ManaCost:2 U -Types:Creature Human Wizard -Text:no text -PT:1/1 -A:AB$ DealDamage | Cost$ T | Tgt$ TgtCP | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature or player. -SVar:Rarity:Common -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuran_spellcaster.jpg -SetInfo:ICE|Common|http://magiccards.info/scans/en/ia/111.jpg -End \ No newline at end of file diff --git a/res/decks/JuzamjediCube.dck b/res/decks/JuzamjediCube.dck index 2376ecaecfa..085cde43bdb 100644 --- a/res/decks/JuzamjediCube.dck +++ b/res/decks/JuzamjediCube.dck @@ -1,515 +1,515 @@ [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] +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/gui/display_new_layout.xml b/res/gui/display_new_layout.xml index 7e237935f26..ecfaed06d0f 100644 --- a/res/gui/display_new_layout.xml +++ b/res/gui/display_new_layout.xml @@ -1,12 +1,12 @@ - + 0 0 - 1680 - 980 + 1600 + 1114 @@ -17,7 +17,7 @@ 0 0 301 - 980 + 1114 @@ -28,7 +28,7 @@ 0 0 301 - 155 + 182 @@ -47,7 +47,7 @@ 0 - 155 + 182 301 5 @@ -62,9 +62,9 @@ 0 - 160 + 187 301 - 236 + 263 @@ -83,7 +83,7 @@ 0 - 396 + 450 301 5 @@ -98,9 +98,9 @@ 0 - 401 + 455 301 - 248 + 275 @@ -119,7 +119,7 @@ 0 - 649 + 730 301 5 @@ -134,9 +134,9 @@ 0 - 654 + 735 301 - 107 + 134 @@ -155,7 +155,7 @@ 0 - 761 + 869 301 5 @@ -170,9 +170,9 @@ 0 - 766 + 874 301 - 214 + 240 @@ -205,7 +205,7 @@ 301 0 5 - 980 + 1114 @@ -219,8 +219,8 @@ 306 0 - 1059 - 980 + 979 + 1114 @@ -230,8 +230,8 @@ 306 0 - 1059 - 443 + 979 + 496 @@ -250,8 +250,8 @@ 306 - 443 - 1059 + 496 + 979 5 @@ -265,9 +265,9 @@ 306 - 448 - 1059 - 346 + 501 + 979 + 399 @@ -286,8 +286,8 @@ 306 - 794 - 1059 + 900 + 979 5 @@ -301,9 +301,9 @@ 306 - 799 - 1059 - 181 + 905 + 979 + 209 @@ -336,10 +336,10 @@ - 1365 + 1285 0 5 - 980 + 1114 @@ -351,10 +351,10 @@ - 1370 + 1290 0 310 - 980 + 1114 @@ -362,10 +362,10 @@ - 1370 + 1290 0 310 - 551 + 618 @@ -383,8 +383,8 @@ - 1370 - 551 + 1290 + 618 310 5 @@ -398,10 +398,10 @@ - 1370 - 556 + 1290 + 623 310 - 424 + 491 diff --git a/res/lang/de.properties b/res/lang/de.properties index a83e7081785..b608075b1a4 100644 --- a/res/lang/de.properties +++ b/res/lang/de.properties @@ -1,4 +1,4 @@ -program/name=Forge - http://mtgrares.blogspot.com +program/name=Forge - http://cardforge.org @@ -74,25 +74,26 @@ DownloadPictures/errors/other=Du musst mit dem Internet Verbunden sein. Fehler b -ErrorViewer/show=Stapel-Report -ErrorViewer/title=Fehler -ErrorViewer/message=Ein Fehler ist aufgetreten. Du kannst diese Nachricht kopieren oder in einer Datei speichern.\n\ - Bitte melde diese Nachricht, und wie er aufgetreten ist, hier:\n\ +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\ - Falls du keine Konto anlegen willst, schreibe eine Mail an\n\ - \t%s\n\n\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 Architektur: %s\n\n\ + OS: %s Version: %s Architecture: %s\n\n\ Java Version: %s Vendor: %s\n\n\ - Detaillierter Stapelverlauf:\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=Du hast einen vollständigen Report verlangt +ErrorViewer/errors/show/message=Sie haben einen vollständigen Report verlangt @@ -136,6 +137,8 @@ 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: diff --git a/res/lang/en.properties b/res/lang/en.properties index e481a9505cc..c71feca0d29 100644 --- a/res/lang/en.properties +++ b/res/lang/en.properties @@ -56,6 +56,21 @@ 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. @@ -85,12 +100,12 @@ DownloadPictures/errors/other=You must be connected to the Internet. Error downl ErrorViewer/show=Stack Report -ErrorViewer/title=Error -ErrorViewer/message=An error has occurred. You can copy/paste this message or save it to a file.\n\ - Please report this, plus what you tried to do, to:\n\ +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\ - If you don't want to register an account, you can mail it directly to\n\ - \t%s\n\n\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\ @@ -145,6 +160,8 @@ 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: diff --git a/res/lib/google-collections-1.0.jar b/res/lib/google-collections-1.0.jar deleted file mode 100644 index 8e394facdf9..00000000000 Binary files a/res/lib/google-collections-1.0.jar and /dev/null differ diff --git a/res/lib/java-image-scaling-0.8.4.jar b/res/lib/java-image-scaling-0.8.4.jar deleted file mode 100644 index 02926f409ec..00000000000 Binary files a/res/lib/java-image-scaling-0.8.4.jar and /dev/null differ diff --git a/res/lib/jl1.0.1.jar b/res/lib/jl1.0.1.jar deleted file mode 100644 index bd5fb8b8eb2..00000000000 Binary files a/res/lib/jl1.0.1.jar and /dev/null differ diff --git a/res/lib/miglayout-3.7.3.1-swing.jar b/res/lib/miglayout-3.7.3.1-swing.jar deleted file mode 100644 index 9b88362b4a8..00000000000 Binary files a/res/lib/miglayout-3.7.3.1-swing.jar and /dev/null differ diff --git a/res/lib/napkinlaf-1.2.jar b/res/lib/napkinlaf-1.2.jar deleted file mode 100644 index 1c8129edf49..00000000000 Binary files a/res/lib/napkinlaf-1.2.jar and /dev/null differ diff --git a/res/lib/nimrodlf.jar b/res/lib/nimrodlf.jar deleted file mode 100644 index 3dcad2e7eda..00000000000 Binary files a/res/lib/nimrodlf.jar and /dev/null differ diff --git a/res/lib/substance.jar b/res/lib/substance.jar deleted file mode 100644 index 444f420ef80..00000000000 Binary files a/res/lib/substance.jar and /dev/null differ diff --git a/res/lib/xpp3_min-1.1.4c.jar b/res/lib/xpp3_min-1.1.4c.jar deleted file mode 100644 index 813a9a830bd..00000000000 Binary files a/res/lib/xpp3_min-1.1.4c.jar and /dev/null differ diff --git a/res/lib/xstream-1.3.1.jar b/res/lib/xstream-1.3.1.jar deleted file mode 100644 index 4ef4219c6f6..00000000000 Binary files a/res/lib/xstream-1.3.1.jar and /dev/null differ diff --git a/res/main.properties b/res/main.properties index 9e50fddfcf4..db5f645c8b5 100644 --- a/res/main.properties +++ b/res/main.properties @@ -1,8 +1,8 @@ -program/mail=mtgerror@yahoo.com -program/forum=http://www.slightlymagic.net/forum/viewforum.php?f=26 +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 @@ -59,4 +59,4 @@ lang--transparent-properties=lang/lang.properties image/base--file=pics image/token--file=pics/tokens image/icon--file=pics/icons -sound/base--file=sound \ No newline at end of file +sound/base--file=sound diff --git a/res/mtg-data.txt b/res/mtg-data.txt index 3fc05f1c270..adc6cb99a12 100644 --- a/res/mtg-data.txt +++ b/res/mtg-data.txt @@ -22,6 +22,7 @@ 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 @@ -56,6 +57,7 @@ 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 @@ -124,7 +126,7 @@ AEther Adept Creature - Human Wizard 2/2 When AEther Adept enters the battlefield, return target creature to its owner's hand. -M11 C +M11 C, M12 C AEther Barrier {2}{U} @@ -267,7 +269,7 @@ 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 +LRW C, JVC C, COM C AEthertow {3}{W/U} @@ -310,7 +312,7 @@ Enchantment - Aura Enchant creature When Abduction enters the battlefield, untap enchanted creature. You control enchanted creature. -When enchanted creature is put into a graveyard, return that card to the battlefield under its owner's control. +When enchanted creature dies, return that card to the battlefield under its owner's control. WTH U, 6ED U Abeyance @@ -386,8 +388,8 @@ Absolver Thrull {3}{W} Creature - Thrull Cleric 2/3 -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Absolver Thrull enters the battlefield or the creature it haunts is put into a graveyard, destroy target enchantment. +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 @@ -407,7 +409,7 @@ Abu Ja'far {W} Creature - Human 0/1 -When Abu Ja'far is put into a graveyard from the battlefield, destroy all creatures blocking or blocked by it. They can't be regenerated. +When Abu Ja'far dies, destroy all creatures blocking or blocked by it. They can't be regenerated. ARN U, CHR U Abuna Acolyte @@ -435,7 +437,7 @@ Abyssal Gatekeeper {1}{B} Creature - Horror 1/1 -When Abyssal Gatekeeper is put into a graveyard from the battlefield, each player sacrifices a creature. +When Abyssal Gatekeeper dies, each player sacrifices a creature. WTH C, DVD C Abyssal Horror @@ -487,7 +489,7 @@ Academy Rector {3}{W} Creature - Human Cleric 1/2 -When Academy Rector is put into a graveyard from the battlefield, you may exile it. If you do, search your library for an enchantment card, put that card onto the battlefield, then shuffle your library. +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 @@ -582,7 +584,7 @@ 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 +M10 U, M11 U, COM U, M12 U Acidic Sliver {B}{R} @@ -604,6 +606,12 @@ Creature - Human Cleric {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 @@ -635,7 +643,7 @@ 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 +M10 U, M11 C, M12 C Active Volcano {R} @@ -656,6 +664,15 @@ 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 @@ -675,7 +692,7 @@ Adarkar Valkyrie Snow Creature - Angel 4/5 Flying, vigilance -{T}: When target creature other than Adarkar Valkyrie is put into a graveyard this turn, return that card to the battlefield under your control. +{T}: When target creature other than Adarkar Valkyrie dies this turn, return that card to the battlefield under your control. CSP R Adarkar Wastes @@ -756,6 +773,14 @@ Sorcery 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 @@ -804,7 +829,7 @@ Aerie Ouphes Creature - Ouphe 3/3 Sacrifice Aerie Ouphes: Aerie Ouphes deals damage equal to its power to target creature with flying. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -842,7 +867,7 @@ 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 +MIR U, MMQ U, COM U Aftershock {2}{R}{R} @@ -951,8 +976,8 @@ RAV R Agyrem Plane - Ravnica -Whenever a white creature is put into a graveyard from the battlefield, return it to the battlefield under its owner's control at the beginning of the next end step. -Whenever a nonwhite creature is put into a graveyard from the battlefield, return it to its owner's hand at the beginning of the next end step. +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 @@ -1042,7 +1067,7 @@ Akki Blizzard-Herder {1}{R} Creature - Goblin Shaman 1/1 -When Akki Blizzard-Herder is put into a graveyard from the battlefield, each player sacrifices a land. +When Akki Blizzard-Herder dies, each player sacrifices a land. BOK C Akki Coalflinger @@ -1122,7 +1147,7 @@ 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 +ZEN U, COM U Akrasan Squire {W} @@ -1156,7 +1181,7 @@ Akroma's Vengeance Sorcery Destroy all artifacts, creatures, and enchantments. Cycling {3} ({3}, Discard this card: Draw a card.) -ONS R, HOP R +ONS R, HOP R, COM R Akroma, Angel of Fury {5}{R}{R}{R} @@ -1166,7 +1191,7 @@ 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 +PLC R, COM R Akroma, Angel of Wrath {5}{W}{W}{W} @@ -1215,7 +1240,7 @@ Alabaster Dragon Creature - Dragon 4/4 Flying -When Alabaster Dragon is put into a graveyard from the battlefield, shuffle Alabaster Dragon into its owner's library. +When Alabaster Dragon dies, shuffle it into its owner's library. POR R, WTH R Alabaster Leech @@ -1225,6 +1250,13 @@ Creature - Leech 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 @@ -1354,7 +1386,7 @@ Algae Gharial Creature - Crocodile 1/1 Shroud -Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on Algae Gharial. +Whenever another creature dies, you may put a +1/+1 counter on Algae Gharial. ALA U Ali Baba @@ -1420,6 +1452,12 @@ Creature - Human Mercenary 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 @@ -1460,7 +1498,7 @@ Alluring Siren Creature - Siren 1/1 {T}: Target creature an opponent controls attacks you this turn if able. -M10 U, M11 U +M10 U, M11 U, M12 U Alms {W} @@ -1619,6 +1657,12 @@ Creature - Kavu 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 @@ -1956,7 +2000,7 @@ Creature - Angel 5/5 Flying When Angel of Despair enters the battlefield, destroy target permanent. -GPT R +GPT R, COM R Angel of Fury {4}{W}{W} @@ -2001,7 +2045,7 @@ 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 +DST U, 9ED U, 10E U, DVD U, M10 U, M11 U, M12 U Angel's Grace {W} @@ -2021,7 +2065,7 @@ Angel's Mercy {2}{W}{W} Instant You gain 7 life. -M10 C +M10 C, M12 C Angel's Trumpet {3} @@ -2051,7 +2095,7 @@ Creature - Angel 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 +M11 R, COM R Angelic Benediction {3}{W} @@ -2079,6 +2123,14 @@ Creature - Angel Spirit 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 @@ -2142,7 +2194,7 @@ 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 +JUD U, COM U Angry Mob {2}{W}{W} @@ -2172,6 +2224,15 @@ 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 @@ -2230,7 +2291,7 @@ Anodet Lurker {5} Artifact Creature - Construct 3/3 -When Anodet Lurker is put into a graveyard from the battlefield, you gain 3 life. +When Anodet Lurker dies, you gain 3 life. 5DN C Anoint @@ -2286,7 +2347,7 @@ Antler Skulkin {5} Artifact Creature - Scarecrow 3/3 -{2}: Target white creature gains persist until end of turn. (When it's put into a graveyard from the battlefield, 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.) +{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 @@ -2398,7 +2459,7 @@ Aphetto Vulture Creature - Zombie Bird 3/2 Flying -When Aphetto Vulture is put into a graveyard from the battlefield, you may put target Zombie card from your graveyard on top of your library. +When Aphetto Vulture dies, you may put target Zombie card from your graveyard on top of your library. ONS U Aphotic Wisps @@ -2489,7 +2550,7 @@ 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 +DIS C, COM C Aquitect's Will {U} @@ -2512,6 +2573,22 @@ Artifact Creature - Spider 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 @@ -2520,13 +2597,20 @@ Legendary Creature - Spirit 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 +LRW R, COM R Arbor Elf {G} @@ -2651,7 +2735,7 @@ Arcbound Bruiser {5} Artifact Creature - Golem 0/0 -Modular 3 (This enters the battlefield with three +1/+1 counters on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2660,7 +2744,7 @@ 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2669,7 +2753,7 @@ 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2677,7 +2761,7 @@ Arcbound Hybrid Artifact Creature - Beast 0/0 Haste -Modular 2 (This enters the battlefield with two +1/+1 counters on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2685,7 +2769,7 @@ Arcbound Lancer Artifact Creature - Beast 0/0 First strike -Modular 4 (This enters the battlefield with four +1/+1 counters on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2693,7 +2777,7 @@ Arcbound Overseer 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2708,7 +2792,7 @@ Arcbound Ravager 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2716,7 +2800,7 @@ Arcbound Reclaimer 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2724,7 +2808,7 @@ Arcbound Slith 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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2732,21 +2816,21 @@ Arcbound Stinger Artifact Creature - Insect 0/0 Flying -Modular 1 (This enters the battlefield with a +1/+1 counter on it. When it's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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's put into a graveyard, you may put its +1/+1 counters on target artifact creature.) +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 @@ -2762,6 +2846,16 @@ Creature - Angel 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 @@ -2812,8 +2906,8 @@ Archon of Justice Creature - Archon 4/4 Flying -When Archon of Justice is put into a graveyard from the battlefield, exile target permanent. -EVE R +When Archon of Justice dies, exile target permanent. +EVE R, M12 R Archon of Redemption {3}{W}{W} @@ -2850,7 +2944,7 @@ 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 is put into a graveyard from the battlefield, you gain 2 life for each age counter on it. +When Arctic Nishoba dies, you gain 2 life for each age counter on it. CSP U Arctic Wolves @@ -3094,7 +3188,7 @@ 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 +CON C, DDG C, COM C Armistice {2}{W} @@ -3174,6 +3268,12 @@ Creature - Pegasus 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 @@ -3305,7 +3405,7 @@ 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 +ROE U, ARC U, COM U Ascendant Evincar {4}{B}{B} @@ -3328,7 +3428,7 @@ ONS C Asceticism {3}{G}{G} Enchantment -Creatures you control can't be the targets of spells or abilities your opponents control. +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 @@ -3379,7 +3479,7 @@ Ashen-Skin Zubera {1}{B} Creature - Zubera Spirit 1/2 -When Ashen-Skin Zubera is put into a graveyard from the battlefield, target opponent discards a card for each Zubera put into a graveyard from the battlefield this turn. +When Ashen-Skin Zubera dies, target opponent discards a card for each Zubera that died this turn. CHK C Ashenmoor Cohort @@ -3541,7 +3641,7 @@ Assault Griffin Creature - Griffin 3/2 Flying -M11 C +M11 C, M12 C Assault Strobe {R} @@ -3600,7 +3700,7 @@ Aswan Jaguar 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. -GG, T: Destroy target creature with the chosen type. It can't be regenerated. +{G}{G}, {T}: Destroy target creature with the chosen type. It can't be regenerated. ASTRAL S Atalya, Samite Master @@ -3628,7 +3728,7 @@ Attrition {1}{B}{B} Enchantment {B}, Sacrifice a creature: Destroy target nonblack creature. -UDS R +UDS R, COM R Attunement {2}{U} @@ -3745,14 +3845,14 @@ Aura Shards {1}{G}{W} Enchantment Whenever a creature enters the battlefield under your control, you may destroy target artifact or enchantment. -INV U +INV U, COM U Aura Thief {3}{U} Creature - Illusion 2/2 Flying -When Aura Thief is put into a graveyard from the battlefield, you gain control of all enchantments. (You don't get to move Auras.) +When Aura Thief dies, you gain control of all enchantments. (You don't get to move Auras.) UDS R Aura of Dominion @@ -3774,7 +3874,7 @@ Auramancer Creature - Human Wizard 2/2 When Auramancer enters the battlefield, you may return target enchantment card from your graveyard to your hand. -ODY C +ODY C, M12 C Auramancer's Guise {2}{U}{U} @@ -3930,7 +4030,7 @@ Auspicious Ancestor {3}{W} Creature - Human Cleric 2/3 -When Auspicious Ancestor is put into a graveyard from the battlefield, you gain 3 life. +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 @@ -3938,7 +4038,7 @@ 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 +LRW R, COM R Autochthon Wurm {10}{G}{G}{G}{W}{W} @@ -3960,7 +4060,7 @@ 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 +M11 U, M12 U Avalanche {X}{2}{R}{R} @@ -4008,7 +4108,7 @@ Creature - Avatar 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 +PCY R, COM R Avatar of Hope {6}{W}{W} @@ -4027,6 +4127,13 @@ If an opponent controls at least four more creatures than you, Avatar of Might c 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 @@ -4042,7 +4149,7 @@ Creature - Avatar 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 +PCY R, TSB S, ARC R, COM R Aven Archer {3}{W}{W} @@ -4106,9 +4213,17 @@ Aven Fisher Creature - Bird Soldier 2/2 Flying (This creature can't be blocked except by creatures with flying or reach.) -When Aven Fisher is put into a graveyard from the battlefield, you may draw a card. +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 @@ -4256,7 +4371,7 @@ Avenging Angel Creature - Angel 3/3 Flying -When Avenging Angel is put into a graveyard from the battlefield, you may put Avenging Angel on top of its owner's library. +When Avenging Angel dies, you may put it on top of its owner's library. TMP R Avenging Druid @@ -4292,7 +4407,7 @@ 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 is on the battlefield. It's still a land. +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 @@ -4305,7 +4420,7 @@ 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 +ROE R, COM R Awe Strike {W} @@ -4331,7 +4446,7 @@ Axelrod Gunnarson Legendary Creature - Giant 5/5 Trample -Whenever a creature dealt damage by Axelrod Gunnarson this turn is put into a graveyard, you gain 1 life and Axelrod deals 1 damage to target player. +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 @@ -4403,7 +4518,7 @@ 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 +DIS C, COM C Azorius First-Wing {W}{U} @@ -4416,10 +4531,9 @@ Azorius Guildmage {W/U}{W/U} Creature - Vedalken Wizard 2/2 -({W/U} can be paid with either {W} or {U}.) {2}{W}: Tap target creature. {2}{U}: Counter target activated ability. (Mana abilities can't be targeted.) -DIS U +DIS U, COM U Azorius Herald {2}{W} @@ -4450,6 +4564,13 @@ Creature - Drake 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 @@ -4729,7 +4850,7 @@ Baloth Woodcrasher 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 +ZEN U, COM U Balshan Beguiler {2}{U} @@ -4815,7 +4936,7 @@ Banewasp Affliction {1}{B} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, that creature's controller loses life equal to its toughness. +When enchanted creature dies, that creature's controller loses life equal to its toughness. ALA C Banishing Knack @@ -4875,7 +4996,7 @@ Bant Sojourners {1}{G}{W}{U} Creature - Human Soldier 2/4 -When you cycle Bant Sojourners or it's put into a graveyard from the battlefield, you may put a 1/1 white Soldier creature token onto the battlefield. +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 @@ -5032,7 +5153,7 @@ Barishi {2}{G}{G} Creature - Elemental 4/3 -When Barishi is put into a graveyard from the battlefield, exile Barishi, then shuffle all creature cards from your graveyard into your library. +When Barishi dies, exile Barishi, then shuffle all creature cards from your graveyard into your library. WTH U Barkhide Mauler @@ -5066,7 +5187,7 @@ Baron Sengir Legendary Creature - Vampire 5/5 Flying -Whenever a creature dealt damage by Baron Sengir this turn is put into a graveyard, put a +2/+2 counter on Baron Sengir. +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 @@ -5106,7 +5227,7 @@ 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 +ONS C, DVD C, ARC C, COM C Barrenton Cragtreads {2}{W/U}{W/U} @@ -5223,6 +5344,15 @@ Basalt Monolith doesn't untap during your untap step. {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 @@ -5249,7 +5379,7 @@ 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 +RAV U, COM U Baton of Courage {3} @@ -5718,8 +5848,8 @@ Belfry Spirit Creature - Spirit 1/1 Flying -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Belfry Spirit enters the battlefield or the creature it haunts is put into a graveyard, put two 1/1 black Bat creature tokens with flying onto the battlefield. +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 @@ -5754,7 +5884,7 @@ 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 +RAV U, M12 U Beloved Chaplain {1}{W} @@ -5845,6 +5975,13 @@ Creature - Human Soldier {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 @@ -5856,7 +5993,7 @@ Benediction of Moons 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 is put into a graveyard, you gain 1 life for each player. +When the creature Benediction of Moons haunts dies, you gain 1 life for each player. GPT C Benevolent Ancestor @@ -5915,13 +6052,13 @@ Bequeathal {G} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, you draw two cards. +When enchanted creature dies, you draw two cards. EXO C Bereavement {1}{B} Enchantment -Whenever a green creature is put into a graveyard from the battlefield, its controller discards a card. +Whenever a green creature dies, its controller discards a card. USG U, 7ED U Berserk @@ -5964,7 +6101,7 @@ 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 +WWK U, COM U Betrayal {U} @@ -6080,7 +6217,7 @@ 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 +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 @@ -6156,7 +6293,7 @@ LEG U, 4ED R Black Market {3}{B}{B} Enchantment -Whenever a creature is put into a graveyard from the battlefield, put a charge counter on Black Market. +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 @@ -6233,7 +6370,7 @@ NPH R Blade of the Bloodchief {1} Artifact - Equipment -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. +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 @@ -6293,7 +6430,7 @@ Legendary Creature - Zombie Dragon 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 +SCG R, FVD R, COM R Bladewing's Thrall {2}{B}{B} @@ -6397,7 +6534,7 @@ Blazing Effigy {1}{R} Creature - Elemental 0/3 -When Blazing Effigy is put into a graveyard from the battlefield, Blazing Effigy 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. +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 @@ -6587,8 +6724,8 @@ Blind Hunter Creature - Bat 2/2 Flying -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Blind Hunter enters the battlefield or the creature it haunts is put into a graveyard, target player loses 2 life and you gain 2 life. +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 @@ -6712,7 +6849,7 @@ Blistergrub Creature - Horror 2/2 Swampwalk -When Blistergrub is put into a graveyard from the battlefield, each opponent loses 2 life. +When Blistergrub dies, each opponent loses 2 life. SOM C Blistering Barrier @@ -6823,7 +6960,7 @@ Blood Cultist Creature - Human Wizard 1/1 {T}: Blood Cultist deals 1 damage to target creature. -Whenever a creature dealt damage by Blood Cultist this turn is put into a graveyard, put a +1/+1 counter on Blood Cultist. +Whenever a creature dealt damage by Blood Cultist this turn dies, put a +1/+1 counter on Blood Cultist. ALA U Blood Frenzy @@ -6873,6 +7010,14 @@ 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 @@ -6891,7 +7036,7 @@ Blood Seeker 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 +ZEN C, M12 C Blood Speaker {3}{B} @@ -7054,6 +7199,15 @@ Creature - Elf Wizard Shaman {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 @@ -7068,6 +7222,13 @@ Creature - Elemental 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 @@ -7174,7 +7335,7 @@ WTH C Blowfly Infestation {2}{B} Enchantment -Whenever a creature is put into a graveyard from the battlefield, if it had a -1/-1 counter on it, put a -1/-1 counter on target creature. +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 @@ -7267,7 +7428,7 @@ Body Snatcher Creature - Minion 2/2 When Body Snatcher enters the battlefield, exile it unless you discard a creature card. -When Body Snatcher is put into a graveyard from the battlefield, exile Body Snatcher and return target creature card from your graveyard to the battlefield. +When Body Snatcher dies, exile Body Snatcher and return target creature card from your graveyard to the battlefield. UDS R Body of Jukai @@ -7275,7 +7436,7 @@ Body of Jukai Creature - Spirit 8/5 Trample -Soulshift 8 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 8 or less from your graveyard to your hand.) +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 @@ -7399,7 +7560,7 @@ Bogardan Firefiend {2}{R} Creature - Elemental Spirit 2/1 -When Bogardan Firefiend is put into a graveyard from the battlefield, it deals 2 damage to target creature. +When Bogardan Firefiend dies, it deals 2 damage to target creature. WTH C, 10E C, HOP C Bogardan Hellkite @@ -7424,7 +7585,7 @@ Bogardan Phoenix Creature - Phoenix 3/3 Flying -When Bogardan Phoenix is put into a graveyard from the battlefield, 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. +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 @@ -7490,7 +7651,7 @@ SHM U, H10 U Boggart Shenanigans {2}{R} Tribal Enchantment - Goblin -Whenever another Goblin you control is put into a graveyard from the battlefield, you may have Boggart Shenanigans deal 1 damage to target player. +Whenever another Goblin you control dies, you may have Boggart Shenanigans deal 1 damage to target player. LRW U, EVG U Boggart Sprite-Chaser @@ -7524,7 +7685,7 @@ 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 +WWK C, COM C Bojuka Brigand {1}{B} @@ -7620,7 +7781,7 @@ 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. For each 1 damage prevented this way, exile the top card of your library. +{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 @@ -7653,6 +7814,12 @@ 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 @@ -7823,16 +7990,15 @@ 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 +RAV C, HOP C, COM C Boros Guildmage {R/W}{R/W} Creature - Human Wizard 2/2 -({R/W} can be paid with either {R} or {W}.) {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 +RAV U, HOP U, COM U Boros Recruit {R/W} @@ -7846,7 +8012,7 @@ Boros Signet {2} Artifact {1}, {T}: Add {R}{W} to your mana pool. -RAV C, HOP C +RAV C, HOP C, COM C Boros Swiftblade {R}{W} @@ -7972,7 +8138,7 @@ Bountiful Harvest {4}{G} Sorcery You gain 1 life for each land you control. -M10 C +M10 C, M12 C Bounty Hunter {2}{B}{B} @@ -8088,7 +8254,7 @@ 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 +ICE C, 5ED C, MMQ C, BTD C, ME2 C, COM C Brainwash {W} @@ -8244,7 +8410,7 @@ 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 +JUD U, COM U Breach {2}{B} @@ -8289,7 +8455,7 @@ Breath of Darigaaz 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 +INV U, ARC U, DDG U, COM U Breath of Dreams {2}{U}{U} @@ -8475,7 +8641,7 @@ Brindle Boar Creature - Boar 2/2 Sacrifice Brindle Boar: You gain 4 life. -M11 C +M11 C, M12 C Brine Elemental {4}{U}{U} @@ -8489,7 +8655,7 @@ Brine Hag {2}{U}{U} Creature - Hag 2/2 -When Brine Hag is put into a graveyard from the battlefield, all creatures that dealt damage to it this turn become 0/2. (This effect lasts indefinitely.) +When Brine Hag dies, all creatures that dealt damage to it this turn become 0/2. (This effect lasts indefinitely.) LEG U Brine Seer @@ -8557,7 +8723,7 @@ Brink of Disaster Enchantment - Aura Enchant creature or land When enchanted permanent becomes tapped, destroy it. -WWK C +WWK C, M12 C Brink of Madness {2}{B}{B} @@ -8569,9 +8735,9 @@ Brion Stoutarm {2}{R}{W} Legendary Creature - Giant Warrior 4/4 -Lifelink (Damage dealt by this creature also causes you to gain that much life.) +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 +LRW R, COM R Brittle Effigy {1} @@ -8904,7 +9070,13 @@ 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 +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} @@ -8947,7 +9119,7 @@ MIR U Burning Sands {3}{R}{R} Enchantment -Whenever a creature is put into a graveyard from the battlefield, that creature's controller sacrifices a land. +Whenever a creature dies, that creature's controller sacrifices a land. ODY R Burning Shield Askari @@ -8974,7 +9146,7 @@ Burning-Eye Zubera {2}{R}{R} Creature - Zubera Spirit 3/3 -When Burning-Eye Zubera is put into a graveyard from the battlefield, if 4 or more damage was dealt to it this turn, Burning-Eye Zubera deals 3 damage to target creature or player. +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 @@ -9012,7 +9184,7 @@ Burr Grafter Creature - Spirit 2/2 Sacrifice Burr Grafter: Target creature gets +2/+2 until end of turn. -Soulshift 3 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 @@ -9068,7 +9240,7 @@ Bushi Tenderfoot {W} Creature - Human Soldier 1/1 -When a creature dealt damage by Bushi Tenderfoot this turn is put into a graveyard, flip Bushi Tenderfoot. +When a creature dealt damage by Bushi Tenderfoot this turn dies, flip Bushi Tenderfoot. ---- Kenzo the Hardhearted Legendary Creature - Human Samurai @@ -9088,8 +9260,8 @@ Butcher of Malakir Creature - Vampire Warrior 5/4 Flying -Whenever Butcher of Malakir or another creature you control is put into a graveyard from the battlefield, each opponent sacrifices a creature. -WWK R +Whenever Butcher of Malakir or another creature you control dies, each opponent sacrifices a creature. +WWK R, COM R Cabal Archon {2}{B} @@ -9360,7 +9532,7 @@ Call the Skybreaker 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 +EVE R, COM R Call to Arms {1}{W} @@ -9393,7 +9565,7 @@ Call to the Grave 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 +SCG R, M12 R Call to the Netherworld {B} @@ -9508,7 +9680,7 @@ Cancel {1}{U}{U} Instant Counter target spell. -TSP C, 10E C, ALA C, M10 C, ZEN C, M11 C +TSP C, 10E C, ALA C, M10 C, ZEN C, M11 C, M12 C Candelabra of Tawnos {1} @@ -9781,7 +9953,7 @@ 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 be put into a graveyard this turn, exile it instead. +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 @@ -9823,6 +9995,14 @@ 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 @@ -9934,7 +10114,7 @@ Carrion Thrash {2}{B}{R}{G} Creature - Viashino Warrior 4/4 -When Carrion Thrash is put into a graveyard from the battlefield, you may pay {2}. If you do, return another target creature card from your graveyard to your hand. +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 @@ -10004,7 +10184,7 @@ Casting of Bones {2}{B} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, draw three cards, then discard one of them. +When enchanted creature dies, draw three cards, then discard one of them. ALL C (x2) Castle @@ -10161,7 +10341,7 @@ Artifact Creature - Wall 0/3 ({W/P} can be paid with either {W} or 2 life.) Defender -When Cathedral Membrane is put into a graveyard from the battlefield during combat, it deals 6 damage to each creature it blocked this combat. +When Cathedral Membrane dies during combat, it deals 6 damage to each creature it blocked this combat. NPH U Cathedral of Serra @@ -10173,7 +10353,7 @@ Cathodion {3} Artifact Creature - Construct 3/3 -When Cathodion is put into a graveyard from the battlefield, add {3} to your mana pool. +When Cathodion dies, add {3} to your mana pool. USG U, MRD U Cauldron Dance @@ -10187,13 +10367,13 @@ 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's put into a graveyard from the battlefield, 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.) +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's put into a graveyard from the battlefield, 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.) +{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 @@ -10207,7 +10387,7 @@ Caustic Hound {5}{B} Creature - Hound 4/4 -When Caustic Hound is put into a graveyard from the battlefield, each player loses 4 life. +When Caustic Hound dies, each player loses 4 life. MBS C Caustic Rain @@ -10367,12 +10547,19 @@ Nonland cards you own that aren't on the battlefield, spells you control, and no 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 is put into a graveyard from the battlefield, exile it, then return up to two target Bird and/or Cleric permanent cards from your graveyard to the battlefield. +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 @@ -10401,7 +10588,7 @@ Celestial Purge {1}{W} Instant Exile target black or red permanent. -CON U, M10 U, M11 U +CON U, M10 U, M11 U, M12 U Celestial Sword {6} @@ -10427,7 +10614,7 @@ Cemetery Puca {1}{U/B}{U/B} Creature - Shapeshifter 1/2 -Whenever a creature is put into a graveyard from the battlefield, you may pay {1}. If you do, Cemetery Puca becomes a copy of that creature and gains this ability. +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 @@ -10436,7 +10623,7 @@ 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 +M10 R, ARC R, M12 R Cenn's Enlistment {3}{W} @@ -10512,7 +10699,7 @@ Centaur Safeguard Creature - Centaur Warrior 3/1 ({G/W} can be paid with either {G} or {W}.) -When Centaur Safeguard is put into a graveyard from the battlefield, you may gain 3 life. +When Centaur Safeguard dies, you may gain 3 life. RAV C Centaur Veteran @@ -10711,7 +10898,7 @@ 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 +WWK R, COM R Chain Stasis {U} @@ -10854,6 +11041,14 @@ 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 @@ -10939,7 +11134,16 @@ 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 +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} @@ -10949,6 +11153,15 @@ 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 @@ -11043,6 +11256,12 @@ 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 @@ -11190,7 +11409,15 @@ 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 +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} @@ -11217,7 +11444,7 @@ Child of Alara Legendary Creature - Avatar 6/6 Trample -When Child of Alara is put into a graveyard from the battlefield, destroy all nonland permanents. They can't be regenerated. +When Child of Alara dies, destroy all nonland permanents. They can't be regenerated. CON M Child of Gaea @@ -11234,7 +11461,7 @@ Child of Night Creature - Vampire 2/1 Lifelink (Damage dealt by this creature also causes you to gain that much life.) -M10 C, M11 C +M10 C, M11 C, M12 C Child of Thorns {G} @@ -11344,7 +11571,7 @@ Chimney Imp Creature - Imp 1/2 Flying -When Chimney Imp is put into a graveyard from the battlefield, target opponent puts a card from his or her hand on top of his or her library. +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 @@ -11471,7 +11698,7 @@ 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 +RAV R, COM R Chromatic Armor {1}{W}{U} @@ -11525,7 +11752,7 @@ 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 +LGN R, COM R Chromium {2}{W}{W}{U}{U}{B}{B} @@ -11578,7 +11805,7 @@ 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 is put into a graveyard from the battlefield, if it had no time counters on it, put two tokens that are copies of it onto the battlefield. +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 @@ -11597,7 +11824,7 @@ TOR C Cinder Cloud {3}{R}{R} Instant -Destroy target creature. If a white creature is put into a graveyard this way, Cinder Cloud deals damage to that creature's controller equal to the creature's power. +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 @@ -11693,6 +11920,12 @@ 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 @@ -11924,7 +12157,7 @@ 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 +RAV U, COM U Cleansing Meditation {1}{W}{W} @@ -12157,7 +12390,7 @@ Clone Shell 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 is put into a graveyard from the battlefield, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control. +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 @@ -12487,7 +12720,7 @@ Cobra Trap 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 +ZEN U, COM U Cockatrice {3}{G}{G} @@ -12503,7 +12736,7 @@ 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 and enchanted creature gets +1/+1 and gains flying. (This effect lasts indefinitely.) +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 @@ -12635,6 +12868,12 @@ 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 @@ -12647,7 +12886,7 @@ Colossal Might {R}{G} Instant Target creature gets +4/+2 and gains trample until end of turn. -ARB C, ARC C +ARB C, ARC C, COM C Colossus of Sardia {9} @@ -12677,14 +12916,19 @@ Combust 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 +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 +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} @@ -12892,7 +13136,7 @@ Congregate {3}{W} Instant Target player gains 2 life for each creature on the battlefield. -USG C, HOP C +USG C, HOP C, COM C Congregation at Dawn {G}{G}{W} @@ -12994,7 +13238,7 @@ Consume Spirit 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 +MRD C, 9ED U, 10E U, DVD U, M10 U, HOP U, M12 U Consume Strength {1}{B}{G} @@ -13159,7 +13403,7 @@ 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 +M11 R, COM R Convalescence {1}{W} @@ -13327,7 +13571,7 @@ Coral Merfolk {1}{U} Creature - Merfolk 2/1 -USG C, 7ED C, M10 C +USG C, 7ED C, M10 C, M12 C Coral Net {U} @@ -13371,7 +13615,7 @@ Core Prowler 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 is put into a graveyard from the battlefield, proliferate. (You choose any number of permanents and/or players with counters on them, then give each another counter of a kind already there.) +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 @@ -13516,7 +13760,7 @@ Corrupted Zendikon Enchantment - Aura Enchant land Enchanted land is a 3/3 black Ooze creature. It's still a land. -When enchanted land is put into a graveyard, return that card to its owner's hand. +When enchanted land dies, return that card to its owner's hand. WWK C Corrupting Licid @@ -13643,7 +13887,7 @@ Creature - Vedalken Knight 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 +DIS U, COM U Covenant of Minds {4}{U} @@ -13875,7 +14119,7 @@ Crawling Filth Creature - Spirit 2/2 Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Soulshift 5 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) +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 @@ -13938,7 +14182,7 @@ Creature Bond {1}{U} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, Creature Bond deals damage equal to that creature's toughness to the creature's controller. +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 @@ -13981,6 +14225,14 @@ 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 @@ -14036,6 +14288,13 @@ Creature - Kobold 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 @@ -14225,6 +14484,12 @@ As long as the top card of your library is a creature card, creatures you contro {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 @@ -14339,6 +14604,14 @@ 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. @@ -14348,7 +14621,7 @@ ALA U Crumbling Sanctuary {5} Artifact -For each 1 damage that would be dealt to a player, that player exiles the top card of his or her library instead. +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 @@ -14389,7 +14662,7 @@ Crusher Zendikon Enchantment - Aura Enchant land Enchanted land is a 4/2 red Beast creature with trample. It's still a land. -When enchanted land is put into a graveyard, return that card to its owner's hand. +When enchanted land dies, return that card to its owner's hand. WWK C Crushing Pain @@ -14403,7 +14676,7 @@ Cry of Contrition 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 is put into a graveyard, target player discards a card. +When the creature Cry of Contrition haunts dies, target player discards a card. GPT C Cryoclasm @@ -14582,7 +14855,7 @@ Cudgel Troll 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 +M10 U, M11 U, M12 U Culling Dais {2} @@ -14621,7 +14894,7 @@ 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 +M11 C, COM C Cultural Exchange {4}{U}{U} @@ -14866,14 +15139,14 @@ Cyclopean Giant {2}{B}{B} Creature - Zombie Giant 4/2 -When Cyclopean Giant is put into a graveyard from the battlefield, target land becomes a Swamp. Exile Cyclopean Giant. +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 is put into a graveyard from the battlefield, exile Cyclopean Mummy. +When Cyclopean Mummy dies, exile it. LEG C, 4ED C, ME4 C Cyclopean Snare @@ -15044,6 +15317,15 @@ Creature - Human Wizard 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 @@ -15201,13 +15483,21 @@ Dark Depths enters the battlefield with ten ice counters on it. 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 +USG R, COM R Dark Heart of the Wood {B}{G} @@ -15342,7 +15632,7 @@ Darkslick Drake Creature - Drake 2/4 Flying -When Darkslick Drake is put into a graveyard from the battlefield, draw a card. +When Darkslick Drake dies, draw a card. SOM U Darkslick Shores @@ -15408,7 +15698,7 @@ Darksteel Ingot 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 +DST C, COM C Darksteel Juggernaut {5} @@ -15619,7 +15909,7 @@ Dauthi Ghoul Creature - Dauthi Zombie 1/1 Shadow (This creature can block or be blocked by only creatures with shadow.) -Whenever a creature with shadow is put into a graveyard from the battlefield, put a +1/+1 counter on Dauthi Ghoul. +Whenever a creature with shadow dies, put a +1/+1 counter on Dauthi Ghoul. TMP U Dauthi Horror @@ -15768,7 +16058,7 @@ Day of Judgment {2}{W}{W} Sorcery Destroy all creatures. -ZEN R, M11 R +ZEN R, M11 R, M12 R Day of the Dragons {4}{U}{U}{U} @@ -15846,7 +16136,7 @@ Deadly Grub 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 is put into a graveyard from the battlefield, 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.) +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 @@ -15862,7 +16152,7 @@ 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 +M10 C, COM C Deadshot {3}{R} @@ -15884,7 +16174,7 @@ 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 +PLC U, COM U Death Baron {1}{B}{B} @@ -15942,7 +16232,7 @@ 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 +APC U, COM U Death Pit Offering {2}{B}{B} @@ -16002,7 +16292,7 @@ Death Watch {B} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, its controller loses life equal to its power and you gain life equal to its toughness. +When enchanted creature dies, its controller loses life equal to its power and you gain life equal to its toughness. VIS C Death Wish @@ -16011,6 +16301,12 @@ 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 @@ -16042,7 +16338,7 @@ Death's-Head Buzzard Creature - Bird 2/1 Flying -When Death's-Head Buzzard is put into a graveyard from the battlefield, all creatures get -1/-1 until end of turn. +When Death's-Head Buzzard dies, all creatures get -1/-1 until end of turn. SCG C Death-Hood Cobra @@ -16075,7 +16371,7 @@ Deathbringer Thoctar {4}{B}{R} Creature - Zombie Beast 3/3 -Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on Deathbringer Thoctar. +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 @@ -16090,7 +16386,7 @@ Deathcurse Ogre {5}{B} Creature - Ogre Warrior 3/3 -When Deathcurse Ogre is put into a graveyard from the battlefield, each player loses 3 life. +When Deathcurse Ogre dies, each player loses 3 life. CHK C Deathforge Shaman @@ -16112,7 +16408,7 @@ Deathgreeter {B} Creature - Human Shaman 1/1 -Whenever another creature is put into a graveyard from the battlefield, you may gain 1 life. +Whenever another creature dies, you may gain 1 life. ALA C, GVL C Deathgrip @@ -16127,7 +16423,7 @@ 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 1 or less from your graveyard to your hand.) +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 @@ -16148,7 +16444,7 @@ Deathmark {B} Sorcery Destroy target green or white creature. -CSP U, 10E U, M10 U, M11 U +CSP U, 10E U, M10 U, M11 U, M12 U Deathmark Prelate {3}{B} @@ -16168,7 +16464,7 @@ Deathrender {4} Artifact - Equipment Equipped creature gets +2/+2. -Whenever equipped creature is put into a graveyard, you may put a creature card from your hand onto the battlefield and attach Deathrender to it. +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 @@ -16245,7 +16541,7 @@ Decomposition 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 is put into a graveyard, its controller loses 2 life. +When enchanted creature dies, its controller loses 2 life. MIR U Deconstruct @@ -16516,7 +16812,7 @@ 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. If that creature is tapped, untap it. +Target creature gets +1/+3 until end of turn. Untap that creature. POR U Defiant Vanguard @@ -16630,7 +16926,7 @@ FUT U Delaying Shield {3}{W} Enchantment -If you would be dealt damage, put that many delay counters on Delaying Shield instead. +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 @@ -16736,7 +17032,7 @@ 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 +DST U, 9ED U, 10E U, DVD U, M10 U, M11 U, M12 U Demon's Jester {3}{B} @@ -16749,7 +17045,7 @@ 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 be put into a graveyard this turn, exile it instead. +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 @@ -16828,7 +17124,7 @@ Demystify {W} Instant Destroy target enchantment. -ONS C, 8ED C, 9ED C, 10E C, ROE C +ONS C, 8ED C, 9ED C, 10E C, ROE C, M12 C Denizen of the Deep {6}{U}{U} @@ -16934,7 +17230,7 @@ Desecrator Hag 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 +EVE C, COM C Desert Land - Desert @@ -17202,6 +17498,14 @@ 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 @@ -17264,7 +17568,7 @@ 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 is put into a graveyard, exile it and return Diabolic Servitude to its owner's hand. +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 @@ -17272,7 +17576,7 @@ 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 +ODY U, 8ED U, 9ED U, 10E U, M10 U, M11 U, COM U, M12 U Diabolic Vision {U}{B} @@ -17357,7 +17661,7 @@ 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 +RAV C, COM C Dimir Cutpurse {1}{U}{B} @@ -17410,7 +17714,7 @@ Dimir Signet {2} Artifact {1}, {T}: Add {U}{B} to your mana pool. -RAV C, ARC C +RAV C, ARC C, COM C Din of the Fireherd {5}{B/R}{B/R}{B/R} @@ -17427,7 +17731,7 @@ 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 is put into a graveyard from the battlefield, Dingus Staff deals 2 damage to that creature's controller. +Whenever a creature dies, Dingus Staff deals 2 damage to that creature's controller. WTH U Diplomatic Escort @@ -17508,7 +17812,7 @@ Disaster Radius 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 +ROE R, COM R Disciple of Grace {1}{W} @@ -17581,7 +17885,7 @@ Disease Carriers {2}{B}{B} Creature - Rat 2/2 -When Disease Carriers is put into a graveyard from the battlefield, target creature gets -2/-2 until end of turn. +When Disease Carriers dies, target creature gets -2/-2 until end of turn. UDS C Diseased Vermin @@ -17614,7 +17918,7 @@ Disentomb {B} Sorcery Return target creature card from your graveyard to your hand. -M10 C, M11 C +M10 C, M11 C, M12 C Disfigure {B} @@ -17632,7 +17936,7 @@ 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 be put into a graveyard this turn, exile it instead. +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 @@ -17814,7 +18118,7 @@ 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 +CHK C, 10E C, M12 C Disturbed Burial {1}{B} @@ -17868,7 +18172,7 @@ Divination {2}{U} Sorcery Draw two cards. -M10 C +M10 C, M12 C Divine Congregation {3}{W} @@ -17877,6 +18181,14 @@ 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 @@ -17989,7 +18301,7 @@ Creature - Djinn 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 +M10 R, M12 R Djinn of the Lamp {5}{U}{U} @@ -18071,7 +18383,7 @@ 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 +EVE R, COM R Donate {2}{U} @@ -18090,7 +18402,7 @@ Doom Blade {1}{B} Instant Destroy target nonblack creature. -M10 C, M11 C +M10 C, M11 C, COM C, M12 C Doom Cannon {6} @@ -18202,6 +18514,12 @@ 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 @@ -18269,7 +18587,7 @@ 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 {1}0}. This cost is reduced by {2} for each basic land type among lands you control. +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 @@ -18408,7 +18726,7 @@ 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 +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} @@ -18423,7 +18741,7 @@ 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 +DST U, 9ED U, 10E U, M10 U, M11 U, DDG U, M12 U Dragon's Herald {R} @@ -18443,7 +18761,7 @@ 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 +M10 R, M11 R, M12 R Dragonsoul Knight {2}{R} @@ -18551,7 +18869,7 @@ Dralnu, Lich Lord {3}{U}{B} Legendary Creature - Zombie Wizard 3/3 -If damage would be dealt to Dralnu, sacrifice that many permanents instead. +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 @@ -18584,6 +18902,13 @@ 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 @@ -18658,7 +18983,7 @@ 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 +TSP U, COM U Dreadwing {B} @@ -18769,7 +19094,7 @@ Dreamborn Muse 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 +LGN R, 10E R, COM R Dreamcatcher {U} @@ -18804,7 +19129,7 @@ Dreamstone Hedron Artifact {T}: Add {3} to your mana pool. {3}, {T}, Sacrifice Dreamstone Hedron: Draw three cards. -ROE U, ARC U +ROE U, ARC U, COM U Dreamwinder {3}{U} @@ -18900,6 +19225,14 @@ Drifting Meadow enters the battlefield tapped. 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 @@ -18928,7 +19261,7 @@ Dripping-Tongue Zubera {1}{G} Creature - Zubera Spirit 1/2 -When Dripping-Tongue Zubera is put into a graveyard from the battlefield, put a 1/1 colorless Spirit creature token onto the battlefield for each Zubera put into a graveyard from the battlefield this turn. +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 @@ -19020,7 +19353,7 @@ Creature - Horror 4/4 Protection from white At the beginning of your end step, you lose 4 life. -Whenever a creature is put into a graveyard from the battlefield, you gain 2 life. +Whenever a creature dies, you gain 2 life. MRD R Dross Hopper @@ -19048,7 +19381,7 @@ Dross Scorpion {4} Artifact Creature - Scorpion 3/1 -Whenever Dross Scorpion or another artifact creature is put into a graveyard from the battlefield, you may untap target artifact. +Whenever Dross Scorpion or another artifact creature dies, you may untap target artifact. MRD C Drought @@ -19063,8 +19396,8 @@ 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. -Drove of Elves can't be the target of spells or abilities your opponents control. SHM U Drowned @@ -19078,7 +19411,7 @@ 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 +M10 R, M11 R, M12 R Drowned Rusalka {U} @@ -19144,6 +19477,12 @@ 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 @@ -19235,7 +19574,7 @@ 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 +EVE U, HOP U, COM U Duergar Mine-Captain {2}{R/W} @@ -19267,6 +19606,14 @@ 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 @@ -19322,7 +19669,7 @@ Dusk Urchins Creature - Ouphe 4/3 Whenever Dusk Urchins attacks or blocks, put a -1/-1 counter on it. -When Dusk Urchins is put into a graveyard from the battlefield, draw a card for each -1/-1 counter on it. +When Dusk Urchins dies, draw a card for each -1/-1 counter on it. SHM R Duskdale Wurm @@ -19332,6 +19679,14 @@ Creature - Wurm 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. @@ -19614,7 +19969,7 @@ Dying Wail {1}{B} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, target player discards two cards. +When enchanted creature dies, target player discards two cards. UDS C Dystopia @@ -19722,7 +20077,7 @@ Earthlink {3}{B}{R}{G} Enchantment At the beginning of your upkeep, sacrifice Earthlink unless you pay {2}. -Whenever a creature is put into a graveyard from the battlefield, that creature's controller sacrifices a land. +Whenever a creature dies, that creature's controller sacrifices a land. ICE R, ME2 R Earthlore @@ -19736,7 +20091,7 @@ 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 +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} @@ -19793,7 +20148,7 @@ Whenever a player casts a spell, you lose 1 life. Ebon Praetor {4}{B}{B} -Creature - Avatar +Creature - Avatar Praetor 5/5 First strike, trample At the beginning of your upkeep, put a -2/-2 counter on Ebon Praetor. @@ -19934,6 +20289,13 @@ Creature - Human Cleric 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 @@ -20080,7 +20442,7 @@ Elder Pine of Jukai 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 2 or less from your graveyard to your hand.) +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 @@ -20124,7 +20486,7 @@ Electrolyze Instant Electrolyze deals 2 damage divided as you choose among one or two target creatures and/or players. Draw a card. -GPT U +GPT U, COM U Electropotence {2}{R} @@ -20198,7 +20560,7 @@ Elephant Guide Enchantment - Aura Enchant creature Enchanted creature gets +3/+3. -When enchanted creature is put into a graveyard, put a 3/3 green Elephant creature token onto the battlefield. +When enchanted creature dies, put a 3/3 green Elephant creature token onto the battlefield. JUD U, GVL U Elephant Resurgence @@ -20260,13 +20622,13 @@ Elite Vanguard {W} Creature - Human Soldier 2/1 -M10 U, M11 U, EVT U +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 +M11 U, EVT U, M12 U Elixir of Vitality {4} @@ -20376,7 +20738,7 @@ 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 +SCG U, COM U Elvish Archdruid {1}{G}{G} @@ -20384,7 +20746,7 @@ 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 +M10 R, M11 R, M12 R Elvish Archers {1}{G} @@ -20572,7 +20934,7 @@ Elvish Soultiller {3}{G}{G} Creature - Elf Mutant 5/4 -When Elvish Soultiller is put into a graveyard from the battlefield, choose a creature type. Shuffle all creature cards of that type from your graveyard into your library. +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 @@ -20656,7 +21018,7 @@ Ember-Fist Zubera {1}{R} Creature - Zubera Spirit 1/2 -When Ember-Fist Zubera is put into a graveyard from the battlefield, it deals damage to target creature or player equal to the number of Zubera put into all graveyards from the battlefield this turn. +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 @@ -20888,7 +21250,7 @@ Enatu Golem {6} Artifact Creature - Golem 3/5 -When Enatu Golem is put into a graveyard from the battlefield, you gain 4 life. +When Enatu Golem dies, you gain 4 life. ROE U Enchanted Being @@ -20968,7 +21330,7 @@ Endless Cockroaches {1}{B}{B} Creature - Insect 1/1 -When Endless Cockroaches is put into a graveyard from the battlefield, return Endless Cockroaches to its owner's hand. +When Endless Cockroaches dies, return it to its owner's hand. POR R Endless Horizons @@ -20996,7 +21358,7 @@ SOK R Endless Whispers {2}{B}{B} Enchantment -Each creature has "When this creature is put into a graveyard, 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." +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 @@ -21093,7 +21455,7 @@ Energy Storm 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 controller's untap step. +Creatures with flying don't untap during their controllers' untap steps. ICE R, ME2 R Energy Tap @@ -21377,7 +21739,7 @@ Epochrasite 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 is put into a graveyard from the battlefield, 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.) +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 @@ -21536,7 +21898,7 @@ MIR U Ertai Vanguard Hand -1, life +4 -Creatures you control can't be the targets of spells or abilities your opponents control. +Creatures you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) VG S Ertai's Familiar @@ -21636,7 +21998,7 @@ Esper Sojourners {W}{U}{B} Artifact Creature - Vedalken Wizard 2/3 -When you cycle Esper Sojourners or it's put into a graveyard from the battlefield, you may tap or untap target permanent. +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 @@ -21699,7 +22061,7 @@ Essence Leak {U} Enchantment - Aura Enchant permanent -If enchanted permanent is red or green, it has "At the beginning of your upkeep, sacrifice this permanent unless you pay its mana cost." +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 @@ -21791,7 +22153,7 @@ Eternal Witness Creature - Human Shaman 2/1 When Eternal Witness enters the battlefield, you may return target card from your graveyard to your hand. -5DN U +5DN U, COM U Eternity Snare {5}{U} @@ -21929,7 +22291,7 @@ TSP R Evaporate {2}{R} Sorcery -Evaporate deals 1 damage to each creature that's white or blue. +Evaporate deals 1 damage to each white and/or blue creature. HML U Evasive Action @@ -22043,7 +22405,7 @@ Evincar's Justice 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 +TMP C, COM C Eviscerator {3}{B}{B} @@ -22068,7 +22430,7 @@ 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 +ROE C, COM C Exalted Angel {4}{W}{W} @@ -22161,8 +22523,8 @@ Exhumer Thrull {5}{B} Creature - Thrull 3/3 -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Exhumer Thrull enters the battlefield or the creature it haunts is put into a graveyard, return target creature card from your graveyard to your hand. +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 @@ -22182,7 +22544,7 @@ Exiled Boggart {1}{B} Creature - Goblin Rogue 2/2 -When Exiled Boggart is put into a graveyard from the battlefield, discard a card. +When Exiled Boggart dies, discard a card. LRW C Exiled Doomsayer @@ -22288,7 +22650,7 @@ 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 +ONS U, HOP U, COM U Expunge {2}{B} @@ -22348,7 +22710,7 @@ Creature - Demon 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 +CON R, ARC R, COM R Extraplanar Lens {3} @@ -22519,7 +22881,7 @@ TSP U Faces of the Past {2}{U} Enchantment -Whenever a creature is put into a graveyard from the battlefield, tap all untapped creatures that share a creature type with it or untap all tapped creatures that share a creature type with it. +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 @@ -22533,7 +22895,7 @@ 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 +INV U, JVC U, COM U Fade Away {2}{U} @@ -22560,7 +22922,7 @@ Faerie Dragon Creature - Dragon 1/3 Flying -1GG: Perform a random action from the following list: +{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. @@ -22680,12 +23042,12 @@ 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 +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 is put into a graveyard from the battlefield, target opponent loses 1 life and you gain 1 life. +Whenever a creature you control dies, target opponent loses 1 life and you gain 1 life. VG S Fallen Askari @@ -22776,7 +23138,7 @@ False Demise {2}{U} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, return that card to the battlefield under your control. +When enchanted creature dies, return that card to the battlefield under your control. ALL C (x2), MMQ U False Memories @@ -22808,8 +23170,8 @@ False Prophet {2}{W}{W} Creature - Human Cleric 2/2 -When False Prophet is put into a graveyard from the battlefield, exile all creatures. -PRO R, UDS R +When False Prophet dies, exile all creatures. +PRO R, UDS R, COM R False Summoning {1}{U} @@ -23066,7 +23428,7 @@ Creature - Elemental 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 +LRW C, COM C Fauna Shaman {1}{G} @@ -23139,7 +23501,7 @@ ALL C (x2), MED C Fecundity {2}{G} Enchantment -Whenever a creature is put into a graveyard from the battlefield, that creature's controller may draw a card. +Whenever a creature dies, that creature's controller may draw a card. USG U, BRB U, 8ED U Feebleness @@ -23205,7 +23567,7 @@ 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 +DRK U, 4ED U, 5ED U, 9ED U, ME3 C, COM U Femeref Archers {2}{G} @@ -23397,7 +23759,7 @@ 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 +MOR C, HOP C, ARC C, COM C Fervent Charge {1}{W}{B}{R} @@ -23437,7 +23799,7 @@ Festering Goblin {B} Creature - Zombie Goblin 1/1 -When Festering Goblin is put into a graveyard from the battlefield, target creature gets -1/-1 until end of turn. +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 @@ -23580,7 +23942,7 @@ Fierce Empath 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 +SCG C, ARC C, COM C Fiery Bombardment {1}{R} @@ -23613,7 +23975,7 @@ Fiery Hellhound Creature - Elemental Hound 2/2 {R}: Fiery Hellhound gets +1/+0 until end of turn. -M10 C, M11 C +M10 C, M11 C, M12 C Fiery Justice {R}{G}{W} @@ -23775,7 +24137,7 @@ Ice Instant Tap target permanent. Draw a card. -APC U (x2) +APC U (x2), COM U Fire Ambush {1}{R} @@ -23858,7 +24220,7 @@ Fire Snake {4}{R} Creature - Snake 3/1 -When Fire Snake is put into a graveyard from the battlefield, destroy target land. +When Fire Snake dies, destroy target land. POR C Fire Sprites @@ -23922,7 +24284,7 @@ Fireball 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 +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} @@ -23950,7 +24312,7 @@ Firebreathing 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 +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} @@ -24024,7 +24386,7 @@ 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 +SHM U, COM U Firestorm {R} @@ -24046,7 +24408,7 @@ Firestorm Phoenix Creature - Phoenix 3/2 Flying -If Firestorm Phoenix would be put into a graveyard from the battlefield, 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. +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 @@ -24108,7 +24470,7 @@ 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 +RAV C, COM C Fists of the Anvil {1}{R} @@ -24254,7 +24616,7 @@ 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 +ALA R, ARC R, M12 R Flameborn Hellion {5}{R} @@ -24337,7 +24699,7 @@ Flametongue Kavu Creature - Kavu 4/2 When Flametongue Kavu enters the battlefield, it deals 4 damage to target creature. -PLS U, JVC U, HOP U +PLS U, JVC U, HOP U, COM U Flametongue Kavu Avatar Vanguard @@ -24451,7 +24813,7 @@ Flashfreeze {1}{U} Instant Counter target red or green spell. -CSP U, 10E U, M10 U, M11 U +CSP U, 10E U, M10 U, M11 U, M12 U Flay {3}{B} @@ -24571,7 +24933,7 @@ 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 put into all graveyards from the battlefield this turn. +Destroy target creature. Its controller loses life equal to the number of creatures that died this turn. SOM U Flesh Reaver @@ -24595,7 +24957,7 @@ Fleshbag Marauder Creature - Zombie Warrior 3/1 When Fleshbag Marauder enters the battlefield, each player sacrifices a creature. -ALA U, GVL U +ALA U, GVL U, COM U Fleshformer {2}{B} @@ -24659,9 +25021,9 @@ EVE U Flight {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.) -LEA C, LEB C, 2ED C, 3ED C, 4ED C, 5ED C, 6ED C, S00 C, 7ED C, 8ED C, 9ED C +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} @@ -24683,7 +25045,7 @@ Fling 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 +STH C, M11 C, M12 C Flint Golem {4} @@ -24705,7 +25067,7 @@ Floating-Dream Zubera {1}{U} Creature - Zubera Spirit 1/2 -When Floating-Dream Zubera is put into a graveyard from the battlefield, draw a card for each Zubera put into a graveyard from the battlefield this turn. +When Floating-Dream Zubera dies, draw a card for each Zubera that died this turn. CHK C Flood @@ -24962,6 +25324,13 @@ 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 @@ -24999,16 +25368,15 @@ 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 +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 (This creature can't attack.) -Flying +Defender, flying Prevent all combat damage that would be dealt to and dealt by Fog Bank. -USG U +USG U, COM U Fog Elemental {2}{U} @@ -25096,7 +25464,7 @@ Fool's Demise {4}{U} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, return that card to the battlefield under your control. +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 @@ -25117,7 +25485,7 @@ Footbottom Feast Instant Put any number of target creature cards from your graveyard on top of your library. Draw a card. -LRW C +LRW C, COM C Foothill Guide {W} @@ -25285,7 +25653,7 @@ 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) +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} @@ -25332,7 +25700,7 @@ 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 +ONS C, EVG C, COM C Forgotten Harvest {1}{G} @@ -25392,7 +25760,7 @@ Forked-Branch Garami {3}{G}{G} Creature - Spirit 4/4 -Soulshift 4, soulshift 4 (When this is put into a graveyard from the battlefield, you may return up to two target Spirit cards with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -25462,7 +25830,7 @@ SHM U Foster {2}{G}{G} Enchantment -Whenever a creature you control is put into a graveyard from the battlefield, 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. +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 @@ -25757,6 +26125,12 @@ Morph {W} (You may cast this face down as a 2/2 creature for {3}. Turn it face u 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 @@ -25790,7 +26164,7 @@ 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 +M11 M, M12 M Frostling {R} @@ -25812,7 +26186,7 @@ Frostwielder 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 be put into a graveyard, exile it instead. +If a creature dealt damage by Frostwielder this turn would die, exile it instead. CHK C Frostwind Invoker @@ -25949,7 +26323,7 @@ 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 +TSP U, COM U Fungal Shambler {4}{G}{U}{B} @@ -26027,9 +26401,9 @@ Furnace Whelp {2}{R}{R} Creature - Dragon 2/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) +Flying {R}: Furnace Whelp gets +1/+0 until end of turn. -5DN U, 10E U, JVC U, ARC U +5DN U, 10E U, JVC U, ARC U, COM U Furnace of Rath {1}{R}{R}{R} @@ -26057,12 +26431,20 @@ You may exile two red cards from your hand rather than pay Fury of the Horde's m 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 is put into a graveyard from the battlefield, 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.) +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 @@ -26113,7 +26495,7 @@ Fyndhorn Druid {2}{G} Creature - Elf Druid 2/2 -When Fyndhorn Druid is put into a graveyard from the battlefield, if it was blocked this turn, you gain 4 life. +When Fyndhorn Druid dies, if it was blocked this turn, you gain 4 life. ALL C (x2) Fyndhorn Elder @@ -26345,7 +26727,7 @@ Gamekeeper {3}{G} Creature - Elf 2/2 -When Gamekeeper is put into a graveyard from the battlefield, 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. +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 @@ -26398,14 +26780,23 @@ Planeswalker - Garruk [+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 +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 +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} @@ -26414,12 +26805,21 @@ Creature - Beast 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 is put into a graveyard, put a +1/+1 counter on Garza Zol. +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 @@ -26567,7 +26967,7 @@ 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. +{T}: Add one mana of the last chosen color to your mana pool. Then choose a color at random. ASTRAL S Gemhide Sliver @@ -26852,6 +27252,15 @@ Amplify 1 (As this creature enters the battlefield, put a +1/+1 counter on it fo 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 @@ -27048,7 +27457,7 @@ 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 +CHK U, COM U Ghostly Visit {2}{B} @@ -27081,7 +27490,7 @@ RAV R Ghostway {2}{W} Instant -Exile each creature you control. Return those cards to the battlefield under their owners' control at the beginning of the next end step. +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 @@ -27095,7 +27504,7 @@ Giant Albatross Creature - Bird 1/1 Flying -When Giant Albatross is put into a graveyard from the battlefield, 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. +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 @@ -27211,7 +27620,7 @@ Giant Spider 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 +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} @@ -27281,7 +27690,7 @@ Gibbering Kami Creature - Spirit 2/2 Flying -Soulshift 3 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 @@ -27291,7 +27700,21 @@ Planeswalker - Gideon [+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 +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} @@ -27460,7 +27883,7 @@ 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 +M10 R, M11 R, M12 R Glacial Plating {2}{W}{W} @@ -27498,6 +27921,13 @@ Creature - Beast 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 @@ -27601,7 +28031,7 @@ Creature - Faerie Wizard 2/2 Flying {U}, Sacrifice Glen Elendra Archmage: Counter target noncreature spell. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -27738,7 +28168,7 @@ Glissa, the Traitor Legendary Creature - Zombie Elf 3/3 First strike, deathtouch -Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may return target artifact card from your graveyard to your hand. +Whenever a creature an opponent controls dies, you may return target artifact card from your graveyard to your hand. MBS M Glistener Elf @@ -27826,7 +28256,7 @@ Gloomwidow Creature - Spider 3/3 Reach -Gloomwidow can't block creatures without flying. +Gloomwidow can block only creatures with flying. SHM U Gloomwidow's Feast @@ -27939,7 +28369,7 @@ 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 put into a graveyard 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. +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 @@ -28014,8 +28444,8 @@ Goblin Arsonist {R} Creature - Goblin Shaman 1/1 -When Goblin Arsonist is put into a graveyard from the battlefield, you may have it deal 1 damage to target creature or player. -ROE C +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} @@ -28052,6 +28482,13 @@ Creature - Goblin Warrior {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 @@ -28112,7 +28549,7 @@ Goblin Cadets 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 +USG U, COM U Goblin Cannon {4} @@ -28130,7 +28567,7 @@ Goblin Caves {1}{R}{R} Enchantment - Aura Enchant land -If enchanted land is a basic Mountain, Goblin creatures get +0/+2. +As long as enchanted land is a basic Mountain, Goblin creatures get +0/+2. DRK C, ME4 C Goblin Charbelcher @@ -28152,7 +28589,7 @@ 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 +M10 R, M11 R, M12 R Goblin Chirurgeon {R} @@ -28242,6 +28679,13 @@ Creature - Goblin 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 @@ -28281,7 +28725,7 @@ Goblin Gardener {3}{R} Creature - Goblin 2/1 -When Goblin Gardener is put into a graveyard from the battlefield, destroy target land. +When Goblin Gardener dies, destroy target land. UDS C, 7ED C Goblin Gaveleer @@ -28327,7 +28771,7 @@ Goblin Grenade 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 +FEM C (x3), MED U, M12 U Goblin Grenadiers {3}{R} @@ -28409,14 +28853,14 @@ Goblin Marshal 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 is put into a graveyard from the battlefield, put two 1/1 red Goblin creature tokens onto the battlefield. +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 is put into a graveyard from the battlefield, destroy target Wall. +When Goblin Masons dies, destroy target Wall. UDS C Goblin Matron @@ -28473,7 +28917,7 @@ Goblin Piker {1}{R} Creature - Goblin Warrior 2/1 -P02 C, 9ED C, 10E C, M10 C, M11 C +P02 C, 9ED C, 10E C, M10 C, M11 C, M12 C Goblin Piledriver {1}{R} @@ -28487,7 +28931,7 @@ 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. +{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 @@ -28547,7 +28991,7 @@ Goblin Ringleader 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. +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 @@ -28600,7 +29044,7 @@ Goblin Sharpshooter Creature - Goblin 1/1 Goblin Sharpshooter doesn't untap during your untap step. -Whenever a creature is put into a graveyard from the battlefield, untap Goblin Sharpshooter. +Whenever a creature dies, untap Goblin Sharpshooter. {T}: Goblin Sharpshooter deals 1 damage to target creature or player. ONS R @@ -28615,7 +29059,7 @@ Goblin Shrine {1}{R}{R} Enchantment - Aura Enchant land -If enchanted land is a basic Mountain, Goblin creatures get +1/+0. +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 @@ -28716,7 +29160,7 @@ Goblin Tunneler Creature - Goblin Rogue 1/1 {T}: Target creature with power 2 or less is unblockable this turn. -ROE C, M11 C +ROE C, M11 C, M12 C Goblin Turncoat {1}{B} @@ -28756,8 +29200,8 @@ Goblin War Paint {1}{R} Enchantment - Aura Enchant creature -Enchanted creature gets +2/+2 and has haste. -ZEN C +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} @@ -28849,7 +29293,7 @@ Godo, Bandit Warlord 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, you get an additional combat phase. +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 @@ -28995,7 +29439,7 @@ RAV C Golgari Germination {1}{B}{G} Enchantment -Whenever a nontoken creature you control is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield. +Whenever a nontoken creature you control dies, put a 1/1 green Saproling creature token onto the battlefield. RAV U Golgari Grave-Troll @@ -29011,17 +29455,16 @@ Golgari Guildmage {B/G}{B/G} Creature - Elf Shaman 2/2 -({B/G} can be paid with either {B} or {G}.) {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 +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 +RAV C, COM C Golgari Rotwurm {3}{B}{G} @@ -29034,13 +29477,13 @@ Golgari Signet {2} Artifact {1}, {T}: Add {B}{G} to your mana pool. -RAV C +RAV C, COM C Golgari Thug {1}{B} Creature - Human Warrior 1/1 -When Golgari Thug is put into a graveyard from the battlefield, put target creature card from your graveyard on top of your library. +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 @@ -29077,7 +29520,7 @@ 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 +ZEN U, COM U Gore Vassal {2}{W} @@ -29086,6 +29529,13 @@ Creature - Hound 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 @@ -29157,7 +29607,7 @@ Gorilla War Cry {1}{R} Instant Cast Gorilla War Cry only during combat before blockers are declared. -Attacking creatures can't be blocked this turn except by two or more creatures. +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 @@ -29228,7 +29678,7 @@ ODY R Graceful Reprieve {1}{W} Instant -When target creature is put into a graveyard this turn, return that card to the battlefield under its owner's control. +When target creature dies this turn, return that card to the battlefield under its owner's control. MOR U Grafted Exoskeleton @@ -29254,6 +29704,13 @@ Whenever Grafted Wargear becomes unattached from a permanent, sacrifice that per 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 @@ -29393,15 +29850,15 @@ 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. +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 is put into a graveyard from the battlefield, each other player sacrifices a creature. -STH R, 8ED R, 9ED R, 10E R, HOP R +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} @@ -29438,7 +29895,7 @@ 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 +M11 M, M12 M Grave-Shell Scarab {2}{B}{G}{G} @@ -29452,7 +29909,7 @@ Gravebane Zombie {3}{B} Creature - Zombie 3/2 -If Gravebane Zombie would be put into a graveyard from the battlefield, put Gravebane Zombie on top of its owner's library instead. +If Gravebane Zombie would die, put Gravebane Zombie on top of its owner's library instead. MIR C, 6ED U Gravebind @@ -29474,7 +29931,7 @@ Gravedigger 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 +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} @@ -29496,7 +29953,7 @@ Gravelgill Axeshark {4}{U/B} Creature - Merfolk Soldier 3/3 -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -29518,8 +29975,8 @@ Graven Dominator Creature - Gargoyle 4/4 Flying -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Graven Dominator enters the battlefield or the creature it haunts is put into a graveyard, each other creature becomes 1/1 until end of turn. +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 @@ -29601,7 +30058,7 @@ Grazing Kelpie 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 is put into a graveyard from the battlefield, 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.) +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 @@ -29657,7 +30114,7 @@ Greater Basilisk Creature - Basilisk 3/5 Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.) -M11 C +M11 C, M12 C Greater Forgeling {3}{R}{R} @@ -29716,6 +30173,13 @@ Creature - Human Wolf 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 @@ -29817,7 +30281,7 @@ Grief Tyrant Creature - Horror 8/8 Grief Tyrant enters the battlefield with four -1/-1 counters on it. -When Grief Tyrant is put into a graveyard from the battlefield, put a -1/-1 counter on target creature for each -1/-1 counter on Grief Tyrant. +When Grief Tyrant dies, put a -1/-1 counter on target creature for each -1/-1 counter on Grief Tyrant. SHM U Griffin Canyon @@ -29831,16 +30295,23 @@ Griffin Guide Enchantment - Aura Enchant creature Enchanted creature gets +2/+2 and has flying. -When enchanted creature is put into a graveyard, put a 2/2 white Griffin creature token with flying onto the battlefield. +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 +M10 C, M12 C Grifter's Blade {3} @@ -29882,7 +30353,7 @@ Grim Lavamancer 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 +TOR R, H10 R, M12 R Grim Monolith {2} @@ -29961,7 +30432,7 @@ ONS R Grinning Demon Avatar Vanguard Hand -1, life -2 -Whenever a nontoken creature you control is put into a graveyard from the battlefield, target opponent discards a card. +Whenever a nontoken creature you control dies, target opponent discards a card. VG S (x2) Grinning Ignus @@ -29994,7 +30465,7 @@ Gristle Grinner {4}{B} Creature - Zombie 3/3 -Whenever a creature is put into a graveyard from the battlefield, Gristle Grinner gets +2/+2 until end of turn. +Whenever a creature dies, Gristle Grinner gets +2/+2 until end of turn. CSP U Gristleback @@ -30057,7 +30528,7 @@ Grixis Sojourners {1}{U}{B}{R} Creature - Zombie Ogre 4/3 -When you cycle Grixis Sojourners or it's put into a graveyard from the battlefield, you may exile target card from a graveyard. +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 @@ -30222,14 +30693,14 @@ Gruul Signet {2} Artifact {1}, {T}: Add {R}{G} to your mana pool. -GPT C, ARC C +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 +GPT C, HOP C, COM C Gruul War Plow {4} @@ -30272,7 +30743,7 @@ Creature - Jellyfish 1/3 Defender, flying Prevent all combat damage that would be dealt to Guard Gomazoa. -ROE U +ROE U, COM U Guardian Angel {X}{W} @@ -30308,7 +30779,7 @@ Guardian Zendikon Enchantment - Aura Enchant land Enchanted land is a 2/6 white Wall creature with defender. It's still a land. -When enchanted land is put into a graveyard, return that card to its owner's hand. +When enchanted land dies, return that card to its owner's hand. WWK C Guardian of Cloverdell @@ -30357,6 +30828,12 @@ 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 @@ -30586,7 +31063,7 @@ 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 +EVE U, COM U Haakon, Stromgald Scourge {1}{B}{B} @@ -30594,7 +31071,7 @@ 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 is put into a graveyard from the battlefield, you lose 2 life. +When Haakon dies, you lose 2 life. CSP R Haakon, Stromgald Scourge Avatar @@ -30990,7 +31467,7 @@ Harbinger of Spring Creature - Spirit 2/1 Protection from non-Spirit creatures -Soulshift 4 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -31007,7 +31484,7 @@ 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 +M11 C, M12 C Harm's Way {W} @@ -31046,7 +31523,7 @@ Harmonize {2}{G}{G} Sorcery Draw three cards. -PLC U, EVG U, GVL U, ARC U +PLC U, EVG U, GVL U, ARC U, COM U Harmony of Nature {2}{G} @@ -31187,7 +31664,7 @@ Haunted Angel Creature - Angel 3/3 Flying -When Haunted Angel is put into a graveyard from the battlefield, exile Haunted Angel and each other player puts a 3/3 black Angel creature token with flying onto the battlefield. +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 @@ -31264,7 +31741,7 @@ Havoc Demon Creature - Demon 5/5 Flying -When Havoc Demon is put into a graveyard from the battlefield, all creatures get -5/-5 until end of turn. +When Havoc Demon dies, all creatures get -5/-5 until end of turn. LGN R Hawkeater Moth @@ -31325,7 +31802,7 @@ 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -31428,7 +31905,7 @@ 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 two. +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 @@ -31506,7 +31983,7 @@ Heartmender Creature - Elemental 2/2 At the beginning of your upkeep, remove a -1/-1 counter from each creature you control. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -31535,7 +32012,7 @@ Heartwood Dryad {1}{G} Creature - Dryad 2/1 -Heartwood Dryad can block creatures with shadow as though they didn't have shadow. +Heartwood Dryad can block creatures with shadow as though Heartwood Dryad had shadow. TMP C Heartwood Giant @@ -31801,7 +32278,7 @@ 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 put into all graveyards this way. +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 @@ -32067,7 +32544,7 @@ Hex {4}{B}{B} Sorcery Destroy six target creatures. -RAV R +RAV R, COM R Hex Parasite {1} @@ -32194,6 +32671,12 @@ 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 @@ -32255,7 +32738,7 @@ Higure, the Still Wind 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 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. +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 @@ -32364,7 +32847,7 @@ Hissing Iguanar {2}{R} Creature - Lizard 3/1 -Whenever another creature is put into a graveyard from the battlefield, you may have Hissing Iguanar deal 1 damage to target player. +Whenever another creature dies, you may have Hissing Iguanar deal 1 damage to target player. ALA C Hissing Miasma @@ -32431,7 +32914,7 @@ 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 is put into a graveyard from the battlefield, you may put the exiled card into its owner's hand. +When Hoarding Dragon dies, you may put the exiled card into its owner's hand. M11 R Hobble @@ -32573,6 +33056,12 @@ Creature - Homarid Warrior {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 @@ -32586,7 +33075,7 @@ Homura, Human Ascendant Legendary Creature - Human Monk 4/4 Homura, Human Ascendant can't block. -When Homura is put into a graveyard from the battlefield, return it to the battlefield flipped. +When Homura dies, return it to the battlefield flipped. ---- Homura's Essence Legendary Enchantment @@ -32634,7 +33123,7 @@ Honor of the Pure {1}{W} Enchantment White creatures you control get +1/+1. -M10 R, M11 R +M10 R, M11 R, M12 R Honor the Fallen {1}{W} @@ -32841,9 +33330,17 @@ Hornet Harasser {2}{B}{B} Creature - Goblin Shaman 2/2 -When Hornet Harasser is put into a graveyard from the battlefield, target creature gets -2/-2 until end of turn. +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 @@ -32927,7 +33424,7 @@ Hour of Reckoning 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 +RAV R, COM R Hoverguard Observer {2}{U}{U} @@ -32989,7 +33486,7 @@ 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 +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} @@ -33044,7 +33541,7 @@ 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 +PLS C, HOP C, COM C Hum of the Radix {2}{G}{G} @@ -33083,7 +33580,7 @@ Hundred-Talon Kami Creature - Spirit 2/3 Flying -Soulshift 4 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -33189,6 +33686,12 @@ When Hunter of Eyeblights enters the battlefield, put a +1/+1 counter on target {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 @@ -33228,7 +33731,7 @@ Hunting Moa 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 is put into a graveyard from the battlefield, put a +1/+1 counter on target creature. +When Hunting Moa enters the battlefield or dies, put a +1/+1 counter on target creature. UDS U, TSB S, ARC U Hunting Pack @@ -33236,7 +33739,7 @@ Hunting Pack 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 +SCG U, COM U Hunting Triad {3}{G} @@ -33269,7 +33772,7 @@ Hurloon Shaman {1}{R}{R} Creature - Minotaur Shaman 2/3 -When Hurloon Shaman is put into a graveyard from the battlefield, each player sacrifices a land. +When Hurloon Shaman dies, each player sacrifices a land. WTH U Hurly-Burly @@ -33305,6 +33808,13 @@ Creature - Spirit {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 @@ -33529,7 +34039,7 @@ 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 +M10 C, M11 C, M12 C Ice Cauldron {4} @@ -33641,7 +34151,7 @@ Icy Prison 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 creature to the battlefield under its owner's control. +When Icy Prison leaves the battlefield, return the exiled card to the battlefield under its owner's control. ICE R, ME2 C Ideas Unbound @@ -33978,7 +34488,7 @@ 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 can't be the target of spells or abilities your opponents control. +You have hexproof. (You can't be the target of spells or abilities your opponents control.) FUT R Imperial Recruiter @@ -34094,7 +34604,7 @@ Iname as One 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 is put into a graveyard from the battlefield, you may exile it. If you do, return target Spirit permanent card from your graveyard to the battlefield. +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 @@ -34108,7 +34618,7 @@ Iname, Life Aspect {4}{G}{G} Legendary Creature - Spirit 4/4 -When Iname, Life Aspect is put into a graveyard from the battlefield, you may exile it. If you do, return any number of target Spirit cards from your graveyard to your hand. +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 @@ -34124,7 +34634,7 @@ Incendiary Enchantment - Aura Enchant creature At the beginning of your upkeep, you may put a fuse counter on Incendiary. -When enchanted creature is put into a graveyard, Incendiary deals X damage to target creature or player, where X is the number of fuse counters 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 @@ -34137,7 +34647,7 @@ 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 +ICE C, MIR C, 5ED C, 10E C, ME2 C, JVC C, M12 C Incite {R} @@ -34181,7 +34691,7 @@ Indebted Samurai 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 is put into a graveyard from the battlefield, you may put a +1/+1 counter on Indebted Samurai. +Whenever a Samurai you control dies, you may put a +1/+1 counter on Indebted Samurai. BOK U Indentured Djinn @@ -34321,7 +34831,7 @@ Infectious Host {2}{B} Creature - Zombie 1/1 -When Infectious Host is put into a graveyard from the battlefield, target player loses 2 life. +When Infectious Host dies, target player loses 2 life. RAV C Infectious Rage @@ -34329,7 +34839,7 @@ Infectious Rage Enchantment - Aura Enchant creature Enchanted creature gets +2/-1. -When enchanted creature is put into a graveyard, choose a creature at random Infectious Rage can enchant. Return Infectious Rage to the battlefield attached to that creature. +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 @@ -34422,7 +34932,7 @@ 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 +M11 M, M12 M Inferno Trap {3}{R} @@ -34478,7 +34988,7 @@ 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 was put into a graveyard this way, put a +1/+1 counter on the first 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 @@ -34535,14 +35045,14 @@ LRW C, JVC C Inheritance {W} Enchantment -Whenever a creature is put into a graveyard from the battlefield, you may pay {3}. If you do, draw a card. +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 is put into a graveyard this turn, flip Initiate of Blood. +{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 @@ -34721,7 +35231,7 @@ Insidious Bookworms {B} Creature - Worm 1/1 -When Insidious Bookworms is put into a graveyard from the battlefield, you may pay {1}{B}. If you do, target player discards a card at random. +When Insidious Bookworms dies, you may pay {1}{B}. If you do, target player discards a card at random. ALL C (x2) Insidious Dreams @@ -34819,7 +35329,7 @@ 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 +ONS R, HOP R, COM R Interdict {1}{U} @@ -34848,7 +35358,7 @@ 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 +PLC R, COM R Intimidation {2}{B}{B}{B} @@ -34964,7 +35474,7 @@ Invigorate 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 +MMQ C, GVL C, COM C Invigorating Boon {1}{G} @@ -35070,7 +35580,7 @@ Irini Sengir {2}{B}{B} Legendary Creature - Vampire Dwarf 2/2 -White enchantment spells and green enchantment spells cost {2} more to cast. +Green enchantment spells and white enchantment spells cost {2} more to cast. HML U Iron Lance @@ -35224,15 +35734,15 @@ 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) +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 can't attack unless defending player controls an Island. 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 @@ -35322,7 +35832,7 @@ Ivory Gargoyle Creature - Gargoyle 2/2 Flying -When Ivory Gargoyle is put into a graveyard from the battlefield, 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. +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 @@ -35410,14 +35920,14 @@ 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 +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 +GPT C, COM C Izzet Guildmage {U/R}{U/R} @@ -35432,7 +35942,7 @@ Izzet Signet {2} Artifact {1}, {T}: Add {U}{R} to your mana pool. -GPT C +GPT C, COM C Izzet Steam Maze Plane - Ravnica @@ -35462,11 +35972,18 @@ Planeswalker - Jace [-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 +M11 C, M12 C Jace's Ingenuity {3}{U}{U} @@ -35474,6 +35991,15 @@ 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 @@ -35532,6 +36058,13 @@ Creature - Leech 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 @@ -36036,14 +36569,14 @@ Jotun Grunt 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 +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 is put into a graveyard from the battlefield, put a 1/1 white Bird creature token with flying onto the battlefield 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 @@ -36058,7 +36591,7 @@ Journey to Nowhere 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 +ZEN C, EVT C, COM C Journeyer's Kite {2} @@ -36117,7 +36650,7 @@ Jugan, the Rising Star Legendary Creature - Dragon Spirit 5/5 Flying -When Jugan, the Rising Star is put into a graveyard from the battlefield, you may distribute five +1/+1 counters among any number of target creatures. +When Jugan, the Rising Star dies, you may distribute five +1/+1 counters among any number of target creatures. CHK R Juggernaut @@ -36180,7 +36713,7 @@ Jund Sojourners {B}{R}{G} Creature - Viashino Shaman 3/2 -When you cycle Jund Sojourners or it's put into a graveyard from the battlefield, you may have it deal 1 damage to target creature or player. +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 @@ -36269,7 +36802,7 @@ Junk Diver Artifact Creature - Bird 1/1 Flying -When Junk Diver is put into a graveyard from the battlefield, return another target artifact card from your graveyard to your hand. +When Junk Diver dies, return another target artifact card from your graveyard to your hand. UDS R Junk Golem @@ -36361,7 +36894,7 @@ 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 +ZEN U, COM U Jwari Scuttler {2}{U} @@ -36376,6 +36909,14 @@ Creature - Shapeshifter Ally 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. @@ -36433,7 +36974,7 @@ MIR U Kaervek's Purge {X}{B}{R} Sorcery -Destroy target creature with converted mana cost X. If that creature is put into a graveyard this way, Kaervek's Purge deals damage equal to the creature's power to the creature's controller. +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 @@ -36485,7 +37026,7 @@ Kalastria Highborn {B}{B} Creature - Vampire Shaman 2/2 -Whenever Kalastria Highborn or another Vampire you control is put into a graveyard from the battlefield, you may pay {B}. If you do, target player loses 2 life and you gain 2 life. +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 @@ -36499,7 +37040,7 @@ Kalitas, Bloodchief of Ghet {5}{B}{B} Legendary Creature - Vampire Warrior 5/5 -{B}{B}{B}, {T}: Destroy target creature. If that creature is put into a graveyard 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. +{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 @@ -36557,7 +37098,7 @@ Kami of Empty Graves {3}{B} Creature - Spirit 4/1 -Soulshift 3 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 @@ -36579,7 +37120,7 @@ Kami of Lunacy Creature - Spirit 4/1 Flying -Soulshift 5 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) +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 @@ -36615,7 +37156,7 @@ Creature - Spirit 3/5 Flying Whenever Kami of the Honored Dead is dealt damage, you gain that much life. -Soulshift 6 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) +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 @@ -36637,7 +37178,7 @@ Kami of the Palace Fields Creature - Spirit 3/2 Flying, first strike -Soulshift 5 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) +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 @@ -36645,7 +37186,7 @@ Kami of the Tended Garden Creature - Spirit 4/4 At the beginning of your upkeep, sacrifice Kami of the Tended Garden unless you pay {G}. -Soulshift 3 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 @@ -36666,6 +37207,14 @@ When Kangee, Aerie Keeper enters the battlefield, if it was kicked, put X feathe 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. @@ -37029,7 +37578,7 @@ 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 +ZEN U, ARC U, COM U Kazandu Tuskcaller {1}{G} @@ -37205,7 +37754,7 @@ Keiga, the Tide Star Legendary Creature - Dragon Spirit 5/5 Flying -When Keiga, the Tide Star is put into a graveyard from the battlefield, gain control of target creature. +When Keiga, the Tide Star dies, gain control of target creature. CHK R Keldon Arsonist @@ -37372,7 +37921,7 @@ 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 put into a graveyard from the battlefield this turn. +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 @@ -37540,7 +38089,7 @@ Kingfisher Creature - Bird 2/2 Flying -When Kingfisher is put into a graveyard from the battlefield, draw a card. +When Kingfisher dies, draw a card. UDS C Kinsbaile Balloonist @@ -37556,7 +38105,7 @@ Kinsbaile Borderguard 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 is put into a graveyard from the battlefield, put a 1/1 white Kithkin Soldier creature token onto the battlefield for each counter on it. +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 @@ -37642,9 +38191,16 @@ Kitchen Finks Creature - Ouphe 3/2 When Kitchen Finks enters the battlefield, you gain 2 life. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -37723,7 +38279,7 @@ Creature - Kithkin Wizard 2/3 Flying {1}{W}, Sacrifice Kithkin Spellduster: Destroy target enchantment. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -38161,7 +38717,7 @@ Knucklebone Witch {B} Creature - Goblin Shaman 1/1 -Whenever a Goblin you control is put into a graveyard from the battlefield, you may put a +1/+1 counter on Knucklebone Witch. +Whenever a Goblin you control dies, you may put a +1/+1 counter on Knucklebone Witch. LRW R Kobold Drill Sergeant @@ -38198,7 +38754,7 @@ Kodama of the Center Tree 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost X or less from your graveyard to your hand.) +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 @@ -38226,14 +38782,14 @@ 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 +CHK C, COM C Kokusho, the Evening Star {4}{B}{B} Legendary Creature - Dragon Spirit 5/5 Flying -When Kokusho, the Evening Star is put into a graveyard from the battlefield, each opponent loses 5 life. You gain life equal to the life lost this way. +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 @@ -38450,7 +39006,7 @@ 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 +DST U, 9ED U, 10E U, M10 U, M11 U, M12 U Krakilin {X}{G}{G} @@ -38518,7 +39074,7 @@ Kresh the Bloodbraided {2}{B}{R}{G} Legendary Creature - Human Warrior 3/3 -Whenever another creature is put into a graveyard from the battlefield, you may put X +1/+1 counters on Kresh the Bloodbraided, where X is that creature's power. +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 @@ -38628,7 +39184,7 @@ 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 +ONS C, GVL C, ARC C, COM C Krosan Verge Land @@ -38725,7 +39281,7 @@ 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 was put into a graveyard, put that card onto the battlefield under your control. Sacrifice it when you lose control of Krovikan Vampire. +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 @@ -38817,14 +39373,14 @@ Kumano's Blessing Enchantment - Aura Flash Enchant creature -If a creature dealt damage by enchanted creature this turn would be put into a graveyard, exile it instead. +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 be put into a graveyard, exile it instead. +If a creature dealt damage by Kumano's Pupils this turn would die, exile it instead. CHK U Kumano, Master Yamabushi @@ -38832,14 +39388,14 @@ Kumano, Master Yamabushi 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 be put into a graveyard, exile it instead. +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 were put into graveyards from the battlefield this turn, flip Kuon, Ogre Ascendant. +At the beginning of the end step, if three or more creatures died this turn, flip Kuon, Ogre Ascendant. ---- Kuon's Essence Legendary Enchantment @@ -39184,7 +39740,7 @@ 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 +LRW C, COM C Lashknife {1}{W} @@ -39314,7 +39870,7 @@ 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 +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} @@ -39431,7 +39987,7 @@ Lavamancer's Skill Enchantment - Aura Enchant creature Enchanted creature has "{T}: This creature deals 1 damage to target creature." -If enchanted creature is a Wizard, it has "{T}: This creature deals 2 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 @@ -39554,7 +40110,7 @@ Leaping Lizard {1}{G}{G} Creature - Lizard 2/3 -{1}{G}: Leaping Lizard gains flying and gets -0/-1 until end of turn. +{1}{G}: Leaping Lizard gets -0/-1 and gains flying until end of turn. HML C, ME2 C Leashling @@ -39664,7 +40220,7 @@ Leonin Abunas {3}{W} Creature - Cat Cleric 2/5 -Artifacts you control can't be the targets of spells or abilities your opponents control. +Artifacts you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) MRD R, ARC R Leonin Arbiter @@ -39828,7 +40384,7 @@ Levitation {2}{U}{U} Enchantment Creatures you control have flying. -ULG U, 7ED U, 9ED U, M10 U +ULG U, 7ED U, 9ED U, M10 U, M12 U Ley Druid {2}{G} @@ -39876,7 +40432,7 @@ 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 can't be the target of spells or abilities your opponents control. +You have hexproof. (You can't be the target of spells or abilities your opponents control.) M11 R Leyline of Singularity @@ -39913,7 +40469,7 @@ Lhurgoyf 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 +ICE R, 5ED R, BRB R, 8ED R, COM R Liability {1}{B}{B} @@ -40011,7 +40567,7 @@ Liege of the Hollows {2}{G}{G} Creature - Spirit 3/4 -When Liege of the Hollows is put into a graveyard from the battlefield, 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. +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 @@ -40114,7 +40670,7 @@ LEA R, LEB R, 2ED R, 3ED R, 4ED R Lifeline {5} Artifact -Whenever a creature is put into a graveyard from the battlefield, 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. +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 @@ -40122,7 +40678,7 @@ Lifelink Enchantment - Aura Enchant creature Enchanted creature has lifelink. (Damage dealt by the creature also causes its controller to gain that much life.) -M10 C +M10 C, M12 C Lifesmith {1}{G} @@ -40202,7 +40758,7 @@ Creature - Angel 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 +WWK U, COM U Lightmine Field {2}{W}{W} @@ -40252,7 +40808,7 @@ VIS R Lightning Coils {3} Artifact -Whenever a nontoken creature you control is put into a graveyard from the battlefield, put a charge counter on Lightning Coils. +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 @@ -40284,14 +40840,14 @@ Lightning Elemental 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 +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} ({0}: 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, PVC U, ARC U +Equip {0} +MRD U, PVC U, ARC U, COM U Lightning Helix {R}{W} @@ -40381,7 +40937,7 @@ 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 in all graveyards onto the battlefield under your control. +[-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 @@ -40409,7 +40965,7 @@ Lim-Dul the Necromancer {5}{B}{B} Legendary Creature - Human Wizard 4/4 -Whenever a creature an opponent controls is put into a graveyard from the battlefield, 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. +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 @@ -40500,7 +41056,7 @@ Lingering Tormentor Creature - Spirit 2/2 Fear (This creature can't be blocked except by artifact creatures and/or black creatures.) -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -40600,7 +41156,7 @@ 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 +TMP R, BRB R, PVC R, COM R Living Destiny {3}{G} @@ -40740,7 +41296,7 @@ Llanowar Elves 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 +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} @@ -40856,7 +41412,7 @@ Lockjaw Snapper Artifact Creature - Scarecrow 2/2 Wither (This deals damage to creatures in the form of -1/-1 counters.) -When Lockjaw Snapper is put into a graveyard from the battlefield, put a -1/-1 counter on each creature with a -1/-1 counter on it. +When Lockjaw Snapper dies, put a -1/-1 counter on each creature with a -1/-1 counter on it. SHM U Locust Miser @@ -40922,7 +41478,7 @@ 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 +ONS C, COM C Long-Forgotten Gohei {3} @@ -41038,6 +41594,13 @@ 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 @@ -41071,7 +41634,7 @@ Lost Auramancers 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 is put into a graveyard from the battlefield, 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. +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 @@ -41463,9 +42026,9 @@ MOR C Lure {1}{G}{G} Enchantment - Aura -Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.) +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 +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} @@ -41489,6 +42052,14 @@ Creature - Beast 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 @@ -41874,7 +42445,7 @@ Magma Phoenix Creature - Phoenix 3/3 Flying -When Magma Phoenix is put into a graveyard from the battlefield, it deals 3 damage to each creature and each player. +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 @@ -41895,7 +42466,7 @@ LGN R Magma Spray {R} Instant -Magma Spray deals 2 damage to target creature. If that creature would be put into a graveyard this turn, exile it instead. +Magma Spray deals 2 damage to target creature. If that creature would die this turn, exile it instead. ALA C Magma Vein @@ -41919,6 +42490,13 @@ Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on th 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 @@ -42101,7 +42679,7 @@ Magus of the Vineyard 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 +FUT R, COM R Mahamoti Djinn {4}{U}{U} @@ -42180,7 +42758,7 @@ 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 +CON M, COM M Malfegor Avatar Vanguard @@ -42293,7 +42871,7 @@ Mana Leak {1}{U} Instant Counter target spell unless its controller pays {3}. -STH C, BRB C, 8ED C, 9ED C, M11 C +STH C, BRB C, 8ED C, 9ED C, M11 C, M12 C Mana Leech {2}{B} @@ -42389,11 +42967,19 @@ 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 +LEA R, LEB R, 2ED R, 3ED R, 4ED R, 5ED R, 6ED R, 10E R, M10 R, M12 R Manabond {G} @@ -42431,6 +43017,12 @@ Artifact Creature - Construct {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 @@ -42486,7 +43078,7 @@ Manic Vandal Creature - Human Warrior 2/2 When Manic Vandal enters the battlefield, destroy target artifact. -M11 C +M11 C, M12 C Manipulate Fate {1}{U} @@ -42643,10 +43235,10 @@ Marjhan Creature - Leviathan 8/8 Marjhan doesn't untap during your untap step. -Marjhan can't attack unless defending player controls an Island. -When you control no Islands, sacrifice Marjhan. {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 @@ -42695,7 +43287,7 @@ Marker Beetles {1}{G}{G} Creature - Insect 2/3 -When Marker Beetles is put into a graveyard from the battlefield, target creature gets +1/+1 until end of turn. +When Marker Beetles dies, target creature gets +1/+1 until end of turn. {2}, Sacrifice Marker Beetles: Draw a card. UDS C @@ -42883,6 +43475,12 @@ Creature - Human Shaman {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 @@ -43016,7 +43614,7 @@ Massacre Wurm 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 is put into a graveyard from the battlefield, that player loses 2 life. +Whenever a creature an opponent controls dies, that player loses 2 life. MBS M Master Apothecary @@ -43048,6 +43646,13 @@ When Master Splicer enters the battlefield, put a 3/3 colorless Golem artifact c 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 @@ -43058,17 +43663,16 @@ CON R, ARC R Master Warcraft {2}{R/W}{R/W} Instant -({R/W} can be paid with either {R} or {W}.) 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 +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. Prevent all combat damage that creature would deal this turn. +{1}{W}: Tap target creature blocking Master of Arms. WTH U Master of Etherium @@ -43411,7 +44015,7 @@ 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 +ALA R, COM R Memory Jar {5} @@ -43531,7 +44135,7 @@ Mercenaries {3}{W} Creature - Human Mercenary 3/3 -{3}: Prevent all damage that would be dealt to you this turn by this creature. Any player may activate this ability. +{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 @@ -43539,7 +44143,7 @@ Mercenary Informer 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 Mercenary on the bottom of its owner's library. +{2}{W}: Put target nontoken Mercenary on the bottom of its owner's library. PCY R Mercenary Knight @@ -43597,7 +44201,14 @@ Merfolk Looter Creature - Merfolk Rogue 1/1 {T}: Draw a card, then discard a card. -EXO C, 7ED U, 10E C, M10 C +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} @@ -43626,7 +44237,7 @@ Merfolk Seer {2}{U} Creature - Merfolk Wizard 2/2 -When Merfolk Seer is put into a graveyard from the battlefield, you may pay {1}{U}. If you do, draw a card. +When Merfolk Seer dies, you may pay {1}{U}. If you do, draw a card. MIR C Merfolk Skyscout @@ -43762,7 +44373,7 @@ Mesa Enchantress Creature - Human Druid 0/2 Whenever you cast an enchantment spell, you may draw a card. -PLC R, M10 R +PLC R, M10 R, M12 R Mesa Falcon {1}{W} @@ -44030,7 +44641,7 @@ Mighty Leap {1}{W} Instant Target creature gets +2/+2 and gains flying until end of turn. -M11 C, EVT C, DDG C +M11 C, EVT C, DDG C, M12 C Mijae Djinn {R}{R}{R} @@ -44082,7 +44693,7 @@ GPT R Mimic Vat {3} Artifact -Imprint - Whenever a nontoken creature is put into a graveyard from the battlefield, you may exile that card. If you do, return each other card exiled with Mimic Vat to its owner's graveyard. +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 @@ -44142,7 +44753,7 @@ Mind Control Enchantment - Aura Enchant creature You control enchanted creature. -M10 U, M11 U +M10 U, M11 U, M12 U Mind Extraction {2}{B} @@ -44209,7 +44820,7 @@ 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 +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} @@ -44255,6 +44866,12 @@ 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 @@ -44358,6 +44975,12 @@ 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 @@ -44368,7 +44991,7 @@ Mindslicer {2}{B}{B} Creature - Horror 4/3 -When Mindslicer is put into a graveyard from the battlefield, each player discards his or her hand. +When Mindslicer dies, each player discards his or her hand. ODY R, 9ED R Mindstab @@ -45037,7 +45660,7 @@ Mistmoon Griffin Creature - Griffin 2/2 Flying -When Mistmoon Griffin is put into a graveyard from the battlefield, exile Mistmoon Griffin, then return the top creature card of your graveyard to the battlefield. +When Mistmoon Griffin dies, exile Mistmoon Griffin, then return the top creature card of your graveyard to the battlefield. WTH U Mistral Charger @@ -45077,7 +45700,7 @@ Mitotic Slime {4}{G} Creature - Ooze 4/4 -When Mitotic Slime is put into a graveyard from the battlefield, put two 2/2 green Ooze creature tokens onto the battlefield. They have "When this creature is put into a graveyard, put two 1/1 green Ooze creature tokens onto the battlefield." +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 @@ -45213,7 +45836,7 @@ TMP U, BRB U Mogg Infestation {3}{R}{R} Sorcery -Destroy all creatures target player controls. For each creature put into a graveyard this way, put two 1/1 red Goblin creature tokens onto the battlefield under that player's control. +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 @@ -45271,7 +45894,7 @@ Mogg War Marshal 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 is put into a graveyard from the battlefield, put a 1/1 red Goblin creature token onto the battlefield. +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 @@ -45361,7 +45984,7 @@ Molten Firebird Creature - Phoenix 2/2 Flying -When Molten Firebird is put into a graveyard from the battlefield, 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. +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 @@ -45418,7 +46041,7 @@ 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 +TSP U, COM U Molten-Tail Masticore {4} @@ -45505,7 +46128,7 @@ Mongrel Pack {3}{G} Creature - Hound 4/1 -When Mongrel Pack is put into a graveyard from the battlefield during combat, put four 1/1 green Hound creature tokens onto the battlefield. +When Mongrel Pack dies during combat, put four 1/1 green Hound creature tokens onto the battlefield. TMP R Monk Idealist @@ -45520,7 +46143,7 @@ Monk Realist Creature - Human Monk Cleric 1/1 When Monk Realist enters the battlefield, destroy target enchantment. -USG C +USG C, COM C Monkey Cage {5} @@ -45528,6 +46151,12 @@ 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 @@ -45628,13 +46257,13 @@ Moonlit Strider 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 is put into a graveyard from the battlefield, you gain 1 life. +Whenever a creature dies, you gain 1 life. MMQ U Moonring Island @@ -45859,7 +46488,7 @@ Mortify {1}{W}{B} Instant Destroy target creature or enchantment. -GPT U +GPT U, COM U Mortipede {3}{B} @@ -45880,7 +46509,7 @@ Mortis Dogs Creature - Hound 2/2 Whenever Mortis Dogs attacks, it gets +2/+0 until end of turn. -When Mortis Dogs is put into a graveyard from the battlefield, target player loses life equal to its power. +When Mortis Dogs dies, target player loses life equal to its power. NPH C Mortivore @@ -45888,8 +46517,8 @@ Mortivore Creature - Lhurgoyf */* Mortivore's power and toughness are each equal to the number of creature cards in all graveyards. -{B}: Regenerate Mortivore. (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.) -ODY R, 9ED R, 10E R +{B}: Regenerate Mortivore. +ODY R, 9ED R, 10E R, COM R Mortuary {3}{B} @@ -45978,7 +46607,7 @@ Mother of Runes Creature - Human Cleric 1/1 {T}: Target creature you control gains protection from the color of your choice until end of turn. -ULG U +ULG U, COM U Mothrider Samurai {3}{W} @@ -45991,7 +46620,7 @@ 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) +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} @@ -46191,7 +46820,7 @@ Mudbutton Torchrunner {2}{R} Creature - Goblin Warrior 1/1 -When Mudbutton Torchrunner is put into a graveyard from the battlefield, it deals 3 damage to target creature or player. +When Mudbutton Torchrunner dies, it deals 3 damage to target creature or player. LRW C, EVG C, DDG C Muddle the Mixture @@ -46236,7 +46865,7 @@ Creature - Elemental 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 +LRW C, JVC C, COM C Multani Vanguard @@ -46276,7 +46905,7 @@ Multani, Maro-Sorcerer Legendary Creature - Elemental */* Shroud (This permanent can't be the target of spells or abilities.) -Multani's power and toughness are each equal to the total number of cards in all players' hands. +Multani, Maro-Sorcerer's power and toughness are each equal to the total number of cards in all players' hands. ULG R Mundungu @@ -46315,7 +46944,7 @@ 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. +{B}{B}, Pay half your life, rounded up: Destroy target nonblack creature. It can't be regenerated. NEM R, 8ED R Murderous Redcap @@ -46323,7 +46952,7 @@ Murderous Redcap 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 is put into a graveyard from the battlefield, 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.) +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 @@ -46341,7 +46970,7 @@ DST U Murgish Cemetery {4}{B}{B} Enchantment -3B, Discard a card: Put an X/X black Zombie token onto the battlefield, where X is a number randomly chosen from 2 to 6. +{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 @@ -46371,7 +47000,7 @@ 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 +SOK C, COM C Muscle Burst {1}{G} @@ -46455,7 +47084,7 @@ 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 is put into a graveyard, abandon this scheme. +When a creature put onto the battlefield with this scheme dies, abandon this scheme. ARC C My Wish Is Your Command @@ -46467,7 +47096,7 @@ Mycoid Shepherd {1}{G}{G}{W} Creature - Fungus 5/4 -Whenever Mycoid Shepherd or another creature you control with power 5 or greater is put into a graveyard from the battlefield, you may gain 5 life. +Whenever Mycoid Shepherd or another creature you control with power 5 or greater dies, you may gain 5 life. ARB R Mycologist @@ -46623,7 +47252,7 @@ Myr Moonvessel {1} Artifact Creature - Myr 1/1 -When Myr Moonvessel is put into a graveyard from the battlefield, add {1} to your mana pool. +When Myr Moonvessel dies, add {1} to your mana pool. DST C Myr Propagator @@ -46659,7 +47288,7 @@ Myr Retriever {2} Artifact Creature - Myr 1/1 -When Myr Retriever is put into a graveyard from the battlefield, return another target artifact card from your graveyard to your hand. +When Myr Retriever dies, return another target artifact card from your graveyard to your hand. MRD U Myr Servitor @@ -46673,7 +47302,7 @@ Myr Sire {2} Artifact Creature - Myr 1/1 -When Myr Sire is put into a graveyard from the battlefield, put a 1/1 colorless Myr artifact creature token onto the battlefield. +When Myr Sire dies, put a 1/1 colorless Myr artifact creature token onto the battlefield. MBS C Myr Superion @@ -47008,7 +47637,7 @@ Nantuko Husk Creature - Zombie Insect 2/2 Sacrifice a creature: Nantuko Husk gets +2/+2 until end of turn. -ONS C, 9ED U, 10E U +ONS C, 9ED U, 10E U, COM U Nantuko Mentor {2}{G} @@ -47146,7 +47775,7 @@ VIS R, POR R Natural Selection {G} Instant -Look at the top three cards of target player's library and put them back in any order. You may have that player shuffle his or her library. +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 @@ -47159,7 +47788,7 @@ 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 +ONS C, 8ED C, 9ED C, 10E C, ALA C, M10 C, ROE C, M11 C, M12 C Nature Demands an Offering Scheme @@ -47293,7 +47922,7 @@ Naya Sojourners {2}{R}{G}{W} Creature - Elf Shaman 5/3 -When you cycle Naya Sojourners or it's put into a graveyard from the battlefield, you may put a +1/+1 counter on target creature. +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 @@ -47385,7 +48014,7 @@ 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 +ALA U, COM U Necrologia {3}{B}{B} @@ -47407,7 +48036,7 @@ Necromancer's Magemark Enchantment - Aura Enchant creature Creatures you control that are enchanted get +1/+1. -If a creature you control that's enchanted would be put into a graveyard, return it to its owner's hand instead. +If a creature you control that's enchanted would die, return it to its owner's hand instead. GPT C Necromancy @@ -47429,7 +48058,7 @@ Necropede 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 is put into a graveyard from the battlefield, you may put a -1/-1 counter on target creature. +When Necropede dies, you may put a -1/-1 counter on target creature. SOM U Necroplasm @@ -47453,7 +48082,7 @@ 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. +{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 @@ -47491,7 +48120,7 @@ Necroskitter 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 is put into a graveyard, you may return that card to the battlefield under your control. +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 @@ -47506,7 +48135,7 @@ Necrotic Plague Enchantment - Aura Enchant creature Enchanted creature has "At the beginning of your upkeep, sacrifice this creature." -When enchanted creature is put into a graveyard, 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. +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 @@ -47584,7 +48213,7 @@ LGN C Nefarious Lich {B}{B}{B}{B} Enchantment -If you would be dealt damage, exile that many cards from your graveyard instead. If you can't, you lose the game. +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 @@ -47600,7 +48229,7 @@ Negate {1}{U} Instant Counter target noncreature spell. -MOR C, M10 C, M11 C +MOR C, M10 C, M11 C, M12 C Neko-Te {3} @@ -47650,7 +48279,7 @@ Nemesis Trap 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 +WWK U, COM U Nemesis of Reason {3}{U}{B} @@ -47905,7 +48534,7 @@ 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 +CHK U, COM U Nezumi Ronin {2}{B} @@ -48118,7 +48747,7 @@ Nightsoil Kami {4}{G}{G} Creature - Spirit 6/4 -Soulshift 5 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 5 or less from your graveyard to your hand.) +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 @@ -48263,10 +48892,17 @@ 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 be put into a graveyard this turn, exile it instead. +{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 @@ -48318,7 +48954,7 @@ Nissa's Chosen {G}{G} Creature - Elf Warrior 2/3 -If Nissa's Chosen would be put into a graveyard from the battlefield, put it on the bottom of its owner's library instead. +If Nissa's Chosen would die, put it on the bottom of its owner's library instead. ZEN C Niv-Mizzet, the Firemind @@ -48387,7 +49023,7 @@ Noble Benefactor {2}{U} Creature - Human Cleric 2/2 -When Noble Benefactor is put into a graveyard from the battlefield, 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. +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 @@ -48737,7 +49373,7 @@ Noxious Toad {2}{B} Creature - Frog 1/1 -When Noxious Toad is put into a graveyard from the battlefield, each opponent discards a card. +When Noxious Toad dies, each opponent discards a card. POR U Noxious Vapors @@ -48752,7 +49388,7 @@ 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 +EVE U, COM U Nuisance Engine {3} @@ -48850,7 +49486,7 @@ 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 +PLC R, COM R Nurturer Initiate {G} @@ -48958,7 +49594,7 @@ Oathkeeper, Takeno's Daisho {3} Legendary Artifact - Equipment Equipped creature gets +3/+1. -Whenever equipped creature is put into a graveyard, return that card to the battlefield under your control if it's a Samurai card. +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 @@ -49028,7 +49664,7 @@ Oblation {2}{W} Instant The owner of target nonland permanent shuffles it into his or her library, then draws two cards. -ONS R +ONS R, COM R Obliterate {6}{R}{R} @@ -49050,14 +49686,14 @@ Oblivion Ring 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 +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 +MRD R, COM R Oboro Breezecaller {1}{U} @@ -49150,7 +49786,7 @@ Oculus {1}{U} Creature - Homunculus 1/1 -When Oculus is put into a graveyard from the battlefield, you may draw a card. +When Oculus dies, you may draw a card. MBS C Odds @@ -49460,7 +50096,7 @@ 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 +SOK U, COM U Oni of Wild Places Avatar Vanguard @@ -49484,7 +50120,7 @@ Onulet {3} Artifact Creature - Construct 2/2 -When Onulet is put into a graveyard from the battlefield, you gain 2 life. +When Onulet dies, you gain 2 life. ATQ U, 3ED R, 4ED R, MED C, ME4 C Onyx Goblet @@ -49493,6 +50129,13 @@ 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 @@ -50070,7 +50713,7 @@ Orim's Thunder 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 +APC C, HOP C, COM C Orim's Touch {W} @@ -50153,45 +50796,44 @@ 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 +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 +GPT C, COM C Orzhov Euthanist {2}{B} Creature - Human Assassin 2/2 -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Orzhov Euthanist enters the battlefield or the creature it haunts is put into a graveyard, destroy target creature that was dealt damage this turn. +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 -({W/B} can be paid with either {W} or {B}.) {2}{W}: Target player gains 1 life. {2}{B}: Each player loses 1 life. -GPT U +GPT U, COM U Orzhov Pontiff {1}{W}{B} Creature - Human Cleric 1/1 -Haunt (When this card is put into a graveyard from the battlefield, exile it haunting target creature.) -When Orzhov Pontiff enters the battlefield or the creature it haunts is put into a graveyard, 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. +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 +GPT C, COM C Orzhova, the Church of Deals Land @@ -50204,7 +50846,7 @@ Osai Vultures Creature - Bird 1/1 Flying -At the beginning of each end step, if a creature was put into a graveyard from the battlefield this turn, put a carrion counter on Osai Vultures. +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 @@ -50394,7 +51036,7 @@ 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 +TMP U, ODY U, 10E U, M10 U, GVL U, M12 U Oversold Cemetery {1}{B} @@ -50510,7 +51152,7 @@ Pacifism 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 +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} @@ -50732,7 +51374,7 @@ 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. +{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" @@ -51084,7 +51726,7 @@ 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 +CON U, ARC U, COM U Pathrazer of Ulamog {11} @@ -51167,7 +51809,7 @@ 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 +BOK R, COM R Patron of the Orochi {6}{G}{G} @@ -51189,7 +51831,7 @@ Pattern of Rebirth {3}{G} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, 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. +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 @@ -51209,7 +51851,7 @@ Pawn of Ulamog {1}{B}{B} Creature - Vampire Shaman 2/2 -Whenever Pawn of Ulamog or another nontoken creature you control is put into a graveyard from the battlefield, 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." +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 @@ -51361,7 +52003,7 @@ Creature - Wurm 7/7 Trample When Pelakka Wurm enters the battlefield, you gain 7 life. -When Pelakka Wurm is put into a graveyard from the battlefield, draw a card. +When Pelakka Wurm dies, draw a card. ROE U Pemmin's Aura @@ -51459,20 +52101,20 @@ Artifact Creature - Construct 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 +MRD R, HOP R, EVT R, M12 R Penumbra Bobcat {2}{G} Creature - Cat 2/1 -When Penumbra Bobcat is put into a graveyard from the battlefield, put a 2/1 black Cat creature token onto the battlefield. +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 is put into a graveyard from the battlefield, put a 3/3 black Kavu creature token onto the battlefield. +When Penumbra Kavu dies, put a 3/3 black Kavu creature token onto the battlefield. APC U Penumbra Spider @@ -51480,15 +52122,15 @@ Penumbra Spider Creature - Spider 2/4 Reach (This creature can block creatures with flying.) -When Penumbra Spider is put into a graveyard from the battlefield, put a 2/4 black Spider creature token with reach onto the battlefield. -TSP C +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 is put into a graveyard from the battlefield, put a 6/6 black Wurm creature token with trample onto the battlefield. +When Penumbra Wurm dies, put a 6/6 black Wurm creature token with trample onto the battlefield. APC R People of the Woods @@ -51512,6 +52154,14 @@ 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 @@ -51534,14 +52184,14 @@ Perilous Myr {2} Artifact Creature - Myr 1/1 -When Perilous Myr is put into a graveyard from the battlefield, it deals 2 damage to target creature or player. +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 +CSP U, COM U Perimeter Captain {W} @@ -51594,9 +52244,15 @@ Personal Incarnation 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 is put into a graveyard from the battlefield, its owner loses half his or her life, rounded up. +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 @@ -51765,6 +52421,21 @@ 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 @@ -51781,6 +52452,13 @@ 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 @@ -51795,7 +52473,7 @@ 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 an opponent's control. That creature's power and toughness are each equal to the number of +1/+1 counters on Phantasmal Sphere. +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 @@ -52707,7 +53385,7 @@ Plague Dogs {4}{B} Creature - Zombie Hound 3/3 -When Plague Dogs is put into a graveyard from the battlefield, all creatures get -1/-1 until end of turn. +When Plague Dogs dies, all creatures get -1/-1 until end of turn. {2}, Sacrifice Plague Dogs: Draw a card. UDS U @@ -52745,7 +53423,7 @@ Plague Spitter Creature - Horror 2/2 At the beginning of your upkeep, Plague Spitter deals 1 damage to each creature and each player. -When Plague Spitter is put into a graveyard from the battlefield, 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 @@ -52805,7 +53483,7 @@ 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) +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} @@ -52951,7 +53629,7 @@ Plated Slagwurm {4}{G}{G}{G} Creature - Wurm 8/8 -Plated Slagwurm can't be the target of spells or abilities your opponents control. +Hexproof (This creature can't be the target of spells or abilities your opponents control.) MRD R, GVL R Plated Sliver @@ -53055,15 +53733,15 @@ Plumeveil {W/U}{W/U}{W/U} Creature - Elemental 4/4 -Flash +Flash (You may cast this spell any time you could cast an instant.) Defender, flying -SHM U +SHM U, COM U Plummet {1}{G} Instant Destroy target creature with flying. -ARC C, M11 C +ARC C, M11 C, M12 C Plunder {4}{R} @@ -53117,7 +53795,7 @@ 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 +LRW U, COM U Pollen Remedy {W} @@ -53163,7 +53841,7 @@ Ponder 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 +LRW C, M10 C, M12 C Pongify {U} @@ -53578,6 +54256,14 @@ Creature - Goblin Rogue 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 @@ -53619,7 +54305,7 @@ Priest of Yawgmoth {1}{B} Creature - Human Cleric 1/2 -{T}, Sacrifice an artifact: Add to your mana pool an amount of black mana equal to the sacrificed artifact's converted mana cost. +{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 @@ -53754,7 +54440,7 @@ 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 +M11 M, M12 M Primitive Etchings {2}{G}{G} @@ -53777,6 +54463,15 @@ 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 @@ -53826,7 +54521,7 @@ 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.) +{2}: Prismatic Dragon becomes a color chosen at random. (This effect lasts indefinitely.) ASTRAL S Prismatic Lace @@ -53886,7 +54581,7 @@ 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 +SHM U, HOP U, COM U Pristine Angel {4}{W}{W} @@ -53908,14 +54603,14 @@ Private Research Enchantment - Aura Enchant creature At the beginning of your upkeep, you may put a page counter on Private Research. -When enchanted creature is put into a graveyard, draw a card for each 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 can't be the targets of spells or abilities your opponents control. +Other permanents you control have hexproof. (They can't be the targets of spells or abilities your opponents control.) RAV R Prized Unicorn @@ -53990,7 +54685,7 @@ INV C Promise of Bunrei {2}{W} Enchantment -When a creature you control is put into a graveyard from the battlefield, sacrifice Promise of Bunrei. If you do, put four 1/1 colorless Spirit creature tokens onto the battlefield. +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 @@ -54004,19 +54699,19 @@ Promised Kannushi {G} Creature - Human Druid 1/1 -Soulshift 7 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 7 or less from your graveyard to your hand.) +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 +TMP U, COM U Proper Burial {3}{W} Enchantment -Whenever a creature you control is put into a graveyard from the battlefield, you gain life equal to that creature's toughness. +Whenever a creature you control dies, you gain life equal to that creature's toughness. DIS R Prophecy @@ -54030,14 +54725,14 @@ 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 +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 +ROE C, COM C Prosperity {X}{U} @@ -54049,7 +54744,7 @@ Protean Hulk {5}{G}{G} Creature - Beast 6/6 -When Protean Hulk is put into a graveyard from the battlefield, 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. +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 @@ -54463,7 +55158,7 @@ Punishing Fire 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 +ZEN U, DDG U, COM U Puppet Conjurer {1}{B} @@ -54477,7 +55172,7 @@ Puppet Master {U}{U}{U} Enchantment - Aura Enchant creature -When enchanted creature is put into a graveyard, 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. +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 @@ -54505,7 +55200,7 @@ 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 is put into a graveyard from the battlefield, 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.) +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 @@ -54523,7 +55218,7 @@ 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. -Whenever 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. +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 @@ -54607,7 +55302,7 @@ Pus Kami Creature - Spirit 3/3 {B}, Sacrifice Pus Kami: Destroy target nonblack creature. -Soulshift 6 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) +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 @@ -54670,7 +55365,7 @@ 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. +Whenever Putrid Warrior deals damage, choose one - Each player loses 1 life; or each player gains 1 life. APC C Pygmy Allosaurus @@ -54727,7 +55422,7 @@ 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 from it instead. +{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 @@ -54790,7 +55485,7 @@ Pyrohemia 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 +PLC U, COM U Pyrokinesis {4}{R}{R} @@ -54982,7 +55677,7 @@ WWK U Quest for the Gravelord {B} Enchantment -Whenever a creature is put into a graveyard from the battlefield, you may put a quest counter on Quest for the Gravelord. +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 @@ -55049,7 +55744,7 @@ Quicksilver Amulet {4} Artifact {4}, {T}: You may put a creature card from your hand onto the battlefield. -ULG R +ULG R, M12 R Quicksilver Behemoth {6}{U} @@ -55373,7 +56068,7 @@ 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. +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 @@ -55572,8 +56267,8 @@ Rainbow Knights 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. -WW: Rainbow Knights gets +X/+0 until end of turn, where X is a number chosen randomly from 0 to 2. +{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 @@ -55635,7 +56330,7 @@ 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 +DIS C, ARC C, COM C Rakdos Guildmage {B/R}{B/R} @@ -55674,7 +56369,7 @@ Rakdos Signet {2} Artifact {1}, {T}: Add {B}{R} to your mana pool. -DIS C, ARC C +DIS C, ARC C, COM C Rakdos the Defiler {2}{B}{B}{R}{R} @@ -55736,7 +56431,7 @@ MBS C Rally the Horde {5}{R} Sorcery -Exile the top three cards 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. +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 @@ -55829,7 +56524,7 @@ 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 +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} @@ -55894,7 +56589,7 @@ 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 +ROE U, COM U Rapid Decay {1}{B} @@ -55930,7 +56625,7 @@ Rashka the Slayer Legendary Creature - Human Archer 3/3 Reach (This creature can block creatures with flying.) -Whenever Rashka blocks one or more black creatures, Rashka gets +1/+2 until end of turn. +Whenever Rashka the Slayer blocks one or more black creatures, Rashka gets +1/+2 until end of turn. HML U Rasputin Dreamweaver @@ -56021,7 +56716,7 @@ Rattleblaze Scarecrow {6} Artifact Creature - Scarecrow 5/3 -Rattleblaze Scarecrow has persist as long as you control a black creature. (When this creature is put into a graveyard from the battlefield, 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 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 @@ -56153,7 +56848,7 @@ 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 +ICE C, MIR C, 5ED C, BRB C, ME2 U, COM C Ray of Distortion {3}{W} @@ -56310,7 +57005,7 @@ Razorjaw Oni Creature - Demon Spirit 4/5 Black creatures can't block. -SOK U +SOK U, COM U Razormane Masticore {5} @@ -56474,14 +57169,14 @@ Reassembling Skeleton Creature - Skeleton Warrior 1/1 {1}{B}: Return Reassembling Skeleton from your graveyard to the battlefield tapped. -ARC U, M11 U +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 Rebel on the bottom of its owner's library. +{3}: Put target nontoken Rebel on the bottom of its owner's library. PCY R Rebellion of the Flamekin @@ -56502,7 +57197,7 @@ Reborn Hero Creature - Human Soldier 2/2 Vigilance -Threshold - As long as seven or more cards are in your graveyard, Reborn Hero has "When Reborn Hero is put into a graveyard from the battlefield, you may pay {W}{W}. If you do, return Reborn Hero to the battlefield under your control." +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 @@ -56622,7 +57317,7 @@ Reclaim {G} Instant Put target card from your graveyard on top of your library. -EXO C, 7ED C, 9ED C +EXO C, 7ED C, 9ED C, M12 C Reclamation {2}{G}{W} @@ -56747,7 +57442,7 @@ 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 be put into a graveyard this turn, exile it instead. Shuffle Red Sun's Zenith into its owner's library. +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 @@ -56773,7 +57468,7 @@ Redirect {U}{U} Instant You may choose new targets for target spell. -M11 R +M11 R, M12 R Reduce to Dreams {3}{U}{U} @@ -56900,13 +57595,13 @@ 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 each creature put into a graveyard this way. +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 is put into a graveyard this turn, return a creature card from that graveyard to the battlefield under the control of that creature's owner. +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 @@ -56927,14 +57622,14 @@ 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 +STH R, COM R Reins of the Vinesteed {3}{G} Enchantment - Aura Enchant creature Enchanted creature gets +2/+2. -When enchanted creature is put into a graveyard, 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. +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 @@ -56956,7 +57651,7 @@ 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 +MRD R, DVD R, COM R Rejuvenate {3}{G} @@ -57042,7 +57737,7 @@ Relic Crush {4}{G} Instant Destroy target artifact or enchantment and up to one other target artifact or enchantment. -ZEN C +ZEN C, COM C Relic Putrescence {2}{B} @@ -57070,7 +57765,7 @@ Reliquary Monk {2}{W} Creature - Human Monk Cleric 2/2 -When Reliquary Monk is put into a graveyard from the battlefield, destroy target artifact or enchantment. +When Reliquary Monk dies, destroy target artifact or enchantment. UDS C Reliquary Tower @@ -57101,7 +57796,7 @@ NPH C Remembrance {3}{W} Enchantment -Whenever a nontoken creature you control is put into a graveyard from the battlefield, 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. +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 @@ -57159,7 +57854,7 @@ Rendclaw Trow Creature - Troll 2/2 Wither (This deals damage to creatures in the form of -1/-1 counters.) -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -57281,7 +57976,7 @@ Repentant Vampire Creature - Vampire 3/3 Flying -Whenever a creature dealt damage by Repentant Vampire this turn is put into a graveyard, put a +1/+1 counter on Repentant Vampire. +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 @@ -57321,7 +58016,7 @@ Repulse Instant Return target creature to its owner's hand. Draw a card. -INV C, JVC C +INV C, JVC C, COM C Reroute {1}{R} @@ -57461,7 +58156,7 @@ Restless Apparition Creature - Spirit 2/2 {W/B}{W/B}{W/B}: Restless Apparition gets +3/+3 until end of turn. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -57597,7 +58292,7 @@ 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 +TSP U, COM U Reveillark {4}{W} @@ -57625,7 +58320,7 @@ HML R, ME3 U Revelation {G} World Enchantment -All players play with their hands revealed. +Players play with their hands revealed. LEG R, CHR R Revelsong Horn @@ -57654,7 +58349,7 @@ Reverberate {R}{R} Instant Copy target instant or sorcery spell. You may choose new targets for the copy. -M11 R, H10 R +M11 R, H10 R, M12 R Reverberation {2}{U}{U} @@ -57953,6 +58648,13 @@ 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 @@ -58062,7 +58764,7 @@ Righteous Cause {3}{W}{W} Enchantment Whenever a creature attacks, you gain 1 life. -ONS U, DVD U +ONS U, DVD U, COM U Righteous Charge {1}{W}{W} @@ -58095,6 +58797,14 @@ 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 @@ -58194,7 +58904,7 @@ Ringskipper Creature - Faerie Wizard 1/1 Flying -When Ringskipper is put into a graveyard from the battlefield, 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.) +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 @@ -58238,7 +58948,7 @@ Riptide Crab Creature - Crab 1/3 Vigilance -When Riptide Crab is put into a graveyard from the battlefield, draw a card. +When Riptide Crab dies, draw a card. INV U Riptide Director @@ -58315,7 +59025,7 @@ 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 +M10 U, GVL U, M11 U, COM U Rise of the Hobgoblins {R/W}{R/W} @@ -58412,7 +59122,7 @@ Rites of Flourishing 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 +FUT R, M12 R Rites of Initiation {R} @@ -58546,7 +59256,7 @@ 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 is put into a graveyard from the battlefield, 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.) +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 @@ -58640,8 +59350,8 @@ Roc Egg Creature - Bird 0/3 Defender (This creature can't attack.) -When Roc Egg is put into a graveyard from the battlefield, put a 3/3 white Bird creature token with flying onto the battlefield. -M11 U +When Roc Egg dies, put a 3/3 white Bird creature token with flying onto the battlefield. +M11 U, M12 U Roc Hatchling {R} @@ -58729,7 +59439,7 @@ Rockslide Elemental Creature - Elemental 1/1 First strike -Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on Rockslide Elemental. +Whenever another creature dies, you may put a +1/+1 counter on Rockslide Elemental. ALA U, HOP U Rocky Tar Pit @@ -58747,7 +59457,7 @@ LEA U, LEB U, 2ED U, 3ED U, 4ED U, 5ED U, 6ED U, S00 U, 7ED U, 8ED U, 9ED U, 10E Rofellos Vanguard Hand -2, life +4 -Whenever a creature you control is put into a graveyard from the battlefield, draw a card. +Whenever a creature you control dies, draw a card. VG S Rofellos's Gift @@ -58955,7 +59665,7 @@ 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 +M10 R, H09 R, M11 R, M12 R Rootbreaker Wurm {5}{G}{G} @@ -58974,7 +59684,7 @@ Rooting Kavu {2}{G}{G} Creature - Kavu 4/3 -When Rooting Kavu is put into a graveyard from the battlefield, you may exile it. If you do, shuffle all creature cards from your graveyard into your library. +When Rooting Kavu dies, you may exile it. If you do, shuffle all creature cards from your graveyard into your library. INV U Rootrunner @@ -58982,7 +59692,7 @@ Rootrunner Creature - Spirit 3/3 {G}{G}, Sacrifice Rootrunner: Put target land on top of its owner's library. -Soulshift 3 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 3 or less from your graveyard to your hand.) +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 @@ -59094,7 +59804,7 @@ Rot Wolf 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 is put into a graveyard, you may draw a card. +Whenever a creature dealt damage by Rot Wolf this turn dies, you may draw a card. MBS C Roterothopter @@ -59109,7 +59819,7 @@ Rotlung Reanimator {2}{B} Creature - Zombie Cleric 2/2 -Whenever Rotlung Reanimator or another Cleric is put into a graveyard from the battlefield, put a 2/2 black Zombie creature token onto the battlefield. +Whenever Rotlung Reanimator or another Cleric dies, put a 2/2 black Zombie creature token onto the battlefield. ONS R Rotted Hystrix @@ -59194,7 +59904,7 @@ Royal Assassin 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 +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 @@ -59273,6 +59983,13 @@ 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 @@ -59284,7 +60001,7 @@ Ruination {3}{R} Sorcery Destroy all nonbasic lands. -STH R +STH R, COM R Ruinous Minotaur {1}{R}{R} @@ -59304,7 +60021,7 @@ Rukh Egg {3}{R} Creature - Bird 0/3 -When Rukh Egg is put into a graveyard from the battlefield, put a 4/4 red Bird creature token with flying onto the battlefield at the beginning of the next end step. +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 @@ -59415,6 +60132,14 @@ 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 @@ -59437,7 +60162,7 @@ Runeclaw Bear {1}{G} Creature - Bear 2/2 -M10 C, M11 C +M10 C, M11 C, M12 C Runed Arch {3} @@ -59457,7 +60182,7 @@ Runed Servitor {2} Artifact Creature - Construct 2/2 -When Runed Servitor is put into a graveyard from the battlefield, each player draws a card. +When Runed Servitor dies, each player draws a card. ROE U, EVT U Runed Stalactite @@ -59485,7 +60210,7 @@ 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 be put into a graveyard this turn, exile that creature instead. +{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 @@ -59499,7 +60224,7 @@ 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 +CON C, H09 C, COM C Rush of Knowledge {4}{U} @@ -59518,7 +60243,7 @@ Rushing-Tide Zubera {2}{U}{U} Creature - Zubera Spirit 3/3 -When Rushing-Tide Zubera is put into a graveyard from the battlefield, if 4 or more damage was dealt to it this turn, draw three cards. +When Rushing-Tide Zubera dies, if 4 or more damage was dealt to it this turn, draw three cards. SOK U Rushwood Dryad @@ -59585,6 +60310,13 @@ 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 @@ -59655,7 +60387,7 @@ Ryusei, the Falling Star Legendary Creature - Dragon Spirit 5/5 Flying -When Ryusei, the Falling Star is put into a graveyard from the battlefield, it deals 5 damage to each creature without flying. +When Ryusei, the Falling Star dies, it deals 5 damage to each creature without flying. PRO R, CHK R, ARC R Saber Ants @@ -59792,28 +60524,28 @@ Sacred Wolf {2}{G} Creature - Wolf 3/1 -Sacred Wolf can't be the target of spells or abilities your opponents control. -M11 C +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 black mana equal to the sacrificed creature's converted mana cost. +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 is put into a graveyard from the battlefield, each player puts a card from his or her hand on top of his or her library. +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 is put into a graveyard from the battlefield, put a +1/+1 counter on enchanted creature. +Whenever a creature dies, put a +1/+1 counter on enchanted creature. TMP C, BRB C Sadistic Hypnotist @@ -59860,7 +60592,7 @@ Safehold Elite {1}{G/W} Creature - Elf Scout 2/2 -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -59978,7 +60710,7 @@ Sakura-Tribe Elder 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 +CHK C, ARC C, COM C Sakura-Tribe Scout {G} @@ -60066,7 +60798,7 @@ 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 is put into a graveyard from the battlefield, you may untap Salvaging Station. +Whenever a creature dies, you may untap Salvaging Station. 5DN R Samite Alchemist @@ -60215,7 +60947,7 @@ MMQ R Sandals of Abdallah {4} Artifact -{2}, {T}: Target creature gains islandwalk until end of turn. When that creature is put into a graveyard from the battlefield this turn, destroy Sandals of Abdallah. +{2}, {T}: Target creature gains islandwalk until end of turn. When that creature dies this turn, destroy Sandals of Abdallah. ARN U Sandbar Crocodile @@ -60312,7 +61044,7 @@ Sangromancer Creature - Vampire Shaman 3/3 Flying -Whenever a creature an opponent controls is put into a graveyard from the battlefield, you may gain 3 life. +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 @@ -60339,7 +61071,7 @@ USG U, PVC U Sanguine Praetor {6}{B}{B} -Creature - Avatar +Creature - Avatar Praetor 7/5 {B}, Sacrifice a creature: Destroy each creature with the same converted mana cost as the sacrificed creature. GPT R @@ -60614,7 +61346,7 @@ Savage Twister {X}{R}{G} Sorcery Savage Twister deals X damage to each creature. -MIR U, GPT U, HOP U, ARC U +MIR U, GPT U, HOP U, ARC U, COM U Savannah Land - Forest Plains @@ -60888,7 +61620,7 @@ 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 +LRW U, COM U Scattershot {2}{R} @@ -60917,7 +61649,7 @@ Scavenger Drake Creature - Drake 1/1 Flying -Whenever another creature is put into a graveyard from the battlefield, you may put a +1/+1 counter on Scavenger Drake. +Whenever another creature dies, you may put a +1/+1 counter on Scavenger Drake. ALA U Scavenger Folk @@ -60931,10 +61663,17 @@ 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 put into a graveyard from the battlefield this turn. +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 @@ -60978,6 +61717,12 @@ 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 @@ -61067,7 +61812,7 @@ 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 be put into a graveyard this turn, exile it instead. +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 @@ -61203,6 +61948,12 @@ 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 @@ -61255,7 +62006,7 @@ Screams from Within Enchantment - Aura Enchant creature Enchanted creature gets -1/-1. -When enchanted creature is put into a graveyard, return Screams from Within from your graveyard to the battlefield. +When enchanted creature dies, return Screams from Within from your graveyard to the battlefield. DST U Screams of the Damned @@ -61269,7 +62020,7 @@ Screeching Buzzard Creature - Bird 2/2 Flying -When Screeching Buzzard is put into a graveyard from the battlefield, each opponent discards a card. +When Screeching Buzzard dies, each opponent discards a card. ONS C Screeching Drake @@ -61409,7 +62160,7 @@ Scuttling Death Creature - Spirit 4/2 Sacrifice Scuttling Death: Target creature gets -1/-1 until end of turn. -Soulshift 4 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -61417,7 +62168,7 @@ Scuzzback Marauders Creature - Goblin Warrior 5/2 Trample -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -61427,6 +62178,14 @@ Creature - Goblin Warrior 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 @@ -61439,7 +62198,7 @@ Scythe of the Wretched {2} Artifact - Equipment Equipped creature gets +2/+2. -Whenever a creature dealt damage by equipped creature this turn is put into a graveyard, return that card to the battlefield under your control. Attach Scythe of the Wretched to that creature. +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 @@ -61742,7 +62501,7 @@ 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 +ONS C, DVD C, ARC C, COM C Second Chance {2}{U} @@ -61866,7 +62625,7 @@ Seedguide Ash {4}{G} Creature - Treefolk Druid 4/4 -When Seedguide Ash is put into a graveyard from the battlefield, you may search your library for up to three Forest cards and put them onto the battlefield tapped. If you do, shuffle your library. +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 @@ -62027,7 +62786,7 @@ Seize the Soul 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 is put into a graveyard, destroy target nonwhite, nonblack creature. Put a 1/1 white Spirit creature token with flying onto the battlefield. +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 @@ -62062,7 +62821,7 @@ Sek'Kuar, Deathkeeper {2}{B}{R}{G} Legendary Creature - Orc Shaman 4/3 -Whenever another nontoken creature you control is put into a graveyard from the battlefield, put a 3/1 black and red Graveborn creature token with haste onto the battlefield. +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 @@ -62099,16 +62858,15 @@ Selesnya Evangel 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 +RAV C, COM C Selesnya Guildmage {G/W}{G/W} Creature - Elf Wizard 2/2 -({G/W} can be paid with either {G} or {W}.) {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 +RAV U, ARC U, COM U Selesnya Sagittars {3}{G}{W} @@ -62123,13 +62881,13 @@ 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 +RAV C, DDG C, COM C Selesnya Signet {2} Artifact {1}, {T}: Add {G}{W} to your mana pool. -RAV C +RAV C, COM C Selfless Exorcist {3}{W}{W} @@ -62150,7 +62908,7 @@ Sell-Sword Brute {1}{R} Creature - Human Mercenary 2/2 -When Sell-Sword Brute is put into a graveyard from the battlefield, it deals 2 damage to you. +When Sell-Sword Brute dies, it deals 2 damage to you. RAV C Semblance Anvil @@ -62180,7 +62938,7 @@ Sengir Bats Creature - Bat 1/2 Flying -Whenever a creature dealt damage by Sengir Bats this turn is put into a graveyard, put a +1/+1 counter on Sengir Bats. +Whenever a creature dealt damage by Sengir Bats this turn dies, put a +1/+1 counter on Sengir Bats. HML C (x2) Sengir Nosferatu @@ -62195,9 +62953,9 @@ Sengir Vampire {3}{B}{B} Creature - Vampire 4/4 -Flying (This creature can't be blocked except by creatures with flying or reach.) -Whenever a creature dealt damage by Sengir Vampire this turn is put into a graveyard, 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 +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} @@ -62265,7 +63023,7 @@ Seraph Creature - Angel 4/4 Flying -Whenever a creature dealt damage by Seraph this turn is put into a graveyard, 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. +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 @@ -62326,7 +63084,7 @@ POR R Serpent Generator {6} Artifact -{4}, {T}: Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature 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.) +{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 @@ -62388,7 +63146,7 @@ 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 +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 @@ -62529,7 +63287,7 @@ Serum Raker Creature - Drake 3/2 Flying -When Serum Raker is put into a graveyard from the battlefield, each player discards a card. +When Serum Raker dies, each player discards a card. MBS C Serum Tank @@ -62603,6 +63361,15 @@ Creature - Zombie 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 @@ -62650,7 +63417,7 @@ PLC C Shade's Breath {1}{B} Instant -Until end of turn, each creature you control becomes black, its creature type becomes Shade, and it gains "{B}: This creature gets +1/+1 until end of turn." +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 @@ -62658,7 +63425,7 @@ Shade's Form Enchantment - Aura Enchant creature Enchanted creature has "{B}: This creature gets +1/+1 until end of turn." -When enchanted creature is put into a graveyard, return that card to the battlefield under your control. +When enchanted creature dies, return that card to the battlefield under your control. TOR C Shadow Guildmage @@ -62821,7 +63588,7 @@ Shambling Swarm {1}{B}{B}{B} Creature - Horror 3/3 -When Shambling Swarm is put into a graveyard from the battlefield, 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. +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 @@ -62941,6 +63708,12 @@ If a player would draw a card, that player exiles the top card of an opponent's 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 @@ -62968,7 +63741,7 @@ Creature - Angel 3/3 Flying Whenever a land enters the battlefield under an opponent's control, you may gain 3 life. -NPH U +NPH U, COM U Shattered Crypt {X}{B}{B} @@ -63485,7 +64258,7 @@ Shivan Phoenix Creature - Phoenix 3/4 Flying -When Shivan Phoenix is put into a graveyard from the battlefield, return Shivan Phoenix to its owner's hand. +When Shivan Phoenix dies, return Shivan Phoenix to its owner's hand. ULG R Shivan Raptor @@ -63558,7 +64331,7 @@ 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 +STH C, 6ED C, S00 C, BTD C, 7ED C, ONS C, 8ED C, 9ED C, 10E C, M12 C Shock Troops {3}{R} @@ -63719,7 +64492,7 @@ Creature - Elemental 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 +LRW U, ARC U, COM U Shrine of Boundless Growth {3} @@ -63771,7 +64544,7 @@ 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 is put into a graveyard from the battlefield, that creature's controller loses life equal to its toughness. +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 @@ -63958,7 +64731,7 @@ Siege Mastodon {4}{W} Creature - Elephant 3/5 -M10 C, M11 C +M10 C, M11 C, M12 C Siege Wurm {5}{G}{G} @@ -64015,7 +64788,7 @@ Sigil Captain 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 +ARB U, COM U Sigil Tracer {1}{U}{U} @@ -64078,7 +64851,7 @@ Sign in Blood {B}{B} Sorcery Target player draws two cards and loses 2 life. -M10 C, GVL C, ARC C, M11 C +M10 C, GVL C, ARC C, M11 C, COM C Signal Pest {1} @@ -64129,15 +64902,15 @@ Silent-Chant Zubera {1}{W} Creature - Zubera Spirit 1/2 -When Silent-Chant Zubera is put into a graveyard from the battlefield, you gain 2 life for each Zubera put into a graveyard from the battlefield this turn. +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. -Silhana Ledgewalker can't be the target of spells or abilities your opponents control. GPT C Silhana Starfletcher @@ -64357,7 +65130,7 @@ 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 +DIS C, COM C Simic Guildmage {G/U}{G/U} @@ -64386,14 +65159,15 @@ Simic Signet {2} Artifact {1}, {T}: Add {G}{U} to your mana pool. -DIS C +DIS C, COM C Simic Sky Swallower {5}{G}{U} Creature - Leviathan 6/6 -Flying; trample; shroud (This permanent can't be the target of spells or abilities.) -DIS R +Flying, trample +Shroud (This creature can't be the target of spells or abilities.) +DIS R, COM R Simoon {R}{G} @@ -64692,7 +65466,7 @@ ICE R, ME2 R Skeletonize {4}{R} Instant -Skeletonize deals 3 damage to target creature. When a creature dealt damage this way is put into a graveyard this turn, put a 1/1 black Skeleton creature token onto the battlefield with "{B}: Regenerate this creature." +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 @@ -64710,6 +65484,13 @@ Creature - Zombie 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 @@ -64754,7 +65535,7 @@ Skirk Drill Sergeant {1}{R} Creature - Goblin 2/1 -Whenever Skirk Drill Sergeant or another Goblin is put into a graveyard from the battlefield, 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. +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 @@ -64791,7 +65572,7 @@ 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 is put into a graveyard from the battlefield, target creature gets -1/-1 until end of turn." +{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 @@ -64951,6 +65732,15 @@ Artifact 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 @@ -64961,9 +65751,9 @@ Skullclamp {1} Artifact - Equipment Equipped creature gets +1/-1. -Whenever equipped creature is put into a graveyard, draw two cards. -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, FVE M +Whenever equipped creature dies, draw two cards. +Equip {1} +DST U, FVE M, COM U Skullmane Baku {3}{B}{B} @@ -65150,7 +65940,7 @@ Skyscribing 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 +DIS U, COM U Skyshaper {2} @@ -65221,7 +66011,7 @@ Skyshroud Elf Creature - Elf Druid 1/1 {T}: Add {G} to your mana pool. -{1}: Add {W} or {R} to your mana pool. +{1}: Add {R} or {W} to your mana pool. TMP C Skyshroud Elite @@ -65242,7 +66032,7 @@ Skyshroud Forest Land Skyshroud Forest enters the battlefield tapped. {T}: Add {1} to your mana pool. -{T}: Add {U} or {G} to your mana pool. Skyshroud Forest deals 1 damage to you. +{T}: Add {G} or {U} to your mana pool. Skyshroud Forest deals 1 damage to you. TMP R Skyshroud Poacher @@ -65325,6 +66115,14 @@ LEVEL 3+ 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 @@ -65384,8 +66182,8 @@ EXO U Slaughter Cry {2}{R} Instant -Target creature gets +3/+0 and gains first strike until end of turn. -ZEN C +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} @@ -65399,7 +66197,7 @@ Slaughterhouse Bouncer {4}{B} Creature - Ogre Warrior 3/3 -Hellbent - When Slaughterhouse Bouncer is put into a graveyard from the battlefield, if you have no cards in hand, target creature gets -3/-3 until end of turn. +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 @@ -65536,7 +66334,7 @@ Slippery Bogle {G/U} Creature - Beast 1/1 -Slippery Bogle can't be the target of spells or abilities your opponents control. +Hexproof (This creature can't be the target of spells or abilities your opponents control.) EVE C Slippery Karst @@ -65552,7 +66350,7 @@ 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 +ONS C, COM C Slipstream Serpent {7}{U} @@ -65717,7 +66515,7 @@ Smallpox {B}{B} Sorcery Each player loses 1 life, discards a card, sacrifices a creature, then sacrifices a land. -TSP U +TSP U, M12 U Smash {2}{R} @@ -66066,7 +66864,7 @@ Sol Ring {1} Artifact {T}: Add {2} to your mana pool. -LEA U, LEB U, 2ED U, 3ED U, FVR M, ME4 R +LEA U, LEB U, 2ED U, 3ED U, FVR M, ME4 R, COM U Sol'kanar the Swamp King {2}{U}{B}{R} @@ -66103,7 +66901,7 @@ Soldevi Adnate {1}{B} Creature - Human Cleric 1/2 -{T}, Sacrifice a black or artifact creature: Add an amount of black mana equal to the sacrificed creature's converted mana cost to your mana pool. +{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 @@ -66195,9 +66993,9 @@ Solemn Simulacrum {4} Artifact Creature - Golem 2/2 -When Solemn Simulacrum 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. -When Solemn Simulacrum is put into a graveyard from the battlefield, you may draw a card. -MRD R +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} @@ -66527,7 +67325,19 @@ Planeswalker - Sorin [+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 +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 @@ -66589,7 +67399,7 @@ Soul Collector Creature - Vampire 3/4 Flying -Whenever a creature dealt damage by Soul Collector this turn is put into a graveyard, return that card to the battlefield under your control. +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 @@ -66651,7 +67461,7 @@ ARB C Soul Net {1} Artifact -Whenever a creature is put into a graveyard from the battlefield, you may pay {1}. If you do, you gain 1 life. +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 @@ -66708,6 +67518,12 @@ 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 @@ -66806,7 +67622,7 @@ Soulcatcher Creature - Bird Soldier 1/1 Flying -Whenever a creature with flying is put into a graveyard from the battlefield, put a +1/+1 counter on Soulcatcher. +Whenever a creature with flying dies, put a +1/+1 counter on Soulcatcher. ODY U Soulcatchers' Aerie @@ -67042,7 +67858,7 @@ 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." -{2}0}: Cast any number of Eldrazi cards you own from outside the game without paying their mana costs. +{20}: Cast any number of Eldrazi cards you own from outside the game without paying their mana costs. ROE R Spawnwrithe @@ -67051,7 +67867,7 @@ 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 +SHM R, COM R Spearbreaker Behemoth {5}{G}{G} @@ -67166,6 +67982,12 @@ Multikicker {1}{U} (You may pay an additional {1}{U} any number of times as you 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 @@ -67396,6 +68218,14 @@ 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 @@ -67492,7 +68322,7 @@ Creature - Spike 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 +STH U, BRB U, TSB S, COM U Spike Hatcher {6}{G} @@ -67810,6 +68640,13 @@ 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 @@ -67865,7 +68702,7 @@ Spirit of the Hearth Creature - Cat Spirit 4/5 Flying -You can't be the target of spells or abilities your opponents control. +You have hexproof. (You can't be the target of spells or abilities your opponents control.) EVE R Spirit of the Night @@ -67942,7 +68779,7 @@ 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 +MOR U, COM U Spiteflame Witch {1}{B/R} @@ -68163,7 +69000,7 @@ 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 is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield for each fungus counter on that 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 @@ -68291,7 +69128,7 @@ Sprouting Thrinax {B}{R}{G} Creature - Lizard 3/3 -When Sprouting Thrinax is put into a graveyard from the battlefield, put three 1/1 green Saproling creature tokens onto the battlefield. +When Sprouting Thrinax dies, put three 1/1 green Saproling creature tokens onto the battlefield. ALA U Sprouting Vines @@ -68313,7 +69150,7 @@ Spurnmage Advocate 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 +JUD U, COM U Spurred Wolverine {4}{R} @@ -68361,7 +69198,7 @@ Squallmonger 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 +MMQ U, COM U Squandered Resources {B}{G} @@ -68404,7 +69241,7 @@ Squee's Embrace Enchantment - Aura Enchant creature Enchanted creature gets +2/+2. -When enchanted creature is put into a graveyard, return that card to its owner's hand. +When enchanted creature dies, return that card to its owner's hand. APC C Squee's Revenge @@ -68575,7 +69412,7 @@ Stalking Vengeance Creature - Avatar 5/5 Haste -Whenever another creature you control is put into a graveyard from the battlefield, it deals damage equal to its power to target player. +Whenever another creature you control dies, it deals damage equal to its power to target player. DIS R Stalking Yeti @@ -68620,7 +69457,7 @@ Stampeding Rhino 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 +M10 C, M12 C Stampeding Serow {2}{G}{G} @@ -68711,7 +69548,7 @@ Star Compass {2} Artifact Star Compass enters the battlefield tapped. -{T}: Add to your mana pool one mana of any color a basic land you control could produce. +{T}: Add to your mana pool one mana of any color that a basic land you control could produce. PLS U, 8ED U Starke @@ -68809,6 +69646,12 @@ Creature - Human Soldier 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 @@ -69091,6 +69934,14 @@ Protection from white and from black {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 @@ -69172,7 +70023,7 @@ Stitch Together 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 +JUD U, COM U Stitch in Time {1}{U}{R} @@ -69367,6 +70218,13 @@ 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 @@ -69463,7 +70321,7 @@ 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 +GPT R, COM R Storm Seeker {3}{G} @@ -69498,6 +70356,14 @@ 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 @@ -69519,7 +70385,7 @@ Stormfront Pegasus Creature - Pegasus 2/1 Flying -M10 C, M11 C +M10 C, M11 C, M12 C Stormfront Riders {4}{W} @@ -69629,6 +70495,13 @@ 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 @@ -70022,7 +70895,7 @@ Su-Chi {4} Artifact Creature - Construct 4/4 -When Su-Chi is put into a graveyard from the battlefield, add {4} to your mana pool. +When Su-Chi dies, add {4} to your mana pool. ATQ U, MED R Subdue @@ -70175,7 +71048,7 @@ 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 +TSP U, COM U Sulfurous Springs Land @@ -70214,7 +71087,7 @@ Summoner's Egg 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 is put into a graveyard from the battlefield, turn the exiled card face up. If it's a creature card, put it onto the battlefield under your control. +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 @@ -70275,7 +71148,7 @@ 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 +M11 M, M12 M Sun's Bounty {1}{W} @@ -70341,6 +71214,12 @@ Convoke (Each creature you tap while casting this spell reduces its cost by {1} 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 @@ -70431,7 +71310,7 @@ 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 +M10 R, M11 R, M12 R Sunrise Sovereign {5}{R} @@ -70738,7 +71617,7 @@ Surveilling Sprite Creature - Faerie Rogue 1/1 Flying -When Surveilling Sprite is put into a graveyard from the battlefield, you may draw a card. +When Surveilling Sprite dies, you may draw a card. RAV C Survival Cache @@ -70807,13 +71686,13 @@ 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 +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 +RAV U, COM U Svyelunite Priest {1}{U} @@ -70838,7 +71717,7 @@ 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) +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} @@ -70921,6 +71800,13 @@ 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 @@ -71094,7 +71980,7 @@ Sylvan Hierophant {1}{G} Creature - Human Cleric 1/2 -When Sylvan Hierophant is put into a graveyard from the battlefield, exile Sylvan Hierophant, then return another target creature card from your graveyard to your hand. +When Sylvan Hierophant dies, exile Sylvan Hierophant, then return another target creature card from your graveyard to your hand. WTH U Sylvan Library @@ -71168,7 +72054,7 @@ Sylvok Lifestaff {1} Artifact - Equipment Equipped creature gets +1/+0. -Whenever equipped creature is put into a graveyard, you gain 3 life. +Whenever equipped creature dies, you gain 3 life. Equip {1} SOM C @@ -71189,7 +72075,7 @@ Symbiotic Beast {4}{G}{G} Creature - Insect Beast 4/4 -When Symbiotic Beast is put into a graveyard from the battlefield, put four 1/1 green Insect creature tokens onto the battlefield. +When Symbiotic Beast dies, put four 1/1 green Insect creature tokens onto the battlefield. ONS U Symbiotic Deployment @@ -71203,15 +72089,15 @@ Symbiotic Elf {3}{G} Creature - Elf 2/2 -When Symbiotic Elf is put into a graveyard from the battlefield, put two 1/1 green Insect creature tokens onto the battlefield. +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 is put into a graveyard from the battlefield, put seven 1/1 green Insect creature tokens onto the battlefield. -ONS R +When Symbiotic Wurm dies, put seven 1/1 green Insect creature tokens onto the battlefield. +ONS R, COM R Symbol of Unsummoning {2}{U} @@ -71262,6 +72148,12 @@ Artifact {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 @@ -71273,7 +72165,7 @@ 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 +ONS C, HOP C, COM C Syphon Soul {2}{B} @@ -71287,7 +72179,7 @@ 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 +RAV R, COM R Tablet of Epityr {1} @@ -71453,7 +72345,7 @@ Takklemaggot 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 is put into a graveyard, 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." +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 @@ -71723,7 +72615,7 @@ Taoist Hermit {2}{G} Creature - Human Mystic 2/2 -Taoist Hermit can't be the target of spells or abilities your opponents control. +Hexproof (This creature can't be the target of spells or abilities your opponents control.) PTK U Taoist Mystic @@ -71761,6 +72653,14 @@ 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 @@ -71792,7 +72692,7 @@ Tarpan {G} Creature - Horse 1/1 -When Tarpan is put into a graveyard from the battlefield, you gain 1 life. +When Tarpan dies, you gain 1 life. ICE C, 5ED C Task Force @@ -71817,6 +72717,12 @@ 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 @@ -71828,7 +72734,7 @@ 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 is put into a graveyard. +{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 @@ -71977,6 +72883,12 @@ 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 @@ -72197,7 +73109,7 @@ USG U, 7ED U, 8ED U, 9ED U, 10E U, M10 U Teleport {U}{U}{U} Instant -Cast Teleport only after attackers are declared and before blockers are declared. +Cast Teleport only during the declare attackers step. Target creature is unblockable this turn. LEG R, CHR R @@ -72320,7 +73232,7 @@ 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 +SCG U, COM U Temporal Adept {1}{U}{U} @@ -72451,7 +73363,7 @@ 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 +PLC R, COM R Tenza, Godo's Maul {3} @@ -72510,7 +73422,7 @@ Terminate {B}{R} Instant Destroy target creature. It can't be regenerated. -PLS C, ARB C, ARC C +PLS C, ARB C, ARC C, COM C Teroh's Faithful {3}{W} @@ -72557,7 +73469,7 @@ 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 +TSP C, 10E C, M10 C, HOP C, H09 C, PVC C, ARC C, M11 C, COM C Terrarion {1} @@ -72652,13 +73564,13 @@ Teysa, Orzhov Scion Legendary Creature - Human Advisor 2/3 Sacrifice three white creatures: Exile target creature. -Whenever another black creature you control is put into a graveyard from the battlefield, put a 1/1 white Spirit creature token with flying onto the battlefield. +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 is put into a graveyard from the battlefield, put a 1/1 white Spirit creature token with flying onto the battlefield. +Whenever a nontoken creature dies, put a 1/1 white Spirit creature token with flying onto the battlefield. VG S Tezzeret the Seeker @@ -72901,6 +73813,13 @@ When you planeswalk to The Maelstrom or at the beginning of your upkeep, you may 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. @@ -72930,7 +73849,7 @@ 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 is put into a graveyard from the battlefield, abandon this scheme. +When a creature you control dies, abandon this scheme. ARC C The Wretched @@ -73061,7 +73980,7 @@ Thief of Hope 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 is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 2 or less from your graveyard to your hand.) +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 @@ -73201,7 +74120,7 @@ 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 is put into a graveyard from the battlefield, untap this creature." +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 @@ -73438,7 +74357,7 @@ Thousand-legged Kami {6}{G}{G} Creature - Spirit 6/6 -Soulshift 7 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 7 or less from your graveyard to your hand.) +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 @@ -73464,7 +74383,7 @@ Thran Golem 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 +UDS R, 9ED R, M12 U Thran Lens {2} @@ -73608,6 +74527,12 @@ 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 @@ -73617,7 +74542,7 @@ SOM U Through the Breach {4}{R} Instant - Arcane -You may put a creature card from your hand onto the battlefield. That creature has haste. Sacrifice that creature at the beginning of the next end step. +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 @@ -73670,7 +74595,7 @@ Thrun, the Last Troll Legendary Creature - Troll Shaman 4/4 Thrun, the Last Troll can't be countered. -Thrun can't be the target of spells or abilities your opponents control. +Hexproof (This creature can't be the target of spells or abilities your opponents control.) {1}{G}: Regenerate Thrun. MBS M @@ -73743,7 +74668,7 @@ Creature - Elemental 7/2 Haste Thunderblust has trample as long as it has a -1/-1 counter on it. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -74121,7 +75046,7 @@ 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 +M11 M, M12 M Time Sieve {U}{B} @@ -74200,6 +75125,12 @@ 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 @@ -74323,7 +75254,7 @@ USG U Titania's Song {3}{G} Enchantment -Each noncreature artifact loses its 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. +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 @@ -74334,6 +75265,12 @@ 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 @@ -74350,7 +75287,7 @@ MRD C Tithe {W} Instant -Search your library for a Plains card. If you control fewer lands than an opponent, you may search your library for an additional Plains card. Reveal those cards and put them into your hand. Then shuffle your library. +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 @@ -74617,7 +75554,7 @@ Torii Watchward Creature - Spirit 3/3 Vigilance (Attacking doesn't cause this creature to tap.) -Soulshift 4 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -74634,6 +75571,13 @@ Creature - Angel 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 @@ -74666,7 +75610,7 @@ 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. +{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 @@ -74755,7 +75699,7 @@ Toshiro Umezawa 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 is put into a graveyard from the battlefield, you may cast target instant card from your graveyard. If that card would be put into a graveyard this turn, exile it instead. +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 @@ -74981,7 +75925,7 @@ 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 +ONS R, COM R Tradewind Rider {3}{U} @@ -75119,7 +76063,7 @@ 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 +ONS C, EVG C, ARC C, COM C Tranquility {2}{G} @@ -75209,7 +76153,7 @@ Trapjaw Kelpie Creature - Beast 3/3 Flash -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -75283,14 +76227,14 @@ 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 is put into a graveyard from the battlefield, you lose 6 life." +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 is put into a graveyard from the battlefield, you lose 4 life." +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 @@ -75429,6 +76373,14 @@ 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 @@ -75549,6 +76501,12 @@ 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 @@ -75650,7 +76608,7 @@ Artifact Creature - Construct 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 +TSP R, COM R Triskelion {6} @@ -75676,9 +76634,9 @@ Troll Ascetic {1}{G}{G} Creature - Troll Shaman 3/2 -Troll Ascetic can't be the target of spells or abilities your opponents control. -{1}{G}: Regenerate Troll Ascetic. (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.) -MRD R, 10E R +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} @@ -75686,6 +76644,13 @@ 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 @@ -75704,7 +76669,7 @@ Trophy Hunter 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 is put into a graveyard, put a +1/+1 counter on Trophy Hunter. +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 @@ -75831,7 +76796,7 @@ Tukatongue Thallid {G} Creature - Fungus 1/1 -When Tukatongue Thallid is put into a graveyard from the battlefield, put a 1/1 green Saproling creature token onto the battlefield. +When Tukatongue Thallid dies, put a 1/1 green Saproling creature token onto the battlefield. CON C Tuknir Deathlock @@ -75862,7 +76827,7 @@ Tuktuk the Explorer Legendary Creature - Goblin 1/1 Haste -When Tuktuk the Explorer is put into a graveyard from the battlefield, put a legendary 5/5 colorless Goblin Golem artifact creature token named Tuktuk the Returned onto the battlefield. +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 @@ -75954,6 +76919,12 @@ 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 @@ -76041,7 +77012,7 @@ 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 is put into a graveyard from the battlefield, 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.) +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 @@ -76435,7 +77406,7 @@ Undying Beast {3}{B} Creature - Beast 3/2 -When Undying Beast is put into a graveyard from the battlefield, put Undying Beast on top of its owner's library. +When Undying Beast dies, put it on top of its owner's library. POR C Undying Flames @@ -76583,7 +77554,7 @@ Unnerve {3}{B} Sorcery Each opponent discards two cards. -USG C, BRB C +USG C, BRB C, COM C Unnerving Assault {2}{U/R} @@ -76603,7 +77574,7 @@ 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 is put into a graveyard, you may exile that card. If you do, put a 2/2 black Zombie creature token onto the battlefield. +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 @@ -76670,7 +77641,7 @@ 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 +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 @@ -76901,8 +77872,8 @@ Uril, the Miststalker {2}{R}{G}{W} Legendary Creature - Beast 5/5 -Uril, the Miststalker can't be the target of spells or abilities your opponents control. -Uril gets +2/+2 for each Aura attached to it. +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 @@ -77134,7 +78105,7 @@ Valley Rannet 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 +ARB C, COM C Valleymaker {5}{R/G} @@ -77208,7 +78179,7 @@ Creature - Vampire Shaman 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 +ZEN U, COM U Vampire Nocturnus {1}{B}{B}{B} @@ -77225,6 +78196,14 @@ 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 @@ -77237,7 +78216,7 @@ Vampiric Dragon Creature - Vampire Dragon 5/5 Flying -Whenever a creature dealt damage by Vampiric Dragon this turn is put into a graveyard, put a +1/+1 counter on Vampiric Dragon. +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 @@ -77246,7 +78225,7 @@ Vampiric Embrace Enchantment - Aura Enchant creature Enchanted creature gets +2/+2 and has flying. -Whenever a creature dealt damage by enchanted creature this turn is put into a graveyard, put a +1/+1 counter on that creature. +Whenever a creature dealt damage by enchanted creature this turn dies, put a +1/+1 counter on that creature. USG U Vampiric Feast @@ -77266,7 +78245,7 @@ Vampiric Sliver {3}{B} Creature - Sliver 3/3 -All Sliver creatures have "Whenever a creature dealt damage by this creature this turn is put into a graveyard, put a +1/+1 counter on this creature." +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 @@ -77371,14 +78350,14 @@ Vastwood Gorger {5}{G} Creature - Wurm 5/6 -ZEN C +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 is put into a graveyard, return that card to its owner's hand. +When enchanted land dies, return that card to its owner's hand. WWK C Vault Skirge @@ -77542,7 +78521,7 @@ Vedalken Plotter 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 +GPT U, COM U Vedalken Shackles {3} @@ -77609,7 +78588,7 @@ 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 is put into a graveyard, put a +1/+1 counter on 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 @@ -77683,7 +78662,7 @@ Venerable Kumo Creature - Spirit 2/3 Reach (This creature can block creatures with flying.) -Soulshift 4 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 4 or less from your graveyard to your hand.) +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 @@ -77718,7 +78697,7 @@ Vengeful Dead {3}{B} Creature - Zombie 3/2 -Whenever Vengeful Dead or another Zombie is put into a graveyard from the battlefield, each opponent loses 1 life. +Whenever Vengeful Dead or another Zombie dies, each opponent loses 1 life. SCG C Vengeful Dreams @@ -77736,12 +78715,20 @@ 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 +ARB U, COM U Vengevine {2}{G}{G} @@ -77881,7 +78868,7 @@ TMP R, 9ED R, 10E R, HOP R Verdant Succession {4}{G} Enchantment -Whenever a green nontoken creature is put into a graveyard from the battlefield, 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. +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 @@ -78021,8 +79008,8 @@ Veteran Explorer {G} Creature - Human Soldier Scout 1/1 -When Veteran Explorer is put into a graveyard from the battlefield, 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 +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} @@ -78093,7 +79080,7 @@ 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 is put into a graveyard from the battlefield, draw a card for each age counter on it. +When Vexing Sphinx dies, draw a card for each age counter on it. CSP R Vhati il-Dal @@ -78265,7 +79252,7 @@ INV U Vicious Shadows {6}{R} Enchantment -Whenever a creature is put into a graveyard from the battlefield, you may have Vicious Shadows deal damage to target player equal to the number of cards in that player's hand. +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 @@ -78326,7 +79313,7 @@ DIS U Vigil for the Lost {3}{W} Enchantment -Whenever a creature you control is put into a graveyard from the battlefield, you may pay {X}. If you do, you gain X life. +Whenever a creature you control dies, you may pay {X}. If you do, you gain X life. SOM U Vigilance @@ -78444,7 +79431,7 @@ Vine Kami Creature - Spirit 4/4 Vine Kami can't be blocked except by two or more creatures. -Soulshift 6 (When this is put into a graveyard from the battlefield, you may return target Spirit card with converted mana cost 6 or less from your graveyard to your hand.) +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 @@ -78559,7 +79546,7 @@ Viridian Emissary {1}{G} Creature - Elf Scout 2/1 -When Viridian Emissary is put into a graveyard from the battlefield, you may search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. +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 @@ -78573,7 +79560,7 @@ Viridian Joiner {2}{G} Creature - Elf Druid 1/2 -{T}: Add an amount of {G} to your mana pool equal to Viridian Joiner's power. +{T}: Add to your mana pool an amount of {G} equal to Viridian Joiner's power. MRD C Viridian Longbow @@ -78652,7 +79639,7 @@ ROE U Virulent Wound {B} Instant -Put a -1/-1 counter on target creature. When that creature is put into a graveyard this turn, its controller gets a poison counter. +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 @@ -78716,6 +79703,15 @@ Artifact Creature - Construct 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 @@ -78726,7 +79722,7 @@ Vision Skeins {1}{U} Instant Each player draws two cards. -DIS C +DIS C, COM C Visions {W} @@ -78734,6 +79730,12 @@ 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 @@ -78808,35 +79810,35 @@ 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 +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 +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 +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 +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 +LRW U, COM U Vivify {2}{G} @@ -78925,7 +79927,7 @@ Creature - Wall 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 is put into a graveyard from the battlefield, destroy all Merfolk tapped this turn to pay for its abilities. +When Vodalian War Machine dies, destroy all Merfolk tapped this turn to pay for its abilities. FEM R Vodalian Zombie @@ -78939,10 +79941,10 @@ Voice of All {2}{W}{W} Creature - Angel 2/2 -Flying (This creature can't be blocked except by creatures with flying or reach.) +Flying As Voice of All enters the battlefield, choose a color. -Voice of All has protection from the chosen color. (It can't be blocked, targeted, dealt damage, or enchanted by anything of the chosen color.) -PLS U, 10E R +Voice of All has protection from the chosen color. +PLS U, 10E R, COM R Voice of Duty {3}{W} @@ -79003,7 +80005,7 @@ Void Maw Creature - Horror 4/5 Trample -If another creature would be put into a graveyard from the battlefield, exile it instead. +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 @@ -79059,8 +80061,9 @@ Volcanic Dragon {4}{R}{R} Creature - Dragon 4/4 -Flying, haste -MIR R, POR R, 6ED R, S99 R +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} @@ -79287,7 +80290,7 @@ 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 +PLC R, COM R Vorrac Battlehorns {2} @@ -79303,6 +80306,41 @@ Creature - Human Soldier {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 @@ -79404,7 +80442,7 @@ 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 +RAV R, COM R Wail of the Nim {2}{B} @@ -79601,15 +80639,16 @@ Wall of Denial {1}{W}{U} Creature - Wall 0/8 -Defender, flying, shroud -ARB U +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 they didn't have shadow. +Wall of Diffusion can block creatures with shadow as though Wall of Diffusion had shadow. TMP C Wall of Distortion @@ -79759,7 +80798,7 @@ Creature - Wall 0/4 Defender When Wall of Omens enters the battlefield, draw a card. -ROE U +ROE U, COM U Wall of Opposition {3}{R}{R} @@ -79898,6 +80937,13 @@ 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 @@ -79995,7 +81041,7 @@ Wandering Eye Creature - Illusion 1/3 Flying -All players play with their hands revealed. +Players play with their hands revealed. NEM C Wandering Goblins @@ -80250,7 +81296,7 @@ Warpath Ghoul {2}{B} Creature - Zombie 3/2 -M10 C +M10 C, M12 C Warped Devotion {2}{B} @@ -80342,6 +81388,12 @@ Cast Warrior's Stand only during the declare attackers step and only if you've b 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 @@ -80625,7 +81677,7 @@ Weatherseed Treefolk Creature - Treefolk 5/3 Trample -When Weatherseed Treefolk is put into a graveyard from the battlefield, return Weatherseed Treefolk to its owner's hand. +When Weatherseed Treefolk dies, return it to its owner's hand. ULG R Weaver of Lies @@ -80765,7 +81817,7 @@ Welkin Hawk Creature - Bird 1/1 Flying -When Welkin Hawk is put into a graveyard from the battlefield, you may search your library for a card named Welkin Hawk, reveal that card, put it into your hand, then shuffle your library. +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 @@ -81015,7 +82067,7 @@ 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 is put into a graveyard this turn, exile the creature. +{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 @@ -81065,7 +82117,7 @@ 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 is put into a graveyard from 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 @@ -81087,7 +82139,7 @@ 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 +LRW C, COM C Whirlwind {2}{G}{G} @@ -81365,7 +82417,7 @@ 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 +LRW R, COM R Wild Swing {3}{R} @@ -81546,16 +82598,16 @@ Wind Zendikon Enchantment - Aura Enchant land Enchanted land is a 2/2 blue Elemental creature with flying. It's still a land. -When enchanted land is put into a graveyard, return that card to its owner's hand. +When enchanted land dies, return that card to its owner's hand. WWK C Windborn Muse {3}{W} Creature - Spirit 2/3 -Flying (This creature can't be blocked except by creatures with flying or reach.) +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 +LGN R, 10E R, COM R Windborne Charge {2}{W}{W} @@ -81582,7 +82634,7 @@ 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 +USG U, BRB U, COM U Winding Canyons Land @@ -81738,7 +82790,7 @@ Wingrattle Scarecrow 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 is put into a graveyard from the battlefield, 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.) +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 @@ -81785,7 +82837,7 @@ LEG R, 4ED U, 5ED U, MED U Winter Orb {2} Artifact -As long as Winter Orb is untapped, players can't untap more than one land during their untap steps. +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 @@ -81873,7 +82925,7 @@ Wirewood Herald {1}{G} Creature - Elf 1/1 -When Wirewood Herald is put into a graveyard from the battlefield, you may search your library for an Elf card, reveal that card, put it into your hand, then shuffle your library. +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 @@ -82151,7 +83203,7 @@ 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 +JUD U, COM U Wood Elemental {3}{G} @@ -82206,7 +83258,7 @@ Creature - Treefolk Shaman 6/6 Trample When Woodfall Primus enters the battlefield, destroy target noncreature permanent. -Persist (When this creature is put into a graveyard from the battlefield, 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.) +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 @@ -82416,8 +83468,8 @@ 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. This card enters the battlefield unattached and stays on the battlefield if the creature leaves.) -MRD R +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} @@ -82586,7 +83638,7 @@ Wrecking Ball {2}{B}{R} Instant Destroy target creature or land. -DIS C +DIS C, COM C Wren's Run Packmaster {3}{G} @@ -82630,7 +83682,13 @@ 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 +WWK M, COM M + +Wring Flesh +{B} +Instant +Target creature gets -3/-1 until end of turn. +M12 C Writ of Passage {U} @@ -82700,7 +83758,7 @@ 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 +DST U, 9ED U, 10E U, M10 U, M11 U, M12 U Wurmcalling {X}{G} @@ -82714,7 +83772,7 @@ Wurmcoil Engine Artifact Creature - Wurm 6/6 Deathtouch, lifelink -When Wurmcoil Engine is put into a graveyard from the battlefield, 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. +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 @@ -82816,13 +83874,13 @@ 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 be put into a graveyard this turn, exile it instead. +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 be put into a graveyard this turn, exile it instead. +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 @@ -82871,9 +83929,9 @@ Yavimaya Elder {1}{G}{G} Creature - Human Druid 2/1 -When Yavimaya Elder is put into a graveyard from the battlefield, 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. +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 +UDS C, PVC C, COM C Yavimaya Enchantress {2}{G} @@ -83018,7 +84076,7 @@ Yoke of the Damned {1}{B} Enchantment - Aura Enchant creature -When a creature is put into a graveyard from the battlefield, destroy enchanted creature. +When a creature dies, destroy enchanted creature. CON C Yoked Plowbeast @@ -83047,7 +84105,7 @@ Yosei, the Morning Star Legendary Creature - Dragon Spirit 5/5 Flying -When Yosei, the Morning Star is put into a graveyard from the battlefield, target player skips his or her next untap step. Tap up to five target permanents that player controls. +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 @@ -83178,6 +84236,14 @@ Creature - Unicorn 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 @@ -83419,7 +84485,7 @@ 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 +FUT U, COM U Zof Shade {3}{B} @@ -83468,13 +84534,13 @@ Zombie Goliath {4}{B} Creature - Zombie Giant 4/3 -M10 C +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 +ODY U, ARC U, M12 U Zombie Master {1}{B}{B} @@ -83559,8 +84625,8 @@ 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. -Zuo Ci can't be the target of spells or abilities your opponents control. PTK R Zur the Enchanter diff --git a/res/quest/all-prices.txt b/res/quest/all-prices.txt index 85b2d00728c..7d790666c25 100644 --- a/res/quest/all-prices.txt +++ b/res/quest/all-prices.txt @@ -534,7 +534,7 @@ Aysen Highway =10 Ayumi, the Last Visitor =47 Azami, Lady of Scrolls =75 Azimaet Drake =15 -Azorius AEthermage =25 +Azorius ARthermage =25 Azorius Chancery =17 Azorius First-Wing =25 Azorius Guildmage =54 @@ -1898,7 +1898,7 @@ Dance of Many =33 Dance of Shadows =99 Dance of the Dead =52 Dancing Scimitar =25 -Dandan =25 +Dandân =25 Daraja Griffin =25 Darba =25 Darien, King of Kjeldor =133 diff --git a/res/quest/decks/Abraham Lincoln 3.dck b/res/quest/decks/Abraham Lincoln 3.dck index 8e2c6d186d1..68516d4f5c7 100644 --- a/res/quest/decks/Abraham Lincoln 3.dck +++ b/res/quest/decks/Abraham Lincoln 3.dck @@ -2,41 +2,45 @@ Abraham Lincoln 3 [general] constructed [main] -3 Plateau +4 Plateau 2 Flooded Strand 3 Arid Mesa 1 Island 1 Plains -1 Mountain -2 Tundra -3 Volcanic Island +1 Tundra +4 Volcanic Island 3 Scalding Tarn 1 Mox Ruby 1 Mox Sapphire 1 Mox Pearl 1 Radiant, Archangel -2 Sky Spirit +1 Sky Spirit +1 Talon Trooper 3 Skyknight Legionnaire +1 Archon of Redemption 1 Ryusei, the Falling Star 3 Lightning Angel -2 Serra Avenger -1 Archon of Justice +1 Serra Avenger +1 Tempest Drake +1 Firemane Angel 1 Niv-Mizzet, the Firemind -2 Azorius First-Wing +1 Azorius First-Wing 1 Zephyr Sprite 1 Flying Men -1 Silver Knight +1 Esper Cormorants 1 Lantern Kami 1 Numot, the Devastator 1 Granite Gargoyle -1 Disenchant +1 Pride of the Clouds 1 Tremor -2 Lightning Helix +1 Lightning Helix 2 Earthquake -3 Flamebreak +4 Flamebreak 1 Ancestral Recall -2 Concentrate -2 Swords to Plowshares +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/Barney Rubble 1.dck b/res/quest/decks/Barney Rubble 1.dck index cb3743c56fc..32fb4d426c2 100644 --- a/res/quest/decks/Barney Rubble 1.dck +++ b/res/quest/decks/Barney Rubble 1.dck @@ -2,36 +2,40 @@ 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 -4 Coastal Tower 1 Stinging Barrier -4 Absorb -6 Island -4 Divination 1 Minamo Scrollkeeper 1 Wall of Omens -1 Plumeveil -1 Serra's Embrace +1 Pride Guardian 1 Sunweb -1 Wall of Reverence -1 Perimeter Captain -1 Propaganda -1 Ghostly Prison +1 Kaijin of the Vanishing Touch +1 Psychic Membrane 1 Glacial Wall -2 Angelic Wall -2 Guardians of Akrasa -2 Concentrate -4 Boreal Shelf -6 Plains +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 -4 Sovereigns of Lost Alara +1 Wall of Denial +1 Necropolis +1 Serra's Embrace +1 Divine Transformation 1 Zephid's Embrace 1 Armadillo Cloak -1 Wall of Denial -1 Divine Transformation +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/Cave Troll 2.dck b/res/quest/decks/Cave Troll 2.dck deleted file mode 100644 index 9f90efa6ef0..00000000000 --- a/res/quest/decks/Cave Troll 2.dck +++ /dev/null @@ -1,25 +0,0 @@ -[metadata] -Name=Cave Troll 2 -Deck Type=constructed -[main] -2 Go for the Throat|MBS -1 Chainer's Edict|TOR -3 Null Brooch|EXO -3 Ravenous Rats|10E -2 Executioner's Capsule|ALA -4 Quicksand|WWK -1 Liliana Vess|M11 -3 The Rack|TSB -1 Stupor|TSB -3 Steel Wall -1 Disfigure|ZEN -1 Doom Blade|M11 -4 Ensnaring Bridge|8ED -19 Swamp|MBS -4 Bottomless Pit|STH -1 Hymn to Tourach|FEM -2 Inquisition of Kozilek|ROE -1 Grasp of Darkness|SOM -1 Guiltfeeder|JUD -3 Quest for the Nihil Stone|WWK -[sideboard] diff --git a/res/quest/decks/Crocodile Dundee 2.dck b/res/quest/decks/Crocodile Dundee 2.dck index af93058de48..063aa71a8ba 100644 --- a/res/quest/decks/Crocodile Dundee 2.dck +++ b/res/quest/decks/Crocodile Dundee 2.dck @@ -10,9 +10,9 @@ constructed 1 Rockslide Ambush 1 Spitting Earth 1 Seismic Strike -2 Spire Barrage +1 Spire Barrage 1 Flame Javelin -2 Blood Knight +1 Blood Knight 1 Kargan Dragonlord 1 Slith Firewalker 1 Pyre Charger @@ -24,10 +24,11 @@ constructed 4 Tarox Bladewing 1 Eternal Flame 1 Tenza, Godo's Maul -1 Goblin Charbelcher 1 Oxidda Golem 1 AErathi Berserker -1 Flowstone Overseer 1 Frost Giant 1 Giant Strength +2 Heartlash Cinder +1 Lightning Cloud +1 Outrage Shaman [sideboard] diff --git a/res/quest/decks/Darrin Stephens 1.dck b/res/quest/decks/Darrin Stephens 1.dck index 4326e232089..700dbdf2a4a 100644 --- a/res/quest/decks/Darrin Stephens 1.dck +++ b/res/quest/decks/Darrin Stephens 1.dck @@ -6,7 +6,7 @@ constructed 1 Scepter of Insight 1 Horrible Hordes 1 Trinket Mage -3 Frogmite +2 Frogmite 1 Ancient Den 2 Thirst for Knowledge 3 Somber Hoverguard @@ -35,4 +35,5 @@ constructed 1 Cumber Stone 1 Faerie Mechanist 1 Spined Thopter +1 Neurok Familiar [sideboard] diff --git a/res/quest/decks/Galadriel 2.dck b/res/quest/decks/Galadriel 2.dck index 66458220757..221639c355d 100644 --- a/res/quest/decks/Galadriel 2.dck +++ b/res/quest/decks/Galadriel 2.dck @@ -9,14 +9,15 @@ constructed 4 Amulet of Vigor 2 Khalni Heart Expedition 1 Time Vault -4 Explosive Vegetation +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 -2 Primeval Titan +1 Primeval Titan 1 Beacon of Creation 1 Timbermaw Larva 1 Reach of Branches diff --git a/res/quest/decks/George of the Jungle 1.dck b/res/quest/decks/George of the Jungle 1.dck index 39c52c7e47d..5a41bea93ac 100644 --- a/res/quest/decks/George of the Jungle 1.dck +++ b/res/quest/decks/George of the Jungle 1.dck @@ -2,31 +2,26 @@ George of the Jungle 1 [general] constructed [main] -4 Sacred Foundry +2 Sacred Foundry +2 Battlefield Forge 1 Expedition Map 4 Jungle Shrine -2 Disenchant -1 Skyknight Legionnaire -1 Royal Falcon -2 Boros Recruit -1 Hobgoblin Dragoon -1 Angel of Mercy +1 Disenchant +4 Boros Recruit +4 Hobgoblin Dragoon 2 Cerodon Yearling -1 Auramancer -1 Barbarian Horde -1 Balduvian War-Makers -1 Foot Soldiers +2 Angelfire Crusader +2 Ordruun Commando 1 Ghostfire -1 Phyrexian War Beast 3 Battlegate Mimic 2 Skyknight Legionnaire 2 Duergar Hedge-Mage 3 Belligerent Hatchling -1 Anodet Lurker -2 Stun Sniper +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 index fba568d14c8..a113fd54bd2 100644 --- a/res/quest/decks/George of the Jungle 2.dck +++ b/res/quest/decks/George of the Jungle 2.dck @@ -4,7 +4,7 @@ constructed [main] 1 Bull Cerodon 4 Sacred Foundry -2 Disenchant +2 Battlefield Forge 4 Plateau 2 Squee's Embrace 1 Hobgoblin Dragoon @@ -12,11 +12,8 @@ constructed 2 Lightning Helix 2 Stun Sniper 8 Plains -1 Goblin Bully 2 Flowstone Charger -2 Ajani Vengeant -1 Angel of Mercy -2 Lightning Bolt +1 Ajani Vengeant 2 Figure of Destiny 2 Double Cleave 2 Hearthfire Hobgoblin @@ -27,4 +24,10 @@ constructed 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/Grampa Simpson 3.dck b/res/quest/decks/Grampa Simpson 3.dck index f481eb0497c..c65cb54aaf4 100644 --- a/res/quest/decks/Grampa Simpson 3.dck +++ b/res/quest/decks/Grampa Simpson 3.dck @@ -3,15 +3,15 @@ Grampa Simpson 3 constructed [main] 2 Marisi's Twinclaws -2 Kor Duelist +1 Kor Duelist 4 Jungle Shrine 3 Plateau 2 Taiga 4 Windswept Heath 2 Warren Instigator 1 Plains -4 Glorious Anthem -4 Skyhunter Skirmisher +3 Glorious Anthem +3 Skyhunter Skirmisher 4 Bonesplitter 2 Scrubland 1 Badlands @@ -20,10 +20,11 @@ constructed 4 Student of Warfare 1 Mox Pearl 1 Gorgon Flail -4 Loxodon Warhammer +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/Hellboy 3.dck b/res/quest/decks/Hellboy 3.dck index de5f8ef0428..9db135aa98b 100644 --- a/res/quest/decks/Hellboy 3.dck +++ b/res/quest/decks/Hellboy 3.dck @@ -5,7 +5,7 @@ constructed 5 Swamp 7 Mountain 4 Badlands -4 Blood Crypt +4 Bloodstained Mire 1 Mox Ruby 1 Mox Jet 4 Blightning @@ -17,9 +17,9 @@ constructed 4 Spark Elemental 2 Night's Whisper 2 Flame Rift -1 Stronghold Discipline 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 index 749673db121..e4ae1143529 100644 --- a/res/quest/decks/Hercules 1.dck +++ b/res/quest/decks/Hercules 1.dck @@ -33,9 +33,13 @@ constructed 1 Heroes' Reunion 1 Pollenbright Wings 1 Reknit -4 Elfhame Palace +2 Elfhame Palace 6 Forest -4 Grasslands -4 Arctic Flats +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 index cc97c3f1639..1c5a05317ed 100644 --- a/res/quest/decks/Hercules 2.dck +++ b/res/quest/decks/Hercules 2.dck @@ -2,31 +2,40 @@ Hercules 2 [general] constructed [main] -3 Ancient Spider +2 Ancient Spider 3 Bant Sureblade -3 Centaur Safeguard +1 Centaur Safeguard 3 Kitchen Finks -3 Leonin Armorguard -3 Messenger Falcons +1 Leonin Armorguard +1 Messenger Falcons 3 Naya Hushblade 1 Armadillo Cloak 1 Aura Shards 1 Behemoth Sledge -1 Condemn +1 Enlisted Wurm 1 Crystallization -1 Hoofprints of the Stag -1 Naturalize -1 Oust -1 Path to Exile -1 Rampant Growth -1 Serra's Blessing +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 Sigil of the Nayan Gods -1 Sunlance -4 Elfhame Palace +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 index 0ac59166b71..2cc6e31e4e7 100644 --- a/res/quest/decks/Hercules 3.dck +++ b/res/quest/decks/Hercules 3.dck @@ -4,7 +4,7 @@ constructed [main] 4 Bant Sureblade 4 Naya Hushblade -1 Watchwolf +2 Watchwolf 4 Kitchen Finks 4 Wilt-Leaf Cavaliers 4 Wilt-Leaf Liege @@ -13,12 +13,12 @@ constructed 1 Tolsimir Wolfblood 2 Oversoul of Dusk 2 Shield of the Oversoul -2 Gaddock Teeg +1 Gaddock Teeg 1 Armadillo Cloak 1 Aura Shards 1 Behemoth Sledge 1 Crystallization -1 Captured Sunlight +1 Mycoid Shepherd 3 Path to Exile 1 Mox Emerald 1 Mox Pearl diff --git a/res/quest/decks/Joe Kidd 1.dck b/res/quest/decks/Joe Kidd 1.dck index 438c0fe714d..95a4d965126 100644 --- a/res/quest/decks/Joe Kidd 1.dck +++ b/res/quest/decks/Joe Kidd 1.dck @@ -2,40 +2,31 @@ Joe Kidd 1 [general] constructed [main] -1 Beckon Apparition -2 Mourning Thrull -1 Pillory of the Sleepless -1 Muck Rats -2 Nightsky Mimic -1 Adarkar Sentinel -1 Alaborn Musketeer 4 Arcane Sanctum -1 Harvest Gwyllion -1 Dakmor Ghoul -4 Godless Shrine -2 Voracious Hatchling -1 Shu Elite Infantry -1 Bargain -1 Agent of Masks -1 Ghost Warden -1 Castigate -2 Nip Gwyllion -1 Mana Tithe -1 Phobian Phantasm 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 -1 Bloodied Ghost -1 Needlebug +2 Bloodied Ghost 1 Righteous War -1 Spidersilk Net -1 Necrogen Spellbomb 1 Edge of the Divinity -1 Suffer the Past -1 Disentomb -1 Stand Firm -2 Gwyllion Hedge-Mage -1 Unmake +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 index dd098e7e57e..0b239fcf111 100644 --- a/res/quest/decks/Joe Kidd 2.dck +++ b/res/quest/decks/Joe Kidd 2.dck @@ -19,7 +19,7 @@ constructed 8 Swamp 2 Stillmoon Cavalier 8 Plains -1 Haunted Angel +1 Tidehollow Sculler 2 Culling Sun 2 Unmake 1 Restless Apparition diff --git a/res/quest/decks/King Arthur 1.dck b/res/quest/decks/King Arthur 1.dck index adc0ab3018d..61c1839b230 100644 --- a/res/quest/decks/King Arthur 1.dck +++ b/res/quest/decks/King Arthur 1.dck @@ -2,25 +2,37 @@ King Arthur 1 [general] constructed [main] -3 Disenchant -1 Armistice -4 Veteran Cavalier -2 Crusade -13 Plains -2 Neurok Hoversail -3 Leonin Skyhunter -4 Sunpetal Grove -3 Knight of the White Orchid -1 Enlightened Tutor -1 Forest -4 Steward of Valeron -1 Serra Angel -4 Knight Errant -1 Convalescence -3 Path to Exile -1 Knight of the Skyward Eye -4 Savannah -2 Bone Saw -2 Rancor -1 Wilt-Leaf Cavaliers +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 index 5bc291651aa..c4ac565e147 100644 --- a/res/quest/decks/King Arthur 2.dck +++ b/res/quest/decks/King Arthur 2.dck @@ -2,24 +2,32 @@ King Arthur 2 [general] constructed [main] -3 Disenchant -1 Armistice -4 Femeref Knight -13 Plains -2 Kitesail -4 Sunpetal Grove -4 Knight of the White Orchid -3 Longbow Archer -1 Enlightened Tutor -1 Forest -1 Kinsbaile Cavalier +1 Lionheart Maverick +1 Student of Warfare +1 Adventuring Gear +1 Trusty Machete +2 Safewright Quest 4 Steward of Valeron -2 Serra Angel -1 Convalescence -2 Vulshok Morningstar -3 Path to Exile -4 Savannah -1 Wilt-Leaf Cavaliers -4 Benalish Cavalry -2 Honor of the Pure +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 index da26e8a6bc6..3ef04d70147 100644 --- a/res/quest/decks/King Arthur 3.dck +++ b/res/quest/decks/King Arthur 3.dck @@ -2,24 +2,30 @@ King Arthur 3 [general] constructed [main] -10 Plains -4 Savannah -4 Sunpetal Grove -4 Windswept Heath +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 Wilt-Leaf Cavaliers -4 Wilt-Leaf Liege -4 Knight of Meadowgrain -4 Steward of Valeron -1 Juniper Order Ranger -1 Knight of the Reliquary -1 Sir Shandlar of Eberyn -2 Kinsbaile Cavalier -4 Knight Exemplar -1 Benalish Cavalry -1 Kitesail -3 Honor of the Pure -3 Disenchant -3 Swords to Plowshares +4 Savannah +6 Forest +6 Plains +2 Elfhame Palace +4 Graypelt Refuge [sideboard] diff --git a/res/quest/decks/King Kong 1.dck b/res/quest/decks/King Kong 1.dck index f040714d8c0..9ecb2ee99b9 100644 --- a/res/quest/decks/King Kong 1.dck +++ b/res/quest/decks/King Kong 1.dck @@ -2,30 +2,34 @@ King Kong 1 [general] constructed [main] -1 Changeling Hero -1 Pacifism -1 Feebleness -3 Avian Changeling -3 Acorn Harvest -4 Scrubland +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 -4 Bayou -4 Savannah -4 Plains 1 Cessation 1 Darksteel Ingot 1 Despondency 1 Greel's Caress -2 Adventuring Gear +2 Druid's Call 3 Kodama's Reach -4 Forest -2 Moonglove Changeling -3 Chatter of the Squirrel 1 Bound in Silence -3 Deranged Hermit -2 Ghostly Changeling 1 Clinging Darkness -4 Mountain +1 Pacifism +1 Feebleness [sideboard] diff --git a/res/quest/decks/King Kong 2.dck b/res/quest/decks/King Kong 2.dck index 1455710d4b1..890ce0582fb 100644 --- a/res/quest/decks/King Kong 2.dck +++ b/res/quest/decks/King Kong 2.dck @@ -2,27 +2,28 @@ King Kong 2 [general] constructed [main] -1 Changeling Hero -4 Plains -1 Feebleness -1 Darksteel Ingot -1 Despondency -1 Greel's Caress -3 Avian Changeling -3 Adventuring Gear -4 Acorn Harvest -4 Forest -4 Scrubland -4 Kodama's Reach -4 Squirrel Nest -1 Skeletal Changeling -1 Moonglove Changeling -1 Enfeeblement -4 Chatter of the Squirrel +8 Forest +2 Plains +2 Swamp 4 Bayou -4 Deranged Hermit -1 Ghostly Changeling -1 Clinging Darkness 4 Savannah -4 Mountain +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/Kojak 2.dck b/res/quest/decks/Kojak 2.dck index 153a5d5d52c..b5dcbb348f7 100644 --- a/res/quest/decks/Kojak 2.dck +++ b/res/quest/decks/Kojak 2.dck @@ -20,7 +20,7 @@ constructed 2 Concentrate 1 Kami of the Crescent Moon 1 Thalakos Seer -1 Dandan +1 Dandân 1 Manta Ray 1 Serpent of the Endless Sea 1 Amnesia diff --git a/res/quest/decks/Magnum 1.dck b/res/quest/decks/Magnum 1.dck index c40bc81c2cc..6205bd327c8 100644 --- a/res/quest/decks/Magnum 1.dck +++ b/res/quest/decks/Magnum 1.dck @@ -2,39 +2,35 @@ Magnum 1 [general] constructed [main] -4 Seaside Citadel +3 Seaside Citadel 8 Island -1 Argothian Pixies -1 Sentinels of Glen Elendra +7 Forest +2 Breeding Pool +2 Yavimaya Coast +1 Novijen, Heart of Progress +2 Skyshroud Forest 2 Temporal Spring -1 Fangren Hunter -4 Breeding Pool -1 Council of Advisors 1 Cold-Eyed Selkie 2 Shielding Plax 2 Gaea's Skyfolk 1 Gilder Bairn -1 Silver Myr -1 Wyluli Wolf 3 Trapjaw Kelpie -1 Wildsize -1 Explore -1 Horned Troll -1 Slippery Bogle -1 Convolute +2 Slippery Bogle 1 Voidslime -5 Forest -1 Greater Mossdog -1 Dryad Arbor -1 Glintwing Invoker 2 Wistful Selkie -1 Vision Skeins -1 Coral Eel 2 Sturdy Hatchling 2 Shorecrasher Mimic 1 Fable of Wolf and Owl 1 Murkfiend Liege 1 Lorescale Coatl 1 Favor of the Overbeing -1 Coiling Oracle +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 index 30fb6b959fa..30e5751b25a 100644 --- a/res/quest/decks/Magnum 2.dck +++ b/res/quest/decks/Magnum 2.dck @@ -4,22 +4,22 @@ constructed [main] 4 Tropical Island 8 Island -1 Sentinels of Glen Elendra +2 Yavimaya Coast +5 Forest 2 Temporal Spring 2 Breeding Pool 2 Cold-Eyed Selkie -1 Assault Zeppelid +2 Assault Zeppelid 1 Shielding Plax 2 Gaea's Skyfolk 1 Yavimaya's Embrace 2 Trapjaw Kelpie -1 Horned Troll -2 Slippery Bogle -5 Forest -1 Convolute -3 Dryad Arbor +1 Jungle Barrier +1 Slippery Bogle +1 Selkie Hedge-Mage +1 Dryad Arbor 2 Wistful Selkie -1 Vision Skeins +1 Trygon Predator 3 Sturdy Hatchling 1 Leafdrake Roost 3 Shorecrasher Mimic @@ -30,5 +30,5 @@ constructed 2 Lorescale Coatl 1 Voidslime 3 Murkfiend Liege -1 Coiling Oracle +2 Coiling Oracle [sideboard] diff --git a/res/quest/decks/Radiant 3.dck b/res/quest/decks/Radiant 3.dck index 80387baea52..04f93bbb187 100644 --- a/res/quest/decks/Radiant 3.dck +++ b/res/quest/decks/Radiant 3.dck @@ -11,17 +11,17 @@ constructed 1 Mox Sapphire 1 Mox Pearl 2 Radiant, Archangel -3 Soulcatcher +2 Soulcatcher 3 Archon of Redemption +3 Pride of the Clouds 1 Angelic Curator 1 Araba Mothrider 1 Aven Riftwatcher -2 Azorius First-Wing +1 Azorius First-Wing 1 Serra Avenger 1 Cloud Elemental 1 Cloud of Faeries 1 Cloud Spirit -1 Coast Watcher 1 Commander Eesha 1 Courier Hawk 1 Divinity of Pride diff --git a/res/quest/decks/Rocky 1.dck b/res/quest/decks/Rocky 1.dck index de1411a754f..30babbc20d1 100644 --- a/res/quest/decks/Rocky 1.dck +++ b/res/quest/decks/Rocky 1.dck @@ -2,33 +2,36 @@ Rocky 1 [general] constructed [main] -1 Goblin Cavaliers 4 Jungle Shrine 2 Beasts of Bogardan 1 Air Elemental 3 Plains 2 Darksteel Ingot -1 Flamebreak -1 Tremor 3 Island -2 Threaten +1 Threaten 2 Oraxid 3 Repentant Blacksmith 2 Galina's Knight 2 Disciple of Law 2 Talon Trooper -2 Shield Wall -3 Guided Strike -1 Venerable Monk +1 Shield Wall +1 Guided Strike 3 Freewind Falcon 4 Coastal Tower 4 Crumbling Necropolis 1 Vulshok Refugee -1 Pyroclasm 4 Mountain -1 Volcanic Fallout -1 Earthquake 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 index 12e1c0cbda6..2b284908be1 100644 --- a/res/quest/decks/Rocky 2.dck +++ b/res/quest/decks/Rocky 2.dck @@ -2,31 +2,50 @@ Rocky 2 [general] constructed [main] -1 Goblin Cavaliers -4 Plateau -2 Obsidian Giant -1 Serra Sphinx -3 Plains -2 Seashell Cameo -2 Narwhal -2 Flamebreak -2 Tremor -3 Island -4 Echoing Truth -1 Giant Octopus -1 Kabuto Moth -2 Galina's Knight -2 Disciple of Law -2 Talon Trooper -2 Spark Elemental -1 Shu Elite Infantry -4 Tundra -4 Volcanic Island -2 Pyroclasm -2 Teroh's Faithful -4 Mountain -1 Earthquake -2 Rolling Earthquake -2 Vedalken Outlander -2 Hazerider Drake +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 index e18a79939a0..9d11016d73b 100644 --- a/res/quest/decks/Rocky 3.dck +++ b/res/quest/decks/Rocky 3.dck @@ -3,34 +3,33 @@ Rocky 3 constructed [main] 4 Plateau -3 Shu Soldier-Farmers -2 Narwhal -2 Flamebreak -2 Island -1 Ancestral Recall -2 Galina's Knight -1 Mox Pearl -4 Tundra -2 Fomori Nomad -3 Pyroclasm -1 Serra Sphinx -1 Mox Sapphire -3 Plains -2 Concentrate -3 Tremor -2 Disciple of Law -2 Talon Trooper -2 Silver Knight -1 Mox Ruby +1 Tundra 4 Volcanic Island +4 Arid Mesa +4 Scalding Tarn 3 Mountain -2 Vedalken Outlander -2 Hazerider Drake +1 Mox Pearl +1 Mox Ruby +1 Mox Sapphire +1 Ancestral Recall 1 Time Walk -1 Auriok Champion -1 Kor Firewalker -1 Soltari Priest -1 Hammerfist Giant -2 Earthquake -4 Rolling Earthquake +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/Samantha Stephens 1.dck b/res/quest/decks/Samantha Stephens 1.dck index ac4dd98507f..cf0633e569d 100644 --- a/res/quest/decks/Samantha Stephens 1.dck +++ b/res/quest/decks/Samantha Stephens 1.dck @@ -4,9 +4,9 @@ constructed [main] 5 Plains 5 Island -4 Tundra +4 Cloudcrest Lake 4 Coastal Tower -4 Sejiri Refuge +4 Boreal Shelf 4 Painter's Servant 4 Enlightened Tutor 3 Fabricate @@ -14,7 +14,6 @@ constructed 2 Flashfreeze 1 Galina's Knight 1 Vedalken Outlander -1 Auriok Champion 1 Kor Firewalker 1 Defender of Law 1 Disciple of Law @@ -33,4 +32,5 @@ constructed 1 Celestial Purge 1 Red Ward 1 Aven Smokeweaver +1 Iron Star [sideboard] diff --git a/res/quest/decks/Sauron 2.dck b/res/quest/decks/Sauron 2.dck index c1695b120aa..9ace03db91b 100644 --- a/res/quest/decks/Sauron 2.dck +++ b/res/quest/decks/Sauron 2.dck @@ -9,7 +9,7 @@ constructed 2 Reliquary Tower 3 Swamp 1 Mikokoro, Center of the Sea -4 Black Vise +3 Black Vise 1 Timetwister 1 Kami of the Crescent Moon 4 Underworld Dreams @@ -23,12 +23,15 @@ constructed 1 Font of Mythos 1 Seizan, Perverter of Truth 1 Time Reversal -4 Propaganda +2 Propaganda 1 Frozen AEther 1 Ivory Tower 2 Deny Reality 2 Boomerang -1 Sinkhole 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/Scotty 2.dck b/res/quest/decks/Scotty 2.dck index 7f7a6ea6c57..43aa828dfcf 100644 --- a/res/quest/decks/Scotty 2.dck +++ b/res/quest/decks/Scotty 2.dck @@ -2,28 +2,40 @@ Scotty 2 [general] constructed [main] -3 Penumbra Spider -3 Eternal Witness -2 Swamp -2 Plains -3 Penumbra Wurm -2 Nevinyrral's Disk -3 Penumbra Bobcat -3 Caller of the Claw -2 Castle -3 Darksteel Ingot -2 Harmonize -1 Enlightened Tutor -3 Penumbra Kavu -2 Guiltfeeder -2 Forest -4 Scrubland -4 Bayou -1 Marble Diamond -1 Charcoal Diamond -3 Gravedigger -4 Life Burst -2 Pestilence -4 Savannah -1 Moss Diamond +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/Sherlock Holmes 1.dck b/res/quest/decks/Sherlock Holmes 1.dck index 9a53ae330bd..a7e16f48479 100644 --- a/res/quest/decks/Sherlock Holmes 1.dck +++ b/res/quest/decks/Sherlock Holmes 1.dck @@ -3,29 +3,37 @@ Sherlock Holmes 1 constructed [main] 22 Forest -3 Three Visits -3 An-Havva Inn +1 Sapseep Forest +1 An-Havva Constable +1 An-Havva Inn +1 Aspect of Wolf 3 Baru, Fist of Krosa -1 Niall Silvain +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 -3 Nettle Sentinel +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 Craw Giant -1 Feral Thallid -1 Groundbreaker -1 Jedit Ojanen of Efrava 1 Rushwood Elemental -2 Juvenile Gloomwidow -2 People of the Woods -1 Whirling Dervish -1 Fruition -1 Primal Bellow +1 Three Visits 1 Timbermaw Larva -1 Nourish -1 Multani's Acolyte -1 Elvish Warrior +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 index 4f138bd5d85..b4845c36604 100644 --- a/res/quest/decks/Sherlock Holmes 2.dck +++ b/res/quest/decks/Sherlock Holmes 2.dck @@ -4,7 +4,7 @@ constructed [main] 22 Forest 1 Emerald Medallion -2 Three Visits +1 Three Visits 1 An-Havva Inn 4 Baru, Fist of Krosa 1 Crabapple Cohort @@ -13,22 +13,29 @@ constructed 1 Kaysa 1 Khalni Hydra 1 Meng Huo, Barbarian King -3 Nettle Sentinel +1 Nettle Sentinel +1 Hunting Cheetah 1 Reach of Branches 1 Roughshod Mentor 1 Craw Giant 1 Force of Nature -1 Groundbreaker +1 Blanchwood Armor 1 Jedit Ojanen of Efrava 1 Kodama of the North Tree -3 Leatherback Baloth +1 Leatherback Baloth 1 Rushwood Elemental -1 Weatherseed Treefolk -2 Garruk's Companion +1 Garruk's Companion 1 Juvenile Gloomwidow -2 People of the Woods -1 Whirling Dervish +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 index 4f5f68d311b..0ee79f078c2 100644 --- a/res/quest/decks/Sherlock Holmes 3.dck +++ b/res/quest/decks/Sherlock Holmes 3.dck @@ -14,7 +14,7 @@ constructed 3 Khalni Hydra 1 Meng Huo, Barbarian King 1 Natural Order -4 Nettle Sentinel +3 Nettle Sentinel 1 Reach of Branches 1 Roughshod Mentor 1 Jugan, the Rising Star @@ -25,5 +25,6 @@ constructed 1 Terra Stomper 1 Weatherseed Treefolk 4 Garruk's Companion -1 Fruition +1 Bellowing Tanglewurm +1 Primalcrux [sideboard] diff --git a/res/quest/decks/Wilma Flintstone 1.dck b/res/quest/decks/Wilma Flintstone 1.dck index 7716308b115..b09caf8b456 100644 --- a/res/quest/decks/Wilma Flintstone 1.dck +++ b/res/quest/decks/Wilma Flintstone 1.dck @@ -2,33 +2,33 @@ Wilma Flintstone 1 [general] constructed [main] -1 Norwood Archers -1 Moaning Spirit -4 Overgrown Tomb -1 Tranquility -2 Rendclaw Trow -1 Kavu Climber -1 Maelstrom Pulse +7 Forest +7 Swamp +3 Gilt-Leaf Palace +2 Llanowar Wastes +2 Pine Barrens 4 Savage Lands -1 Tel-Jilad Exile -1 Bog Imp -2 Odious Trow -1 Creakwood Ghoul -3 Llanowar Dead -8 Swamp -3 Stalker Hag -1 Wielding the Green Dragon +1 Dark Heart of the Wood +1 Death Mutation +1 Drain the Well 1 Ebony Treefolk -1 Seal of Primordium -1 Tranquil Path -8 Forest -1 Elvish Archers -1 Putrefy -1 Dakmor Scorpion -1 Swallowing Plague -3 Noxious Hatchling -1 Hag Hedge-Mage -3 Woodlurker Mimic -2 Drain the Well +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 index ca9a8c4a1b7..d35570ae0f8 100644 --- a/res/quest/decks/Wilma Flintstone 2.dck +++ b/res/quest/decks/Wilma Flintstone 2.dck @@ -2,8 +2,8 @@ Wilma Flintstone 2 [general] constructed [main] -3 Putrid Leech -2 Overgrown Tomb +1 Putrid Leech +2 Gilt-Leaf Palace 3 Rendclaw Trow 3 Maelstrom Pulse 4 Bayou @@ -15,9 +15,10 @@ constructed 1 Grave-Shell Scarab 8 Forest 3 Putrefy -1 Swallowing Plague +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 index e54e9b7b2ab..56de2e0cbbc 100644 --- a/res/quest/decks/Wilma Flintstone 3.dck +++ b/res/quest/decks/Wilma Flintstone 3.dck @@ -6,7 +6,6 @@ constructed 1 Lord of Extinction 1 Mox Emerald 7 Swamp -2 Putrid Leech 1 Stalker Hag 2 Overgrown Tomb 2 Ebony Treefolk @@ -24,4 +23,6 @@ constructed 2 Drain the Well 3 Spiritmonger 4 Creakwood Liege +1 Deity of Scars +1 Glissa, the Traitor [sideboard] diff --git a/res/quest/decks/Wyatt Earp 1.dck b/res/quest/decks/Wyatt Earp 1.dck index 045a0ab1bed..f0316eaae1d 100644 --- a/res/quest/decks/Wyatt Earp 1.dck +++ b/res/quest/decks/Wyatt Earp 1.dck @@ -3,29 +3,34 @@ Wyatt Earp 1 constructed [main] 22 Plains +1 Angel's Feather +1 Angelic Voices +1 Apothecary Initiate +1 Auspicious Ancestor 3 Ballynock Cohort -3 Ballynock Trapper -3 Blinding Light -1 Crovax, Ascendant Hero +1 Ballynock Trapper +1 Battle Screech +1 Blinding Light +1 Favorable Destiny +1 Ivory Giant 3 Kithkin Rabble -2 Knight of the White Orchid -3 Springjack Shepherd -1 Sunlance -2 Abbey Gargoyles -1 Unmake -1 Saltblast -1 Alaborn Grenadier +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 Crusade -2 Valorous Charge -2 Landbind Ritual -1 Devout Lightcaster 1 White Knight -1 Whipcorder 1 Silver Knight -1 Righteous Avengers +1 Abbey Gargoyles [sideboard] diff --git a/res/quest/decks/Wyatt Earp 2.dck b/res/quest/decks/Wyatt Earp 2.dck index 21aaaed6cd3..864bd9e8299 100644 --- a/res/quest/decks/Wyatt Earp 2.dck +++ b/res/quest/decks/Wyatt Earp 2.dck @@ -5,13 +5,18 @@ constructed 22 Plains 1 Pearl Medallion 3 Ballynock Cohort -2 Ballynock Trapper -2 Blinding Light +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 -2 Knight of the White Orchid +1 Knight of the White Orchid 1 Mass Calcify -3 Springjack Shepherd +1 Springjack Shepherd 1 Sunlance 1 Abbey Gargoyles 1 Unmake @@ -24,11 +29,11 @@ constructed 1 Longbow Archer 1 Serra Avenger 1 Soltari Monk -3 Crusade 1 Valorous Charge 1 Landbind Ritual 1 Devout Lightcaster +1 Opal Guardian 1 White Knight -1 Whipcorder 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 index 701128d5db6..9734ea6ea5e 100644 --- a/res/quest/decks/Wyatt Earp 3.dck +++ b/res/quest/decks/Wyatt Earp 3.dck @@ -5,13 +5,12 @@ constructed 21 Plains 1 Karakas 1 Mox Pearl -1 Pearl Medallion 4 Honor of the Pure -1 Blinding Light +1 Celestial Crusader 1 Crovax, Ascendant Hero 2 Knight of the White Orchid 2 Mass Calcify -2 Springjack Shepherd +1 Springjack Shepherd 1 Dawn Elemental 2 Unmake 2 Swords to Plowshares @@ -26,4 +25,6 @@ constructed 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 index c4440f7bd9b..3bd1e8985c3 100644 --- a/res/quest/decks/quest1.dck +++ b/res/quest/decks/quest1.dck @@ -2,17 +2,41 @@ quest1 [general] constructed [main] -2 Elspeth, Knight-Errant -19 Plains -4 Field Marshal -2 Raise the Alarm -4 Preeminent Captain -4 Mobilization -4 Swords to Plowshares -4 Captain of the Watch -1 Mox Pearl -4 Path to Exile -4 Veteran Swordsmith -4 Honor of the Pure -4 Veteran Armorsmith +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/quest2.dck b/res/quest/decks/quest2.dck index 17bc0bb3b75..841139a6b30 100644 --- a/res/quest/decks/quest2.dck +++ b/res/quest/decks/quest2.dck @@ -2,19 +2,28 @@ quest2 [general] constructed [main] -2 Keiga, the Tide Star -1 Mox Sapphire -4 Concentrate -4 Sower of Temptation -2 Arcanis the Omnipotent -4 Control Magic -17 Island -1 Ancestral Recall -4 Echoing Truth -4 Boomerang -4 Sky Diamond -4 Repulse -3 Bribery -2 Memnarch -4 Man-o'-War +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/quest6.dck b/res/quest/decks/quest6.dck index b0add7e03bb..d1ad5300b39 100644 --- a/res/quest/decks/quest6.dck +++ b/res/quest/decks/quest6.dck @@ -2,33 +2,75 @@ quest6 [general] constructed [main] -3 Underground Sea -1 Vampiric Tutor -1 Mox Emerald -4 Master of Etherium -3 Ancient Den -1 Windwright Mage -3 Seat of the Synod -2 Enlightened Tutor -3 Coiled Tinviper -3 Scrubland -3 Ornithopter -1 Flying Carpet -1 Mox Pearl -3 Tundra -1 Demonic Tutor -3 Vault of Whispers -1 Mox Jet -2 War Chariot -3 Dancing Scimitar -3 Tower Gargoyle -1 Mox Sapphire -3 Darklit Gargoyle -1 Vectis Agents -1 Mox Ruby -1 Hanna, Ship's Navigator -3 Vedalken Archmage -2 Arachnoid -1 Iron Lance -2 Esper Cormorants +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/easy.txt b/res/quest/easy.txt index b2d477af753..a841ca4620e 100644 --- a/res/quest/easy.txt +++ b/res/quest/easy.txt @@ -1,13 +1,17 @@ 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 @@ -17,6 +21,7 @@ Galahad 1 Genghis Khan 1 George of the Jungle 1 Grampa Simpson 1 +Green Arrow 1 Harry Potter 1 Hercules 1 Homer Simpson 1 @@ -24,14 +29,17 @@ 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 diff --git a/res/quest/hard.txt b/res/quest/hard.txt index 8638fc95b43..2365ecb8625 100644 --- a/res/quest/hard.txt +++ b/res/quest/hard.txt @@ -1,5 +1,6 @@ Abraham Lincoln 3 Albert Einstein 3 +Alice in Wonderland 3 Aquaman 3 Atomic Robo 3 Barney Rubble 3 @@ -11,6 +12,7 @@ Blackbeard 3 Boba Fett 3 Boris Karloff 3 Boromir 3 +Bridge Troll 3 Buffy 3 C3PO 3 Captain America 3 @@ -44,6 +46,7 @@ George of the Jungle 3 Gimli 3 Gold Finger 3 Grampa Simpson 3 +Green Arrow 3 Green Lantern 3 Han Solo 3 Hans 3 @@ -65,11 +68,12 @@ King Arthur 3 King Edward 3 King Kong 3 Kojak 3 -Lisa Simpson 3 +Krypto 3 Luke Skywalker 3 Maggie Simpson 3 Magneto 3 Magnum 3 +Mister Fantastic 3 Morpheus 3 Mr Slate 3 Napoleon 3 @@ -85,13 +89,15 @@ 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 -Scooby Doo 3 Saruman 3 +Scooby Doo 3 +Scotty 3 Seabiscuit 3 Secret Squirrel 3 Sherlock Holmes 3 diff --git a/res/quest/medium.txt b/res/quest/medium.txt index 82c3cc734ac..b556f9ebc20 100644 --- a/res/quest/medium.txt +++ b/res/quest/medium.txt @@ -1,4 +1,6 @@ Albert Einstein 2 +Alice in Wonderland 2 +Apu Nahasapeemapetilon 2 Aquaman 2 Aragorn 2 Barney Rubble 2 @@ -8,7 +10,7 @@ Buffy 2 C3PO 2 Captain America 2 Catwoman 2 -Cave Troll 2 +Conan the Barbarian 2 Crocodile Dundee 2 Cyclops 2 Da Vinci 2 @@ -16,6 +18,7 @@ Darrin Stephens 2 Deadpool 2 Dino 2 Doc Holiday 2 +Dogbert 2 Electro 2 Elrond 2 Endora 2 @@ -25,6 +28,7 @@ Fin Fang Foom 2 Frodo 2 Galadriel 2 Galahad 2 +Gambit 2 Genghis Khan 2 George of the Jungle 2 Gimli 2 @@ -43,17 +47,22 @@ 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 @@ -68,6 +77,7 @@ Spock 2 Storm 2 Sun Quan 2 Tarzan 2 +The Thing 2 Totoro 2 Treebeard 2 Walle 2 diff --git a/res/quest/price.txt b/res/quest/price.txt index 3decfa1103d..e0423a9a4d4 100644 --- a/res/quest/price.txt +++ b/res/quest/price.txt @@ -527,7 +527,7 @@ Dakmor Scorpion =10 Damnation =200 Dance of Shadows =50 Dancing Scimitar =50 -Dandan =10 +Dandân =10 Dark Banishing =10 Dark Confidant =200 Dark Depths =200 diff --git a/res/quest/quests.txt b/res/quest/quests.txt index 473ab38a071..f18666d83e3 100644 --- a/res/quest/quests.txt +++ b/res/quest/quests.txt @@ -1,19 +1,19 @@ 1 Dungeon Crawling (White) -Guarded by white creatures +This realm is guarded by a divine entity laying his protecting hand on each living being. Medium Repeatable -25 +20 Three white rares 100 Dungeon Crawling White.jpg 2 Dungeon Crawling (Blue) -Guarded by blue creatures. +This realm holds knowledge so vast it can overburden the unwary. Medium Repeatable -25 +20 Three blue rares 100 Dungeon Crawling Blue.jpg @@ -23,7 +23,7 @@ Dungeon Crawling (Black) Guarded by black creatures. Medium Repeatable -25 +20 Three black rares 100 Dungeon Crawling Black.jpg @@ -33,7 +33,7 @@ Dungeon Crawling (Red) Guarded by red creatures. Medium Repeatable -25 +20 Three red rares 100 Dungeon Crawling Red.jpg @@ -43,17 +43,17 @@ Dungeon Crawling (Green) Guarded by green creatures. Medium Repeatable -25 +20 Three green rares 100 Dungeon Crawling Green.jpg 6 Dungeon Crawling (Colorless) -Guarded by artifact creatures. +The inhabitants of this plane tread with a light step. Hard Repeatable -35 +28 Three colorless rares 150 Dungeon Crawling Colorless.jpg @@ -63,7 +63,7 @@ Dungeon Crawling (Gold) Guarded by gold creatures. Hard Repeatable -35 +28 Three multi-colored rares 150 Dungeon Crawling Gold.jpg @@ -73,7 +73,7 @@ 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 -35 +28 Three random rares 200 A Wolf in Sheeps Clothing.jpg @@ -83,7 +83,7 @@ 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 -50 +40 Four green rares 225 Bushwhacked.jpg @@ -93,7 +93,7 @@ Zombie Attack! The village of Haven is getting attacked by the Zombie horde! Protect the village. Hard Not Repeatable -50 +40 Four black rares 200 Zombie Attack.jpg @@ -103,7 +103,7 @@ 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 -50 +40 Three random rares 150 The Kings Contest.jpg @@ -113,7 +113,7 @@ Barroom Brawl A drunken giant of a man takes a swing at you, your brew spills and a fight breaks out. Hard Not Repeatable -80 +64 Four random rares 250 Barroom Brawl.jpg @@ -123,7 +123,7 @@ The Court Jester The Court Jester pulls a prank on you. Will you laugh it off or pay him back? Hard Not Repeatable -65 +52 Four multi-colored rares 300 The Court Jester.jpg @@ -133,7 +133,7 @@ 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 -80 +64 Four random rares 250 Ancient Battlefield.jpg @@ -143,7 +143,7 @@ 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 -65 +52 Four red rares 200 Dont Play With Matches.jpg @@ -153,7 +153,7 @@ 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 -65 +52 Four green rares 250 Mines of Kazum Durl.jpg @@ -163,7 +163,7 @@ 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 -80 +64 Four colorless rares 250 House Party.jpg @@ -173,7 +173,7 @@ 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 -80 +64 Five random rares 300 Crows in the Field.jpg @@ -183,7 +183,7 @@ 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 -100 +80 Five random rares 300 The Desert Caravan.jpg @@ -193,7 +193,7 @@ 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 -100 +80 Five colorless rares 300 Blood Oath.jpg @@ -203,7 +203,7 @@ 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 -120 +96 Six random rares 500 Private Domain.jpg @@ -213,7 +213,7 @@ 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 -40 +32 three random rares 150 The Pied Piper.jpg diff --git a/res/quest/veryhard.txt b/res/quest/veryhard.txt index 17c70eb1982..1e723a65916 100644 --- a/res/quest/veryhard.txt +++ b/res/quest/veryhard.txt @@ -1,7 +1,9 @@ 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 index 18fe473fee8..e0e291e73c7 100755 --- a/res/reprintSetInfo.py +++ b/res/reprintSetInfo.py @@ -2,7 +2,10 @@ # 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 -# MAKE SURE THE setAbbr VARIABLE IS UPDATED TO THE SET YOU WANT TO CLEAR OUT +# 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 @@ -64,11 +67,12 @@ nameList = [] getCardsInSet() for fileName in nameList: - # if file doesn't exist continue - filePath = os.path.join(folder, fileName) + # Join new folder convention cardsfolder// + filePath = os.path.join(folder, fileName[0].lower(), fileName) print filePath - if os.path.isfile(filePath) == False: + # if file doesn't exist continue + if not os.path.isfile(filePath): continue file = open(filePath) @@ -101,7 +105,7 @@ for fileName in nameList: line = file.readline().strip() - file = open(os.path.join(folder, fileName), 'w') + file = open(filePath, 'w') file.write(card.lines) file.write('End') diff --git a/res/setInfoScript.py b/res/setInfoScript.py index 399a6a19c7b..bab923fd783 100755 --- a/res/setInfoScript.py +++ b/res/setInfoScript.py @@ -6,192 +6,195 @@ from httplib import HTTP from urlparse import urlparse from urllib import urlopen -import os +import os,fnmatch def getURL(url): - return urlopen(url).read() + return urlopen(url).read() class SetInfo: - def __init__(self, set, rarity, image): - self.set = set - self.rarity = rarity - self.image = image + 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 __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' + # 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' - # Portal - allSets['Portal'] = 'POR' - allSets['Portal Second Age'] = 'PO2' - allSets['Portal Three Kingdoms'] = 'PTK' + # Starter + allSets['Starter 1999'] = 'S99' + allSets['Starter 2000'] = 'S00' - # 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' - # 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' - # Ice Age - allSets['Ice Age'] = 'ICE' - allSets['Alliances'] = 'ALL' - allSets['Coldsnap'] = 'CSP' + # Mirage + allSets['Mirage'] = 'MIR' + allSets['Visions'] = 'VIS' + allSets['Weatherlight'] = 'WTH' - # Mirage - allSets['Mirage'] = 'MIR' - allSets['Visions'] = 'VIS' - allSets['Weatherlight'] = 'WTH' + # Rath Cycle + allSets['Tempest'] = 'TMP' + allSets['Stronghold'] = 'STH' + allSets['Exodus'] = 'EXO' - # 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' - # 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' - # Masques - allSets['Mercadian Masques'] = 'MMQ' - allSets['Nemesis'] = 'NMS' - allSets['Prophecy'] = 'PCY' + # Invasion + allSets['Invasion'] = 'INV' + allSets['Planeshift'] = 'PLS' + allSets['Apocalypse'] = 'APC' - # Invasion - allSets['Invasion'] = 'INV' - allSets['Planeshift'] = 'PLS' - allSets['Apocalypse'] = 'APC' + # Odyssey + allSets['Odyssey'] = 'ODY' + allSets['Torment'] = 'TOR' + allSets['Judgment'] = 'JUD' - # Odyssey - allSets['Odyssey'] = 'ODY' - allSets['Torment'] = 'TOR' - allSets['Judgment'] = 'JUD' + # Onslaught + allSets['Onslaught'] = 'ONS' + allSets['Legions'] = 'LGN' + allSets['Scourge'] = 'SCG' - # Onslaught - allSets['Onslaught'] = 'ONS' - allSets['Legions'] = 'LGN' - allSets['Scourge'] = 'SCG' + # Mirrodin + allSets['Mirrodin'] = 'MRD' + allSets['Darksteel'] = 'DST' + allSets['Fifth Dawn'] = '5DN' - # 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' - # 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' - # 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' - # 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' - # Lorwyn - allSets['Lorwyn'] = 'LRW' - allSets['Morningtide'] = 'MOR' + # Shadowmoor + allSets['Shadowmoor'] = 'SHM' + allSets['Eventide'] = 'EVE' - # Shadowmoor - allSets['Shadowmoor'] = 'SHM' - allSets['Eventide'] = 'EVE' + # Alara + allSets['Shards of Alara'] = 'ALA' + allSets['Conflux'] = 'CFX' + allSets['Alara Reborn'] = 'ARB' - # 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' - # 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' + # 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] + 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 + print card.name - for edition in allSets.keys(): - edIndex = block.find('>'+edition+'<') # Portal/Mirrodin issue + 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 + 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 + # 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 + # 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 + # 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', '') + 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] + 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] + # data = scans/en/[set]/[num] + splitData = data.split('/') + setAbbr = splitData[2] + setNum = splitData[3] - image = 'http://magiccards.info/scans/en/' + setAbbr + '/' + setNum + '.jpg' + image = 'http://magiccards.info/scans/en/' + setAbbr + '/' + setNum + '.jpg' - card.sets[allSets[edition]] = SetInfo(allSets[edition], rarity, image) + card.sets[allSets[edition]] = SetInfo(allSets[edition], rarity, image) - return + return #get master card list and drop into a dictionary @@ -202,58 +205,60 @@ initSets() cardDict = {} setStr = 'SetInfo:' -for fileName in os.listdir(folder): - if fileName.startswith('.'): - continue +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(folder + os.sep + fileName) - cleanName = fileName.replace('.txt', '') + # 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:','') + 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' + 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() + # 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 + while line != 'End': + # Skip empty lines + if line == '': + line = file.readline().strip() + continue - # We really shouldn't - if line == 'End': - break + # We really shouldn't + if line == 'End': + break - if line.find(setStr) != -1: - info = line.replace('SetInfo:','') - parts = info.split('|') + 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' + card.hasSet = True + card.sets[parts[0]] = SetInfo(parts[0], parts[1], parts[2]) + else: + card.lines += line +'\n' - line = file.readline().strip() + line = file.readline().strip() - if not card.hasSet: - addSets(card) - card.hasSet = True + if not card.hasSet: + addSets(card) + card.hasSet = True - file = open(folder + os.sep + 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') - file.close() - err.write(card.name + '... Updated\n') + 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/src/arcane/ui/CardArea.java b/src/arcane/ui/CardArea.java index 3f87db75bc6..d89a9ca65ed 100644 --- a/src/arcane/ui/CardArea.java +++ b/src/arcane/ui/CardArea.java @@ -1,269 +1,332 @@ - package arcane.ui; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.event.MouseEvent; - -import javax.swing.JFrame; -import javax.swing.JLayeredPane; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - import arcane.ui.util.Animation; import arcane.ui.util.CardPanelMouseListener; -public class CardArea extends CardPanelContainer implements CardPanelMouseListener { - private static final long serialVersionUID = -5836122075999621592L; - static public final int GUTTER_Y = 5; - static public final int GUTTER_X = 5; - static private final float HORIZ_CARD_SPACING_X = 0.04f; - static private final float HORIZ_CARD_SPACING_Y = 0.06f; - static private final float VERT_CARD_SPACING_X = 0.06f; - static private final float VERT_CARD_SPACING_Y = 0.10f; +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseEvent; - private float maxCoverage = 0.5f; - private int maxRows = 0; +/** + *

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; - // Computed in layout. - private float cardSpacingX; - private int actualCardsPerRow; - private int mouseDragStartX; - private int mouseDragStartY; - private boolean isVertical; - private boolean hasScrollbars; + private float maxCoverage = 0.5f; + private int maxRows = 0; - public CardArea (JScrollPane scrollPane) { - super(scrollPane); - setBackground(Color.white); - } + // Computed in layout. + private float cardSpacingX; + private int actualCardsPerRow; + private int mouseDragStartX; + private int mouseDragStartY; + private boolean isVertical; + private boolean hasScrollbars; - 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; - } + /** + *

Constructor for CardArea.

+ * + * @param scrollPane a {@link javax.swing.JScrollPane} object. + */ + public CardArea(JScrollPane scrollPane) { + super(scrollPane); + setBackground(Color.white); + } - public void layout () { - if (cardPanels.isEmpty()) return; + /** {@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; + } - Rectangle rect = scrollPane.getVisibleRect(); - Insets insets = scrollPane.getInsets(); - rect.width -= insets.left; - rect.height -= insets.top; - rect.width -= insets.right; - rect.height -= insets.bottom; + /** + *

doLayout.

+ * + * @since 1.0.15 + */ + public void doLayout() { + if (cardPanels.isEmpty()) return; - int cardAreaWidth = rect.width; - int cardAreaHeight = rect.height; - int cardWidth = cardWidthMax; - int cardHeight; - int cardSpacingY; + 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 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; - } + int cardAreaWidth = rect.width; + int cardAreaHeight = rect.height; + int cardWidth = cardWidthMax; + int cardHeight; + int cardSpacingY; - 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; - } + 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 = 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; - } - } - } + 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; + } - Dimension oldPreferredSize = getPreferredSize(); - setPreferredSize(new Dimension(maxWidth, maxHeight)); - if (oldPreferredSize.width != maxWidth || oldPreferredSize.height != maxHeight) { - getParent().invalidate(); - getParent().validate(); - } - } + 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; + } + } + } - public void paint (Graphics g) { - boolean hasScrollbars = scrollPane.getVerticalScrollBar().isVisible(); - if (hasScrollbars != this.hasScrollbars) revalidate(); - this.hasScrollbars = hasScrollbars; + Dimension oldPreferredSize = getPreferredSize(); + setPreferredSize(new Dimension(maxWidth, maxHeight)); + if (oldPreferredSize.width != maxWidth || oldPreferredSize.height != maxHeight) { + getParent().invalidate(); + getParent().validate(); + } + } - super.paint(g); - } + /** {@inheritDoc} */ + public void paint(Graphics g) { + boolean hasScrollbars = scrollPane.getVerticalScrollBar().isVisible(); + if (hasScrollbars != this.hasScrollbars) revalidate(); + this.hasScrollbars = hasScrollbars; - public void mouseDragStart (CardPanel dragPanel, MouseEvent evt) { - super.mouseDragStart(dragPanel, evt); + super.paint(g); + } - mouseDragStartX = dragPanel.getCardX(); - mouseDragStartY = dragPanel.getCardY(); - dragPanel.setDisplayEnabled(false); + /** {@inheritDoc} */ + public void mouseDragStart(CardPanel dragPanel, MouseEvent evt) { + super.mouseDragStart(dragPanel, evt); - 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()); - } + mouseDragStartX = dragPanel.getCardX(); + mouseDragStartY = dragPanel.getCardY(); + dragPanel.setDisplayEnabled(false); - public void mouseDragged (CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { - super.mouseDragged(dragPanel, dragOffsetX, dragOffsetY, evt); + 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()); + } - 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); + /** {@inheritDoc} */ + public void mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { + super.mouseDragged(dragPanel, dragOffsetX, dragOffsetY, evt); - 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(); - } + 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); - public void mouseDragEnd (CardPanel dragPanel, MouseEvent evt) { - super.mouseDragEnd(dragPanel, evt); - layout(); - 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); - } + 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(); + } - public float getMaxCoverage () { - return maxCoverage; - } + /** {@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); + } - public void setMaxCoverage (float maxCoverage) { - this.maxCoverage = maxCoverage; - } + /** + *

Getter for the field maxCoverage.

+ * + * @return a float. + */ + public float getMaxCoverage() { + return maxCoverage; + } - public void setMaxRows (int maxRows) { - this.maxRows = maxRows; - } + /** + *

Setter for the field maxCoverage.

+ * + * @param maxCoverage a float. + */ + public void setMaxCoverage(float maxCoverage) { + this.maxCoverage = maxCoverage; + } - public int getMaxRows () { - return maxRows; - } + /** + *

Setter for the field maxRows.

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

Getter for the field maxRows.

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

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 index 90215b5d0cb..ac2081fc120 100644 --- a/src/arcane/ui/CardPanel.java +++ b/src/arcane/ui/CardPanel.java @@ -1,352 +1,460 @@ - package arcane.ui; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Font; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Image; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.RenderingHints; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.JPanel; -import javax.swing.JRootPane; -import javax.swing.SwingUtilities; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardContainer; -import forge.Counters; -import forge.Gui_NewGame; -import forge.ImageCache; -import arcane.ui.ScaledImagePanel; import arcane.ui.ScaledImagePanel.MultipassType; import arcane.ui.ScaledImagePanel.ScalingType; import arcane.ui.util.GlowText; import arcane.ui.util.ManaSymbols; +import forge.*; -public class CardPanel extends JPanel implements CardContainer{ - private static final long serialVersionUID = 2361907095724263295L; - static public final double TAPPED_ANGLE = Math.PI / 2; - static public final float ASPECT_RATIO = 3.5f / 2.5f; +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; - static public CardPanel dragAnimationPanel; +/** + *

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; - static private final float ROUNDED_CORNER_SIZE = 0.1f; - static private final float SELECTED_BORDER_SIZE = 0.01f; - static private final float BLACK_BORDER_SIZE = 0.03f; - static private final int TEXT_GLOW_SIZE = 6; - static private final float TEXT_GLOW_INTENSITY = 3f; - static private final float rotCenterToTopCorner = 1.0295630140987000315797369464196f; - static private final float rotCenterToBottomCorner = 0.7071067811865475244008443621048f; - - static private boolean beenHere = false; + /** + * Constant dragAnimationPanel + */ + public static CardPanel dragAnimationPanel; - public Card gameCard; - public CardPanel attachedToPanel; - public List attachedPanels = new ArrayList(); - public boolean tapped; - public double tappedAngle = 0; - public ScaledImagePanel imagePanel; + /** 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; - 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; + /** Constant beenHere=false */ + private static boolean beenHere = false; - public CardPanel (Card newGameCard) { - this.gameCard = newGameCard; + public Card gameCard; + public CardPanel attachedToPanel; + public List attachedPanels = new ArrayList(); + public boolean tapped; + public double tappedAngle = 0; + public ScaledImagePanel imagePanel; - setBackground(Color.black); - setOpaque(false); + 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; - 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); + /** + *

Constructor for CardPanel.

+ * + * @param newGameCard a {@link forge.Card} object. + */ + public CardPanel(Card newGameCard) { + this.gameCard = newGameCard; - 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); + 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); - 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); + setCard(gameCard); } - + @Override public void componentResized(ComponentEvent e) { - setCard(gameCard); + setCard(gameCard); } }); - - setCard(newGameCard); - } - 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(); - } - layout(); - } + setCard(newGameCard); + } - 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); - } - } - - public void setScalingType (ScalingType scalingType) { - imagePanel.setScalingType(scalingType); - } - - public void setDisplayEnabled (boolean displayEnabled) { - this.displayEnabled = displayEnabled; - } - - public boolean isDisplayEnabled () { - return displayEnabled; - } - - public void setAnimationPanel (boolean isAnimationPanel) { - this.isAnimationPanel = isAnimationPanel; - } - - public void setSelected (boolean isSelected) { - this.isSelected = isSelected; - repaint(); - } - - public void setShowCastingCost (boolean showCastingCost) { - this.showCastingCost = showCastingCost; - } - - 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); - } - - 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); - } - } - - 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 (getCard().getName().equals("Mana Pool") && !isAnimationPanel) { - - if (AllZone.ManaPool != null) { - String s = AllZone.ManaPool.getManaList(); - if (!s.equals("|||||||||||")) { - //System.out.println("ManaList: " + s); - - 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++; - } - } - } - } - } - } - } - - public void layout () { - 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); - } - - public String toString () { - return gameCard.getName(); - } - - 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); - } - - 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); - } - - public int getCardX () { - return getX() + cardXOffset; - } - - public int getCardY () { - return getY() + cardYOffset; - } - - public int getCardWidth () { - return cardWidth; - } - - public int getCardHeight () { - return cardHeight; - } - - public Point getCardLocation () { - Point p = getLocation(); - p.x += cardXOffset; - p.y += cardYOffset; - return p; - } - public void setText(Card card) { - if (card == null || !Gui_NewGame.cardOverlay.isSelected()) return; - if(card.isFaceDown()){ - titleText.setText(""); - showCastingCost = false; + /** + *

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(); } - else { - titleText.setText(card.getName()); - showCastingCost = true; + 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()) { @@ -356,23 +464,29 @@ public class CardPanel extends JPanel implements CardContainer{ } else { ptText.setText(""); } - } + } - public Card getCard() { - return gameCard; - } + /** + *

getCard.

+ * + * @return a {@link forge.Card} object. + */ + public Card getCard() { + return gameCard; + } - public void setCard(Card card) { - if(gameCard != null && gameCard.equals(card) && isAnimationPanel && imagePanel.hasImage()) return; - this.gameCard = card; - if(!isShowing()) return; + /** {@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() + 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); + 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 index 33f18817746..1627e00cc60 100644 --- a/src/arcane/ui/CardPanelContainer.java +++ b/src/arcane/ui/CardPanelContainer.java @@ -1,290 +1,430 @@ - package arcane.ui; -import java.awt.Dimension; -import java.awt.Rectangle; +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; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingUtilities; - -import forge.Card; -import arcane.ui.util.CardPanelMouseListener; -import arcane.ui.util.UI; - /** * Manages mouse events and common funcitonality for CardPanel containing components. + * + * @author Forge + * @version $Id$ */ abstract public class CardPanelContainer extends JPanel { - private static final long serialVersionUID = -6400018234895548306L; + /** Constant serialVersionUID=-6400018234895548306L */ + private static final long serialVersionUID = -6400018234895548306L; - private final static int DRAG_SMUDGE = 10; + /** 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; + 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; + private List listeners = new ArrayList(2); + private int mouseDragOffsetX, mouseDragOffsetY; + private int intialMouseDragX = -1, intialMouseDragY; + private boolean dragEnabled; + private int zoneID; - public CardPanelContainer (JScrollPane scrollPane) { - this.scrollPane = scrollPane; + /** + *

Constructor for CardPanelContainer.

+ * + * @param scrollPane a {@link javax.swing.JScrollPane} object. + */ + public CardPanelContainer(JScrollPane scrollPane) { + this.scrollPane = scrollPane; - setOpaque(true); + 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); - } + 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); - } - }); + 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]; + 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 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; + 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 (dragEnabled) { + intialMouseDragX = -1; + if (mouseDragPanel != null) { + CardPanel panel = mouseDragPanel; + mouseDragPanel = null; + CardPanelContainer.this.mouseDragEnd(panel, evt); + } + } - if (!buttonsDown[button]) return; - buttonsDown[button] = false; + 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); - } - } - } + 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 mouseExited(MouseEvent evt) { + mouseOutPanel(evt); + } - public void mouseEntered (MouseEvent e) { - } - }); - } + public void mouseEntered(MouseEvent e) { + } + }); + } - private void mouseOutPanel (MouseEvent evt) { - if (mouseOverPanel == null) return; - mouseOverPanel.setSelected(false); - mouseOut(mouseOverPanel, evt); - mouseOverPanel = null; - } + /** + *

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(); - };*/ - abstract protected CardPanel getCardPanel (int x, int y); + /*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. - */ - 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; - } + /** + * 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; + } - public CardPanel getCardPanel (int gameCardID) { - for (CardPanel panel : cardPanels) - if (panel.gameCard.getUniqueNumber() == gameCardID) return panel; - return null; - } + /** + *

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; + } - 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(); - } - }); - } + /** + *

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(); + } + }); + } - public void clear () { - UI.invokeAndWait(new Runnable() { - public void run () { - cardPanels.clear(); - removeAll(); - setPreferredSize(new Dimension(0, 0)); - invalidate(); - getParent().validate(); - repaint(); - } - }); - } + /** + *

clear.

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

Getter for the field scrollPane.

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

Getter for the field cardWidthMin.

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

Setter for the field cardWidthMin.

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

Getter for the field cardWidthMax.

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

Setter for the field cardWidthMax.

+ * + * @param cardWidthMax a int. + */ + public void setCardWidthMax(int cardWidthMax) { + this.cardWidthMax = cardWidthMax; + } - public boolean isDragEnabled () { - return dragEnabled; - } + /** + *

isDragEnabled.

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

Setter for the field dragEnabled.

+ * + * @param dragEnabled a boolean. + */ + public void setDragEnabled(boolean dragEnabled) { + this.dragEnabled = dragEnabled; + } - public void addCardPanelMouseListener (CardPanelMouseListener listener) { - listeners.add(listener); - } + /** + *

addCardPanelMouseListener.

+ * + * @param listener a {@link arcane.ui.util.CardPanelMouseListener} object. + */ + public void addCardPanelMouseListener(CardPanelMouseListener listener) { + listeners.add(listener); + } - public void mouseLeftClicked (CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseLeftClicked(panel, 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) { + for (CardPanelMouseListener listener : listeners) + listener.mouseLeftClicked(panel, evt); + } - public void mouseRightClicked (CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseRightClicked(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); + } - public void mouseMiddleClicked (CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseMiddleClicked(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); + } - public void mouseDragEnd (CardPanel dragPanel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragEnd(dragPanel, 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); + } - public void mouseDragged (CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragged(mouseDragPanel, mouseDragOffsetX, mouseDragOffsetY, 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); + } - public void mouseDragStart (CardPanel dragPanel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseDragStart(mouseDragPanel, 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); + } - public void mouseOut (CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseOut(mouseOverPanel, 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); + } - public void mouseOver (CardPanel panel, MouseEvent evt) { - for (CardPanelMouseListener listener : listeners) - listener.mouseOver(panel, evt); - } - - public Card getCardFromMouseOverPanel(){ - if(mouseOverPanel != null) - return mouseOverPanel.gameCard; - else - return null; - } + /** + *

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); + } - public int getZoneID () { - return zoneID; - } + /** + *

getCardFromMouseOverPanel.

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

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 index b194d3a36fc..1977031ac83 100644 --- a/src/arcane/ui/HandArea.java +++ b/src/arcane/ui/HandArea.java @@ -1,49 +1,58 @@ - package arcane.ui; -import java.awt.Frame; -import java.awt.event.MouseEvent; - -import javax.swing.JScrollPane; - -import arcane.ui.CardArea; -import arcane.ui.CardPanel; 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 { - private static final long serialVersionUID = 7488132628637407745L; + /** Constant serialVersionUID=7488132628637407745L */ + private static final long serialVersionUID = 7488132628637407745L; - public HandArea (JScrollPane scrollPane, final Frame frame) { - super(scrollPane); + /** + *

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); + setDragEnabled(true); + setVertical(true); - addCardPanelMouseListener(new CardPanelMouseListener() { - public void mouseRightClicked (CardPanel panel, MouseEvent evt) { - } + addCardPanelMouseListener(new CardPanelMouseListener() { + public void mouseRightClicked(CardPanel panel, MouseEvent evt) { + } - public void mouseOver (CardPanel panel, MouseEvent evt) { - } + public void mouseOver(CardPanel panel, MouseEvent evt) { + } - public void mouseOut (CardPanel panel, MouseEvent evt) { - } + public void mouseOut(CardPanel panel, MouseEvent evt) { + } - public void mouseMiddleClicked (CardPanel panel, MouseEvent evt) { - } + public void mouseMiddleClicked(CardPanel panel, MouseEvent evt) { + } - public void mouseLeftClicked (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 mouseDragged(CardPanel dragPanel, int dragOffsetX, int dragOffsetY, MouseEvent evt) { + } - public void mouseDragEnd (CardPanel dragPanel, 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 index bfdff2f73c1..ae7508e1865 100644 --- a/src/arcane/ui/PlayArea.java +++ b/src/arcane/ui/PlayArea.java @@ -1,403 +1,469 @@ - package arcane.ui; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Rectangle; +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; -import javax.swing.JScrollPane; - -import arcane.ui.util.CardPanelMouseListener; - -import forge.Card; - +/** + *

PlayArea class.

+ * + * @author Forge + * @version $Id$ + */ public class PlayArea extends CardPanelContainer implements CardPanelMouseListener { - private static final long serialVersionUID = 8333013579724492513L; - static private final int GUTTER_Y = 5; - static private final int GUTTER_X = 5; - static final float EXTRA_CARD_SPACING_X = 0.04f; - static private final float CARD_SPACING_Y = 0.06f; - static private final float STACK_SPACING_X = 0.07f; - static private final float STACK_SPACING_Y = 0.07f; + /** 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 int tokenStackMax = 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; + private int landStackMax = 5; - public PlayArea (JScrollPane scrollPane, boolean mirror) { - super(scrollPane); - setBackground(Color.white); - this.mirror = mirror; - } + private boolean stackVertical; + private boolean mirror; - public void layout () { - // Collect lands. - Row allLands = new Row(); - outerLoop: // - for (CardPanel panel : cardPanels) { - if (!panel.gameCard.isLand()) continue; + // 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; - int insertIndex = -1; + /** + *

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; + } - // 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; - } + /** + *

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; - Stack stack = new Stack(); - stack.add(panel); - allLands.add(insertIndex == -1 ? allLands.size() : insertIndex, stack); - } + int insertIndex = -1; - // Collect tokens. - Row allTokens = new Row(); - outerLoop: // - for (CardPanel panel : cardPanels) { - if (!panel.gameCard.isToken()) 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; + } - // 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); + allLands.add(insertIndex == -1 ? allLands.size() : insertIndex, stack); + } - 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); + // Collect tokens. + Row allTokens = new Row(); + outerLoop: + // + for (CardPanel panel : cardPanels) { + if (!panel.gameCard.isToken()) continue; - 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--; - } + int insertIndex = -1; - // 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(); + // 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; + } - // 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; - } - } + Stack stack = new Stack(); + stack.add(panel); + allTokens.add(insertIndex == -1 ? allTokens.size() : insertIndex, stack); + } - 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 allCreatures = new Row(cardPanels, RowType.creatureNonToken); + Row allOthers = new Row(cardPanels, RowType.other); - 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; - } + 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--; + } - 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)); - } - } + // 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(); - private int getRowsHeight (List rows) { - int height = 0; - for (Row row : rows) - height += row.getHeight(); - return height - cardSpacingY + GUTTER_Y * 2; - } + // 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; + } + } - 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; - } + /** + *

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; - public void mouseLeftClicked (CardPanel panel, MouseEvent evt) { - if (panel.tappedAngle != 0 && panel.tappedAngle != CardPanel.TAPPED_ANGLE) return; - super.mouseLeftClicked(panel, evt); - } + 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; + } - public int getLandStackMax () { - return landStackMax; - } + /** + *

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)); + } + } - public void setLandStackMax (int landStackMax) { - this.landStackMax = landStackMax; - } + /** + *

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; + } - public boolean getStackVertical () { - return stackVertical; - } + /** {@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; + } - public void setStackVertical (boolean stackVertical) { - this.stackVertical = stackVertical; - } + /** {@inheritDoc} */ + public void mouseLeftClicked(CardPanel panel, MouseEvent evt) { + if (panel.tappedAngle != 0 && panel.tappedAngle != CardPanel.TAPPED_ANGLE) return; + super.mouseLeftClicked(panel, evt); + } - static private enum RowType { - land, creature, creatureNonToken, other; + /** + *

Getter for the field landStackMax.

+ * + * @return a int. + */ + public int getLandStackMax() { + return landStackMax; + } - 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); - } - } - } + /** + *

Setter for the field landStackMax.

+ * + * @param landStackMax a int. + */ + public void setLandStackMax(int landStackMax) { + this.landStackMax = landStackMax; + } - private class Row extends ArrayList { - private static final long serialVersionUID = 716489891951011846L; + /** + *

Getter for the field stackVertical.

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

Setter for the field stackVertical.

+ * + * @param stackVertical a boolean. + */ + public void setStackVertical(boolean stackVertical) { + this.stackVertical = stackVertical; + } - public Row (List cardPanels, RowType type) { - this(); - addAll(cardPanels, type); - } + static private enum RowType { + land, creature, creatureNonToken, other; - 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 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); + } + } + } - public boolean addAll (Collection c) { - boolean changed = super.addAll(c); - c.clear(); - return changed; - } + private class Row extends ArrayList { + private static final long serialVersionUID = 716489891951011846L; - private int getWidth () { - if (isEmpty()) return 0; - int width = 0; - for (Stack stack : this) - width += stack.getWidth(); - return width + GUTTER_X * 2 - extraCardSpacingX; - } + public Row() { + super(16); + } - private int getHeight () { - if (isEmpty()) return 0; - int height = 0; - for (Stack stack : this) - height = Math.max(height, stack.getHeight()); - return height; - } - } + public Row(List cardPanels, RowType type) { + this(); + addAll(cardPanels, type); + } - private class Stack extends ArrayList { - private static final long serialVersionUID = 3863135156832080368L; + 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 Stack () { - super(8); - } + public boolean addAll(Collection c) { + boolean changed = super.addAll(c); + c.clear(); + return changed; + } - public boolean add (CardPanel panel) { - boolean appended = super.add(panel); - for (CardPanel attachedPanel : panel.attachedPanels) - add(attachedPanel); - return appended; - } + 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 getWidth () { - return cardWidth + (size() - 1) * stackSpacingX + cardSpacingX; - } + private int getHeight() { + if (isEmpty()) return 0; + int height = 0; + for (Stack stack : this) + height = Math.max(height, stack.getHeight()); + return height; + } + } - private int getHeight () { - return cardHeight + (size() - 1) * stackSpacingY + cardSpacingY; - } - } + 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 index 9bb5a4cd9fb..e1dddf7fdba 100644 --- a/src/arcane/ui/ScaledImagePanel.java +++ b/src/arcane/ui/ScaledImagePanel.java @@ -1,194 +1,261 @@ - package arcane.ui; - - import java.awt.Graphics; - import java.awt.Graphics2D; - import java.awt.Image; - import java.awt.RenderingHints; - import java.awt.image.BufferedImage; - - import javax.swing.JPanel; - - public class ScaledImagePanel extends JPanel { - - 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; - - public ScaledImagePanel () { - super(false); - setOpaque(false); - } - - public void setImage (Image srcImage, Image srcImageBlurred) { - this.srcImage = srcImage; - this.srcImageBlurred = srcImageBlurred; - } - - public void clearImage () { - srcImage = null; - srcImageBlurred = null; - repaint(); - } - - public void setScalingMultiPassType (MultipassType multiPassType) { - this.multiPassType = multiPassType; - } - - public void setScalingType (ScalingType scalingType) { - this.scalingType = scalingType; - } - - public void setScalingBlur (boolean blur) { - this.blur = blur; - } - - public void setScaleLarger (boolean scaleLarger) { - this.scaleLarger = scaleLarger; - } - - public boolean hasImage () { - return srcImage != null; - } - - 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; - } - - 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; - } - } - - 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); - } - - 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); - } - - 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 - } - } +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 index dc720f96139..d9b032bde90 100644 --- a/src/arcane/ui/ViewPanel.java +++ b/src/arcane/ui/ViewPanel.java @@ -1,40 +1,53 @@ - package arcane.ui; -import java.awt.BorderLayout; - -import javax.swing.JPanel; - -import arcane.ui.CardPanel; +import javax.swing.*; +import java.awt.*; +/** + *

ViewPanel class.

+ * + * @author Forge + * @version $Id$ + */ public class ViewPanel extends JPanel { - private static final long serialVersionUID = 7016597023142963068L; + /** Constant serialVersionUID=7016597023142963068L */ + private static final long serialVersionUID = 7016597023142963068L; - public void layout () { - 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); - } + /** + *

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); + } - public void setCardPanel (CardPanel panel) { - //CardPanel newPanel = new CardPanel(panel.gameCard); - //newPanel.setImage(panel); - removeAll(); - add(panel, BorderLayout.CENTER); - panel.revalidate(); - panel.repaint(); - } + /** + *

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 index 1c690969b18..caac66316d4 100644 --- a/src/arcane/ui/util/Animation.java +++ b/src/arcane/ui/util/Animation.java @@ -1,393 +1,477 @@ - package arcane.ui.util; -import java.awt.Container; -import java.awt.EventQueue; -import java.awt.Frame; -import java.awt.Point; +import arcane.ui.CardPanel; +import arcane.util.Util; + +import javax.swing.*; +import java.awt.*; import java.util.Timer; import java.util.TimerTask; -import javax.swing.JLayeredPane; -import javax.swing.SwingUtilities; - -import arcane.ui.CardPanel; -import arcane.ui.util.UI; -import arcane.util.Util; - +/** + *

Abstract Animation class.

+ * + * @author Forge + * @version $Id$ + */ abstract public class Animation { - static private final long TARGET_MILLIS_PER_FRAME = 30; + /** Constant TARGET_MILLIS_PER_FRAME=30 */ + static private final long TARGET_MILLIS_PER_FRAME = 30; - static private Timer timer = new Timer("Animation", true); + /** Constant timer */ + static private Timer timer = new Timer("Animation", true); - static private CardPanel delayedCardPanel; - static private long delayedTime; - static private CardPanel enlargedCardPanel; - static private CardPanel enlargedAnimationPanel; - static private Object enlargeLock = new Object(); + /** 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; + private TimerTask timerTask; + private FrameTimer frameTimer; + private long elapsed; - public Animation (final long duration) { - this(duration, 0); - } + /** + *

Constructor for Animation.

+ * + * @param duration a long. + */ + public Animation(final long duration) { + this(duration, 0); + } - 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); - } + /** + *

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); + } - abstract protected void update (float percentage); + /** + *

update.

+ * + * @param percentage a float. + */ + abstract protected void update(float percentage); - protected void cancel () { - timerTask.cancel(); - end(); - } + /** + *

cancel.

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

start.

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

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. + /** + * 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; + 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 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(); + public long getTimeSinceLastFrame() { + long currentTime = System.currentTimeMillis(); - int id = sampleIndex - 1; - if (id < 0) id += SAMPLES; + int id = sampleIndex - 1; + if (id < 0) id += SAMPLES; - long timeSinceLastSample = currentTime - samples[id]; + 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; - } + // 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; + long timeSinceOldestSample = currentTime - samples[sampleIndex]; + samples[sampleIndex] = currentTime; + sampleIndex = (sampleIndex + 1) % SAMPLES; - return timeSinceOldestSample / SAMPLES; - } - } + return timeSinceOldestSample / SAMPLES; + } + } - static public void tapCardToggle (final CardPanel panel) { - new Animation(200) { - protected void start () { - panel.tapped = !panel.tapped; - } + /** + *

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 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; - } - }; - } + protected void end() { + panel.tappedAngle = panel.tapped ? CardPanel.TAPPED_ANGLE : 0; + } + }; + } - // static public void moveCardToPlay (Component source, final CardPanel dest, final CardPanel animationPanel) { - 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); + // 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); - } + 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); - } + 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); - } - }); - } - }; - } - }); - } + 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); + } + }); + } + }; + } + }); + } - 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); + /** + *

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); - } + 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); - } + 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); - } - }); - } - }; - } - }); - } - - 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); - } - } - }); - } - }); - } + 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); + } + }); + } + }; + } + }); + } - 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; - } + /** + *

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); + } + } + }); + } + }); + } - final CardPanel overPanel = enlargedCardPanel, animationPanel = enlargedAnimationPanel; + /** + *

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; + } - animationPanel.setAnimationPanel(true); - final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); - layeredPane.setLayer(animationPanel, JLayeredPane.MODAL_LAYER); + final CardPanel overPanel = enlargedCardPanel, animationPanel = enlargedAnimationPanel; - 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); + animationPanel.setAnimationPanel(true); + final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); + layeredPane.setLayer(animationPanel, JLayeredPane.MODAL_LAYER); - 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); - } + 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); - protected void end () { - animationPanel.setVisible(false); - animationPanel.repaint(); - EventQueue.invokeLater(new Runnable() { - public void run () { - layeredPane.remove(animationPanel); - } - }); - } - }; - } + 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); + } - 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; + protected void end() { + animationPanel.setVisible(false); + animationPanel.repaint(); + EventQueue.invokeLater(new Runnable() { + public void run() { + layeredPane.remove(animationPanel); + } + }); + } + }; + } - Animation.enlargedAnimationPanel.setVisible(false); - Animation.enlargedAnimationPanel.repaint(); - Animation.enlargedAnimationPanel = null; - return; - } - } - final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); + /** + *

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; - 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; + Animation.enlargedAnimationPanel.setVisible(false); + Animation.enlargedAnimationPanel.repaint(); + Animation.enlargedAnimationPanel = null; + return; + } + } + final JLayeredPane layeredPane = SwingUtilities.getRootPane(overPanel).getLayeredPane(); - 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 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; - final CardPanel animationPanel = new CardPanel(overPanel.gameCard); - animationPanel.setImage(overPanel); + 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; - 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) { - } - } + final CardPanel animationPanel = new CardPanel(overPanel.gameCard); + animationPanel.setImage(overPanel); - 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); - } - }; - } + 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) { + } + } - static public boolean isShowingEnlargedCard () { - synchronized (enlargeLock) { - return enlargedAnimationPanel != null; - } - } + 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 index e80bf48afed..eba7364dff3 100644 --- a/src/arcane/ui/util/CardPanelMouseListener.java +++ b/src/arcane/ui/util/CardPanelMouseListener.java @@ -1,24 +1,79 @@ - package arcane.ui.util; -import java.awt.event.MouseEvent; - import arcane.ui.CardPanel; +import java.awt.event.MouseEvent; + +/** + *

CardPanelMouseListener interface.

+ * + * @author Forge + * @version $Id$ + */ public interface CardPanelMouseListener { - public void mouseOver (CardPanel panel, MouseEvent 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); - public void mouseOut (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); - public void mouseLeftClicked (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); - public void mouseMiddleClicked (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); - public void mouseRightClicked (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); - public void mouseDragStart (CardPanel dragPanel, 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); - public void mouseDragged (CardPanel dragPanel, int dragOffsetX, int dragOffsetY, 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); - public void mouseDragEnd (CardPanel dragPanel, 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 index b1be621f252..c1ab86876a9 100644 --- a/src/arcane/ui/util/GlowText.java +++ b/src/arcane/ui/util/GlowText.java @@ -1,12 +1,7 @@ - package arcane.ui.util; -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.RenderingHints; +import javax.swing.*; +import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.font.LineBreakMeasurer; import java.awt.font.TextAttribute; @@ -16,83 +11,104 @@ import java.text.AttributedString; import java.text.BreakIterator; import java.util.Locale; -import javax.swing.JLabel; - +/** + *

GlowText class.

+ * + * @author Forge + * @version $Id$ + */ public class GlowText extends JLabel { - private static final long serialVersionUID = -2868833097364223352L; - private int glowSize; - @SuppressWarnings("unused") - private float glowIntensity; - private Color glowColor; - private boolean wrap; + /** Constant serialVersionUID=-2868833097364223352L */ + private static final long serialVersionUID = -2868833097364223352L; + private int glowSize; + private Color glowColor; + private boolean wrap; - public void setGlow (Color glowColor, int size, float intensity) { - this.glowColor = glowColor; - this.glowSize = size; - this.glowIntensity = intensity; - } + /** + *

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; + } - public void setWrap (boolean wrap) { - this.wrap = wrap; - } + /** + *

Setter for the field wrap.

+ * + * @param wrap a boolean. + */ + public void setWrap(boolean wrap) { + this.wrap = wrap; + } - public Dimension getPreferredSize () { - Dimension size = super.getPreferredSize(); - size.width += glowSize; - size.height += glowSize / 2; - return size; - } + /** + *

getPreferredSize.

+ * + * @return a {@link java.awt.Dimension} object. + */ + public Dimension getPreferredSize() { + Dimension size = super.getPreferredSize(); + size.width += glowSize; + size.height += glowSize / 2; + return size; + } - public void setText (String text) { - super.setText(text); - } + /** {@inheritDoc} */ + public void setText(String text) { + super.setText(text); + } - public void paint (Graphics g) { - if (getText().length() == 0) return; + /** {@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); + 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); + 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(); + 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. + 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(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); + 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. - } - } + 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 index 0ac003a50fc..4c11d8aa164 100644 --- a/src/arcane/ui/util/ImageUtil.java +++ b/src/arcane/ui/util/ImageUtil.java @@ -1,41 +1,67 @@ - package arcane.ui.util; - - import java.awt.Graphics2D; - import java.awt.Image; - 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; - -import javax.imageio.ImageIO; - - public class ImageUtil { - 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; - } - - 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; - } - - 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); - } - } +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 index 94e8f324f16..53b97e98d7f 100644 --- a/src/arcane/ui/util/ManaSymbols.java +++ b/src/arcane/ui/util/ManaSymbols.java @@ -1,74 +1,136 @@ - package arcane.ui.util; -import java.awt.Graphics; -import java.awt.Image; +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; -import com.esotericsoftware.minlog.Log; - +/** + *

ManaSymbols class.

+ * + * @author Forge + * @version $Id$ + */ public class ManaSymbols { - static private final Map manaImages = new HashMap(); - static private Pattern replaceSymbolsPattern = Pattern.compile("\\{([^}/]*)/?([^}]*)\\}"); + /** Constant manaImages */ + static private final Map manaImages = new HashMap(); + /** Constant replaceSymbolsPattern */ + static private Pattern replaceSymbolsPattern = Pattern.compile("\\{([^}/]*)/?([^}]*)\\}"); - 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"}; - for (String symbol : symbols) - manaImages.put(symbol, UI.getImageIcon("res/images/symbols-13/" + symbol + ".png").getImage()); - } + /** + *

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()); + } - 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 drawAttack (Graphics g, int x, int y) { - Image image = manaImages.get("attack"); - g.drawImage(image, x, y, null); - } - + /** + *

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 drawSymbol (String imageName, Graphics g, int x, int y) { - Image image = manaImages.get(imageName); - g.drawImage(image, x, y, null); - } + 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); + } - 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; - } - 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(""); - } - } + /** + *

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 index 07363a5ba23..83ecddee9ac 100644 --- a/src/arcane/ui/util/UI.java +++ b/src/arcane/ui/util/UI.java @@ -1,15 +1,18 @@ - package arcane.ui.util; -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.Font; -import java.awt.Image; -import java.awt.Insets; -import java.awt.Point; -import java.awt.Toolkit; +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; @@ -22,175 +25,219 @@ import java.net.URL; import java.util.Collections; import java.util.concurrent.ConcurrentMap; -import javax.swing.BorderFactory; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JEditorPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JToggleButton; -import javax.swing.JViewport; -import javax.swing.ScrollPaneConstants; -import javax.swing.UIManager; -import javax.swing.ViewportLayout; -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 com.google.common.collect.MapMaker; - /** * UI utility functions. + * + * @author Forge + * @version $Id$ */ public class UI { - static private ConcurrentMap imageCache = new MapMaker().softValues().makeMap(); + /** Constant imageCache */ + static private ConcurrentMap imageCache = new MapMaker().softValues().makeMap(); - static public JToggleButton getToggleButton () { - JToggleButton button = new JToggleButton(); - button.setMargin(new Insets(2, 4, 2, 4)); - return button; - } + /** + *

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; + } - static public JButton getButton () { - JButton button = new JButton(); - 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; + } - 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)); - } + /** + *

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)); + } - 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); - } + /** + *

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); + } - 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); - } - } + /** + *

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); + } + } - 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; + /** + *

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); - } - }; - } - }); - } + 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); + } + }; + } + }); + } - static public void setVerticalScrollingView (JScrollPane scrollPane, final Component view) { - final JViewport viewport = new JViewport(); - viewport.setLayout(new ViewportLayout() { - private static final long serialVersionUID = -4436977380450713628L; + /** + *

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); - } + 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); + } - 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; - } + /** + *

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; + } - static public void invokeLater (Runnable runnable) { - EventQueue.invokeLater(runnable); - } + /** + *

invokeLater.

+ * + * @param runnable a {@link java.lang.Runnable} object. + */ + static public void invokeLater(Runnable runnable) { + EventQueue.invokeLater(runnable); + } - 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); - } - } + /** + *

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); + } + } - static public void setSystemLookAndFeel () { - try { - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception ex) { - System.err.println("Error setting look and feel:"); - ex.printStackTrace(); - } - } + /** + *

setSystemLookAndFeel.

+ */ + static public void setSystemLookAndFeel() { + try { + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) { + System.err.println("Error setting look and feel:"); + ex.printStackTrace(); + } + } - 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); - } - } + /** + *

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 index e2b1f870384..b1db49efc47 100644 --- a/src/arcane/util/MultiplexOutputStream.java +++ b/src/arcane/util/MultiplexOutputStream.java @@ -1,4 +1,3 @@ - package arcane.util; import java.io.IOException; @@ -6,23 +5,33 @@ 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; + private final OutputStream[] streams; - public MultiplexOutputStream (OutputStream... streams) { - super(); - if (streams == null) throw new IllegalArgumentException("streams cannot be null."); - this.streams = 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; + } - public void write (int b) throws IOException { - for (int i = 0; i < streams.length; i++) - streams[i].write(b); - } + /** {@inheritDoc} */ + public void write(int b) throws IOException { + for (int i = 0; i < streams.length; i++) + streams[i].write(b); + } - 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); - } + /** {@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 index c9e191069a4..23b34cb5fce 100644 --- a/src/arcane/util/Util.java +++ b/src/arcane/util/Util.java @@ -1,8 +1,6 @@ - package arcane.util; -import java.awt.AWTException; -import java.awt.Robot; +import javax.swing.*; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; @@ -15,61 +13,83 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; -import javax.swing.SwingUtilities; - +/** + *

Util class.

+ * + * @author Forge + * @version $Id$ + */ public class Util { - static public final boolean isMac = System.getProperty("os.name").toLowerCase().indexOf("mac") != -1; - static public final boolean isWindows = System.getProperty("os.name").toLowerCase().indexOf("windows") == -1; + /** 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; - static public Robot robot; - static { - try { - new Robot(); - } catch (AWTException ex) { - throw new RuntimeException("Error creating robot.", ex); - } - } + /** Constant threadPool */ + static public ThreadPoolExecutor threadPool; + /** Constant threadCount */ + static private int threadCount; - static public ThreadPoolExecutor threadPool; - 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(); - } + 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(); + } - public static void broadcast (byte[] data, int port) throws IOException { - DatagramSocket socket = new DatagramSocket(); - broadcast(socket, data, port, NetworkInterface.getNetworkInterfaces()); - socket.close(); - } + /** + *

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(); + } - 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)); - } - } - } + /** + *

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)); + } + } + } - 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); - } - } + /** + *

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/com/cloudgarden/layout/AnchorConstraint.java b/src/com/cloudgarden/layout/AnchorConstraint.java deleted file mode 100644 index 6090dfaefd3..00000000000 --- a/src/com/cloudgarden/layout/AnchorConstraint.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - */ -package com.cloudgarden.layout; - -/** - * Used by both AnchorLayout (SWT) and AnchorLayoutManager (Swing) - */ -public class AnchorConstraint { - - /** - * Meaning: This side is not anchored. - */ - public static final int ANCHOR_NONE = 0; - - /** - * (Relative anchor) Meaning: This side is anchored so that it always - * occurs a fixed fraction of - * the distance along it's parent's side. The position is calculated by - * the formula " position = (parent side)*(value)/1000 " so for - * instance if top=100 and topType == ANCHOR_REL then the - * value of y for this side would be (parent height)*top/1000. - */ - public static final int ANCHOR_REL = 1; - - /** - * (Absolute anchor) Meaning: This side is anchored a fixed distance - * in pixels (given by the value for this side) from it's parent's respective side. - * For instance, if bottomType == ANCHOR_ABS and bottom = 100 then the - * bottom side of this component will remain fixed 100 pixels from - * the bottom side of it's parent container. - */ - public static final int ANCHOR_ABS = 2; - - public int top; - public int bottom; - public int left; - public int right; - public int topType; - public int bottomType; - public int rightType; - public int leftType; - - public AnchorConstraint() { - this(0, 0, 0, 0, ANCHOR_NONE, ANCHOR_NONE, ANCHOR_NONE, ANCHOR_NONE); - } - - /** - * Creates an AnchorConstraint. - * @param top - value (relative or absolute) for top side - * @param right - like 'top' but for right side - * @param bottom - like 'top' but for bottom side - * @param left - like 'top' but for left side - * @param topType - either ANCHOR_ABS, ANCHOR_REL or ANCHOR_NONE - * to indicate whether the 'top' parameter is an absolute value (in pixels) or - * a fractional value (in 1/1000 ths) of the height of this component's parent, - * denoting where the anchor will be applied (if at all). - * @param rightType - like 'topType' but for right side - * @param bottomType - like 'topType' but for bottom side - * @param leftType - like 'topType' but for left side - */ - public AnchorConstraint( - int top, - int right, - int bottom, - int left, - int topType, - int rightType, - int bottomType, - int leftType) { - this.top = top; - this.bottom = bottom; - this.left = left; - this.right = right; - this.topType = topType; - this.rightType = rightType; - this.bottomType = bottomType; - this.leftType = leftType; - } - -} diff --git a/src/com/cloudgarden/layout/AnchorLayout.java b/src/com/cloudgarden/layout/AnchorLayout.java deleted file mode 100644 index d0c1acd9131..00000000000 --- a/src/com/cloudgarden/layout/AnchorLayout.java +++ /dev/null @@ -1,256 +0,0 @@ -/* - */ -package com.cloudgarden.layout; - -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.LayoutManager2; -import java.awt.Rectangle; -import java.util.HashMap; - -/** - * Lays out components, using a combination of their "bounds" property - * and their AnchorConstraints layout constraint objects. - *

- * Sides of the components can be anchored either absolutely (eg, if the - * right side is anchored absolutely then it will always be a fixed number - * of pixels from the right side of it's parent container) or relatively (ie, - * if any side is anchored relatively then it will always occur a fixed - * fraction of the way along it's parent's side). Or they can be not anchored, - * at all in which case they will occur at places determined by their - * component's "bounds" property and the anchoring of the component's - * other sides. - */ -public class AnchorLayout implements LayoutManager2 { - - private int preferredWidth, preferredHeight, minHeight, minWidth; - - private HashMap constraintMap = new HashMap(); - private boolean sizesCalculated = false; - //private Container container; - - public AnchorLayout() { - super(); - } - - void initialize(Container parent) { - if (sizesCalculated) - return; - Component[] children = parent.getComponents(); - preferredWidth = 10000; - preferredHeight = 10000; - minWidth = 0; - minHeight = 0; - Rectangle pb = parent.getBounds(); - for (int i = 0; i < children.length; i++) { - Component child = children[i]; - if (child != null) { - Object ld = constraintMap.get(child); - Rectangle b = child.getBounds(); - Dimension pref = child.getPreferredSize(); - Dimension min = child.getMaximumSize(); - if (pref == null) - pref = child.getSize(); - if (min == null) - min = child.getSize(); - int minX = b.x + b.width; - int minY = b.y + b.height; - int maxX = b.x + b.width; - int maxY = b.y + b.height; - if (ld instanceof AnchorConstraint) { - AnchorConstraint ac = (AnchorConstraint) ld; - int acl = ac.left; - int acr = ac.right; - int aclt = ac.leftType; - int acrt = ac.rightType; - - if (aclt == AnchorConstraint.ANCHOR_REL) - acl = acl * pb.width / 1000; - if (acrt == AnchorConstraint.ANCHOR_REL) - acr = pb.width - acr * pb.width / 1000; - - if (aclt != AnchorConstraint.ANCHOR_NONE - && acrt != AnchorConstraint.ANCHOR_NONE) - maxX = acl + pref.width + acr; - if (aclt == AnchorConstraint.ANCHOR_NONE) - acl = 0; - if (acrt == AnchorConstraint.ANCHOR_NONE) - acr = 0; - minX = acl + min.width + acr; - - int act = ac.top; - int acb = ac.bottom; - int actt = ac.topType; - int acbt = ac.bottomType; - if (actt == AnchorConstraint.ANCHOR_REL) - act = act * pb.height / 1000; - if (acbt == AnchorConstraint.ANCHOR_REL) - acb = pb.height - acb * pb.height / 1000; - - if (actt != AnchorConstraint.ANCHOR_NONE - && acbt != AnchorConstraint.ANCHOR_NONE) - maxY = act + pref.height + acb; - if (actt == AnchorConstraint.ANCHOR_NONE) - act = 0; - if (acbt == AnchorConstraint.ANCHOR_NONE) - acb = 0; - minY = act + min.height + acb; - } - if (minX > minWidth) - minWidth = minX; - if (maxX > minWidth) - preferredWidth = maxX; - if (minY > minHeight) - minHeight = minY; - if (maxY > preferredHeight) - preferredHeight = maxY; - } - } - - } - - /* (non-Javadoc) - * @see org.eclipse.swt.widgets.Layout#layout(org.eclipse.swt.widgets.Composite, boolean) - */ - public void layoutContainer(Container container) { - //this.container = container; - Component children[] = container.getComponents(); - Rectangle rect = container.getBounds(); - int width = rect.width; - int height = rect.height; - for (int i = 0; i < children.length; i++) { - Component child = children[i]; - if (child != null) { - Object ld = constraintMap.get(child); - Rectangle b = child.getBounds(); - Dimension pref = child.getPreferredSize(); - if (pref == null) - pref = child.getSize(); - if (ld instanceof AnchorConstraint) { - AnchorConstraint ac = (AnchorConstraint) ld; - int acl = ac.left; - int acr = ac.right; - int aclt = ac.leftType; - int acrt = ac.rightType; - if (aclt == AnchorConstraint.ANCHOR_REL) - acl = acl * width / 1000; - if (acrt == AnchorConstraint.ANCHOR_REL) - acr = width - acr * width / 1000; - - if (aclt != AnchorConstraint.ANCHOR_NONE) { - if (acrt != AnchorConstraint.ANCHOR_NONE) { - b.width = width - acr - acl; - b.x = acl; - } else { - b.width = pref.width; - if (b.width + acl > width) - b.width = width - acl; - b.x = acl; - } - } else { - if (acrt != AnchorConstraint.ANCHOR_NONE) { - b.x = width - acr - pref.width; - } - b.width = pref.width; - if (b.width + b.x > width) - b.width = width - b.x; - } - - int act = ac.top; - int acb = ac.bottom; - int actt = ac.topType; - int acbt = ac.bottomType; - if (actt == AnchorConstraint.ANCHOR_REL) - act = act * height / 1000; - if (acbt == AnchorConstraint.ANCHOR_REL) - acb = height - acb * height / 1000; - - if (actt != AnchorConstraint.ANCHOR_NONE) { - if (acbt != AnchorConstraint.ANCHOR_NONE) { - b.height = height - acb - act; - b.y = act; - } else { - b.height = pref.height; - if (b.height + act > height) - b.height = height - act; - b.y = act; - } - } else { - if (acbt != AnchorConstraint.ANCHOR_NONE) { - b.y = height - acb - pref.height; - } - b.height = pref.height; - if (b.height + b.y > height) - b.height = height - b.y; - } - child.setBounds(b); - } - } - } - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager#addLayoutComponent(java.lang.String, java.awt.Component) - */ - public void addLayoutComponent(String name, Component comp) {} - - /* (non-Javadoc) - * @see java.awt.LayoutManager#removeLayoutComponent(java.awt.Component) - */ - public void removeLayoutComponent(Component comp) { - constraintMap.remove(comp); - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager#preferredLayoutSize(java.awt.Container) - */ - public Dimension preferredLayoutSize(Container parent) { - initialize(parent); - return new Dimension(preferredWidth, preferredHeight); - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager#minimumLayoutSize(java.awt.Container) - */ - public Dimension minimumLayoutSize(Container parent) { - initialize(parent); - return new Dimension(minWidth, minHeight); - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager2#addLayoutComponent(java.awt.Component, java.lang.Object) - */ - public void addLayoutComponent(Component comp, Object constraints) { - constraintMap.put(comp, constraints); - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager2#maximumLayoutSize(java.awt.Container) - */ - public Dimension maximumLayoutSize(Container target) { - return preferredLayoutSize(target); - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager2#getLayoutAlignmentX(java.awt.Container) - */ - public float getLayoutAlignmentX(Container target) { - return 0; - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager2#getLayoutAlignmentY(java.awt.Container) - */ - public float getLayoutAlignmentY(Container target) { - return 0; - } - - /* (non-Javadoc) - * @see java.awt.LayoutManager2#invalidateLayout(java.awt.Container) - */ - public void invalidateLayout(Container target) { - sizesCalculated = false; - } - -} diff --git a/src/com/esotericsoftware/minlog/Log.java b/src/com/esotericsoftware/minlog/Log.java deleted file mode 100644 index 27e0aa614a7..00000000000 --- a/src/com/esotericsoftware/minlog/Log.java +++ /dev/null @@ -1,233 +0,0 @@ -package com.esotericsoftware.minlog; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Date; - -/** - * A low overhead, lightweight logging system. - * @author Nathan Sweet - */ -public class Log { - /** No logging at all. */ - static public final int LEVEL_NONE = 6; - /** Critical errors. The application may no longer work correctly. */ - static public final int LEVEL_ERROR = 5; - /** Important warnings. The application will continue to work correctly. */ - static public final int LEVEL_WARN = 4; - /** Informative messages. Typically used for deployment. */ - static public final int LEVEL_INFO = 3; - /** Debug messages. This level is useful during development. */ - static public final int LEVEL_DEBUG = 2; - /** Trace messages. A lot of information is logged, so this level is usually only needed when debugging a problem. */ - static public final int LEVEL_TRACE = 1; - - /** - * The level of messages that will be logged. Compiling this and the booleans below as "final" will cause the compiler to - * remove all "if (Log.info) ..." type statements below the set level. - */ - static private int level = LEVEL_INFO; - - /** True when the ERROR level will be logged. */ - static public boolean ERROR = level <= LEVEL_ERROR; - /** True when the WARN level will be logged. */ - static public boolean WARN = level <= LEVEL_WARN; - /** True when the INFO level will be logged. */ - static public boolean INFO = level <= LEVEL_INFO; - /** True when the DEBUG level will be logged. */ - static public boolean DEBUG = level <= LEVEL_DEBUG; - /** True when the TRACE level will be logged. */ - static public boolean TRACE = level <= LEVEL_TRACE; - - /** - * Sets the level to log. If a version of this class is being used that has a final log level, this has no affect. - */ - static public void set (int level) { - // Comment out method contents when compiling fixed level JARs. - Log.level = level; - ERROR = level <= LEVEL_ERROR; - WARN = level <= LEVEL_WARN; - INFO = level <= LEVEL_INFO; - DEBUG = level <= LEVEL_DEBUG; - TRACE = level <= LEVEL_TRACE; - } - - static public void NONE () { - set(LEVEL_NONE); - } - - static public void ERROR () { - set(LEVEL_ERROR); - } - - static public void WARN () { - set(LEVEL_WARN); - } - - static public void INFO () { - set(LEVEL_INFO); - } - - static public void DEBUG () { - set(LEVEL_DEBUG); - } - - static public void TRACE () { - set(LEVEL_TRACE); - } - - /** - * Sets the logger that will write the log messages. - */ - static public void setLogger (Logger logger) { - Log.logger = logger; - } - - static private Logger logger = new Logger(); - - static public void error (String message, Throwable ex) { - if (ERROR) logger.log(LEVEL_ERROR, null, message, ex); - } - - static public void error (String category, String message, Throwable ex) { - if (ERROR) logger.log(LEVEL_ERROR, category, message, ex); - } - - static public void error (String message) { - if (ERROR) logger.log(LEVEL_ERROR, null, message, null); - } - - static public void error (String category, String message) { - if (ERROR) logger.log(LEVEL_ERROR, category, message, null); - } - - static public void warn (String message, Throwable ex) { - if (WARN) logger.log(LEVEL_WARN, null, message, ex); - } - - static public void warn (String category, String message, Throwable ex) { - if (WARN) logger.log(LEVEL_WARN, category, message, ex); - } - - static public void warn (String message) { - if (WARN) logger.log(LEVEL_WARN, null, message, null); - } - - static public void warn (String category, String message) { - if (WARN) logger.log(LEVEL_WARN, category, message, null); - } - - static public void info (String message, Throwable ex) { - if (INFO) logger.log(LEVEL_INFO, null, message, ex); - } - - static public void info (String category, String message, Throwable ex) { - if (INFO) logger.log(LEVEL_INFO, category, message, ex); - } - - static public void info (String message) { - if (INFO) logger.log(LEVEL_INFO, null, message, null); - } - - static public void info (String category, String message) { - if (INFO) logger.log(LEVEL_INFO, category, message, null); - } - - static public void debug (String message, Throwable ex) { - if (DEBUG) logger.log(LEVEL_DEBUG, null, message, ex); - } - - static public void debug (String category, String message, Throwable ex) { - if (DEBUG) logger.log(LEVEL_DEBUG, category, message, ex); - } - - static public void debug (String message) { - if (DEBUG) logger.log(LEVEL_DEBUG, null, message, null); - } - - static public void debug (String category, String message) { - if (DEBUG) logger.log(LEVEL_DEBUG, category, message, null); - } - - static public void trace (String message, Throwable ex) { - if (TRACE) logger.log(LEVEL_TRACE, null, message, ex); - } - - static public void trace (String category, String message, Throwable ex) { - if (TRACE) logger.log(LEVEL_TRACE, category, message, ex); - } - - static public void trace (String message) { - if (TRACE) logger.log(LEVEL_TRACE, null, message, null); - } - - static public void trace (String category, String message) { - if (TRACE) logger.log(LEVEL_TRACE, category, message, null); - } - - private Log () { - } - - /** - * Performs the actual logging. Default implementation logs to System.out. Extended and use {@link Log#logger} set to handle - * logging differently. - */ - static public class Logger { - private long firstLogTime = new Date().getTime(); - - public void log (int level, String category, String message, Throwable ex) { - StringBuilder builder = new StringBuilder(256); - - long time = new Date().getTime() - firstLogTime; - long minutes = time / (1000 * 60); - long seconds = time / (1000) % 60; - if (minutes <= 9) builder.append('0'); - builder.append(minutes); - builder.append(':'); - if (seconds <= 9) builder.append('0'); - builder.append(seconds); - - switch (level) { - case LEVEL_ERROR: - builder.append(" ERROR: "); - break; - case LEVEL_WARN: - builder.append(" WARN: "); - break; - case LEVEL_INFO: - builder.append(" INFO: "); - break; - case LEVEL_DEBUG: - builder.append(" DEBUG: "); - break; - case LEVEL_TRACE: - builder.append(" TRACE: "); - break; - } - - if (category != null) { - builder.append('['); - builder.append(category); - builder.append("] "); - } - - builder.append(message); - - if (ex != null) { - StringWriter writer = new StringWriter(256); - ex.printStackTrace(new PrintWriter(writer)); - builder.append('\n'); - builder.append(writer.toString().trim()); - } - - print(builder.toString()); - } - - /** - * Prints the message to System.out. Called by the default implementation of {@link #log(int, String, String, Throwable)}. - */ - protected void print (String message) { - System.out.println(message); - } - } -} diff --git a/src/forge/AIPlayer.java b/src/forge/AIPlayer.java index 34efa19c537..b9ae1836802 100644 --- a/src/forge/AIPlayer.java +++ b/src/forge/AIPlayer.java @@ -1,235 +1,290 @@ - -package forge; - -import java.util.Random; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; - - -public class AIPlayer extends Player{ - - public AIPlayer(String myName) { - this(myName, 20, 0); - } - - public AIPlayer(String myName, int myLife, int myPoisonCounters) { - super(myName, myLife, myPoisonCounters); - } - - public Player getOpponent() { - return AllZone.HumanPlayer; - } - - //////////////// - /// - /// Methods to ease transition to Abstract Player class - /// - /////////////// - - public boolean isHuman() { return false; } - public boolean isComputer() { return true; } - public boolean isPlayer(Player p1) { - return p1.getName().equals(this.name); - } - - /////////////// - /// - /// End transition methods - /// - /////////////// - - //////////////////////////////// - /// - /// replaces AllZone.GameAction.draw* methods - /// - //////////////////////////////// - - public void mayDrawCard() { - mayDrawCards(1); - } - - public void mayDrawCards(int n) { - if(AllZone.Computer_Library.size() > n) { - drawCards(n); - } - } - - 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.Computer_Library.size() ) { - //dredge library, put card in hand - AllZone.GameAction.moveToHand(c); - //put dredge number in graveyard - for(int i = 0; i < getDredgeNumber(c); i++) { - Card c2 = AllZone.Computer_Library.get(0); - AllZone.GameAction.moveToGraveyard(c2); - } - return true; - } - } - return false; - } - - //////////////////////////////// - /// - /// replaces AllZone.GameAction.discard* methods - /// - //////////////////////////////// - - 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 - - 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.ComputerPlayer.discard(num, sa, false); - } - - 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.ComputerPlayer); - - CardList blIP = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - - 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.GameAction.moveToLibrary(card, position); - } - else { - CardListUtil.sortAttackLowFirst(hand); - CardListUtil.sortNonFlyingFirst(hand); - - AllZone.GameAction.moveToLibrary(hand.get(0), position); - } - } - else { - CardListUtil.sortCMC(hand); - - AllZone.GameAction.moveToLibrary(hand.get(0), position); - } - } - } - - - /////////////////////////// - - 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.ComputerPlayer); - 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.ComputerPlayer); - 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.GameAction.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.GameAction.moveToLibrary(c); - topN.remove(r); - } - } - - 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.GameAction.sacrificeDestroy(c); - } - } - - protected void clashMoveToTopOrBottom(Card c) { - //computer just puts the card back until such time it can make a smarter decision - AllZone.GameAction.moveToLibrary(c); - } - -}//end AIPlayer class \ No newline at end of file +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 index 0eebd733d67..8d6e0f8dbde 100644 --- a/src/forge/AllZone.java +++ b/src/forge/AllZone.java @@ -1,9 +1,11 @@ package forge; -import forge.card.cardFactory.CardFactory; +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; @@ -12,121 +14,596 @@ 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"); - - public static final Player HumanPlayer = new HumanPlayer("Human"); - public static final Player ComputerPlayer = new AIPlayer("Computer"); - - public static forge.quest.data.QuestData QuestData = null; - public static Quest_Assignment QuestAssignment = null; - public static final NameChanger NameChanger = new NameChanger(); - - public static EndOfTurn EndOfTurn = new EndOfTurn(); - public static EndOfCombat EndOfCombat = new EndOfCombat(); - public static final Phase Phase = new Phase(); - + /** 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 - public static final CardFactory CardFactory = new CardFactory(ForgeProps.getFile(CARDSFOLDER)); - - public static final MagicStack Stack = new MagicStack(); - public static final InputControl InputControl = new InputControl(); - public static final GameAction GameAction = new GameAction(); - public static final StaticEffects StaticEffects = new StaticEffects(); - public static final GameInfo GameInfo = new GameInfo(); - - public static final TriggerHandler TriggerHandler = new TriggerHandler(); + /** 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 - public static ComputerAI_Input Computer; + /** Constant Computer */ + private static ComputerAI_Input Computer; //shared between Input_Attack, Input_Block, Input_CombatDamage , InputState_Computer - - public static Combat Combat = new Combat(); + + /** 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) - public final static PlayerZone Human_Battlefield = new PlayerZone_ComesIntoPlay(Constant.Zone.Battlefield, AllZone.HumanPlayer); - public final static PlayerZone Human_Hand = new DefaultPlayerZone(Constant.Zone.Hand , AllZone.HumanPlayer); - public final static PlayerZone Human_Graveyard = new DefaultPlayerZone(Constant.Zone.Graveyard , AllZone.HumanPlayer); - public final static PlayerZone Human_Library = new DefaultPlayerZone(Constant.Zone.Library , AllZone.HumanPlayer); - public final static PlayerZone Human_Exile = new DefaultPlayerZone(Constant.Zone.Exile, AllZone.HumanPlayer); - public final static PlayerZone Human_Command = new DefaultPlayerZone(Constant.Zone.Command, AllZone.HumanPlayer); + /** 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()); - public final static PlayerZone Computer_Battlefield = new PlayerZone_ComesIntoPlay(Constant.Zone.Battlefield , AllZone.ComputerPlayer); - public final static PlayerZone Computer_Hand = new DefaultPlayerZone(Constant.Zone.Hand , AllZone.ComputerPlayer); - public final static PlayerZone Computer_Graveyard = new DefaultPlayerZone(Constant.Zone.Graveyard , AllZone.ComputerPlayer); - public final static PlayerZone Computer_Library = new DefaultPlayerZone(Constant.Zone.Library , AllZone.ComputerPlayer); - public final static PlayerZone Computer_Exile = new DefaultPlayerZone(Constant.Zone.Exile, AllZone.ComputerPlayer); - public final static PlayerZone Computer_Command = new DefaultPlayerZone(Constant.Zone.Command, AllZone.ComputerPlayer); - - public final static PlayerZone Stack_Zone = new DefaultPlayerZone(Constant.Zone.Stack, null); - - public static final ManaPool ManaPool = new ManaPool(AllZone.HumanPlayer); - public static final ManaPool Computer_ManaPool = new ManaPool(AllZone.ComputerPlayer); - - public static Display Display; + /** 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()); - private final static Map map = new HashMap(); + /** Constant Stack_Zone */ + private final static PlayerZone Stack_Zone = new DefaultPlayerZone(Constant.Zone.Stack, null); - static - { - map.put(Constant.Zone.Graveyard + AllZone.HumanPlayer, Human_Graveyard); - map.put(Constant.Zone.Hand + AllZone.HumanPlayer, Human_Hand); - map.put(Constant.Zone.Library + AllZone.HumanPlayer, Human_Library); - map.put(Constant.Zone.Battlefield + AllZone.HumanPlayer, Human_Battlefield); - map.put(Constant.Zone.Exile + AllZone.HumanPlayer, Human_Exile); - map.put(Constant.Zone.Command + AllZone.HumanPlayer, Human_Command); - - map.put(Constant.Zone.Graveyard + AllZone.ComputerPlayer, Computer_Graveyard); - map.put(Constant.Zone.Hand + AllZone.ComputerPlayer, Computer_Hand); - map.put(Constant.Zone.Library + AllZone.ComputerPlayer, Computer_Library); - map.put(Constant.Zone.Battlefield + AllZone.ComputerPlayer, Computer_Battlefield); - map.put(Constant.Zone.Exile + AllZone.ComputerPlayer, Computer_Exile); - map.put(Constant.Zone.Command + AllZone.ComputerPlayer, Computer_Command); - - map.put(Constant.Zone.Stack + null , Stack_Zone); - + /** 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); } - public static PlayerZone getZone(Card c) - { - Iterator it = map.values().iterator(); - PlayerZone p; - while(it.hasNext()) - { - p = (PlayerZone)it.next(); - - if(AllZoneUtil.isCardInZone(p, c)) - return p; - } - return null; - } + private static long timestamp = 0; - public static PlayerZone getZone(String zone, Player player) - { - if(zone.equals("Stack")) player = null; - Object o = map.get(zone + player); - if(o == null) - throw new RuntimeException("AllZone : getZone() invalid parameters " +zone +" " +player); - - return (PlayerZone)o; + /** 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; } - public static void resetZoneMoveTracking() - { - ((DefaultPlayerZone)Human_Command).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Human_Library).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Human_Hand).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Human_Battlefield).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Human_Graveyard).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Computer_Command).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Computer_Library).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Computer_Hand).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Computer_Battlefield).resetCardsAddedThisTurn(); - ((DefaultPlayerZone)Computer_Graveyard).resetCardsAddedThisTurn(); + /** + *

getComputerPlayer.

+ * + * @return a {@link forge.Player} object. + * @since 1.0.15 + */ + public static Player getComputerPlayer() { + return ComputerPlayer; } -}//AllZone \ No newline at end of file + + /** + *

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 index 547455b124f..32c66886743 100644 --- a/src/forge/AllZoneUtil.java +++ b/src/forge/AllZoneUtil.java @@ -1,844 +1,953 @@ - -package forge; - - -import java.util.ArrayList; - -import forge.card.cardFactory.CardFactoryUtil; - -/** - * AllZoneUtil contains static functions used to get CardLists of various - * cards in various zones. - * - * @author dennis.r.friedrichsen (slapshot5 on slightlymagic.net) - * - */ -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.HumanPlayer)); - lands.addAll(getPlayerLandsInPlay(AllZone.ComputerPlayer)); - 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.HumanPlayer)); - cards.addAll(getPlayerCardsInPlay(AllZone.ComputerPlayer)); - 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.HumanPlayer)); - cards.addAll(getPlayerGraveyard(AllZone.ComputerPlayer)); - 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.HumanPlayer)); - cards.addAll(getPlayerGraveyard(AllZone.ComputerPlayer)); - 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.ComputerPlayer)); - cards.addAll(getPlayerCardsInExile(AllZone.HumanPlayer)); - 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 - */ - 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; - } - - public static boolean isCardExiled(Card c) { - return getCardsInExile().contains(c); - } - - public static boolean isCardInGrave(Card c) { - return getCardsInGraveyard().contains(c); - } - - ///Check if a certain card is in play - - 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; - } - - ///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 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.ComputerPlayer, color); - cards.addAll(getPlayerColorInPlay(AllZone.HumanPlayer, 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; - } - - 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; - } - - public static CardList getCardsInZone(String zone){ - return getCardsInZone(zone, null); - } - - public static CardList getCardsInZone(PlayerZone zone){ - return new CardList(zone.getCards()); - } - - 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.Human_Graveyard.getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.Computer_Graveyard.getCards()); - } - if (zone.contains(Constant.Zone.Hand)){ - if (player == null || player.isHuman()) - all.addAll(AllZone.Human_Hand.getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.Computer_Hand.getCards()); - } - if (zone.contains(Constant.Zone.Battlefield)){ - if (player == null || player.isHuman()) - all.addAll(AllZone.Human_Battlefield.getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.Computer_Battlefield.getCards()); - } - if (zone.contains(Constant.Zone.Exile)){ - if (player == null || player.isHuman()) - all.addAll(AllZone.Human_Exile.getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.Computer_Exile.getCards()); - } - if (zone.contains(Constant.Zone.Library)){ - if (player == null || player.isHuman()) - all.addAll(AllZone.Human_Library.getCards()); - if (player == null || player.isComputer()) - all.addAll(AllZone.Computer_Library.getCards()); - } - - return all; - } - - 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()); - } - - 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 CardListFilter tapped = new CardListFilter() { - public boolean addCard(Card c) { - return c.isTapped(); - } - }; - - /** - * a CardListFilter to get all cards that are untapped - */ - public static CardListFilter untapped = new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped(); - } - }; - - /** - * a CardListFilter to get all creatures - */ - public static CardListFilter creatures = new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature(); - } - }; - - /** - * a CardListFilter to get all enchantments - */ - public static CardListFilter enchantments = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchantment(); - } - }; - - /** - * a CardListFilter to get all equipment - */ - public static CardListFilter equipment = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEquipment(); - } - }; - - /** - * a CardListFilter to get all unenchanted cards in a list - */ - public static CardListFilter unenchanted = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all enchanted cards in a list - */ - public static CardListFilter enchanted = new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchanted(); - } - }; - - /** - * a CardListFilter to get all nontoken cards - */ - public static CardListFilter nonToken = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isToken(); - } - }; - - /** - * a CardListFilter to get all token cards - */ - public static CardListFilter token = new CardListFilter() { - public boolean addCard(Card c) { - return c.isToken(); - } - }; - - /** - * a CardListFilter to get all nonbasic lands - */ - public static CardListFilter nonBasicLand = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isBasicLand(); - } - }; - - /** - * a CardListFilter to get all basicLands - */ - public static 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 CardListFilter artifacts = new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all nonartifacts - */ - public static CardListFilter nonartifacts = new CardListFilter() { - public boolean addCard(Card c) { - return !c.isArtifact(); - } - }; - - /** - * a CardListFilter to get all lands - */ - public static CardListFilter lands = new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand(); - } - }; - - /** - * a CardListFilter to get all nonlands - */ - public static 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 CardListFilter black = new CardListFilter() { - public boolean addCard(Card c) { - return c.isBlack(); - } - }; - - /** - * a CardListFilter to get all cards that are blue - */ - public static CardListFilter blue = new CardListFilter() { - public boolean addCard(Card c) { - return c.isBlue(); - } - }; - - /** - * a CardListFilter to get all cards that are green - */ - public static CardListFilter green = new CardListFilter() { - public boolean addCard(Card c) { - return c.isGreen(); - } - }; - - /** - * a CardListFilter to get all cards that are red - */ - public static CardListFilter red = new CardListFilter() { - public boolean addCard(Card c) { - return c.isRed(); - } - }; - - /** - * a CardListFilter to get all cards that are white - */ - public static 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 - */ - public static CardList getCardsInGame(){ - CardList all = new CardList(); - all.addAll(AllZone.Human_Graveyard.getCards()); - all.addAll(AllZone.Human_Hand.getCards()); - all.addAll(AllZone.Human_Library.getCards()); - all.addAll(AllZone.Human_Battlefield.getCards()); - all.addAll(AllZone.Human_Exile.getCards()); - //should this include Human_Command ? - //all.addAll(AllZone.Human_Sideboard.getCards()); - - all.addAll(AllZone.Computer_Graveyard.getCards()); - all.addAll(AllZone.Computer_Hand.getCards()); - all.addAll(AllZone.Computer_Library.getCards()); - all.addAll(AllZone.Computer_Battlefield.getCards()); - all.addAll(AllZone.Computer_Exile.getCards()); - //should this include Computer_Command ? - //all.addAll(AllZone.Computer_Sideboard.getCards()); - - return all; - } - - 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.HumanPlayer); - list.add(AllZone.ComputerPlayer); - 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; - } - -}//end class AllZoneUtil \ No newline at end of file +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 index ca78091daf7..61e1a8367ef 100644 --- a/src/forge/Base64Coder.java +++ b/src/forge/Base64Coder.java @@ -1,235 +1,286 @@ -// 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. -*/ -public class Base64Coder { - -// The line separator string of the operating system. -private static final String systemLineSeparator = System.getProperty("line.separator"); - -// Mapping table from 6-bit nibbles to Base64 characters. -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. -private static byte[] map2 = new byte[128]; - static { - for (int i=0; isun.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 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 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 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 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 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 + *

+ * 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 index 56d19809fdd..04bb96fa071 100644 --- a/src/forge/BoosterDraft.java +++ b/src/forge/BoosterDraft.java @@ -1,320 +1,56 @@ package forge; -import java.io.File; -import java.util.ArrayList; - -import javax.swing.JOptionPane; - -import forge.gui.GuiUtils; - - import forge.deck.Deck; +import java.util.Map; +import java.util.TreeMap; -public interface BoosterDraft -{ - public CardList nextChoice(); - public void setChoice(Card c); - public boolean hasNextChoice(); - public Deck[] getDecks(); //size 7, all the computers decks - - public String LandSetCode[] = {""}; -} +/** + *

BoosterDraft interface.

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

nextChoice.

+ * + * @return a {@link forge.CardList} object. + */ + public CardList nextChoice(); -class BoosterDraft_1 implements BoosterDraft -{ - private final BoosterDraftAI draftAI = new BoosterDraftAI(); - private static final int nPlayers = 8; - //private static int boosterPackSize = 15; - private static int stopCount = 45; //boosterPackSize * 3;//should total of 45 + /** + *

setChoice.

+ * + * @param c a {@link forge.Card} object. + */ + public void setChoice(Card c); - private int currentCount = 0; - private CardList[] pack;//size 8 - //private BoosterGenerator packs[] = {new BoosterGenerator(), new BoosterGenerator(), new BoosterGenerator()}; - private ArrayList packs = new ArrayList(); - private int packNum = 0; + /** + *

hasNextChoice.

+ * + * @return a boolean. + */ + public boolean hasNextChoice(); - //helps the computer choose which booster packs to pick from - //the first row says "pick from boosters 1-7, skip 0" since the players picks from 0 - //the second row says "pick from 0 and 2-7 boosters, skip 1" - player chooses from 1 - private final int computerChoose[][] = { - { 1,2,3,4,5,6,7}, - {0, 2,3,4,5,6,7}, - {0,1, 3,4,5,6,7}, - {0,1,2, 4,5,6,7}, - {0,1,2,3, 5,6,7}, - {0,1,2,3,4, 6,7}, - {0,1,2,3,4,5, 7}, - {0,1,2,3,4,5,6 } - }; + /** + *

getDecks.

+ * + * @return an array of {@link forge.deck.Deck} objects. + */ + public Deck[] getDecks(); //size 7, all the computers decks - public static void main(String[] args) - { - BoosterDraft_1 draft = new BoosterDraft_1(); - while(draft.hasNextChoice()) - { - CardList list = draft.nextChoice(); - System.out.println(list.size()); - draft.setChoice(list.get(0)); - } - } - BoosterDraft_1() {pack = get8BoosterPack();} - - public BoosterDraft_1(String draftType) { - draftAI.bd = this; - - if (draftType.equals("Full")) { // Draft from all cards in Forge - BoosterGenerator bpFull = new BoosterGenerator(); - for (int i=0; i<3; i++) - packs.add(bpFull); - - LandSetCode[0] = AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer).getMostRecentSet(); - } - - else if (draftType.equals("Block")) { // Draft from cards by block or set - ArrayList bNames = SetInfoUtil.getBlockNameList(); - ArrayList rbNames = new ArrayList(); - for (int i=bNames.size() - 1; i>=0; i--) - rbNames.add(bNames.get(i)); - - Object o = GuiUtils.getChoice("Choose Block", rbNames.toArray()); - - ArrayList blockSets = SetInfoUtil.getSets_BlockName(o.toString()); - int nPacks = SetInfoUtil.getDraftPackCount(o.toString()); - - ArrayList setCombos = new ArrayList(); - - //if (blockSets.get(1).equals("") && blockSets.get(2).equals("")) { // Block only has one set - if (blockSets.size() == 1) { - BoosterGenerator bpOne = new BoosterGenerator(blockSets.get(0)); - int n = 0; - for (int i=0; i customs = new ArrayList(); - ArrayList customList = new ArrayList(); - - // get list of custom draft files - File dFolder = new File("res/draft/"); - if(!dFolder.exists()) - throw new RuntimeException("BoosterDraft : folder not found -- folder is " + dFolder.getAbsolutePath()); - - if (!dFolder.isDirectory()) - throw new RuntimeException("BoosterDraft : not a folder -- " + dFolder.getAbsolutePath()); - - dList = dFolder.list(); - - for (int i=0; i< dList.length; i++) { - if (dList[i].endsWith(".draft")) { - ArrayList dfData = FileUtil.readFile("res/draft/" + dList[i]); - - CustomDraft cd = new CustomDraft(); - - for (int j=0; jLandSetCode="{}" */ + public String LandSetCode[] = {""}; - if (packNum < packs.size()) { - for(int i = 0; i < list.length; i++) - //list[i].addAll(pack.getBoosterPack()); - list[i].addAll(packs.get(packNum).getBoosterPack()); - } + /** Constant draftFormat="{}" */ + public String draftFormat[] = {""}; - packNum++; - - return list; - }//get8BoosterPack() - - //size 7, all the computers decks - public Deck[] getDecks() {return draftAI.getDecks();} - - private void computerChoose() - { - int row[] = computerChoose[getMod()]; - - for(int i = 0; i < row.length; i++) - draftAI.choose(pack[row[i]], i); - }//computerChoose() - - private int getMod() {return currentCount % nPlayers;} - public boolean hasNextChoice() {return currentCount < stopCount;} - - public void setChoice(Card c) - { - CardList list = pack[getMod()]; - currentCount++; - - if(! list.contains(c)) - throw new RuntimeException("BoosterDraft : setChoice() error - card not found - " +c +" - booster pack = " +list); - - list.remove(c); - }//setChoice() + /** Constant draftPicks="{}" */ + public Map draftPicks = new TreeMap(); } -class CustomDraft { - public String Name; - public String Type; - public String DeckFile; - public Boolean IgnoreRarity; - public int NumCards = 15; - public int NumSpecials = 0; - public int NumMythics = 1; - public int NumRares = 1; - public int NumUncommons = 3; - public int NumCommons = 11; - public int NumPacks = 3; - public String LandSetCode = AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer).getMostRecentSet(); -} -class BoosterDraftTest implements BoosterDraft -{ - int n = 3; - public Deck[] getDecks() {return null;} - public CardList nextChoice() - { - n--; - ReadDraftBoosterPack pack = new ReadDraftBoosterPack(); - return pack.getBoosterPack(); - } - public void setChoice(Card c) {System.out.println(c.getName());} - public boolean hasNextChoice() - { - return n > 0; - } - public CardList getChosenCards() {return null;} - public CardList getUnchosenCards() {return null;} -} + + + diff --git a/src/forge/BoosterDraftAI.java b/src/forge/BoosterDraftAI.java index 48c4e096228..10eb98cded0 100644 --- a/src/forge/BoosterDraftAI.java +++ b/src/forge/BoosterDraftAI.java @@ -1,167 +1,146 @@ package forge; -import java.util.ArrayList; -import java.util.Comparator; - +import forge.card.spellability.Ability_Mana; import forge.deck.Deck; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Random; +import java.util.*; -import forge.card.spellability.Ability_Mana; +/** + *

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; -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; - 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][]; - //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(); - private static Map colorToLand = new HashMap(); + //picks one Card from in_choose, removes that card, and returns the list + //returns the cards not picked - public static void main(String[] args) - { - BoosterDraftAI ai = new BoosterDraftAI(); - ai.runTestPrint(); - } - public void runTestPrint() - { - BoosterDraftAI ai = new BoosterDraftAI(); - ai.runTest(ai); + /** + *

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 - Deck[] deck = ai.getDecks(); + if (Constant.Runtime.DevMode[0]) + System.out.println("Player[" + player + "] pack: " + in_choose.toString()); - for(int outer = 0; outer < 7; outer++) - { - System.out.print(deck[outer].countMain() +" - "); + CardList list = new CardList(); + boolean hasPicked = false; + Card pickedCard = new Card(); - for(int i = 0; i < 16; i++) - System.out.print(deck[outer].getMain(i) +", "); + 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; + } + }); - System.out.println(""); + 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); - System.out.println("\n"); - }//for outer - }//runTestPrint() + 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); - //throws Exception if error - public void runTest(BoosterDraftAI ai) - { - ReadDraftBoosterPack booster = new ReadDraftBoosterPack(); - for(int outer = 0; outer < 1; outer++) - { - CardList allBooster = new CardList(); - for(int i = 0; i < 21; i++) - allBooster.addAll(booster.getBoosterPack()); + 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); - //picks one Card from in_choose, removes that card, and returns the list - //returns the cards not picked - 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 + playerColors.get(player).Mana2 = playerColors.get(player).ColorToMana(playerColors.get(player).Color2); + hasPicked = true; + } + } else { + CardList typeList; + CardList colorList; - 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) { - return !(c.getSVar("RemAIDeck").equals("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); - 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)); - - - } - else { + 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); @@ -191,53 +170,46 @@ public class BoosterDraftAI hasPicked = true; } } -*/ - typeList = AIPlayables.getType("Artifact"); - if (typeList.size() > 0) { - CardListUtil.sortCMC(typeList); - list.add(typeList.get(0)); - } - - typeList = AIPlayables.getType("Land"); - if (typeList.size() > 0) { - for (int i=0; i maList = typeList.get(i).getManaAbility(); - for (int j=0; j 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() +*/ + 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 @@ -264,256 +236,258 @@ public class BoosterDraftAI }//checkDeckList() */ - //private int countCreatures(CardList list) {return list.getType("Creature").size();} + //private int countCreatures(CardList list) {return list.getType("Creature").size();} - private void testColors(int[] n) - { - if(n.length != nDecks) - throw new RuntimeException("BoosterDraftAI : testColors error, numbers array length does not equal 7"); + /** + *

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"); - HashSet set = new HashSet(); - for(int i = 0; i < nDecks; i++) - set.add(Integer.valueOf(n[i])); + 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"); + 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() + 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() - public Deck[] getDecks() - { - //check CardList[] deck for errors - //checkDeckList(deck); + /** + *

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]; + 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)); + 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; } - return out; - }//getDecks() - 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 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) { - - Random r = new Random(); - Card c = otherCreatures.get(r.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) { - Random r = new Random(); - Card c = others.get(r.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"); - Random r = new Random(); - Card c = z.get(r.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 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.CardFactory.getCard(ClrCnts[i].Color, AllZone.ComputerPlayer); - c.setCurSetCode(BoosterDraft.LandSetCode[0]); - outList.add(c); - landsNeeded--; - } - } - } - int n = 0; - while (landsNeeded > 0) { - if (ClrCnts[n].Count > 0) { - Card c = AllZone.CardFactory.getCard(ClrCnts[n].Color, AllZone.ComputerPlayer); - 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) { - Random r = new Random(); - Card c = outList.get(r.nextInt(outList.size() - 1)); - outList.remove(c); - AIPlayables.add(c); - } - - while (outList.size() < 40) { - Random r = new Random(); - Card c = AIPlayables.get(r.nextInt(AIPlayables.size() - 1)); - outList.add(c); - AIPlayables.remove(c); - } - if (outList.size() == 40) - { - for (i=0; igetDeckColors.

+ * + * @return an array of int. + */ + private int[] getDeckColors() { + int[] out = new int[nDecks]; + int start = MyRandom.random.nextInt(10); - return out; - }//getDeckColors() + 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); - 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"); + return out; + }//getDeckColors() - //initilize deck array and playerColors list - for(int i = 0; i < deck.length; i++) { - deck[i] = new CardList(); - playerColors.add(new deckColors()); - } - - }//BoosterDraftAI() + /** + *

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]]; - - 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}, + //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"); - {Constant.Color.Blue, Constant.Color.Green}, - {Constant.Color.Blue, Constant.Color.Red}, - {Constant.Color.Blue, Constant.Color.White}, + //initilize deck array and playerColors list + for (int i = 0; i < deck.length; i++) { + deck[i] = new CardList(); + playerColors.add(new DeckColors()); + } - {Constant.Color.Green, Constant.Color.Red}, - {Constant.Color.Green, Constant.Color.White}, + }//BoosterDraftAI() - {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 scoreA = ((attA + defA) / cmcA) + keyA + abA + trgA; - int scoreB = ((attB + defB) / cmcB) + keyB + abB + trgB; - - if (scoreA == scoreB) - return 0; - else if (scoreA > scoreB) - return 1; - else if (scoreB > scoreA) - return -1; - - return 0; - } - }; + + 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() -class CCnt -{ - public String Color; - public int Count; - - public CCnt(String clr, int cnt) - { - Color = clr; - Count = cnt; - } -} -class deckColors { - public String Color1 = "none"; - public String Color2 = "none"; - //public String Splash = "none"; - public String Mana1 = ""; - public String Mana2 = ""; - //public String ManaS = ""; - - public deckColors(String c1, String c2, String sp) { - Color1 = c1; - Color2 = c2; - //Splash = sp; - } - public deckColors() { - } - - public String ColorToMana(String color) { - String Mana[] = {"W", "U", "B", "R", "G"}; - - for (int i=0; iBoosterGenerator 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 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 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 int numCommons = 0; + private int numUncommons = 0; + private int numRares = 0; + private int numMythics = 0; + private int numSpecials = 0; - private Random r = new Random(); + //private Random r = new Random(); - public BoosterGenerator() { - numCommons = 11; - numUncommons = 3; - numRares = 1; - numMythics = 0; - numSpecials = 0; + /** + *

Constructor for BoosterGenerator.

+ */ + public BoosterGenerator() { + numCommons = 11; + numUncommons = 3; + numRares = 1; + numMythics = 0; + numSpecials = 0; - CardList tList = AllZone.CardFactory.getAllCards(); - for (int i=0; iConstructor 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; - 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)); - Deck dPool= dio.getDeck(DeckFile); - if (dPool == null) - throw new RuntimeException("BoosterGenerator : deck not found - " + DeckFile); - - CardList cList = new CardList(); - List tList = dPool.getMain(); + //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); - for (int i=0; i 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.CardFactory.getCard(cardName, AllZone.HumanPlayer); + Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); if (!setCode.equals("")) - c.setCurSetCode(setCode); + c.setCurSetCode(setCode); else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - c.setRandomSetCode(); + c.setRandomSetCode(); cList.add(c); - } + } - for (int i=0; iConstructor 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; - if (si != null) { - c.setCurSetCode(SetCode); + for (Card c : AllZone.getCardFactory()) { + SetInfo si = SetInfoUtil.getSetInfo_Code(c.getSets(), SetCode); - Random r = new Random(); - int n = si.PicCount; - if (n > 1) - c.setRandomPicture(r.nextInt(n-1) + 1); + if (si != null) { + c.setCurSetCode(SetCode); - addToRarity(c, si); - } - } + Random r = new Random(); + int n = si.PicCount; + if (n > 1) + c.setRandomPicture(r.nextInt(n - 1) + 1); - shuffleAll(); + addToRarity(c, si); + } + } - ArrayList bpData = FileUtil.readFile("res/boosterdata/" + SetCode + ".pack"); + 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:")) { + } else if (line.startsWith("Uncommons:")) { numUncommons = Integer.parseInt(line.substring(10)); - } - else if (line.startsWith("Rares:")) { + } else if (line.startsWith("Rares:")) { numRares = Integer.parseInt(line.substring(6)); - } - else if (line.startsWith("Mythics:")) { + } else if (line.startsWith("Mythics:")) { numMythics = Integer.parseInt(line.substring(8)); - } - else if (line.startsWith("Specials:")) { + } 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); + 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); } - } + } - 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); - } - } + /** + *

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); + } + } - private void shuffleAll() { + /** + *

shuffleAll.

+ */ + private void shuffleAll() { - if (commons.size() > 0) - commons.shuffle(); + if (commons.size() > 0) + commons.shuffle(); - if (uncommons.size() > 0) - uncommons.shuffle(); + if (uncommons.size() > 0) + uncommons.shuffle(); - if (rares.size() > 0) - rares.shuffle(); + if (rares.size() > 0) + rares.shuffle(); - if (mythics.size() > 0) - mythics.shuffle(); + if (mythics.size() > 0) + mythics.shuffle(); - if (specials.size() > 0) - specials.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()); - } - } + 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()); + } + } - public CardList getBoosterPack() { - CardList temp = new CardList(); + /** + *

getBoosterPack.

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

getBoosterPackSize.

+ * + * @return a int. + */ + public int getBoosterPackSize() { + return numCommons + numUncommons + numRares + numSpecials; + } } diff --git a/src/forge/BoosterPack.java b/src/forge/BoosterPack.java deleted file mode 100644 index 223f79d42eb..00000000000 --- a/src/forge/BoosterPack.java +++ /dev/null @@ -1,28 +0,0 @@ -package forge; - - -public class BoosterPack -{ - public static CardList getBoosterPack(int number) - { - CardList all = new CardList(); - for(int i = 0; i < number; i++) - all.addAll(getBoosterPack()); - - return all; - } - - public static CardList getBoosterPack() - { - CardList all = AllZone.CardFactory.getAllCards(); - CardList pack = new CardList(); - - for(int i = 0; i < 10; i++) - pack.add(all.get(MyRandom.random.nextInt(all.size()))); - - for(int i = 0; i < 5; i++) - pack.add(AllZone.CardFactory.copyCard(pack.get(i))); - - return pack; - }//getBoosterPack() -} \ No newline at end of file diff --git a/src/forge/ButtonUtil.java b/src/forge/ButtonUtil.java index c4681f543a2..dfc17021629 100644 --- a/src/forge/ButtonUtil.java +++ b/src/forge/ButtonUtil.java @@ -1,43 +1,84 @@ package forge; -public class ButtonUtil -{ - public static void reset() - { - getOK().setText("OK"); - getCancel().setText("Cancel"); - - getOK().setSelectable(false); - getCancel().setSelectable(false); + +/** + *

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); } - public static void enableOnlyOK() - { - getOK().setSelectable(true); - getCancel().setSelectable(false); + + /** + *

enableOnlyOK.

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

enableOnlyCancel.

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

disableAll.

+ */ + public static void disableAll() { + getOK().setSelectable(false); + getCancel().setSelectable(false); } - public static void enableAll() - { - getOK().setSelectable(true); - getCancel().setSelectable(true); - } - public static void disableOK() - { - getOK().setSelectable(false); - } - public static void disableCancel() - { - 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(); } - - private static MyButton getOK() {return AllZone.Display.getButtonOK();} - private static MyButton getCancel() {return AllZone.Display.getButtonCancel();} } diff --git a/src/forge/Card.java b/src/forge/Card.java index c1e247b034b..c486d641237 100644 --- a/src/forge/Card.java +++ b/src/forge/Card.java @@ -1,3573 +1,5800 @@ - -package forge; - - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.Random; -import java.util.Map.Entry; - -import com.esotericsoftware.minlog.Log; - -import forge.card.cardFactory.CardFactory; -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.trigger.Trigger; - -public class Card extends MyObservable { - private static int nextUniqueNumber; - private int uniqueNumber = nextUniqueNumber++; - - private long value; - - private HashMap triggeringObjects = new HashMap(); - private ArrayList triggers = new ArrayList(); - private ArrayList intrinsicAbility = new ArrayList(); - private ArrayList intrinsicKeyword = new ArrayList(); - private ArrayList extrinsicKeyword = new ArrayList(); - private ArrayList otherExtrinsicKeyword = 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 rememberedObjects = new ArrayList(); - private ArrayList imprintedCards = new ArrayList(); - - private HashMap receivedDamageFromThisTurn = new HashMap(); - private HashMap dealtDamageToThisTurn = new HashMap(); - private HashMap assignedDamageHashMap = new HashMap(); - - 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 dealtCombatDmgToOppThisTurn = false; - private boolean dealtDmgToHumanThisTurn = false; - private boolean dealtDmgToComputerThisTurn = false; - private boolean sirenAttackOrDestroy = false; - private boolean exaltedBonus = false; - private boolean faceDown = false; - private boolean sacrificeAtEOT = false; - private boolean kicked = false; - private boolean evoked = false; - private boolean reflectedLand = false; - private boolean levelUp = false; - private boolean bounceAtUntap = false; - private boolean finishedEnteringBF = false; - - private boolean firstStrike = false; - private boolean doubleStrike = 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 int exaltedMagnitude = 0; - - private int baseAttack; - private int baseDefense; - private int baseLoyalty = 0; - private String baseAttackString = null; - private String baseDefenseString = null; - - private int damage; - - private int nShield; - 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 otherAttackBoost = 0; - private int otherDefenseBoost = 0; - - private int randomPicture = 0; - - private int upkeepDamage = 0; - - private int X = 0; - - private int xManaCostPaid = 0; - - private int xLifePaid = 0; - - private int multiKickerMagnitude = 0; - private int replicateMagnitude = 0; - - private int sunburstValue = 0; - - 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 upkeepCost = ""; - private String echoCost = ""; - private String madnessCost = ""; - private String chosenType = ""; - private String chosenColor = ""; - private String namedCard = ""; - private String topCardName = ""; - private String reflectableMana = ""; - 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 comesIntoPlayCommandList = new ArrayList(); - private ArrayList destroyCommandList = new ArrayList(); - private ArrayList leavesPlayCommandList = 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 Hashtable counters = new Hashtable(); - private Hashtable SVars = new Hashtable(); - - //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 - - private int abilityUsed; //How many times has this ability been used? - - public void addRemembered(Object o) - { - rememberedObjects.add(o); - } - - public ArrayList getRemembered() - { - return rememberedObjects; - } - - public void clearRemembered() - { - rememberedObjects.clear(); - } - - public void addImprinted(Card c) { - imprintedCards.add(c); - } - - public void addImprinted(ArrayList list) { - imprintedCards.addAll(list); - } - - public ArrayList getImprinted() { - return imprintedCards; - } - - public void clearImprinted() { - imprintedCards.clear(); - } - - public Trigger addTrigger(Trigger t) - { - Trigger newtrig = t.getCopy(); - newtrig.setHostCard(this); - triggers.add(newtrig); - return newtrig; - } - - public void removeTrigger(Trigger t) { - triggers.remove(t); - } - - public ArrayList getTriggers() - { - return triggers; - } - - public Trigger getNamedTrigger(String name) - { - for(Trigger t : triggers) - { - if(t.getName() != null) - { - if(t.getName().equals(name)) - { - return t; - } - } - } - - return null; - } - - public void setTriggers(ArrayList trigs) - { - for(Trigger t : trigs) - { - Trigger newtrig = t.getCopy(); - newtrig.setHostCard(this); - triggers.add(newtrig); - } - } - - public void clearTriggersNew() - { - triggers.clear(); - } - - public Object getTriggeringObject(String type) - { - return triggeringObjects.get(type); - } - - public void setAbilityUsed(int i) { - abilityUsed = i; - } - - public int getAbilityUsed() { - return abilityUsed; - } - - public int getSunburstValue() - { - return sunburstValue; - } - - public void setSunburstValue(int value) - { - sunburstValue = value; - } - - //****************TOhaveDOne:Use somehow - public void setX(int i) { - X = i; - } - - public int getX() { - return X; - } - - //***************/ - - public void addXManaCostPaid(int n) - { - xManaCostPaid += n; - } - - public void setXManaCostPaid(int n) - { - xManaCostPaid = n; - } - - public int getXManaCostPaid() - { - return xManaCostPaid; - } - - public void setXLifePaid(int n) - { - xLifePaid = n; - } - - public int getXLifePaid() - { - return xLifePaid; - } - - //used to see if an attacking creature with a triggering attack ability triggered this phase: - public void setCreatureAttackedThisCombat(boolean b) { - creatureAttackedThisCombat = b; - if(true == b) { - setCreatureAttackedThisTurn(true); - } - } - - public boolean getCreatureAttackedThisCombat() { - return creatureAttackedThisCombat; - } - - public void setCreatureAttackedThisTurn(boolean b) { - creatureAttackedThisTurn = b; - } - - public boolean getCreatureAttackedThisTurn() { - return creatureAttackedThisTurn; - } - - public void setCreatureBlockedThisCombat(boolean b) { - creatureBlockedThisCombat = b; - } - - public boolean getCreatureBlockedThisCombat() { - return creatureBlockedThisCombat; - } - - public void setCreatureGotBlockedThisCombat(boolean b) { - creatureGotBlockedThisCombat = b; - } - - public boolean getCreatureGotBlockedThisCombat() { - return creatureGotBlockedThisCombat; - } - /* - public void setDealtCombatDmgToOppThisTurn(boolean b) { - dealtCombatDmgToOppThisTurn = b; - } - - public boolean getDealtCombatDmgToOppThisTurn() { - return dealtCombatDmgToOppThisTurn; - }*/ - - public boolean canAnyPlayerActivate() { - for(SpellAbility s : spellAbility) - { - if (s.getRestrictions().getAnyPlayer()) - return true; - } - return false; - } - - public void setDealtDmgToHumanThisTurn(boolean b) { - dealtDmgToHumanThisTurn = b; - } - - public boolean getDealtDmgToHumanThisTurn() { - return dealtDmgToHumanThisTurn; - } - - public void setDealtDmgToComputerThisTurn(boolean b) { - dealtDmgToComputerThisTurn = b; - } - - public boolean getDealtDmgToComputerThisTurn() { - return dealtDmgToComputerThisTurn; - } - - public void setSirenAttackOrDestroy(boolean b) { - sirenAttackOrDestroy = b; - } - - public boolean getSirenAttackOrDestroy() { - return sirenAttackOrDestroy; - } - - public ArrayList getClones() { - return clones; - } - - public void setClones(ArrayList c) { - clones.clear(); - clones.addAll(c); - } - - public void addClone(Card c) { - clones.add(c); - } - - public void addClones(ArrayList c) { - clones.addAll(c); - } - - public void clearClones() { - clones.clear(); - } - - public Card getCloneOrigin() { - return cloneOrigin; - } - - public void setCloneOrigin(Card name) { - cloneOrigin = name; - } - - public Command getCloneLeavesPlayCommand() { - return cloneLeavesPlayCommand; - } - - public void setCloneLeavesPlayCommand(Command com) { - cloneLeavesPlayCommand = com; - } - - public Card getCurrentlyCloningCard() { - return currentlyCloningCard; - } - - public void setCurrentlyCloningCard(Card c) { - currentlyCloningCard = c; - } - - public boolean getSacrificeAtEOT() { - return sacrificeAtEOT || hasKeyword("At the beginning of the end step, sacrifice CARDNAME."); - } - - public void setSacrificeAtEOT(boolean sacrificeAtEOT) { - this.sacrificeAtEOT = sacrificeAtEOT; - } - - public boolean getBounceAtUntap() { - return bounceAtUntap; - } - - public void setBounceAtUntap(boolean bounce) { - this.bounceAtUntap = bounce; - } - - public boolean getFinishedEnteringBF() { - return finishedEnteringBF; - } - - public void setFinishedEnteringBF(boolean b) { - this.finishedEnteringBF = b; - } - - public boolean hasFirstStrike() { - return firstStrike || hasKeyword("First Strike"); - } - - public void setFirstStrike(boolean firstStrike) { - this.firstStrike = firstStrike; - } - - public void setDoubleStrike(boolean doubleStrike) { - this.doubleStrike = doubleStrike; - } - - public boolean hasDoubleStrike() { - return doubleStrike || hasKeyword("Double Strike"); - } - - public boolean hasSecondStrike() { - return !hasFirstStrike() || (hasFirstStrike() && hasDoubleStrike()); - }; - - //for costs (like Planeswalker abilities) Doubling Season gets ignored. - 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.TriggerHandler.runTrigger("CounterAdded", runParams); - */ - - this.updateObservers(); - } - - 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 - HashMap runParams = new HashMap(); - runParams.put("Card", this); - runParams.put("CounterType", counterName); - for(int i=0;i<(multiplier*n);i++) - { - AllZone.TriggerHandler.runTrigger("CounterAdded", runParams); - } - - AllZone.GameAction.checkStateEffects(); - - this.updateObservers(); - } - - 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 = CardFactory.hasKeyword(this, "Vanishing") != -1; - - if(hasVanish && AllZoneUtil.isCardInPlay(this)) - AllZone.GameAction.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.Phase.setSkipPhase(false); - AllZone.GameAction.playCardNoCost(c); - } - } - - AllZone.GameAction.checkStateEffects(); - - this.updateObservers(); - } - } - - public int getCounters(Counters counterName) { - if(counters.containsKey(counterName)) { - return counters.get(counterName); - } else return 0; - } - - //get all counters from a card - public Hashtable getCounters() { - return counters; - } - - public boolean hasCounters() - { - return counters.size() > 0; - } - - 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 - public void setCounters(Hashtable allCounters) { - counters = allCounters; - } - - //get all counters from a card - public void clearCounters() { - counters = new Hashtable(); - } - - /** - * 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; - } - - public void setLevelUp(boolean b) - { - levelUp = b; - } - - public String getSVar(String Var) { - if(SVars.containsKey(Var)) return SVars.get(Var); - else return ""; - } - - public void setSVar(String Var, String str) { - if(SVars.containsKey(Var)) SVars.remove(Var); - - SVars.put(Var, str); - } - - public Hashtable getSVars() - { - return SVars; - } - - public void setSVars(Hashtable newSVars) - { - SVars = newSVars; - } - - 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; - } - - public int getNetPTCounters() { - return getCounters(Counters.P1P1) - getCounters(Counters.M1M1); - } - - public int getTurnInZone() { - return turnInZone; - } - - public void setTurnInZone(int turn) { - turnInZone = turn; - } - - public void setEchoCost(String s) { - echoCost = s; - } - - public String getEchoCost() { - return echoCost; - } - - public void setManaCost(String s) { - manaCost = s; - } - - public String getManaCost() { - return manaCost; - } - - public void addColor(String s){ - if (s.equals("")) - s = "0"; - cardColor.add(new Card_Color(new ManaCost(s), this, false, true)); - } - - 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(); - } - - 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); - } - - public Card_Color determineColor(){ - if (this.isImmutable()){ - return new Card_Color(this); - } - Card_Color colors = null; - ArrayList globalChanges = AllZone.GameInfo.getColorChanges(); - colors = determineColor(globalChanges); - colors.fixColorless(); - return colors; - } - - public void setColor(ArrayList colors){ - cardColor = colors; - } - - 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; - } - - public int getCMC() - { - return CardUtil.getConvertedManaCost(manaCost); - } - - public void setUpkeepCost(String s) { - upkeepCost = s; - } - - public String getUpkeepCost() { - return upkeepCost; - } - - public boolean hasUpkeepCost() { - return upkeepCost.length() > 0 && !upkeepCost.equals("0"); - } - - //used for cards like Belbe's Portal, Conspiracy, Cover of Darkness, etc. - public String getChosenType() { - return chosenType; - } - - public void setChosenType(String s) { - chosenType = s; - } - - public String getChosenColor() { - return chosenColor; - } - - public void setChosenColor(String s) { - chosenColor = s; - } - - //used for cards like Meddling Mage... - public String getNamedCard() { - return namedCard; - } - - public void setNamedCard(String s) { - namedCard = s; - } - - public String getTopCardName() { - return topCardName; - } - - public void setTopCardName(String s) { - topCardName = s; - } - - public void setDrawnThisTurn(boolean b) { - drawnThisTurn = b; - } - - public boolean getDrawnThisTurn() { - return drawnThisTurn; - } - - public String getReflectableMana() { - return reflectableMana; - } - - public void setReflectableMana(String s) { - reflectableMana = s; - } - - /** - * 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 - */ - 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) - */ - 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); - } - - public void clearGainControlReleaseCommands() { - gainControlReleaseCommands.clear(); - } - - public String getSpellText() { - return text; - } - - public void setText(String t) { - text = t; - } - - // get the text that should be displayed - 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 ruleswise) - 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 - 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("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("stPump")) { - String k[] = keyword.get(i).split(":",5); - if (!k[4].contains("no text")) sbLong.append(k[4]).append("\r\n"); - } else if (keyword.get(i).toString().contains("stSetPT")) { - String k[] = keyword.get(i).split(":",10); - if(k.length > 8) sbLong.append(k[9]).append("\r\n"); - else if(k.length > 5) sbLong.append(k[6]).append("\r\n"); - else sbLong.append(k[3]).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).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")) { - 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(":"); - 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(kk[1]); - sbLong.append(" (When this enters the battlefield, sacrifice it unless you exile another ").append(kk[1]); - 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")) { - sbLong.append(keyword.get(i)); - sbLong.append(" (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)"); - } - 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 - 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"); - } - } - - // 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"); - } - } - - // Draw a card. + Changeling + CARDNAME can't be countered. + Cascade - 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"))) { - 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"); - - // Triggered abilities - for(Trigger trig : triggers) - { - if(!trig.isSecondary()) - { - sb.append(trig.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){ - // 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){ - sb.insert(0, "\r\n"); - sb.insert(0, sAbility); - } - else{ - sb.append(sAbility); - sb.append("\r\n"); - } - } - - // 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() - - public ArrayList getManaAbility() { - return new ArrayList(manaAbility); - } - - // Returns basic mana abilities plus "reflected mana" abilities - public ArrayList getAIPlayableMana() { - ArrayList res = new ArrayList(); - for(Ability_Mana am:getManaAbility()) - if(am.isBasic() && am.isUndoable() && !res.contains(am)) { - res.add(am); - } else if (am.isReflectedMana() && !res.contains(am)) { - res.add(am); - } - - return res; - - } - - public ArrayList getBasicMana() { - ArrayList res = new ArrayList(); - for(Ability_Mana am:getManaAbility()) - if(am.isBasic() && !res.contains(am)) res.add(am); - return res; - } - - public void clearFirstSpellAbility(){ - spellAbility.remove(0); - } - - public void clearAllButFirstSpellAbility(){ - if(!spellAbility.isEmpty()) { - SpellAbility first = spellAbility.get(0); - spellAbility.clear(); - spellAbility.add(first); - } - manaAbility.clear(); - } - - 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; - } - - public void clearSpellAbility() { - spellAbility.clear(); - manaAbility.clear(); - } - - public Spell_Permanent getSpellPermanent() { - for(SpellAbility sa:spellAbility) { - if(sa instanceof Spell_Permanent) return (Spell_Permanent)sa; - } - return null; - } - - public void clearSpellKeepManaAbility() { - spellAbility.clear(); - } - - public void clearManaAbility() { - manaAbility.clear(); - } - - - public void addFirstSpellAbility(SpellAbility a){ - a.setSourceCard(this); - if(a instanceof Ability_Mana) manaAbility.add(0, (Ability_Mana) a); - else spellAbility.add(0, a); - } - - public void addSpellAbility(SpellAbility a) { - a.setSourceCard(this); - if(a instanceof Ability_Mana) manaAbility.add((Ability_Mana) a); - else spellAbility.add(a); - } - - 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); - } - - - 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); - } - } - - public ArrayList getIntrinsicManaAbilitiesDescriptions() { - ArrayList list = new ArrayList(); - for(SpellAbility var:manaAbility) { - if(var.isIntrinsic()) list.add(var.toString()); - } - return list; - } - - public SpellAbility[] getSpellAbility() { - ArrayList res = new ArrayList(spellAbility); - res.addAll(getManaAbility()); - SpellAbility[] s = new SpellAbility[res.size()]; - res.toArray(s); - return s; - } - - public ArrayList getSpellAbilities() { - ArrayList res = new ArrayList(spellAbility); - res.addAll(getManaAbility()); - return res; - } - - public ArrayList getSpells() { - ArrayList s = new ArrayList(spellAbility); - ArrayList res = new ArrayList(); - - for(SpellAbility sa:s) { - if(sa.isSpell()) res.add(sa); - } - return res; - } - - 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; - } - - 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 - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - public int getPreventNextDamage() { - return preventNextDamage; - } - - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - - //shield = regeneration - public void setShield(int n) { - nShield = n; - } - - public int getShield() { - return nShield; - } - - public void addShield() { - nShield++; - } - - public void subtractShield() { - nShield--; - } - - public void resetShield() { - nShield = 0; - } - - public boolean canBeShielded() { - return !hasKeyword("CARDNAME can't be regenerated."); - } - - //is this "Card" supposed to be a token? - public void setToken(boolean b) { - token = b; - } - - public boolean isToken() { - return token; - } - - public void setCopiedToken(boolean b) - { - copiedToken = b; - } - - public boolean isCopiedToken() { - return copiedToken; - } - public void setCopiedSpell(boolean b) - { - copiedSpell = b; - } - - public boolean isCopiedSpell() { - return copiedSpell; - } - public void addSpellChoice(String string) - { - ChoicesMade.add(string); - } - - public ArrayList getChoices() { - return ChoicesMade; - } - public String getChoice(int i) { - return ChoicesMade.get(i); - } - - public void setSpellChoiceTarget(String string) - { - Targets_for_Choices.add(string); - } - - public ArrayList getChoiceTargets() { - return Targets_for_Choices; - } - public String getChoiceTarget(int i) { - return Targets_for_Choices.get(i); - } - - public void setSpellWithChoices(boolean b) - { - SpellwithChoices = b; - } - - public boolean hasChoices() { - return SpellwithChoices; - } - public void setCopiesSpells(boolean b) - { - SpellCopyingCard = b; - } - public boolean copiesSpells() { - return SpellCopyingCard; - } - public void setExaltedBonus(boolean b) { - exaltedBonus = b; - } - - public boolean hasExaltedBonus() { - return exaltedBonus; - } - - public void setExaltedMagnitude(int i) { - exaltedMagnitude = i; - } - - public int getExaltedMagnitude() { - return exaltedMagnitude; - } - - public void setIsFaceDown(boolean b) { - faceDown = b; - } - - public boolean isFaceDown() { - return faceDown; - } - - public void addTrigger(Command c, ZCTrigger type) { - zcTriggers.add(new Ability_Triggered(this, c, type)); - } - - public void removeTrigger(Command c, ZCTrigger type) { - zcTriggers.remove(new Ability_Triggered(this, c, type)); - } - - public void executeTrigger(ZCTrigger type) { - for(Ability_Triggered t:zcTriggers) - if(t.trigger.equals(type) && t.isBasic()) t.execute();//AllZone.Stack.addSimultaneousStackEntry(t); - } - - public void clearTriggers() { - zcTriggers.clear(); - } - - public void addComesIntoPlayCommand(Command c) { - addTrigger(c, ZCTrigger.ENTERFIELD); - } - - public void removeComesIntoPlayCommand(Command c) { - removeTrigger(c, ZCTrigger.ENTERFIELD); - } - - public void comesIntoPlay() { - executeTrigger(ZCTrigger.ENTERFIELD); - } - - public void addTurnFaceUpCommand(Command c) { - turnFaceUpCommandList.add(c); - } - - public void removeTurnFaceUpCommand(Command c) { - turnFaceUpCommandList.remove(c); - } - - public void turnFaceUp() { - for(Command var:turnFaceUpCommandList) - var.execute(); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", this); - AllZone.TriggerHandler.runTrigger("TurnFaceUp", runParams); - } - - public void addDestroyCommand(Command c) { - addTrigger(c, ZCTrigger.DESTROY); - } - - public void removeDestroyCommand(Command c) { - removeTrigger(c, ZCTrigger.DESTROY); - } - - public void destroy() { - executeTrigger(ZCTrigger.DESTROY); - } - - public void addLeavesPlayCommand(Command c) { - addTrigger(c, ZCTrigger.LEAVEFIELD); - } - - public void removeLeavesPlayCommand(Command c) { - removeTrigger(c, ZCTrigger.LEAVEFIELD); - } - - public void leavesPlay() { - executeTrigger(ZCTrigger.LEAVEFIELD); - } - - public void addEquipCommand(Command c) { - equipCommandList.add(c); - } - - public void removeEquipCommand(Command c) { - equipCommandList.remove(c); - } - - public void equip() { - for(Command var:equipCommandList) - var.execute(); - } - - public void addUnEquipCommand(Command c) { - unEquipCommandList.add(c); - } - - public void removeUnEquipCommand(Command c) { - unEquipCommandList.remove(c); - } - - public void unEquip() { - for(Command var:unEquipCommandList) - var.execute(); - } - - public void addEnchantCommand(Command c) { - enchantCommandList.add(c); - } - - public void clearEnchantCommand() { - enchantCommandList.clear(); - } - - public void enchant() { - for(Command var:enchantCommandList) - var.execute(); - } - - public void addUnEnchantCommand(Command c) { - unEnchantCommandList.add(c); - } - - public void clearUnEnchantCommand() { - unEnchantCommandList.clear(); - } - - public void unEnchant() { - for(Command var:unEnchantCommandList) - var.execute(); - } - - public void addUntapCommand(Command c) { - untapCommandList.add(c); - } - - public void addChangeControllerCommand(Command c) { - changeControllerCommandList.add(c); - } - - public ArrayList getReplaceMoveToGraveyard() { - return replaceMoveToGraveyardCommandList; - } - - public void addReplaceMoveToGraveyardCommand(Command c) { - replaceMoveToGraveyardCommandList.add(c); - } - - public void clearReplaceMoveToGraveyardCommandList() { - replaceMoveToGraveyardCommandList.clear(); - } - - public void replaceMoveToGraveyard() { - for(Command var:replaceMoveToGraveyardCommandList) - var.execute(); - } - - public void addCycleCommand(Command c) { - cycleCommandList.add(c); - } - - public void cycle() { - for(Command var:cycleCommandList) - var.execute(); - } - - public void setSickness(boolean b) { - sickness = b; - } - - public boolean hasSickness() { - if(hasKeyword("Haste")) return false; - - return sickness; - } - - public boolean isSick() { - if(hasKeyword("Haste")) return false; - - return sickness && isCreature(); - } - - public void setRarity(String s) { - rarity = s; - } - - public String getRarity() { - return rarity; - } - - public void setImageName(String s) { - imageName = s; - } - - public String getImageName() { - if(!imageName.equals("")) return imageName; - return name; - } - - public String getName() { - return name; - } - - public Player getOwner() { - return owner; - } - - public Player getController() { - return controller; - } - - public void setName(String s) { - name = s; - this.updateObservers(); - } - - public void setOwner(Player player) { - owner = player; - this.updateObservers(); - } - - public void setController(Player player) { - if( null != controller && !controller.isPlayer(player)) { - for(Command var:changeControllerCommandList) - var.execute(); - } - controller = player; - this.updateObservers(); - } - - public ArrayList getEquippedBy() { - return equippedBy; - } - - public void setEquippedBy(ArrayList list) { - equippedBy = list; - } - - public ArrayList getEquipping() { - return equipping; - } - - public Card getEquippingCard() { - if (equipping.size() == 0) - return null; - return equipping.get(0); - } - - public void setEquipping(ArrayList list) { - equipping = list; - } - - public boolean isEquipped() { - return equippedBy.size() != 0; - } - - public boolean isEquipping() { - return equipping.size() != 0; - } - - public void addEquippedBy(Card c) { - equippedBy.add(c); - this.updateObservers(); - } - - public void removeEquippedBy(Card c) { - equippedBy.remove(c); - this.updateObservers(); - } - - public void addEquipping(Card c) { - equipping.add(c); - this.updateObservers(); - } - - public void removeEquipping(Card c) { - equipping.remove(c); - this.updateObservers(); - } - - public void equipCard(Card c) //equipment.equipCard(cardToBeEquipped); - { - equipping.add(c); - c.addEquippedBy(this); - this.equip(); - } - - public void unEquipCard(Card c) //equipment.unEquipCard(equippedCard); - { - this.unEquip(); - equipping.remove(c); - c.removeEquippedBy(this); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Equipment", this); - runParams.put("Card", c); - AllZone.TriggerHandler.runTrigger("Unequip", runParams); - } - - public void unEquipAllCards() { - while(equippedBy.size() > 0){ // while there exists equipment, unequip the first one - equippedBy.get(0).unEquipCard(this); - } - } - - public ArrayList getEnchantedBy() { - return enchantedBy; - } - - public void setEnchantedBy(ArrayList list) { - enchantedBy = list; - } - - public ArrayList getEnchanting() { - return enchanting; - } - - public Card getEnchantingCard() { - if (enchanting.size() == 0) - return null; - return enchanting.get(0); - } - - public void setEnchanting(ArrayList list) { - enchanting = list; - } - - public boolean isEnchanted() { - return enchantedBy.size() != 0; - } - - public boolean isEnchanting() {; - return enchanting.size() != 0; - } - - public void addEnchantedBy(Card c) { - enchantedBy.add(c); - this.updateObservers(); - } - - 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; - } - - public void addEnchanting(Card c) { - enchanting.add(c); - this.updateObservers(); - } - - public void removeEnchanting(Card c) { - enchanting.remove(c); - this.updateObservers(); - } - - public void enchantCard(Card c) { - enchanting.add(c); - c.addEnchantedBy(this); - this.enchant(); - } - - public void unEnchantCard(Card c) { - this.unEnchant(); - enchanting.remove(c); - c.removeEnchantedBy(this); - } - - 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 - public Card[] getAttachedCards() { - Card c[] = new Card[attached.size()]; - attached.toArray(c); - return c; - } - - public boolean hasAttachedCards() { - return getAttachedCards().length != 0; - } - - public void attachCard(Card c) { - attached.add(c); - this.updateObservers(); - } - - public void unattachCard(Card c) { - attached.remove(c); - this.updateObservers(); - } - - public void setType(ArrayList a) { - type = new ArrayList(a); - } - - public void addType(String a) { - type.add(a); - this.updateObservers(); - } - - public void removeType(String a) { - type.remove(a); - this.updateObservers(); - } - - public ArrayList getType() { - return new ArrayList(type); - } - - public ArrayList clearAllTypes() { - ArrayList originalTypes = new ArrayList(); - originalTypes.addAll(type); - type.clear(); - return originalTypes; - } - - public void setPrevType(ArrayList a) { - prevType = new ArrayList(a); - } - - public void addPrevType(String a) { - prevType.add(a); - } - - public void removePrevType(String a) { - prevType.remove(a); - } - - public ArrayList getPrevType() { - return new ArrayList(prevType); - } - - //values that are printed on card - public int getBaseLoyalty() { - return baseLoyalty; - } - - //values that are printed on card - public void setBaseLoyalty(int n) { - baseLoyalty = n; - } - - //values that are printed on card - public int getBaseAttack() { - return baseAttack; - } - - public int getBaseDefense() { - return baseDefense; - } - - //values that are printed on card - public void setBaseAttack(int n) { - baseAttack = n; - this.updateObservers(); - } - - public void setBaseDefense(int n) { - baseDefense = n; - this.updateObservers(); - } - - //values that are printed on card - public String getBaseAttackString() { - return (null == baseAttackString) ? ""+getBaseAttack() : baseAttackString; - } - - public String getBaseDefenseString() { - return (null == baseDefenseString) ? ""+getBaseDefense() : baseDefenseString; - } - - //values that are printed on card - public void setBaseAttackString(String s) { - baseAttackString = s; - this.updateObservers(); - } - - public void setBaseDefenseString(String s) { - baseDefenseString = s; - this.updateObservers(); - } - - public int getUnswitchedAttack() { - int total = getBaseAttack(); - total += getTempAttackBoost() + getSemiPermanentAttackBoost() + getOtherAttackBoost() - + 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; - } - - public int getNetAttack() { - if(this.getAmountOfKeyword("CARDNAME's power and toughness are switched") % 2 != 0 ) return getUnswitchedDefense(); - else return getUnswitchedAttack(); - } - - public int getUnswitchedDefense() { - int total = getBaseDefense(); - total += getTempDefenseBoost() + getSemiPermanentDefenseBoost() + getOtherDefenseBoost() - + 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; - } - - 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 - public int getNetCombatDamage() { - if (AllZoneUtil.isCardInPlay("Doran, the Siege Tower")) return getNetDefense(); - return getNetAttack(); - } - - public void setRandomPicture(int n) { - randomPicture = n; - } - - public int getRandomPicture() { - return randomPicture; - } - - public void setUpkeepDamage(int n) { - upkeepDamage = n; - } - - public int getUpkeepDamage() { - return upkeepDamage; - } - - public void addMultiKickerMagnitude(int n) - { - multiKickerMagnitude += n; - } - - public void setMultiKickerMagnitude(int n) - { - multiKickerMagnitude = n; - } - - public int getMultiKickerMagnitude() - { - return multiKickerMagnitude; - } - - public void addReplicateMagnitude(int n) { - replicateMagnitude += n; - } - - public void setReplicateMagnitude(int n) { - replicateMagnitude = n; - } - - public int getReplicateMagnitude() { - return replicateMagnitude; - } - - //for cards like Giant Growth, etc. - public int getTempAttackBoost() { - return tempAttackBoost; - } - - public int getTempDefenseBoost() { - return tempDefenseBoost; - } - - public void addTempAttackBoost(int n) { - tempAttackBoost += n; - this.updateObservers(); - } - - public void addTempDefenseBoost(int n) { - tempDefenseBoost += n; - this.updateObservers(); - } - - public void setTempAttackBoost(int n) { - tempAttackBoost = n; - this.updateObservers(); - } - - public void setTempDefenseBoost(int n) { - tempDefenseBoost = n; - this.updateObservers(); - } - - //for cards like Glorious Anthem, etc. - public int getSemiPermanentAttackBoost() { - return semiPermanentAttackBoost; - } - - public int getSemiPermanentDefenseBoost() { - return semiPermanentDefenseBoost; - } - - public void addSemiPermanentAttackBoost(int n) { - semiPermanentAttackBoost += n; - } - - public void addSemiPermanentDefenseBoost(int n) { - semiPermanentDefenseBoost += n; - } - - public void setSemiPermanentAttackBoost(int n) { - semiPermanentAttackBoost = n; - } - - public void setSemiPermanentDefenseBoost(int n) { - semiPermanentDefenseBoost = n; - } - - //for cards like Relentless Rats, Master of Etherium, etc. - public int getOtherAttackBoost() { - return otherAttackBoost; - } - - public int getOtherDefenseBoost() { - return otherDefenseBoost; - } - - public void addOtherAttackBoost(int n) { - otherAttackBoost += n; - } - - public void addOtherDefenseBoost(int n) { - otherDefenseBoost += n; - } - - public void setOtherAttackBoost(int n) { - otherAttackBoost = n; - } - - public void setOtherDefenseBoost(int n) { - otherDefenseBoost = n; - } - - public boolean isUntapped() { - return !tapped; - } - - public boolean isTapped() { - return tapped; - } - - public void setTapped(boolean b) { - tapped = b; - updateObservers(); - } - - public void tap() { - if (isUntapped()) { - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", this); - AllZone.TriggerHandler.runTrigger("Taps", runParams); - } - setTapped(true); - } - - public void untap() { - if( isTapped() ) { - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", this); - AllZone.TriggerHandler.runTrigger("Untaps", runParams); - - } - - for(Command var:untapCommandList) { - var.execute(); - } - - setTapped(false); - } - - public boolean isUnCastable() { - return unCastable; - } - - public void setUnCastable(boolean b) { - unCastable = b; - updateObservers(); - } - - //keywords are like flying, fear, first strike, etc... - public ArrayList getKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); - ArrayList a2 = new ArrayList(getExtrinsicKeyword()); - ArrayList a3 = new ArrayList(getOtherExtrinsicKeyword()); - ArrayList a4 = new ArrayList(getHiddenExtrinsicKeyword()); - a1.addAll(a2); - a1.addAll(a3); - 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 - public ArrayList getUnhiddenKeyword() { - ArrayList a1 = new ArrayList(getIntrinsicKeyword()); - ArrayList a2 = new ArrayList(getExtrinsicKeyword()); - ArrayList a3 = new ArrayList(getOtherExtrinsicKeyword()); - a1.addAll(a2); - a1.addAll(a3); - - // SOL Changes for Mana - //for(Ability_Mana sa:getManaAbility()) - // if(sa.isBasic()) a1.add((sa).orig); - - return a1; - } - - public ArrayList getIntrinsicAbilities() - { - return intrinsicAbility; - } - - public ArrayList getIntrinsicKeyword() { - return new ArrayList(intrinsicKeyword); - } - - public void clearIntrinsicKeyword() { - intrinsicKeyword.clear(); - } - - public void setIntrinsicKeyword(ArrayList a) { - intrinsicKeyword = new ArrayList(a); - this.updateObservers(); - } - - public void clearAllKeywords() { - intrinsicKeyword.clear(); - extrinsicKeyword.clear(); - otherExtrinsicKeyword.clear(); - HiddenExtrinsicKeyword.clear(); //Hidden keywords won't be displayed on the card - } - - public void setIntrinsicAbilities(ArrayList a) - { - intrinsicAbility = new ArrayList(a); - } - - public void addIntrinsicKeyword(String s) { - if (s.trim().length()!=0) - intrinsicKeyword.add((getName().trim().length()== 0 ? s :s.replaceAll(getName(), "CARDNAME"))); - } - - public void addIntrinsicAbility(String s) - { - if (s.trim().length() != 0) - intrinsicAbility.add(s); - } - - public void addNonStackingIntrinsicKeyword(String s) { - if(!getIntrinsicKeyword().contains(s)){ - if (s.trim().length()!=0) - intrinsicKeyword.add((getName().trim().length()== 0 ? s :s.replaceAll(getName(), "CARDNAME"))); - } - } - - public void removeIntrinsicKeyword(String s) { - intrinsicKeyword.remove(s); - this.updateObservers(); - } - - public int getIntrinsicKeywordSize() { - return intrinsicKeyword.size(); - } - - public ArrayList getExtrinsicKeyword() { - return new ArrayList(extrinsicKeyword); - } - - public void setExtrinsicKeyword(ArrayList a) { - extrinsicKeyword = new ArrayList(a); - this.updateObservers(); - } - - public void addExtrinsicKeyword(String s) { - //if(!hasKeyword(s)){ - if (s.startsWith("HIDDEN")) addHiddenExtrinsicKeyword(s); - else - extrinsicKeyword.add((getName().trim().length()==0 ? s :s.replaceAll(getName(), "CARDNAME"))); - //} - } - - public void addStackingExtrinsicKeyword(String s) { - if(s.startsWith("HIDDEN")) addHiddenExtrinsicKeyword(s); - else extrinsicKeyword.add(s); - } - - public void removeExtrinsicKeyword(String s) { - if(s.startsWith("HIDDEN")) removeHiddenExtrinsicKeyword(s); - else extrinsicKeyword.remove(s); - this.updateObservers(); - } - - public int getExtrinsicKeywordSize() { - return extrinsicKeyword.size(); - } - - public ArrayList getOtherExtrinsicKeyword() { - return new ArrayList(otherExtrinsicKeyword); - } - - public void setOtherExtrinsicKeyword(ArrayList a) { - otherExtrinsicKeyword = new ArrayList(a); - this.updateObservers(); - } - - public void addOtherExtrinsicKeyword(String s) { - otherExtrinsicKeyword.add((getName().trim().length()==0 ? s :s.replaceAll(getName(), "CARDNAME"))); - } - - public void addStackingOtherExtrinsicKeyword(String s) { - extrinsicKeyword.add(s); - } - - public void removeOtherExtrinsicKeyword(String s) { - otherExtrinsicKeyword.remove(s); - this.updateObservers(); - } - - public int getOtherExtrinsicKeywordSize() { - return otherExtrinsicKeyword.size(); - } - - public ArrayList getPrevIntrinsicKeyword() { - return new ArrayList(prevIntrinsicKeyword); - } - - public void setPrevIntrinsicKeyword(ArrayList a) { - prevIntrinsicKeyword = new ArrayList(a); - this.updateObservers(); - } - - public void addPrevIntrinsicKeyword(String s) { - prevIntrinsicKeyword.add(s); - } - - public void removePrevIntrinsicKeyword(String s) { - prevIntrinsicKeyword.remove(s); - this.updateObservers(); - } - - public int getPrevIntrinsicKeywordSize() { - return prevIntrinsicKeyword.size(); - } - - // Hidden Keywords will be returned without the indicator HIDDEN - public ArrayList getHiddenExtrinsicKeyword() { - ArrayList Keyword = new ArrayList(); - for (int i = 0; i < HiddenExtrinsicKeyword.size(); i++) { - String keyword = HiddenExtrinsicKeyword.get(i); - Keyword.add(keyword.replace("HIDDEN ", "")); - } - return Keyword; - } - - public void addHiddenExtrinsicKeyword(String s) { - HiddenExtrinsicKeyword.add(s); - } - - public void removeHiddenExtrinsicKeyword(String s) { - HiddenExtrinsicKeyword.remove(s); - //this.updateObservers(); - } - - public boolean isPermanent() { - return !(isInstant() || isSorcery() || isImmutable()); - } - - public boolean isSpell() { - return (isInstant() || isSorcery() || (isAura() && !AllZoneUtil.getCardsInPlay().contains(this))); - } - - public boolean isCreature() { - return type.contains("Creature"); - } - - public boolean isWall() { - return type.contains("Wall"); - } - - public boolean isBasicLand() { - return type.contains("Basic"); - } - - public boolean isLand() { - return type.contains("Land"); - } - - public boolean isSorcery() { - return type.contains("Sorcery"); - } - - public boolean isInstant() { - return type.contains("Instant"); - } - - public boolean isArtifact() { - return type.contains("Artifact"); - } - - public boolean isEquipment() { - return type.contains("Equipment"); - } - - public boolean isPlaneswalker() { - return type.contains("Planeswalker"); - } - - public boolean isEmblem() { - return type.contains("Emblem"); - } - - public boolean isTribal() { - return type.contains("Tribal"); - } - - public boolean isSnow() { - return type.contains("Snow"); - } - - //global and local enchantments - public boolean isEnchantment() { - return typeContains("Enchantment"); - } - - public boolean isAura() { - return typeContains("Aura"); - } - - 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; - } - - public void setUniqueNumber(int n) { - uniqueNumber = n; - this.updateObservers(); - } - - public int getUniqueNumber() { - return uniqueNumber; - } - - public void setValue(long n) - { - value = n; - } - - public long getValue() - { - return value; - } - - @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; - } - - @Override - public int hashCode() { - return getUniqueNumber(); - } - - @Override - public String toString() { - return this.getName() + " (" + this.getUniqueNumber() + ")"; - } - - public boolean hasFlashback() { - return flashback; - } - - public void setFlashback(boolean b) { - flashback = b; - } - - public boolean hasUnearth() { - return unearth; - } - - public void setUnearth(boolean b) { - unearth = b; - } - - public boolean isUnearthed() - { - return unearthed; - } - - public void setUnearthed(boolean b) - { - unearthed = b; - } - - public boolean hasMadness() { - return madness; - } - - public void setMadness(boolean b) { - madness = b; - } - - public String getMadnessCost() { - return madnessCost; - } - - public void setMadnessCost(String cost) { - madnessCost = cost; - } - - public boolean hasSuspend() { - return suspend; - } - - public void setSuspend(boolean b) { - suspend = b; - } - - public boolean wasSuspendCast() { - return suspendCast; - } - - public void setSuspendCast(boolean b) { - suspendCast = b; - } - - public void setKicked(boolean b) { - kicked = b; - } - - public boolean isKicked() { - return kicked; - } - - public void setReflectedLand(boolean b) { - reflectedLand = b; - } - - public boolean isReflectedLand() { - return reflectedLand; - } - - public boolean hasKeyword(String keyword) - { - return getKeyword().contains(keyword); - } - - 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; - } - - 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; - } - - 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; - } - - - public boolean hasAnyKeyword(String keywords[]) - { - for (int i=0; i keywords) - { - for (int i=0; i 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. - 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 - public boolean isType(String cardType) { - cardType = toMixedCase(cardType); - - if (type.contains(cardType) - || ( (isCreature() || isTribal()) - && CardUtil.isACreatureType(cardType) && hasKeyword("Changeling"))) return true; - return false; - } - - - // Takes an array of arguments like Permanent.Blue+withFlying, only one of them has to be true - 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 - 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 - 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("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("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") && hasStartOfKeyword(Property.substring(7))) return false; - if (!Property.startsWith("without") && !hasStartOfKeyword(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.Phase.getTurn())) return false;} - else if (Property.startsWith("dealtDamageToYouThisTurn")){ - if(!(dealtDmgToHumanThisTurn && getController().isPlayer(AllZone.ComputerPlayer)) - && !(dealtDmgToComputerThisTurn && getController().isPlayer(AllZone.HumanPlayer))) 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 (!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 - 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 (!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.Combat.isBlocked(this)) return false;} - - else if (Property.startsWith("blockedBySource")) { if(!isBlockedBy(source)) return false;} - - else if (Property.startsWith("unblocked")) { if(!AllZone.Combat.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.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("ChosenType")) { - if(!isType(source.getChosenType())) return false; - } - else { - if(!isType(Property)) return false; - } - } - return true; - }//hasProperty - - 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; - } - - public void setImmutable(boolean isImmutable) { - this.isImmutable = isImmutable; - } - - 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 - */ - - public boolean isColor(String col) { - return CardUtil.getColors(this).contains(col); - } - - public boolean isBlack() { - return CardUtil.getColors(this).contains(Constant.Color.Black); - } - - public boolean isBlue() { - return CardUtil.getColors(this).contains(Constant.Color.Blue); - } - - public boolean isRed() { - return CardUtil.getColors(this).contains(Constant.Color.Red); - } - - public boolean isGreen() { - return CardUtil.getColors(this).contains(Constant.Color.Green); - } - - public boolean isWhite() { - return CardUtil.getColors(this).contains(Constant.Color.White); - } - - public boolean isColorless() { - return CardUtil.getColors(this).contains(Constant.Color.Colorless); - } - - 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; - } - - public boolean isAttacking() { - return AllZone.Combat.isAttacking(this); - } - - public boolean isBlocking() { - CardList blockers = AllZone.Combat.getAllBlockers(); - return blockers.contains(this); - } - - public boolean isBlocking(Card attacker) { - return attacker.equals(AllZone.Combat.getAttackerBlockedBy(this)); - } - - public boolean isBlockedBy(Card blocker) { - return this.equals(AllZone.Combat.getAttackerBlockedBy(blocker)); - } - - /////////////////////////// - // - // Damage code - // - ////////////////////////// - - //all damage to cards is now handled in Card.java, no longer AllZone.GameAction... - public void addReceivedDamageFromThisTurn(Card c, int damage) { - receivedDamageFromThisTurn.put(c, damage); - } - - public void setReceivedDamageFromThisTurn(HashMap receivedDamageList) { - receivedDamageFromThisTurn = receivedDamageList; - } - - public HashMap getReceivedDamageFromThisTurn() { - return receivedDamageFromThisTurn; - } - - public void resetReceivedDamageFromThisTurn() { - receivedDamageFromThisTurn.clear(); - } - - public void addDealtDamageToThisTurn(Card c, int damage) { - dealtDamageToThisTurn.put(c, damage); - } - - public void setDealtDamageToThisTurn(HashMap dealtDamageList) { - dealtDamageToThisTurn = dealtDamageList; - } - - public HashMap getDealtDamageToThisTurn() { - return dealtDamageToThisTurn; - } - - public void resetDealtDamageToThisTurn() { - dealtDamageToThisTurn.clear(); - } - - //how much damage is enough to kill the creature (for AI) - public int getEnoughDamageToKill(int maxDamage, Card source, boolean isCombat) { - return getEnoughDamageToKill(maxDamage, source, isCombat, false); - } - - 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) - 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 - public int getLethalDamage() { - int lethalDamage = getNetDefense() - getDamage() - getTotalAssignedDamage(); - - return lethalDamage; - } - - public void setDamage(int n) { - //if (this.hasKeyword("Prevent all damage that would be dealt to CARDNAME.")) n = 0; - damage = n; - } - - public int getDamage() { - return damage; - } - - 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(!assignedDamageHashMap.containsKey(sourceCard)) assignedDamageHashMap.put(sourceCard, assignedDamage); - else { - assignedDamageHashMap.put(sourceCard, assignedDamageHashMap.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;i c = assignedDamageHashMap.values(); - - Iterator itr = c.iterator(); - while(itr.hasNext()) - total += itr.next(); - - return total; - } - - public HashMap getAssignedDamageHashMap() { - return assignedDamageHashMap; - } - - public void addCombatDamage(HashMap 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 ) { - if (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 - 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 - 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) - 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) - 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)) { - if(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; - } - - 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) - 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("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; - } - - 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; - } - - public void addDamage(HashMap sourcesMap) { - for(Entry entry : sourcesMap.entrySet()) { - addDamageAfterPrevention(entry.getValue(), entry.getKey(),true); // damage prevention is already checked! - } - } - - //This is for noncombat damage - 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); - - } - - 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 - 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 - HashMap runParams = new HashMap(); - runParams.put("DamageSource", source); - runParams.put("DamageTarget", this); - runParams.put("DamageAmount", damageToAdd); - runParams.put("IsCombatDamage",isCombat); - AllZone.TriggerHandler.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 = ""; - - public void addSet(SetInfo sInfo) - { - Sets.add(sInfo); - } - - public ArrayList getSets() - { - return Sets; - } - - public void setSets(ArrayList siList) - { - Sets = siList; - } - - public void setCurSetCode(String setCode) { - curSetCode = setCode; - } - - public String getCurSetCode() { - return curSetCode; - } - - public void setRandomSetCode() { - if (Sets.size() < 1) - return; - - Random r = MyRandom.random; - SetInfo si = Sets.get(r.nextInt(Sets.size())); - - curSetCode = si.Code; - } - - public String getSetImageName(String setCode) { - return "/" + setCode + "/" + getImageName(); - } - - public String getCurSetImage() { - return getSetImageName(curSetCode); - } - - public String getCurSetRarity() { - for (int i=0; iCard 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 index 2b45580c46f..5f013a03ade 100644 --- a/src/forge/CardContainer.java +++ b/src/forge/CardContainer.java @@ -1,6 +1,6 @@ /** * CardContainer.java - * + * * Created on 17.02.2010 */ @@ -9,12 +9,22 @@ package forge; /** * The class CardContainer. A card container is an object that references a card. - * - * @version V0.0 17.02.2010 + * * @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 index 0613df55c52..da9e5b7a41a 100644 --- a/src/forge/CardFilter.java +++ b/src/forge/CardFilter.java @@ -1,197 +1,374 @@ -package forge; - -public class CardFilter { - - - public CardList CardListNameFilter(CardList all, String name) - { - Card CardName; - String s; - s=""; - CardList listFilter = new CardList(); - for(int i=0;i=0) - { - listFilter.add(CardName); - - } - - } - - return listFilter; - } - - public CardList CardListTextFilter(CardList all, String name) - { - Card CardName; - String s; - s=""; - CardList listFilter = new CardList(); - for(int i=0;i=0) - { - listFilter.add(CardName); - - } - - } - - return listFilter; - } - - - public CardList CardListColorFilter(CardList all, String name) - { - Card CardName = new Card(); - CardList listFilter = new CardList(); - - if(name=="black"){ - for(int i=0;iCardFilter 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 index 10cb8da16b4..2b7b5c35f0e 100644 --- a/src/forge/CardList.java +++ b/src/forge/CardList.java @@ -1,389 +1,762 @@ - -package forge; - - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.Iterator; -import forge.card.cardFactory.CardFactoryUtil; - - -public class CardList implements Iterable { - - public Iterator iterator() { - return list.iterator(); - } - - private ArrayList list = new ArrayList(); - - public CardList() {} - - public CardList(Card... c) { - addAll(c); - } - - public CardList(ArrayList al) { - addAll(al.toArray()); - } - - public CardList(CardList al) { - addAll(al.toArray()); - } - - public CardList(Object[] c) { - addAll(c); - } - - // get any cards that exist in the passed in sets list - 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() - - - 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() - - 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 c) { - Collections.sort(list, c); - } - - public CardList getTargetableCards(final Card Source) - { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(Source, c); - } - }); - } - - public CardList getValidCards(String Restrictions, final Player sourceController, final Card source) { - return getValidCards(Restrictions.split(","), sourceController, source); - } - - public CardList getValidCards(final String Restrictions[], final Player sourceController, final Card source) { - return this.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isValidCard(Restrictions, sourceController, source); - } - }); - } - - 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()))); - } - }); - } - - 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()))); - } - }); - } - - public int getTotalConvertedManaCost() { - int total = 0; - for (int i=0; iCardList 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 index b1fb0cf61b2..5ec2a1831e9 100644 --- a/src/forge/CardListFilter.java +++ b/src/forge/CardListFilter.java @@ -1,5 +1,17 @@ package forge; -public interface CardListFilter -{ + +/** + *

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 index a6c0864a8bc..8e498b1c4c3 100644 --- a/src/forge/CardListUtil.java +++ b/src/forge/CardListUtil.java @@ -1,385 +1,454 @@ -package forge; -import java.util.ArrayList; -import java.util.Comparator; - -import com.esotericsoftware.minlog.Log; - -import forge.card.cardFactory.CardFactoryUtil; - -public class CardListUtil -{ - 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 - - 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 - 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 - 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 - 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 - 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() - - public static void sortNonFlyingFirst(CardList list) - { - sortFlying(list); - list.reverse(); - }//sortNonFlyingFirst - - //the creature with flying are better - 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 - 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() - - 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); - } - - 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); - } - - 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); - } - - 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); - } - - 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); - } - - 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 - 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 - - - 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() - - public static CardList getGoldCards(CardList list) - { - return list.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return CardUtil.getColors(c).size() >= 2; - } - }); - } - - 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() - - 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() - - 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 - 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 -} \ No newline at end of file +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 index cbf39963c3c..959380fe532 100644 --- a/src/forge/CardShopTableModel.java +++ b/src/forge/CardShopTableModel.java @@ -1,305 +1,408 @@ - -package forge; - - -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Arrays; - -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; - - -class CardShopTableModel extends AbstractTableModel { - - private static final long serialVersionUID = 1L; - - //holds 1 copy of each card, DOES NOT HOLD multiple cards with the same name - private CardList dataNoCopies = new CardList(); - - //holds multiple card - //example: if there are 4 Elvish Pipers, dataNoCopies has 1 copy, and dataCopies has 3 - private CardList dataCopies = new CardList(); - - //used by sort(), holds old data to compare with sorted data, to see if any change was made - //private CardList oldList = new CardList(); - - private CardContainer cardDetail; - private String column[] = {"Qty", "Name", "Cost", "Color", "Type", "Stats", "R", "Value"}; - - //used to resort(), used when addCard(Card) is called - private int recentSortedColumn; - private boolean recentAscending; - - public CardShopTableModel(CardContainer cd) { - this(new CardList(), cd); - } - - public CardShopTableModel(CardList inData, CardContainer in_cardDetail) { - cardDetail = in_cardDetail; - //intialize dataNoCopies and dataCopies - addCard(inData); - } - - - public void resizeCols(final JTable table) { - TableColumn column = null; - for(int i = 0; i < table.getColumnCount(); i++) { - column = table.getColumnModel().getColumn(i); - - if(i == 0) { - column.setPreferredWidth(25); //make first column small - column.setMaxWidth(25); - } else if(i == 1) { - column.setPreferredWidth(190); - column.setMinWidth(190); - column.setMaxWidth(190); - } else if(i == 2) { - column.setPreferredWidth(85); - column.setMinWidth(85); - column.setMaxWidth(126); - } else if(i == 3) { - column.setPreferredWidth(58); - column.setMaxWidth(58); - } else if(i == 4) column.setPreferredWidth(130); - else if(i == 5) { - column.setPreferredWidth(32); - column.setMaxWidth(42); - } else if(i == 6) { - column.setPreferredWidth(20); - column.setMaxWidth(20); - } else if(i == 7) { - column.setPreferredWidth(40); - column.setMaxWidth(40); - } - }//for - - /*for(int j = 0; j < table.getColumnCount(); j++) { - column = table.getColumnModel().getColumn(j); - //System.out.println("col Width:" + column.getPreferredWidth()); - }*/ - } - - public void clear() { - dataNoCopies.clear(); - dataCopies.clear(); - //fireTableDataChanged(); - } - - public CardList getCards() { - CardList all = new CardList(); - all.addAll(dataCopies); - all.addAll(dataNoCopies); - - return all; - } - - public void removeCard(Card c) { - //remove card from "dataCopies", - //if not found there, remove card from "dataNoCopies" - int index = findCardName(c.getName(), dataCopies); - - if(index != -1) //found card name - dataCopies.remove(index); - else { - index = findCardName(c.getName(), dataNoCopies); - dataNoCopies.remove(index); - } - - fireTableDataChanged(); - } - - private int findCardName(String name, CardList list) { - for(int i = 0; i < list.size(); i++) - if(list.get(i).getName().equals(name)) return i; - - return -1; - } - - public void addCard(Card c) { - if(0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c); - else dataCopies.add(c); - } - - public void addCard(CardList c) { - for(int i = 0; i < c.size(); i++) - addCard(c.get(i)); - - fireTableDataChanged(); - } - - public Card rowToCard(int row) { - return dataNoCopies.get(row); - } - - private int countQuantity(Card c) { - return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies); - } - - //CardList data is either class members "dataNoCopies" or "dataCopies" - private int countQuantity(Card c, CardList data) { - int count = 0; - for(int i = 0; i < data.size(); i++) - //are the card names the same? - if(data.get(i).getName().equals(c.getName())) count++; - - return count; - } - - public int getRowCount() { - return dataNoCopies.size(); - } - - public int getColumnCount() { - return column.length; - } - - @Override - public String getColumnName(int n) { - return column[n]; - } - - public Object getValueAt(int row, int column) { - return getColumn(dataNoCopies.get(row), column); - } - - private Object getColumn(Card c, int column) { - switch(column) { - case 0: - return Integer.valueOf(countQuantity(c)); - case 1: - return c.getName(); - case 2: - return c.getManaCost(); - case 3: - return TableSorter.getColor(c); - case 4: - return GuiDisplayUtil.formatCardType(c); - case 5: - return c.isCreature()? c.getBaseAttack() + "/" + c.getBaseDefense():""; - case 6: - String rarity = c.getRarity(); - if(rarity.length() > 0) rarity = rarity.substring(0, 1); - return rarity; - case 7: - long value = c.getValue(); - return value; - default: - return "error"; - } - } - - public void addListeners(final JTable table) { - //updates card detail, listens to any key strokes - table.addKeyListener(new KeyListener() { - public void keyPressed(KeyEvent ev) {} - - public void keyTyped(KeyEvent ev) {} - - public void keyReleased(KeyEvent ev) { - int row = table.getSelectedRow(); - if(row != -1) { - cardDetail.setCard(dataNoCopies.get(row)); - } - } - }); - //updates card detail, listens to any mouse clicks - table.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - int row = table.getSelectedRow(); - if(row != -1) { - cardDetail.setCard(dataNoCopies.get(row)); - } - } - }); - - //sorts - MouseListener mouse = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - TableColumnModel columnModel = table.getColumnModel(); - int viewColumn = columnModel.getColumnIndexAtX(e.getX()); - int column = table.convertColumnIndexToModel(viewColumn); - - - if(column != -1) { - //sort ascending - @SuppressWarnings("unused") - boolean change = sort(column, true); - - //if(! change) - // sort(column, false);//sort descending - - //fireTableDataChanged(); - } - }//mousePressed() - };//MouseListener - table.getTableHeader().addMouseListener(mouse); - }//addCardListener() - - //called by the GUI when a card is added to re-sort - public void resort() { - sort(recentSortedColumn, recentAscending); - //this.fireTableDataChanged(); - } - - //returns true if any data changed positions - // @SuppressWarnings("unchecked") - // Arrays.sort - public boolean sort(int column, boolean ascending) { - //used by addCard() to resort the cards - recentSortedColumn = column; - recentAscending = ascending; - - CardList all = new CardList(); - all.addAll(dataNoCopies); - 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 +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 index 37261c2e411..a5c285a7e15 100644 --- a/src/forge/CardUtil.java +++ b/src/forge/CardUtil.java @@ -1,81 +1,136 @@ package forge; -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Random; -import java.util.Set; - 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( + 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( + 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++) { + + for (int i = 0; i < c.length; i++) { Object swap = o[i]; - if(swap instanceof Card) c[i] = (Card) 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++) + 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"); @@ -83,195 +138,314 @@ public class CardUtil { 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); - + if (o == null) throw new RuntimeException("CardUtil : getShortColor() invalid argument - " + longColor); + return (String) o; } - - public static boolean isColor(Card c, String col) { - ArrayList list = getColors(c); - return list.contains(col); - } - + + /** + *

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(); + 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)) { + + for (int i = 0; i < m.length(); i++) { + switch (m.charAt(i)) { case ' ': - break; + break; case 'G': colors.add(Constant.Color.Green); - break; + break; case 'W': colors.add(Constant.Color.White); - break; + break; case 'B': colors.add(Constant.Color.Black); - break; + break; case 'U': colors.add(Constant.Color.Blue); - break; + break; case 'R': colors.add(Constant.Color.Red); - break; + 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); + 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++) { + + for (int i = 0; i < list.size(); i++) { c = list.get(i); - if(c.getName().equals(cardName)) { + 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()); } - - static public int getConvertedManaCost(Card c) - { - if (c.isToken() && !c.isCopiedToken()) - return 0; - return getConvertedManaCost(c.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(); + if (manaCost.equals("")) return 0; + + ManaCost cost = new ManaCost(manaCost); + return cost.getConvertedManaCost(); } - 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(); + /** + *

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(); } - - 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"); + + /** + *

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); + return getAllCardTypes().contains(cardType); } - + + /** + *

getAllCardTypes.

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

getCardTypes.

+ * + * @return a {@link java.util.ArrayList} object. + */ public static ArrayList getCardTypes() { - ArrayList types = new ArrayList(); + 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.add("Artifact"); +// types.add("Creature"); +// types.add("Enchantment"); +// types.add("Instant"); +// types.add("Land"); +// types.add("Planeswalker"); +// types.add("Sorcery"); +// types.add("Tribal"); - return types; + 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 ( 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)); + 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 (!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 (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 (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 ( +/* return ( keyword.equals("Deathtouch") || keyword.equals("Defender") || keyword.equals("Double Strike") || keyword.equals("First Strike") || keyword.equals("Flash") || keyword.equals("Flying") @@ -280,115 +454,133 @@ public class CardUtil { || keyword.equals("Shroud") || keyword.equals("Trample") || keyword.equals("Vigilance") || keyword.equals("Horsemanship") || keyword.equals("Fear") || keyword.equals("Changeling") - || keyword.equals("Wither") || keyword.equals("Infect")); + || 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); + return !isNonStackingKeyword(keyword); } - - public static String buildFilename(Card card) - { + + /** + *

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); + 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? + path = ForgeProps.getFile(NewConstants.IMAGE_BASE); - return "none"; + 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"; } - public static double getWeightedManaCost(String manaCost) - { - if(manaCost.equals("")) return 0; + /** + *

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; + } - ManaCost cost = new ManaCost(manaCost); - return cost.getWeightedManaCost(); - } - - public static String getShortColorsString(ArrayList colors) { - String colorDesc = ""; - for(String col : colors) { - 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"; - } - } - return colorDesc; - } } diff --git a/src/forge/Card_Color.java b/src/forge/Card_Color.java index 9a2c3d4ea80..fc334ec290d 100644 --- a/src/forge/Card_Color.java +++ b/src/forge/Card_Color.java @@ -1,69 +1,138 @@ -package forge; - -import java.util.ArrayList; -import java.util.EnumSet; - -import forge.card.mana.ManaCost; - -public class Card_Color { - // takes care of individual card color, for global color change effects use AllZone.GameInfo.getColorChanges() - private EnumSet col; - private boolean additional; - public boolean getAdditional() { return additional; } - private Card effectingCard = null; - private long stamp = 0; - public long getStamp() { return stamp; } - - private static long timeStamp = 0; - public static long getTimestamp() { return timeStamp; } - - 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; - } - - public Card_Color(Card c) { - col = Color.Colorless(); - additional = false; - stamp = 0; - effectingCard = c; - } - - boolean addToCardColor(String s){ - Color c = Color.ConvertFromString(s); - if (!col.contains(c)){ - col.add(c); - return true; - } - return false; - } - - void fixColorless(){ - if (col.size() > 1 && col.contains(Color.Colorless)) - col.remove(Color.Colorless); - } - - static void increaseTimestamp() { timeStamp++; } - - public boolean equals(String cost, Card c, boolean addToColors, long time){ - return effectingCard == c && addToColors == additional && stamp == time; - } - - public ArrayList toStringArray(){ - ArrayList list = new ArrayList(); - for(Color c : col) - list.add(c.toString()); - return list; - } - - public static void main(String[] args) { - ManaCost mc = new ManaCost("R W U"); - EnumSet col = Color.ConvertManaCostToColor(mc); - System.out.println(col.toString()); - } -} +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 index bfa8c1c55a6..825f8965b64 100644 --- a/src/forge/Color.java +++ b/src/forge/Color.java @@ -1,90 +1,130 @@ -package forge; - -import java.util.EnumSet; - -import forge.card.mana.ManaCost; - -public enum Color { - Colorless(0), - White(1), - Green(2), - Red(4), - Black(8), - Blue(16); - - @SuppressWarnings("unused") - private int flag = 0; - Color(int c){ - flag = c; - } - - public static EnumSet Colorless(){ - EnumSet colors = EnumSet.of(Color.Colorless); - return colors; - } - - 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; - } - - 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; - } - } - - 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; - } - - 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; - } -} \ No newline at end of file +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 index bb50c5444da..78ea99cb15b 100644 --- a/src/forge/Combat.java +++ b/src/forge/Combat.java @@ -1,599 +1,808 @@ package forge; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; +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 HashMap(); - private Set blocked = new HashSet(); + // 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(); + 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; + // Defenders are the Defending Player + Each Planeswalker that player controls + private ArrayList defenders = new ArrayList(); + private int currentDefender = 0; + private int nextDefender = 0; - private Player attackingPlayer = null; - private Player defendingPlayer = null; + // This Hash keeps track of + private HashMap attackerToDefender = new HashMap(); - private CardList attackersWithLure = new CardList(); - private CardList canBlockAttackerWithLure = new CardList(); + private int attackingDamage; - public Combat() { - // Let the Begin Turn/Untap Phase Reset Combat properly - } + private Player attackingPlayer = null; + private Player defendingPlayer = null; - public void reset() { - resetAttackers(); - blocked.clear(); + private CardList attackersWithLure = new CardList(); + private CardList canBlockAttackerWithLure = new CardList(); - unblockedMap.clear(); + /** + *

Constructor for Combat.

+ */ + public Combat() { + // Let the Begin Turn/Untap Phase Reset Combat properly + } - attackingDamage = 0; - defendingDamageMap.clear(); + /** + *

reset.

+ */ + public void reset() { + resetAttackers(); + blocked.clear(); - attackingPlayer = null; - defendingPlayer = null; - - attackersWithLure.clear(); - canBlockAttackerWithLure.clear(); - - defenders.clear(); - currentDefender = 0; - nextDefender = 0; - - initiatePossibleDefenders(AllZone.Phase.getPlayerTurn().getOpponent()); - } + unblockedMap.clear(); - public void initiatePossibleDefenders(Player defender){ - defenders.add(defender); - CardList planeswalkers = AllZoneUtil.getPlayerCardsInPlay(defender); - planeswalkers = planeswalkers.getType("Planeswalker"); - for(Card pw : planeswalkers) - defenders.add(pw); - } - - public Object nextDefender(){ - if (nextDefender >= defenders.size()) - return null; - - currentDefender = nextDefender; - nextDefender++; + attackingDamage = 0; + defendingDamageMap.clear(); - return defenders.get(currentDefender); - } - - public void setCurrentDefender(int def){ - currentDefender = def; - } - - public int getRemainingDefenders(){ - return defenders.size() - nextDefender; - } - - public ArrayList getDefenders(){ - return defenders; - } - - public void setDefenders(ArrayList newDef){ - defenders = newDef; - } - - 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; - } + attackingPlayer = null; + defendingPlayer = null; - public int getDeclaredAttackers() { - return attackerToDefender.size(); - } + attackersWithLure.clear(); + canBlockAttackerWithLure.clear(); - public void setAttackingPlayer(Player player) { - attackingPlayer = player; - } + defenders.clear(); + currentDefender = 0; + nextDefender = 0; - public void setDefendingPlayer(Player player) { - defendingPlayer = player; - } + initiatePossibleDefenders(AllZone.getPhase().getPlayerTurn().getOpponent()); + } - public Player getAttackingPlayer() { - return attackingPlayer; - } + /** + *

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); + } - public Player getDefendingPlayer() { - return defendingPlayer; - } + /** + *

nextDefender.

+ * + * @return a {@link java.lang.Object} object. + */ + public Object nextDefender() { + if (nextDefender >= defenders.size()) + return null; - public HashMap getDefendingDamageMap() { - return defendingDamageMap; - } - - public int getTotalDefendingDamage() { - int total = 0; + currentDefender = nextDefender; + nextDefender++; - Collection c = defendingDamageMap.values(); + return defenders.get(currentDefender); + } - Iterator itr = c.iterator(); - while (itr.hasNext()) - total += itr.next(); + /** + *

Setter for the field currentDefender.

+ * + * @param def a int. + */ + public void setCurrentDefender(int def) { + currentDefender = def; + } - return total; - } - - 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(); + /** + *

getRemainingDefenders.

+ * + * @return a int. + */ + public int getRemainingDefenders() { + return defenders.size() - nextDefender; + } - 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 - } - - - 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(); + /** + *

Getter for the field defenders.

+ * + * @return a {@link java.util.ArrayList} object. + */ + public ArrayList getDefenders() { + return defenders; + } - 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; - } - + /** + *

Setter for the field defenders.

+ * + * @param newDef a {@link java.util.ArrayList} object. + */ + public void setDefenders(ArrayList newDef) { + defenders = newDef; + } - 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); - } - } + /** + *

getDefendingPlaneswalkers.

+ * + * @return an array of {@link forge.Card} objects. + */ + public Card[] getDefendingPlaneswalkers() { + Card[] pwDefending = new Card[defenders.size() - 1]; - public void addAttackingDamage(int n) { - attackingDamage += n; - } + int i = 0; - public int getAttackingDamage() { - return attackingDamage; - } - - 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; - } - - public boolean isAttacking(Card c) { - return map.get(c) != null; - } - - public void addAttacker(Card c) { - map.put(c, new CardList()); - attackerToDefender.put(c, currentDefender); - } - - public Object getDefenderByAttacker(Card c) { - return attackerToDefender.get(c); - } - - public void resetAttackers() { - map.clear(); - attackerToDefender.clear(); - } - - public Card[] getAttackers() { - CardList out = new CardList(); - Iterator it = map.keySet().iterator(); - - while (it.hasNext()) { - out.add((Card) it.next()); - } - - return out.toArray(); - }// getAttackers() - - public boolean isBlocked(Card attacker) { - return blocked.contains(attacker); - } - - public void addBlocker(Card attacker, Card blocker) { - blocked.add(attacker); - getList(attacker).add(blocker); - } - - public void resetBlockers() { - reset(); - - CardList att = new CardList(getAttackers()); - for (int i = 0; i < att.size(); i++) - addAttacker(att.get(i)); - } - - 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() - - public CardList getBlockers(Card attacker) { - if (getList(attacker) == null) - return new CardList(); - else - return new CardList(getList(attacker)); - } - - 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; - } - - private CardList getList(Card attacker) { - return (CardList) map.get(attacker); - } - - 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.Phase.is(Constant.Phase.Combat_Declare_Blockers)) - blocked.remove(a); - } - } - // update combat - CombatUtil.showCombat(); - }// removeFromCombat() - - 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() - - 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.TriggerHandler.runTrigger("AttackerUnblocked", runParams); - - } - } - } - - // set Card.setAssignedDamage() for all creatures in combat - // also assigns player damage by setPlayerDamage() - 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.Display.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() - 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.Display.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() - - 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() - - public static void dealAssignedDamage(){ - // This function handles both Regular and First Strike combat assignment - Player player = AllZone.Combat.getDefendingPlayer(); - - boolean bFirstStrike = AllZone.Phase.is(Constant.Phase.Combat_FirstStrikeDamage); - - HashMap defMap = AllZone.Combat.getDefendingDamageMap(); - - for(Entry entry : defMap.entrySet()) { - player.addCombatDamage(entry.getValue(), entry.getKey()); + for (Object o : defenders) { + if (o instanceof Card) { + pwDefending[i] = (Card) o; + i++; + } } - - CardList unblocked = new CardList(bFirstStrike ? AllZone.Combat.getUnblockedAttackers() : - AllZone.Combat.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)); - } + + 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.Combat.getAttackers()); - combatants.addAll(AllZone.Combat.getAllBlockers()); - combatants.addAll(AllZone.Combat.getDefendingPlaneswalkers()); + 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++) { + 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; - HashMap assignedDamageMap = c.getAssignedDamageHashMap(); + // 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()){ + + 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. - } - - public boolean isUnblocked(Card att){ - return unblockedMap.containsKey(att); - } - - 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() + /** + *

isUnblocked.

+ * + * @param att a {@link forge.Card} object. + * @return a boolean. + */ + public boolean isUnblocked(Card att) { + return unblockedMap.containsKey(att); + } - 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); - } - } + /** + *

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() + return out.toArray(); + }// getUnblockedAttackers() - public void addUnblockedAttacker(Card c) { - unblockedMap.put(c, new CardList()); - } + /** + *

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); + } + } -}// Class Combat \ No newline at end of file + 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 index 9fb08f8750c..563fcbcaa24 100644 --- a/src/forge/CombatUtil.java +++ b/src/forge/CombatUtil.java @@ -1,1889 +1,2132 @@ - -package forge; - - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -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; - - -public class CombatUtil { - - //can the creature block given the combat state? - 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? - 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 0) return false; - - return canBeBlocked(attacker); - } - - //can the attacker be blocked at all? - 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? - public static boolean finishedMandatotyBlocks(Combat combat) { - - CardList blockers = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - 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? - 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? - 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; - - return canBlock(attacker, blocker); - } - - - // can the blocker block the attacker? - 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; - } - - // CARDNAME can't block creatures with power ... - int powerLimit[] = {0}; - int keywordPosition = 0; - boolean hasKeyword = false; - - ArrayList blockerKeywords = blocker.getKeyword(); - for (int i = 0; i < blockerKeywords.size(); i++) { - if (blockerKeywords.get(i).toString().startsWith("CARDNAME can't block creatures with power")) { - hasKeyword = true; - keywordPosition = i; - } - } - - if (attacker.hasKeyword("Creatures with power less than CARDNAME's power can't block it.") - && attacker.getNetAttack() > blocker.getNetAttack()) return false; - - if (hasKeyword) { // The keyword "CARDNAME can't block creatures with power" ... is present - String tmpString = blocker.getKeyword().get(keywordPosition).toString(); - String asSeparateWords[] = tmpString.trim().split(" "); - - if (asSeparateWords.length >= 9) { - if (asSeparateWords[6].matches("[0-9][0-9]?")) { - powerLimit[0] = Integer.parseInt((asSeparateWords[6]).trim()); - - if (attacker.getNetAttack() >= powerLimit[0] - && blocker.hasKeyword("CARDNAME can't block creatures with power " + powerLimit[0] + " or greater.")) return false; - if (attacker.getNetAttack() <= powerLimit[0] - && blocker.hasKeyword("CARDNAME can't block creatures with power " + powerLimit[0] + " or less.")) return false; - } - } - - if (attacker.getNetAttack() > blocker.getNetAttack() - && blocker.hasKeyword("CARDNAME can't block creatures with power greater than CARDNAME's power.")) return false; - if (attacker.getNetAttack() >= blocker.getNetDefense() - && blocker.hasKeyword("CARDNAME can't block creatures with power equal to or greater than CARDNAME's toughness.")) return false; - - }// hasKeyword CARDNAME can't block creatures with power ... - - // CARDNAME can't be blocked by creatures with power ... - int powerLimit2[] = {0}; - int keywordPosition2 = 0; - boolean hasKeyword2 = false; - - ArrayList attackerKeywords = attacker.getKeyword(); - for (int i = 0; i < attackerKeywords.size(); i++) { - if (attackerKeywords.get(i).toString().startsWith("CARDNAME can't be blocked by creatures with power")) { - hasKeyword2 = true; - keywordPosition2 = i; - } - } - - if (hasKeyword2) { // The keyword "CARDNAME can't be blocked by creatures with power" ... is present - String tmpString = attacker.getKeyword().get(keywordPosition2).toString(); - String asSeparateWords[] = tmpString.trim().split(" "); - - if (asSeparateWords.length >= 9) { - if (asSeparateWords[8].matches("[0-9][0-9]?")) { - powerLimit2[0] = Integer.parseInt((asSeparateWords[8]).trim()); - - if (blocker.getNetAttack() >= powerLimit2[0] && attacker.hasKeyword - ("CARDNAME can't be blocked by creatures with power " + powerLimit2[0] + " or greater.")) return false; - if (blocker.getNetAttack() <= powerLimit2[0] && attacker.hasKeyword - ("CARDNAME can't be blocked by creatures with power " + powerLimit2[0] + " or less.")) 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; - - }// hasKeyword CARDNAME can't be blocked by creatures with power ... - - 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(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 (AllZoneUtil.isCardInPlay("Shifting Sliver")) { - if (attacker.isType("Sliver") && !blocker.isType("Sliver")) return false; - } - - return true; - }//canBlock() - - //can a creature attack given the combat state - 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? - 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? - 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.HumanPlayer); - if (Human.getName("Ensnaring Bridge").size() > 0) { - CardList Hand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - limit = Hand.size(); - } - CardList Compi = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - if (Compi.getName("Ensnaring Bridge").size() > 0) { - CardList Hand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - 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 0) poison += attacker.getKeywordMagnitude("Poisonous"); - return poison; - } - - //Returns the damage unblocked attackers would deal - 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 - 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 - 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.ComputerPlayer); - - if(!AllZone.ComputerPlayer.canLoseLife()) damage = 0; - - return AllZone.ComputerPlayer.getLife() - damage; - } - - //calculates the amount of poison counters after the attack - 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.ComputerPlayer); - - return AllZone.ComputerPlayer.getPoisonCounters() + poison; - } - - //Checks if the life of the attacked Player/Planeswalker is in danger - public static boolean lifeInDanger(Combat combat) { - // life in danger only cares about the player's life. Not about a Planeswalkers life - if(AllZone.ComputerPlayer.cantLose()) - return false; - - if (lifeThatWouldRemain(combat) < Math.min(4, AllZone.ComputerPlayer.getLife()) - && !AllZone.ComputerPlayer.cantLoseForZeroOrLessLife()) - return true; - - return (resultingPoison(combat) > Math.max(7,AllZone.ComputerPlayer.getPoisonCounters())); - } - - //Checks if the life of the attacked Player would be reduced - public static boolean wouldLoseLife(Combat combat) { - - return (lifeThatWouldRemain(combat) < AllZone.ComputerPlayer.getLife()); - } - - //Checks if the life of the attacked Player/Planeswalker is in danger - public static boolean lifeInSeriousDanger(Combat combat) { - // life in danger only cares about the player's life. Not about a Planeswalkers life - if(AllZone.ComputerPlayer.cantLose()) - return false; - - if (lifeThatWouldRemain(combat) < 1 && !AllZone.ComputerPlayer.cantLoseForZeroOrLessLife()) - return true; - - return (resultingPoison(combat) > 9); - } - - // This calculates the amount of damage a blockgang can deal to the attacker (first strike not supported) - 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 - 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) - 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) - 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 - 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 - public static boolean attackerWouldBeDestroyed(Card attacker) { - CardList blockers = AllZone.Combat.getBlockers(attacker); - - for (Card defender:blockers) { - if (CombatUtil.canDestroyAttacker(attacker, defender, AllZone.Combat, true) - && !(defender.hasKeyword("Wither") || defender.hasKeyword("Infect"))) - return true; - } - - return totalDamageOfBlockers(attacker, blockers) >= attacker.getKillDamage(); - } - - //Will this trigger trigger? - 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.Combat; - - 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) - 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.TriggerHandler.getRegisteredTriggers(); - for(Trigger trigger : registeredTriggers) - { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if(combatTriggerWillTrigger(attacker, defender, trigger, null) && trigParams.containsKey("Execute")) { - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB")) { - if (abilityParams.get("AB").equals("Pump")) - if (!abilityParams.containsKey("ValidTgts") && !abilityParams.containsKey("Tgt")) - if (AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null).contains(defender)) - if (abilityParams.containsKey("NumAtt")){ - String att = abilityParams.get("NumAtt"); - if (att.startsWith("+")) - att = att.substring(1); - power += Integer.parseInt(att); - } - } - } - } - return power; - } - - //Predict the Toughness bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - 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.TriggerHandler.getRegisteredTriggers(); - for(Trigger trigger : registeredTriggers) - { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if(combatTriggerWillTrigger(attacker, defender, trigger, null) && trigParams.containsKey("Execute")) { - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB")) { - if (abilityParams.get("AB").equals("Pump")) - if (!abilityParams.containsKey("ValidTgts") && !abilityParams.containsKey("Tgt")) - if (AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null).contains(defender)) - if (abilityParams.containsKey("NumDef")) { - String def = abilityParams.get("NumDef"); - if (def.startsWith("+")) - def = def.substring(1); - toughness += Integer.parseInt(def); - } - } - } - } - return toughness; - } - - //Predict the Power bonus of the blocker if blocking the attacker (Flanking, Bushido and other triggered abilities) - 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.TriggerHandler.getRegisteredTriggers(); - for(Trigger trigger : registeredTriggers) - { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if(combatTriggerWillTrigger(attacker, defender, trigger, combat) && trigParams.containsKey("Execute")) { - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB")) { - boolean isValid = false; - - //Pump - if (abilityParams.get("AB").equals("Pump")) - if (!abilityParams.containsKey("ValidTgts") && !abilityParams.containsKey("Tgt")) //not targeted - if (AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null).contains(attacker)) - isValid = true; - - //PumpAll - if (abilityParams.get("AB").equals("PumpAll") && abilityParams.containsKey("ValidCards")) - if (attacker.isValidCard(abilityParams.get("ValidCards").split(","), source.getController(), source) - || attacker.isValidCard(abilityParams.get("ValidCards").replace("attacking+", "").split(",") - , source.getController(), source)) - isValid = true; - - if (abilityParams.containsKey("NumAtt") && isValid){ - 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) - public static int predictToughnessBonusOfAttacker(Card attacker, Card defender, Combat combat) { - int toughness = 0; - - toughness += attacker.getKeywordMagnitude("Bushido"); - - ArrayList registeredTriggers = AllZone.TriggerHandler.getRegisteredTriggers(); - for(Trigger trigger : registeredTriggers) - { - HashMap trigParams = trigger.getMapParams(); - Card source = trigger.getHostCard(); - - if(combatTriggerWillTrigger(attacker, defender, trigger, combat) && trigParams.containsKey("Execute")) { - String ability = source.getSVar(trigParams.get("Execute")); - AbilityFactory AF = new AbilityFactory(); - HashMap abilityParams = AF.getMapParams(ability, source); - if (abilityParams.containsKey("AB")) { - boolean isValid = false; - - //Pump - if (abilityParams.get("AB").equals("Pump")) - if (!abilityParams.containsKey("ValidTgts") && !abilityParams.containsKey("Tgt")) //not targeted - if (AbilityFactory.getDefinedCards(source, abilityParams.get("Defined"), null).contains(attacker)) - isValid = true; - - //PumpAll - if (abilityParams.get("AB").equals("PumpAll") && abilityParams.containsKey("ValidCards")) - if (attacker.isValidCard(abilityParams.get("ValidCards").split(","), source.getController(), source) - || attacker.isValidCard(abilityParams.get("ValidCards").replace("attacking+", "").split(",") - , source.getController(), source)) - isValid = true; - - if (abilityParams.containsKey("NumDef") && isValid){ - 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? - 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 - public static boolean blockerWouldBeDestroyed(Card blocker) { - Card attacker = AllZone.Combat.getAttackerBlockedBy(blocker); - - if(canDestroyBlocker(blocker, attacker, AllZone.Combat, true) && - !(attacker.hasKeyword("Wither") || attacker.hasKeyword("Infect"))) - return true; - return false; - } - - //can the attacker destroy this blocker? - 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 - - public static void removeAllDamage() { - CardList cl = AllZoneUtil.getCardsInPlay(); - for(Card c : cl) { - c.setDamage(0); - } - } - - public static void showCombat() { - AllZone.Display.showCombat(""); - - Card defend[] = null; - StringBuilder display = new StringBuilder(); - - // Loop through Defenders - // Append Defending Player/Planeswalker - ArrayList defenders = AllZone.Combat.getDefenders(); - CardList attackers[] = AllZone.Combat.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.Combat.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.Display.showCombat(display.toString().trim()); - - }//showBlockers() - - 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(); - } - - public static boolean isDoranInPlay() { - return AllZoneUtil.isCardInPlay("Doran, the Siege Tower"); - } - - 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.Phase.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.Combat.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.InputControl.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.Combat.removeFromCombat(crd); - } - } - } - } - } - - 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.Combat.getAttackers()); - otherAttackers.remove(c); - runParams.put("OtherAttackers",otherAttackers); - AllZone.TriggerHandler.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.ComputerPlayer); - ComputerUtil.sacrificePermanents(a, list); - } - else - { - AllZone.InputControl.setInput(CardFactoryUtil.input_sacrificePermanents(a)); - } - - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Annihilator - Defending player sacrifices ").append(a).append(" permanents."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.add(ability); - } //find - } //for - }//creatureAttacked - //Annihilator - - //Mijae Djinn - if(c.getName().equals("Mijae Djinn")) { - if( GameActionUtil.flipACoin(c.getController(), c)) { - //attack as normal - } - else{ - AllZone.Combat.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.GameAction.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.StaticEffects.getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); - } - GameActionUtil.executeCardStateEffects(); - - } - } 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.GameAction.moveToPlay(card); - c.getController().shuffle(); - //we have to have cards like glorious anthem take effect immediately: - GameActionUtil.executeCardStateEffects(); - } - } - } //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.EndOfTurn.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.Stack.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.GameAction.moveToPlay(card); - - card.tap(); - AllZone.Combat.addAttacker(card); - - card.setCreatureAttackedThisCombat(true); - } - } else if(c.getController().isComputer()) { - Card card = CardFactoryUtil.AI_getBestCreature(soldiers); - if (card != null){ - AllZone.GameAction.moveToPlay(card); - - card.tap(); - AllZone.Combat.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.GameAction.moveToHand(top); - } - } - }//Sapling of Colfenor - - c.setCreatureAttackedThisCombat(true); - }//checkDeclareAttackers - - public static void checkUnblockedAttackers(Card c) { - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", c); - AllZone.TriggerHandler.runTrigger("AttackerUnblocked", runParams); - } - - public static void checkDeclareBlockers(CardList cl) { - for (Card c:cl) { - if (!c.getCreatureBlockedThisCombat()) { - for(Ability ab:CardFactoryUtil.getBushidoEffects(c)) { - AllZone.Stack.add(ab); - } - } - - c.setCreatureBlockedThisCombat(true); - }//for - - }//checkDeclareBlockers - - 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.TriggerHandler.runTrigger("Blocks", runParams); - - if(!a.getCreatureGotBlockedThisCombat()) { - final int blockers = AllZone.Combat.getBlockers(a).size(); - runParams.put("NumBlockers", blockers); - AllZone.TriggerHandler.runTrigger("AttackerBlocked", runParams); - - //Bushido - for(Ability ab:CardFactoryUtil.getBushidoEffects(a)) - AllZone.Stack.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.Combat.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.EndOfTurn.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.Stack.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); - } else if(a.getName().equals("Elven Warhounds")) { - AllZone.GameAction.moveToLibrary(b); - } - - a.setCreatureGotBlockedThisCombat(true); - - } - - 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.EndOfTurn.addUntil(untilEOT); - } - }//resolve - - };//ability - - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - (Exalted) gets +1/+1 until EOT."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.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.Phase.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.Stack.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.Phase.addExtraCombat(); - } - }; - - StringBuilder sbACom = new StringBuilder(); - sbACom.append(c).append(" - (Exalted) ").append(phasingPlayer).append(" gets Extra Combat Phase."); - fhAddCombat.setStackDescription(sbACom.toString()); - - AllZone.Stack.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()); - //final String turn = 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 i = 0; i < enchantments.size(); i++) { - Card crd = enchantments.get(i); - Target[i] = crd; - } - Object check = GuiUtils.getChoiceOptional("Select enchantment to enchant exalted creature", Target); - if(check != null) { - Enchantment = ((Card) check); - } - } else { - //enchantments = enchantments.getKeywordsContain("enPump"); Doesn't seem to work - //enchantments = enchantments.getKeywordsDontContain("enPumpCurse"); - Enchantment = CardFactoryUtil.AI_getBestEnchantment(enchantments,attacker, false); - } - if(Enchantment != null && AllZoneUtil.isCardInPlay(attacker)){ - AllZone.GameAction.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.Stack.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.EndOfTurn.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.Stack.add(ability); - } - } - -}//end class CombatUtil +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 index b7c283d3d1f..a08dd902f04 100644 --- a/src/forge/Command.java +++ b/src/forge/Command.java @@ -1,11 +1,23 @@ package forge; -public interface Command extends java.io.Serializable -{ - public static Command Blank = new Command() { - - private static final long serialVersionUID = 2689172297036001710L; - public void execute() {}}; - - public void execute(); +/** + *

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 index 784134b53bc..3e2d3aa927f 100644 --- a/src/forge/CommandArgs.java +++ b/src/forge/CommandArgs.java @@ -1,5 +1,16 @@ package forge; -public interface CommandArgs extends java.io.Serializable -{ + +/** + *

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 index e28f24a3e2a..031a0f23db1 100644 --- a/src/forge/CommandList.java +++ b/src/forge/CommandList.java @@ -1,29 +1,92 @@ package forge; + import java.util.ArrayList; import java.util.Iterator; -public class CommandList implements java.io.Serializable, Command, Iterable -{ - private static final long serialVersionUID = -1532687201812613302L; +/** + *

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(); + private ArrayList a = new ArrayList(); + + public CommandList() { + ; + } + + public CommandList(Command c) { + a.add(c); + } - 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 - public void add(Command c) {a.add(0,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); + } - public Command get(int i) {return (Command) a.get(i);} - public Command remove(int i) {return (Command)a.remove(i);} - public int size() {return a.size();} - public void clear() {a.clear();} + /** + *

get.

+ * + * @param i a int. + * @return a {@link forge.Command} object. + */ + public Command get(int i) { + return (Command) a.get(i); + } - public void execute() - { - for(int i = 0; i < size(); i++) - get(i).execute(); - } + /** + *

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 index 809aa0cd1ce..6641ea327d8 100644 --- a/src/forge/CommandReturn.java +++ b/src/forge/CommandReturn.java @@ -1,5 +1,16 @@ package forge; -public interface CommandReturn -{ - public Object execute(); -} \ No newline at end of file + +/** + *

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 index 56ff406b262..8f7790ee1f2 100644 --- a/src/forge/Computer.java +++ b/src/forge/Computer.java @@ -1,16 +1,60 @@ package forge; -public interface Computer -{ + +/** + *

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 index 84216433932..db55a389401 100644 --- a/src/forge/ComputerAI_General.java +++ b/src/forge/ComputerAI_General.java @@ -1,367 +1,444 @@ -package forge; -import static forge.error.ErrorViewer.showError; - -import java.util.ArrayList; - -import com.esotericsoftware.minlog.Log; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; - - -public class ComputerAI_General implements Computer { - - public ComputerAI_General() { - - } - - public void main1() { - if (!ComputerUtil.chooseLandsToPlay()){ - if (AllZone.Phase.getPriorityPlayer().isComputer()) - stackResponse(); - return; - } - playCards(Constant.Phase.Main1); - }//main1() - - public void main2() { - if (!ComputerUtil.chooseLandsToPlay()){ // in case we can play more lands now, or drew cards since first main phase - if (AllZone.Phase.getPriorityPlayer().isComputer()) - stackResponse(); - return; - } - playCards(Constant.Phase.Main2); - } - - private void playCards(final String phase) { - SpellAbility[] sp = phase.equals(Constant.Phase.Main1)? getMain1():getMain2(); - - boolean nextPhase = ComputerUtil.playCards(sp); - - if(nextPhase) { - AllZone.Phase.passPriority(); - } - }//playCards() - - private SpellAbility[] getMain1() { - //Card list of all cards to consider - CardList hand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - - if (AllZone.Computer_ManaPool.isEmpty()) - hand = hand.filter(new CardListFilter() { - public boolean addCard(Card c) { - - if (c.getSVar("PlayMain1").equals("TRUE")) - return true; - - if (c.isSorcery()) //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.ComputerPlayer); //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.HumanPlayer); //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.ComputerPlayer, "Vengevine"); - if (vengevines.size() > 0) { - CardList creatures = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - 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.ComputerCreatureSpellCount > 1 - && c.isCreature() - && CardUtil.getConvertedManaCost(c.getManaCost()) <= 3) return true; - } // AI Improvement for Vengevine - // Beached As End - return false; - } - }); - CardList all = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - all.addAll(hand); - - CardList humanPlayable = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - humanPlayable = humanPlayable.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return (c.canAnyPlayerActivate()); - } - }); - - all.addAll(humanPlayable); - - return getPlayable(all); - }//getMain1() - - - private SpellAbility[] getMain2() { - //Card list of all cards to consider - CardList all = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - //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.Phase.isPlayerTurn(AllZone.ComputerPlayer) - || AllZone.Phase.isBefore(Constant.Phase.Combat_Declare_Attackers_InstantAbility))) - return false; - return true; - } - }); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - all.addAll(CardFactoryUtil.getGraveyardActivationCards(AllZone.ComputerPlayer)); - - // 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.HumanPlayer); - humanPlayable = humanPlayable.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return (c.canAnyPlayerActivate()); - } - }); - all.addAll(humanPlayable); - - return getPlayable(all); - }//getMain2() - - private CardList getAvailableSpellAbilities(){ - CardList all = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - //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.Phase.isPlayerTurn(AllZone.ComputerPlayer) - || AllZone.Phase.isBefore(Constant.Phase.Combat_Declare_Attackers_InstantAbility))) - return false; - return true; - } - }); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - all.addAll(CardFactoryUtil.getGraveyardActivationCards(AllZone.ComputerPlayer)); - - - CardList humanPlayable = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - humanPlayable = humanPlayable.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return (c.canAnyPlayerActivate()); - } - }); - all.addAll(humanPlayable); - return all; - } - - private SpellAbility[] getOtherPhases(){ - return getPlayable(getAvailableSpellAbilities()); - } - - private ArrayList getPossibleCounters(){ - return getPlayableCounters(getAvailableSpellAbilities()); - } - - private ArrayList getPossibleETBCounters(){ - return getETBCounters(getAvailableSpellAbilities()); - } - - /** - * Returns the spellAbilities from the card list that the computer is able to play - */ - 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.ComputerPlayer); - if(sa.canPlay() && ComputerUtil.canPayCost(sa) && sa.canPlayAI()){ - 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()]); - } - - 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; - } - - 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; - } - - public void begin_combat() { - stackResponse(); - } - - public void declare_attackers() { - // 12/2/10(sol) the decision making here has moved to getAttackers() - - AllZone.Combat = ComputerUtil.getAttackers(); - - Card[] att = AllZone.Combat.getAttackers(); - if (att.length > 0) - AllZone.Phase.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.Computer_Battlefield.updateObservers(); - CombatUtil.showCombat(); - - AllZone.Phase.setNeedToNextPhase(true); - } - - public void declare_attackers_after() - { - stackResponse(); - } - - public void declare_blockers() { - CardList blockers = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - AllZone.Combat = ComputerUtil_Block2.getBlockers(AllZone.Combat, blockers); - - CombatUtil.showCombat(); - - AllZone.Phase.setNeedToNextPhase(true); - } - - public void declare_blockers_after() { - stackResponse(); - } - - public void end_of_combat(){ - stackResponse(); - } - - //end of Human's turn - public void end_of_turn() { - stackResponse(); - } - - public void stack_not_empty() { - stackResponse(); - } - - public void stackResponse(){ - // if top of stack is empty - SpellAbility[] sas = null; - if (AllZone.Stack.size() == 0){ - sas = getOtherPhases(); - - boolean pass = (sas.length == 0) || AllZone.Phase.is(Constant.Phase.Upkeep, AllZone.ComputerPlayer) || - AllZone.Phase.is(Constant.Phase.Draw, AllZone.ComputerPlayer) || - AllZone.Phase.is(Constant.Phase.End_Of_Turn, AllZone.ComputerPlayer); - if (!pass){ // Each AF should check the phase individually - pass = ComputerUtil.playCards(sas); - } - - if (pass) - AllZone.Phase.passPriority(); - return; - } - - // if top of stack is owned by me - if (AllZone.Stack.peekInstance().getActivatingPlayer().isComputer()){ - // probably should let my stuff resolve to force Human to respond to it - AllZone.Phase.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.Phase.passPriority(); - return; - } - - sas = getOtherPhases(); - if (sas.length > 0){ - // Spell not Countered - // each AF should check the Stack/Phase on it's own - - //ArrayList targets = topSA.getTarget().getTargets(); - // does it target me or something I own? - // can i protect it? can I counter it? - - // if i can't save it, can I activate an ability on that card in response? sacrifice etc? - - // does it target his stuff? can I kill it in response? - - } - // if this hasn't been covered above, just PassPriority() - AllZone.Phase.passPriority(); - } -} +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 index c85e29b832d..e99d55dace3 100644 --- a/src/forge/ComputerAI_Input.java +++ b/src/forge/ComputerAI_Input.java @@ -1,73 +1,88 @@ - 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; - + + 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 + /* + * //put this back in ButtonUtil.disableAll(); - AllZone.Display.showMessage("Phase: " - + AllZone.Phase.getPhase() + 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.Phase.getPhase(); - - if (AllZone.Stack.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)) { + //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)) { + } else if (phase.equals(Constant.Phase.Combat_Declare_Attackers_InstantAbility)) { computer.declare_attackers_after(); - } - else if(phase.equals(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) { + } 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"); + } 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(); + } else + computer.stack_not_empty(); }//think } diff --git a/src/forge/ComputerUtil.java b/src/forge/ComputerUtil.java index 9a6632316a8..92188dfe26e 100644 --- a/src/forge/ComputerUtil.java +++ b/src/forge/ComputerUtil.java @@ -1,1107 +1,1372 @@ - -package forge; - -import static forge.error.ErrorViewer.showError; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; - -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.mana.ManaPool; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Cost; -import forge.card.spellability.Cost_Payment; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - - -public class ComputerUtil -{ - - //if return true, go to next phase - static public boolean playCards() - { - return playCards(getSpellAbility()); - } - - //if return true, go to next phase - 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.ComputerPlayer); - if(canPayCost(sa) && sa.canPlay() && sa.canPlayAI()) - { - handlePlayingSpellAbility(sa); - - return false; - } - }//while - return true; - }//playCards() - - 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() - - static public void handlePlayingSpellAbility(SpellAbility sa){ - AllZone.Stack.freezeStack(); - Card source = sa.getSourceCard(); - - if (sa.isSpell() && !source.isCopiedSpell()) - AllZone.GameAction.moveToStack(source); - - Cost cost = sa.getPayCosts(); - Target tgt = sa.getTarget(); - - if (cost == null) { - payManaCost(sa); - sa.chooseTargetAI(); - sa.getBeforePayManaAI().execute(); - AllZone.Stack.addAndUnfreeze(sa); - } - else { - if (tgt != null && tgt.doesTarget()) - sa.chooseTargetAI(); - - Cost_Payment pay = new Cost_Payment(cost, sa); - pay.payComputerCosts(); - } - } - - 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.ComputerPlayer).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.HumanPlayer); - - // 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 - static public boolean playCounterSpell(ArrayList possibleCounters) - { - SpellAbility bestSA = null; - int bestRestriction = Integer.MIN_VALUE; - - for(SpellAbility sa : possibleCounters){ - sa.setActivatingPlayer(AllZone.ComputerPlayer); - if(canPayCost(sa) && sa.canPlay() && sa.canPlayAI()){ - 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; - } - } - } - }//while - - if (bestSA == null) - return false; - - // TODO - // "Look" at Targeted SA and "calculate" the threshold - // if (bestRestriction < targetedThreshold) return false; - - AllZone.Stack.freezeStack(); - Card source = bestSA.getSourceCard(); - - if(bestSA.isSpell() && !source.isCopiedSpell()) - AllZone.GameAction.moveToStack(source); - - Cost cost = bestSA.getPayCosts(); - - if (cost == null){ - // Honestly Counterspells shouldn't use this branch - payManaCost(bestSA); - bestSA.chooseTargetAI(); - bestSA.getBeforePayManaAI().execute(); - AllZone.Stack.addAndUnfreeze(bestSA); - } - else{ - Cost_Payment pay = new Cost_Payment(cost, bestSA); - pay.payComputerCosts(); - } - - return true; - }//playCounterSpell() - - - //this is used for AI's counterspells - final static public void playStack(SpellAbility sa) - { - if (canPayCost(sa)) - { - Card source = sa.getSourceCard(); - if(sa.isSpell() && !source.isCopiedSpell()) - AllZone.GameAction.moveToStack(source); - - sa.setActivatingPlayer(AllZone.ComputerPlayer); - - payManaCost(sa); - - AllZone.Stack.add(sa); - } - } - - final static public void playStackFree(SpellAbility sa) - { - sa.setActivatingPlayer(AllZone.ComputerPlayer); - - Card source = sa.getSourceCard(); - if(sa.isSpell() && !source.isCopiedSpell()) - AllZone.GameAction.moveToStack(source); - - AllZone.Stack.add(sa); - } - - 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.GameAction.moveToStack(source); - - sa.setActivatingPlayer(AllZone.ComputerPlayer); - - payManaCost(sa); - - sa.resolve(); - - if (source.hasKeyword("Draw a card.")) - source.getController().drawCard(); - if (source.hasKeyword("Draw a card at the beginning of the next turn's upkeep.")) - source.getController().addSlowtripList(source); - - //destroys creatures if they have lethal damage, etc.. - AllZone.GameAction.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 - static public SpellAbility[] getSpellAbility() - { - CardList all = new CardList(); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - all.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - all.addAll(CardFactoryUtil.getGraveyardActivationCards(AllZone.ComputerPlayer)); - - CardList humanPlayable = new CardList(); - humanPlayable.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer)); - humanPlayable = humanPlayable.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return (c.canAnyPlayerActivate()); - } - }); - - all.addAll(humanPlayable); - - all = all.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - if(c.isBasicLand()) - return false; - - return true; - } - }); - - - 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++) - if(sa[i].canPlayAI() && canPayCost(sa[i]) /*&& sa[i].canPlay()*/) - 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; - } - - static public boolean canPlay(SpellAbility sa) - { - return sa.canPlayAI() && canPayCost(sa); - } - - static public boolean canPayCost(SpellAbility sa) - { - return canPayCost(sa, AllZone.ComputerPlayer); - }//canPayCost() - - static public boolean canPayCost(SpellAbility sa, Player player) - { - Card card = sa.getSourceCard(); - - ManaPool manapool = AllZone.Computer_ManaPool; - if (player.isHuman()) manapool = AllZone.ManaPool; - - String mana = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : sa.getManaCost(); - - ManaCost cost = new ManaCost(mana); - - // Tack xMana Payments into mana here if X is a set value - if (sa.getPayCosts() != null && cost.getXcounter() > 0){ - String xSvar = card.getSVar("X").equals("Count$xPaid") ? "PayX" : "X"; - // For Count$xPaid set PayX in the AFs then use that here - // Else calculate it as appropriate. - if (!card.getSVar(xSvar).equals("")){ - int manaToAdd = AbilityFactory.calculateAmount(card, xSvar, sa) * cost.getXcounter(); - cost.increaseColorlessMana(manaToAdd); - } - } - - cost = AllZone.GameAction.getSpellCostChange(sa, cost); - if(cost.isPaid()) - return canPayAdditionalCosts(sa, player); - - cost = manapool.subtractMana(sa, cost); - - CardList land = getAvailableMana(player); - - if(card.isLand()) - { - land.remove(card); - } - - ArrayList colors; - - for(int i = 0; i < land.size(); i++) - { - colors = getColors(land.get(i)); - int once = 0; - - for(int j =0; j < colors.size(); j++) - { - if(cost.isNeeded(colors.get(j)) && once == 0) - { - cost.payMana(colors.get(j)); - once++; - } - - if(cost.isPaid()) { - manapool.clearPay(sa, true); - return canPayAdditionalCosts(sa, player); - } - } - } - manapool.clearPay(sa, true); - return false; - }//canPayCost() - - - static public int determineLeftoverMana(SpellAbility sa){ - // This function should mostly be called to determine how much mana AI has leftover to pay X costs - // This function is basically getAvailableMana.size() - sa.getConvertedManaCost() - // Except in the future the AI can hopefully use mana sources that provided more than a single mana - - int xMana = 0; - boolean paid = false; - - CardList land = getAvailableMana(); - - if(sa.getSourceCard().isLand() /*&& sa.isTapAbility()*/) - { - land.remove(sa.getSourceCard()); - } - - ManaCost cost = new ManaCost(sa.getManaCost()); - cost = AllZone.GameAction.getSpellCostChange(sa, cost); - paid = cost.isPaid(); - - ArrayList colors; - - for(int i = 0; i < land.size(); i++) - { - colors = getColors(land.get(i)); - int j; - for(j =0; j < colors.size(); j++) - { - if (paid){ - j = colors.size(); - break; - } - if(cost.isNeeded(colors.get(j))) - { - cost.payMana(colors.get(j)); - paid = cost.isPaid(); - break; - } - } - if (j == colors.size()) // Cost either paid, or this card doesn't produce a "needed" color - xMana++; - } - - return xMana; - } - - static public boolean canPayAdditionalCosts(SpellAbility sa) - { - return canPayAdditionalCosts(sa, AllZone.ComputerPlayer); - } - - 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; - } - - static public boolean canPayCost(String cost) - { - if(cost.equals(("0"))) - return true; - - CardList land = getAvailableMana(); - - ManaCost manacost = new ManaCost(cost); - - ArrayList colors; - - for(int i = 0; i < land.size(); i++) - { - colors = getColors(land.get(i)); - int once = 0; - - for(int j =0; j < colors.size(); j++) - { - if(manacost.isNeeded(colors.get(j)) && once == 0) - { - manacost.payMana(colors.get(j)); - once++; - } - - if(manacost.isPaid()) { - return true; - } - } - } - return false; - }//canPayCost() - - static public void payManaCost(SpellAbility sa) - { - String mana = sa.getPayCosts() != null ? sa.getPayCosts().getTotalMana() : sa.getManaCost(); - - ManaCost cost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana)); - - Card card = sa.getSourceCard(); - // Tack xMana Payments into mana here if X is a set value - if (sa.getPayCosts() != null && cost.getXcounter() > 0){ - String xSvar = card.getSVar("X").equals("Count$xPaid") ? "PayX" : "X"; - // For Count$xPaid set PayX in the AFs then use that here - // Else calculate it as appropriate. - int manaToAdd = 0; - if (xSvar.equals("PayX")){ - manaToAdd = Integer.parseInt(card.getSVar(xSvar)); - } - else{ - manaToAdd = AbilityFactory.calculateAmount(card, xSvar, sa) * cost.getXcounter(); - } - - cost.increaseColorlessMana(manaToAdd); - card.setXManaCostPaid(manaToAdd); - } - - - if(cost.isPaid()) - return; - - ArrayList colors; - - cost = ((ManaPool)AllZone.Computer_ManaPool).subtractMana(sa, cost); - - CardList land = getAvailableMana(); - - //this is to prevent errors for land cards that have abilities that cost mana. - if(sa.getSourceCard().isLand() /*&& sa.isTapAbility()*/) - { - land.remove(sa.getSourceCard()); - } - - for(int i = 0; i < land.size(); i++) - { - final Card sourceLand = land.get(i); - colors = getColors(land.get(i)); - for(int j = 0; j runParams = new HashMap(); - - runParams.put("Card", sourceLand); - runParams.put("Player", AllZone.ComputerPlayer); - runParams.put("Produced", colors.get(j)); //can't tell what mana to computer just paid? - AllZone.TriggerHandler.runTrigger("TapsForMana", runParams); - - } - if(cost.isPaid()) - { - //if (sa instanceof Spell_Permanent) // should probably add this - sa.getSourceCard().setSunburstValue(cost.getSunburst()); - AllZone.Computer_ManaPool.clearPay(sa, false); - break; - } - } - - } - if(!cost.isPaid()) - throw new RuntimeException("ComputerUtil : payManaCost() cost was not paid for " + sa.getSourceCard().getName()); - - }//payManaCost() - - - public static ArrayList getColors(Card land) - { - // loop through abilities and peek at mana abilities - // any mana abilities, look what color they produce - - ArrayList colors = new ArrayList(); - ArrayList mana = land.getManaAbility(); - - for(Ability_Mana m : mana){ - - //if the mana ability is not avaiable move to the next one - m.setActivatingPlayer(land.getController()); - if (!m.canPlay()) continue; - - 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; - } - - static public CardList getAvailableMana() - { - return getAvailableMana(AllZone.ComputerPlayer); - }//getAvailableMana() - - static public CardList getAvailableMana(final Player player) - { - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - CardList mana = 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 sortedMana = new CardList(); - - for (int i=0; i 0) - { - CardList lands = AllZoneUtil.getPlayerTypeInGraveyard(computer, "Land"); - for (Card crd : lands) - 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.ComputerPlayer); - if (list.containsName(c.getName())) - 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.Stack.size() != 0) - return false; - } - return true; - } - - 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; - } - - static public CardList chooseSacrificeType(String type, Card activate, Card target, int amount) { - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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; - } - - static public CardList chooseExileType(String type, Card activate, Card target, int amount){ - return chooseExileFrom(Constant.Zone.Battlefield, type, activate, target, amount); - } - - static public CardList chooseExileFromHandType(String type, Card activate, Card target, int amount){ - return chooseExileFrom(Constant.Zone.Hand, type, activate, target, amount); - } - - static public CardList chooseExileFromGraveType(String type, Card activate, Card target, int amount){ - return chooseExileFrom(Constant.Zone.Graveyard, type, activate, target, amount); - } - - static public CardList chooseExileFrom(String zone, String type, Card activate, Card target, int amount){ - CardList typeList = AllZoneUtil.getCardsInZone(zone, AllZone.ComputerPlayer); - 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; - } - - static public CardList chooseTapType(String type, Card activate, boolean tap, int amount){ - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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; - } - - static public CardList chooseReturnType(String type, Card activate, Card target, int amount){ - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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; - } - - static public CardList getPossibleAttackers() - { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.filter(new CardListFilter() - { - public boolean addCard(Card c) { - return CombatUtil.canAttack(c); - } - }); - return list; - } - - static public Combat getAttackers() - { - ComputerUtil_Attack2 att = new ComputerUtil_Attack2(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer), - AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer), AllZone.HumanPlayer.getLife()); - - return att.getAttackers(); - } - - static public Combat getBlockers() - { - CardList blockers = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - - return ComputerUtil_Block2.getBlockers(AllZone.Combat, blockers); - } - - 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() - - 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.ComputerPlayer); - } 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.GameAction.sacrifice(c); - } - } - - 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()) - // 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("Regenerate")) { - if (AbilityFactory.getDefinedCards(sa.getSourceCard(), mapParams.get("Defined"), sa).contains(card)) - return true; - Target tgt = sa.getTarget(); - if (tgt != null) { - if (AllZoneUtil.getCardsInPlay().getValidCards(tgt.getValidTgts(), controller, af.getHostCard()) - .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; - } - - 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; - } -} \ No newline at end of file +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 index fe0ec3ef4d8..75141acc8ad 100644 --- a/src/forge/ComputerUtil_Attack2.java +++ b/src/forge/ComputerUtil_Attack2.java @@ -1,570 +1,667 @@ package forge; +import forge.card.cardFactory.CardFactoryUtil; +import forge.card.trigger.Trigger; + import java.util.ArrayList; import java.util.HashMap; import java.util.Random; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.trigger.Trigger; - -//doesHumanAttackAndWin() uses the global variable AllZone.ComputerPlayer +//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 - - public ComputerUtil_Attack2(Card[] possibleAttackers, Card[] possibleBlockers, int blockerLife) - { - this(new CardList(possibleAttackers), new CardList(possibleBlockers), blockerLife); - } - - 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 - - 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.TriggerHandler.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) - public boolean isEffectiveAttacker(Card attacker, Combat combat) - { - if (CombatUtil.damageIfUnblocked(attacker, AllZone.HumanPlayer, combat) > 0) return true; - if (CombatUtil.poisonIfUnblocked(attacker, AllZone.HumanPlayer, combat) > 0) return true; - - ArrayList registeredTriggers = AllZone.TriggerHandler.getRegisteredTriggers(); - for(Trigger trigger : registeredTriggers) - if (CombatUtil.combatTriggerWillTrigger(attacker,null,trigger, combat) - && trigger.getHostCard().getController().isComputer()) return true; - - return false; - } - - 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() - - 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() - 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.HumanPlayer); - - if (humanExaltedBonus > 0) { - int nFinestHours = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer, "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.HumanPlayer) ? - 2 * humanBaseAttack: humanBaseAttack; - if ((AllZone.ComputerPlayer.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 - 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.ComputerPlayer.getLife() <= totalAttack; - } - - private boolean doAssault() - { - //Beastmaster Ascension - if(AllZoneUtil.isCardInPlay("Beastmaster Ascension", AllZone.ComputerPlayer) && attackers.size() > 1) { - CardList beastions = AllZoneUtil.getCardsInZone(Constant.Zone.Battlefield, AllZone.ComputerPlayer). - 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() - - 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; - } - - // Randomnly determine who EVERYONE is attacking - // would be better to determine more individually - int n = MyRandom.random.nextInt(defs.size()); - c.setCurrentDefender(n); - return; - } - - - 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.Phase.getTurn() + randomInt); - - Combat combat = new Combat(); - combat.setAttackingPlayer(AllZone.Combat.getAttackingPlayer()); - combat.setDefendingPlayer(AllZone.Combat.getDefendingPlayer()); - - combat.setDefenders(AllZone.Combat.getDefenders()); - - boolean bAssault = doAssault(); - // Determine who will be attacked - chooseDefender(combat, bAssault); - - CardList attackersLeft = new CardList(attackers.toArray()); - - //Atackers 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()) - && 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.ComputerPlayer.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.HumanPlayer,combat); - computerForces += 1; - } - - } - } - - // find the potential damage ratio the AI can cause - double playerLifeToDamageRatio = 1000000; - if(candidateUnblockedDamage > 0) - playerLifeToDamageRatio = (double) AllZone.HumanPlayer.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.HumanPlayer.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.HumanPlayer,combat); - } - } - if(unblockableDamage > 0){turnsUntilDeathByUnblockable = AllZone.HumanPlayer.life/unblockableDamage;} - if(unblockableDamage > AllZone.HumanPlayer.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.ComputerPlayer) >= 3 || - AllZoneUtil.isCardInPlay("Rafiq of the Many", AllZone.ComputerPlayer) || - AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, "Battlegrace Angel").size() >= 2 || - (AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, "Finest Hour").size()>=1) && - AllZone.Phase.isFirstCombat()) - && !bAssault) - { - int biggest = 0; - Card att = null; - for(int i=0; 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.HumanPlayer); - - if (shouldAttack(attacker,blockers,combat) && (totalFirstStrikeBlockPower < attacker.getKillDamage() || aiAggression == 5) - && CombatUtil.canAttack(attacker, combat)) - combat.addAttacker(attacker); - } - }//getAttackers() - - return combat; - }//getAttackers() - - 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(); - } - - public int getAttack(Card c) - { - int n = c.getNetCombatDamage(); - - if (c.hasKeyword("Double Strike")) - n *= 2; - - return n; - } - - 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 - } + //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 index ce5977a0fdc..6b3c6f439a1 100644 --- a/src/forge/ComputerUtil_Block2.java +++ b/src/forge/ComputerUtil_Block2.java @@ -1,458 +1,641 @@ - package forge; -import java.util.ArrayList; - import forge.card.cardFactory.CardFactoryUtil; +import java.util.ArrayList; -public class ComputerUtil_Block2 -{ - private static CardList attackers = new CardList(); //all attackers - private static CardList attackersLeft = new CardList(); //keeps track of all currently unblocked attackers - private static CardList blockedButUnkilled = new CardList(); //blocked attackers that currently wouldn't be destroyed - private static CardList blockersLeft = new CardList(); //keeps track of all unassigned blockers - private static int diff = 0; - - - //finds the creatures able to block the attacker - 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 - 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 - 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; - } - - 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 thread - 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 thread - 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); - } +/** + *

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; - return sortedAttackers; - } - - // ======================= block assignment functions ================================ - - // Good Blocks means a good trade or no trade - private static Combat makeGoodBlocks(Combat combat){ - - CardList currentAttackers = new CardList(attackersLeft.toArray()); - - for(Card attacker : attackersLeft) { - - Card blocker = new Card(); - - CardList blockers = getPossibleBlockers(attacker, blockersLeft, 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); - blockedButUnkilled.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) + diff < CardFactoryUtil.evaluateCreature(attacker)) { - blocker = worst; - } - } - } - if(blocker.getName() != "") { - currentAttackers.remove(attacker); - blockersLeft.remove(blocker); - combat.addBlocker(attacker, blocker); - } - } - attackersLeft = new CardList(currentAttackers.toArray()); - return combat; - } - - // Good Gang Blocks means a good trade or no trade - private static Combat makeGangBlocks(Combat combat){ - - CardList currentAttackers = new CardList(attackersLeft.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 : attackersLeft) { - if (!attacker.hasKeyword("First Strike") - && !attacker.hasKeyword("Double Strike")) { - blockers = getPossibleBlockers(attacker, blockersLeft, 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) { - blockersLeft.remove(b); - combat.addBlocker(attacker, b); - } - } - } - } - } - } - } - - attackersLeft = new CardList(currentAttackers.toArray()); - currentAttackers = new CardList(attackersLeft.toArray()); - - //Try to block an attacker with two blockers of which only one will die - for(final Card attacker : attackersLeft) { - blockers = getPossibleBlockers(attacker, blockersLeft, 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) + diff < 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); + /** + *

Getter for the field attackers.

+ * + * @return a {@link forge.CardList} object. + */ + private static CardList getAttackers() { + return attackers; + } - 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); - blockersLeft.remove(blocker); - blockersLeft.remove(leader); - break; - } - } - } - - attackersLeft = new CardList(currentAttackers.toArray()); - return combat; - } - - // Bad Trade Blocks (should only be made if life is in danger) - private static Combat makeTradeBlocks(Combat combat){ - - CardList currentAttackers = new CardList(attackersLeft.toArray()); - CardList killingBlockers; - - for(Card attacker : attackersLeft) { - killingBlockers = - getKillingBlockers(attacker, getPossibleBlockers(attacker, blockersLeft, combat), combat); - if(killingBlockers.size() > 0 && CombatUtil.lifeInDanger(combat)) { - Card blocker = CardFactoryUtil.AI_getWorstCreature(killingBlockers); - combat.addBlocker(attacker, blocker); - currentAttackers.remove(attacker); - blockersLeft.remove(blocker); - } - } - attackersLeft = new CardList(currentAttackers.toArray()); - return combat; - } - - // Chump Blocks (should only be made if life is in danger) - private static Combat makeChumpBlocks(Combat combat){ - - CardList currentAttackers = new CardList(attackersLeft.toArray()); - CardList chumpBlockers; - - for(Card attacker : attackersLeft) { - chumpBlockers = getPossibleBlockers(attacker, blockersLeft, combat); - if(chumpBlockers.size() > 0 && CombatUtil.lifeInDanger(combat)) { - Card blocker = CardFactoryUtil.AI_getWorstCreature(chumpBlockers); - combat.addBlocker(attacker, blocker); - currentAttackers.remove(attacker); - blockedButUnkilled.add(attacker); - blockersLeft.remove(blocker); - } - } - attackersLeft = new CardList(currentAttackers.toArray()); - return combat; - } - - //Reinforce blockers blocking attackers with trample (should only be made if life is in danger) - private static Combat reinforceBlockersAgainstTrample(Combat combat){ - - CardList chumpBlockers; - - CardList tramplingAttackers = attackers.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." + /** + *

Setter for the field attackers.

+ * + * @param cardList a {@link forge.CardList} object. + */ + private static void setAttackers(CardList cardList) { + attackers = (cardList); + } - for(Card attacker : tramplingAttackers) { - chumpBlockers = getPossibleBlockers(attacker, blockersLeft, 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); - blockersLeft.remove(blocker); - } - } - } + /** + *

Getter for the field attackersLeft.

+ * + * @return a {@link forge.CardList} object. + */ + private static CardList getAttackersLeft() { + return attackersLeft; + } - return combat; - } - - //Support blockers not destroying the attacker with more blockers to try to kill the attacker - private static Combat reinforceBlockersToKill(Combat combat){ - - CardList safeBlockers; - CardList blockers; - CardList targetAttackers = blockedButUnkilled.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, blockersLeft, combat); + /** + *

Setter for the field attackersLeft.

+ * + * @param cardList a {@link forge.CardList} object. + */ + private static void setAttackersLeft(CardList cardList) { + attackersLeft = (cardList); + } - //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); - blockersLeft.remove(blocker); - } - blockers.remove(blocker); //Don't check them again next - } + /** + *

Getter for the field blockedButUnkilled.

+ * + * @return a {@link forge.CardList} object. + */ + private static CardList getBlockedButUnkilled() { + return blockedButUnkilled; - //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) + diff < CardFactoryUtil.evaluateCreature(attacker) - && CombatUtil.canBlock(attacker,blocker,combat)) { - combat.addBlocker(attacker, blocker); - blockersLeft.remove(blocker); - } - } - } + /** + *

Setter for the field blockedButUnkilled.

+ * + * @param cardList a {@link forge.CardList} object. + */ + private static void setBlockedButUnkilled(CardList cardList) { + blockedButUnkilled = (cardList); + } - return combat; - } - - private static Combat resetBlockers(Combat combat, CardList possibleBlockers) { - - CardList oldBlockers = combat.getAllBlockers(); - for (Card blocker:oldBlockers) { - combat.removeFromCombat(blocker); - } - - attackersLeft = new CardList(attackers.toArray()); //keeps track of all currently unblocked attackers - blockersLeft = new CardList(possibleBlockers.toArray()); //keeps track of all unassigned blockers - blockedButUnkilled = new CardList(); //keeps track of all blocked attackers that currently wouldn't be destroyed - - return combat; - } + /** + *

Getter for the field blockersLeft.

+ * + * @return a {@link forge.CardList} object. + */ + private static CardList getBlockersLeft() { + return blockersLeft; + } - //Main function - static public Combat getBlockers(Combat originalCombat, CardList possibleBlockers) { - - Combat combat = originalCombat; - - attackers = sortPotentialAttackers(combat); - - if (attackers.size() == 0) - return combat; - - attackersLeft = new CardList(attackers.toArray()); //keeps track of all currently unblocked attackers - blockersLeft = new CardList(possibleBlockers.toArray()); //keeps track of all unassigned blockers - blockedButUnkilled = new CardList(); //keeps track of all blocked attackers that currently wouldn't be destroyed - CardList blockers; - CardList chumpBlockers; - - diff = AllZone.ComputerPlayer.getLife() * 2 - 5; //This is the minimal gain for an unnecessary trade - - // remove all attackers that can't be blocked anyway - for(Card a : attackers) { - if(!CombatUtil.canBeBlocked(a)) { - attackersLeft.remove(a); - } - } - - // remove all blockers that can't block anyway - for(Card b : possibleBlockers) { - if(!CombatUtil.canBlock(b, combat)) blockersLeft.remove(b); - } - - if (attackersLeft.size() == 0) - return combat; - - //Begin with the weakest blockers - CardListUtil.sortAttackLowFirst(blockersLeft); + /** + *

Setter for the field blockersLeft.

+ * + * @param cardList a {@link forge.CardList} object. + */ + private static void setBlockersLeft(CardList cardList) { + blockersLeft = (cardList); + } - //== 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 = blockersLeft.getKeyword("CARDNAME blocks each turn if able."); - // if an attacker with lure attacks - all that can block - for(Card blocker : blockersLeft) { - if(CombatUtil.canBlockAnAttackerWithLure(blocker,combat)) chumpBlockers.add(blocker); - } - if (!chumpBlockers.isEmpty()) { - attackers.shuffle(); - for(Card attacker : attackers) { - blockers = getPossibleBlockers(attacker, chumpBlockers, combat); - for(Card blocker : blockers) { - if (CombatUtil.canBlock(attacker, blocker, combat)) { - combat.addBlocker(attacker, blocker); - blockersLeft.remove(blocker); - } - } - } - } - - return combat; - } -} \ No newline at end of file + /** + *

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 index b62cfe240ec..afb3f810da8 100644 --- a/src/forge/Constant.java +++ b/src/forge/Constant.java @@ -1,135 +1,166 @@ - package forge; import forge.deck.Deck; import forge.quest.data.QuestMatchState; -import javax.swing.*; 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 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[] 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 int[] width = new int[1]; - public static final int[] height = new int[1]; + public static final boolean[] NetConn = new boolean[1]; + public static final boolean[] UpldDrft = new boolean[1]; - public static final int[] stackSize = new int[1]; - public static final int[] stackOffset = new int[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 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 { - //TODO: 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 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 Untap = "Untap"; + public static final String Upkeep = "Upkeep"; + public static final String Draw = "Draw"; - 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 Main1 = "Main1"; - public static final String End_Of_Turn = "End of Turn"; - public static final String Cleanup = "Cleanup"; + 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 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"; + 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 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 Snow = "snow"; public static final String ManaColors[] = {White, Blue, Black, Red, Green, Colorless, Snow}; - } - - 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 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 index 22662e563a1..3775316ccf7 100644 --- a/src/forge/CopyFiles.java +++ b/src/forge/CopyFiles.java @@ -1,87 +1,96 @@ - -package forge; - - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.List; - -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JProgressBar; - -import org.jdesktop.swingworker.SwingWorker; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - -public class CopyFiles extends SwingWorker implements NewConstants { - - private List FileList; - JLabel jLb; - JProgressBar jB; - JCheckBox jCheck; - JButton jSource; - int count; - - public CopyFiles(List FileList, JLabel jLabelTotalFiles, JProgressBar Jbar, JCheckBox jCheckBox, JButton jButtonSource) { - this.FileList = FileList; - jLb = jLabelTotalFiles; - jB = Jbar; - jCheck = jCheckBox; - jSource = jButtonSource; - } - - @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; - - } - - @Override - protected void done() { - jLb.setText("All files were copied successfully."); - jB.setIndeterminate(false); - jCheck.setEnabled(true); - jSource.setEnabled(true); - - } - -} +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 index 36ba4fc30fe..60ce5e23b01 100644 --- a/src/forge/Counters.java +++ b/src/forge/Counters.java @@ -1,6 +1,6 @@ /** * Counters.java - * + * * Created on 17.02.2010 */ @@ -9,9 +9,9 @@ package forge; /** * The class Counters. - * - * @version V0.0 17.02.2010 + * * @author Clemens Koza + * @version V0.0 17.02.2010 */ public enum Counters { AGE(), @@ -22,6 +22,7 @@ public enum Counters { BLOOD(), BOUNTY(), BRIBERY(), + CARRION(), CHARGE(), CORPSE(), CREDIT(), @@ -50,6 +51,7 @@ public enum Counters { JAVELIN(), KI(), LEVEL(), + LORE(), LOYALTY(), LUCK(), M0M1("-0/-1"), @@ -65,6 +67,7 @@ public enum Counters { ORE(), PAGE(), PETAL(), + PIN(), PLAGUE(), PRESSURE(), PHYLACTERY, @@ -95,22 +98,41 @@ public enum Counters { 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; } - public static Counters getType(String name) - { - return Enum.valueOf(Counters.class, name.replace("/", "").replaceAll("\\+", "p").replaceAll("\\-", "m").toUpperCase()); + + /** + *

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 index 78fa4e28f5b..d2b79e766f9 100644 --- a/src/forge/DefaultPlayerZone.java +++ b/src/forge/DefaultPlayerZone.java @@ -1,217 +1,320 @@ package forge; + import java.util.ArrayList; import java.util.Arrays; import java.util.Observable; -public class DefaultPlayerZone extends PlayerZone implements java.io.Serializable -{ - private static final long serialVersionUID = -5687652485777639176L; +/** + *

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 ArrayList cards = new ArrayList(); + private String zoneName; + private Player player; + private boolean update = true; - private CardList cardsAddedThisTurn = new CardList(); - private ArrayList cardsAddedThisTurnSource = new ArrayList(); + private CardList cardsAddedThisTurn = new CardList(); + private ArrayList cardsAddedThisTurnSource = new ArrayList(); - public DefaultPlayerZone(String zone, Player inPlayer) - { - zoneName = zone; - player = inPlayer; - } - //************ BEGIN - these methods fire updateObservers() ************* - public void add(Object o) - { - Card c = (Card)o; + /** + *

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; + } - cardsAddedThisTurn.add(c); - if(AllZone.getZone(c) != null) - { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } - else - { - cardsAddedThisTurnSource.add("None"); - } + //************ BEGIN - these methods fire updateObservers() ************* - 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()); + /** + * + * @param o a {@link java.lang.Object} object. + */ + public void add(Object o) { + Card c = (Card) o; - grave.addOnce(c); - grave.remove(c); - lib.add(c); - c.getOwner().shuffle(); - return; - } + 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 (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; - } + 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.addObserver(this); - c.setTurnInZone(AllZone.Phase.getTurn()); + c.setTurnInZone(AllZone.getPhase().getTurn()); - cards.add((Card)c); - update(); - } + cards.add((Card) c); + update(); + } - //hack... use for adding Dread / Serra Avenger to grave - public void addOnce(Object o) - { - Card c = (Card)o; + //hack... use for adding Dread / Serra Avenger to grave - cardsAddedThisTurn.add(c); - if(AllZone.getZone(c) != null) - { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } - else - { - cardsAddedThisTurnSource.add("None"); - } + /** + * + * @param o a {@link java.lang.Object} object. + */ + public void addOnce(Object o) { + Card c = (Card) o; - c.addObserver(this); + 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((Card)c); - update(); - } - public void update(Observable ob, Object object) - { - this.update(); - } - public void add(Card c, int index) - { - cardsAddedThisTurn.add(c); - if(AllZone.getZone(c) != null) - { - cardsAddedThisTurnSource.add(AllZone.getZone(c).getZoneName()); - } - else - { - cardsAddedThisTurnSource.add("None"); - } + c.addObserver(this); - cards.add(index, c); - c.setTurnInZone(AllZone.Phase.getTurn()); - update(); - } - public void remove(Object c) - { - cards.remove((Card)c); - update(); - } - public void setCards(Card c[]) - { - cards = new ArrayList(Arrays.asList(c)); - update(); - } - //removes all cards - public void reset() - { - cards.clear(); - update(); - } - //************ END - these methods fire updateObservers() ************* + cards.add((Card) c); + update(); + } - public boolean is(String zone) - { - return zone.equals(zoneName); - } - public boolean is(String zone, Player player) - { - return (zone.equals(zoneName) && player.isPlayer(player)); - } - public Player getPlayer() - { - return player; - } - public String getZoneName() - { - return zoneName; - } - public int size() - { - return cards.size(); - } - public Card get(int index) - { - return (Card)cards.get(index); - } + /** + * + * @param ob + * @param object + */ + public void update(Observable ob, Object object) { + this.update(); + } - public Card[] getCards() - { - Card c[] = new Card[cards.size()]; - cards.toArray(c); - return c; - } - public void update() - { - if(update) - updateObservers(); - } - public void setUpdate(boolean b) {update = b;} - public boolean getUpdate() {return 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"); + } + } - public String toString(){ - StringBuilder sb = new StringBuilder(); - if (player != null) - sb.append(player.toString()).append(" "); - sb.append(zoneName); - return sb.toString(); - } + cards.add(index, c); + c.setTurnInZone(AllZone.getPhase().getTurn()); + update(); + } - public CardList getCardsAddedThisTurn(String origin) - { - System.out.print("Request cards put into " + getZoneName() + " from " + origin + ".Amount: "); - CardList ret = new CardList(); - for(int i=0;iSetter 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 index 358a718222e..0567facfc12 100644 --- a/src/forge/Display.java +++ b/src/forge/Display.java @@ -1,33 +1,95 @@ - package forge; - - -public interface Display { +/** + *

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); + + // 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); - public boolean stopAtPhase(Player turn, String phase); - + /** + *

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(); - public boolean canLoseByDecking(); - - public void setCard(Card c); + /** + *

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 index 21b4f38a364..aa1b3aa46e5 100644 --- a/src/forge/EndOfCombat.java +++ b/src/forge/EndOfCombat.java @@ -1,36 +1,81 @@ -package forge; - -//handles "until end of combat" and "at end of combat" commands from cards -public class EndOfCombat implements java.io.Serializable -{ - - private static final long serialVersionUID = 3035250030566186842L; - - private CommandList at = new CommandList(); - private CommandList until = new CommandList(); - - public void addAt(Command c) {at.add(c);} - public void addUntil(Command c) {until.add(c);} - - public void executeAt() - { - //AllZone.StateBasedEffects.rePopulateStateBasedList(); - execute(at); - }//executeAt() - - - public void executeUntil() { - execute(until); - } - - public int sizeAt() {return at.size();} - public int sizeUntil() {return until.size();} - - private void execute(CommandList c) - { - int length = c.size(); - - for(int i = 0; i < length; i++) - c.remove(0).execute(); - } -} +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 index ca16366d594..e03f60ef832 100644 --- a/src/forge/EndOfTurn.java +++ b/src/forge/EndOfTurn.java @@ -4,209 +4,289 @@ import forge.card.spellability.Ability; import forge.card.spellability.SpellAbility; //handles "until end of turn" and "at end of turn" commands from cards -public class EndOfTurn implements java.io.Serializable -{ - private static final long serialVersionUID = -3656715295379727275L; +/** + *

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(); + private CommandList at = new CommandList(); + private CommandList until = new CommandList(); + private CommandList last = new CommandList(); - public void addAt(Command c) {at.add(c);} - public void addUntil(Command c) {until.add(c);} - public void addLast(Command c) {last.add(c);} + /** + *

addAt.

+ * + * @param c a {@link forge.Command} object. + */ + public void addAt(Command c) { + at.add(c); + } - public void executeAt() { + /** + *

addUntil.

+ * + * @param c a {@link forge.Command} object. + */ + public void addUntil(Command c) { + until.add(c); + } - //Pyrohemia and Pestilence - CardList all = AllZoneUtil.getCardsInPlay(); + /** + *

addLast.

+ * + * @param c a {@link forge.Command} object. + */ + public void addLast(Command c) { + last.add(c); + } - GameActionUtil.endOfTurn_Predatory_Advantage(); - GameActionUtil.endOfTurn_Wall_Of_Reverence(); - GameActionUtil.endOfTurn_Lighthouse_Chronologist(); - GameActionUtil.endOfTurn_Krovikan_Horror(); + /** + *

executeAt.

+ */ + public void executeAt() { - GameActionUtil.removeAttackedBlockedThisTurn(); - AllZone.GameInfo.setPreventCombatDamageThisTurn(false); + //Pyrohemia and Pestilence + CardList all = AllZoneUtil.getCardsInPlay(); - AllZone.StaticEffects.rePopulateStateBasedList(); + GameActionUtil.endOfTurn_Predatory_Advantage(); + GameActionUtil.endOfTurn_Wall_Of_Reverence(); + GameActionUtil.endOfTurn_Lighthouse_Chronologist(); + + //reset mustAttackEntity for me + AllZone.getPhase().getPlayerTurn().setMustAttackEntity(null); - 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.GameAction.sacrifice(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Sacrifice ").append(card); - sac.setStackDescription(sb.toString()); + GameActionUtil.removeAttackedBlockedThisTurn(); + AllZone.getGameInfo().setPreventCombatDamageThisTurn(false); - AllZone.Stack.addSimultaneousStackEntry(sac); + AllZone.getStaticEffects().rePopulateStateBasedList(); - } - 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.GameAction.exile(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Exile ").append(card); - exile.setStackDescription(sb.toString()); + 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.Stack.addSimultaneousStackEntry(exile); + AllZone.getStack().addSimultaneousStackEntry(sac); - } - 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.GameAction.destroy(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Destroy ").append(card); - destroy.setStackDescription(sb.toString()); + } + 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.Stack.addSimultaneousStackEntry(destroy); + AllZone.getStack().addSimultaneousStackEntry(exile); - } - //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.GameAction.destroy(card); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append("Destroy ").append(card); - sac.setStackDescription(sb.toString()); + } + 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.Stack.addSimultaneousStackEntry(sac); + AllZone.getStack().addSimultaneousStackEntry(destroy); - } - 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.GameAction.changeController(new CardList(vale), vale.getController(), vale.getController().getOpponent()); + } + //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()); - 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(sac); - AllZone.Stack.addSimultaneousStackEntry(change); + } 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()); - } - if(c.getName().equals("Erg Raiders") && !c.getCreatureAttackedThisTurn() && - !c.isSick() && AllZone.Phase.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()); + 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.Stack.addSimultaneousStackEntry(change); + 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.Phase.getTurn())*/ - && AllZone.Phase.isPlayerTurn(c.getController())) { - final Card source = c; - final SpellAbility change = new Ability(source, "0") { - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(source)) { - AllZone.GameAction.sacrifice(source); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(source.getName()).append(" - sacrifice ").append(source.getName()).append("."); - change.setStackDescription(sb.toString()); + } + 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.Stack.addSimultaneousStackEntry(change); + AllZone.getStack().addSimultaneousStackEntry(change); - } - if(c.hasKeyword("At the beginning of your end step, return CARDNAME to its owner's hand.") - && AllZone.Phase.isPlayerTurn(c.getController())) { - final Card source = c; - final SpellAbility change = new Ability(source, "0") { - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(source)) { - AllZone.GameAction.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()); + } + 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.Stack.addSimultaneousStackEntry(change); + 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); + execute(at); + CardList all2 = AllZoneUtil.getCardsInPlay(); + for (Card c : all2) { + if (c.getCreatureAttackedThisTurn()) c.setCreatureAttackedThisTurn(false); + } - CardList all2 = AllZoneUtil.getCardsInPlay(); - for(Card c:all2) { - if(c.getCreatureAttackedThisTurn()) c.setCreatureAttackedThisTurn(false); - } - - }//executeAt() + }//executeAt() - public void executeUntil() { - execute(until); - execute(last); - } + /** + *

executeUntil.

+ */ + public void executeUntil() { + execute(until); + execute(last); + } - public int sizeAt() {return at.size();} - public int sizeUntil() {return until.size();} - public int sizeLast() { return last.size();} + /** + *

sizeAt.

+ * + * @return a int. + */ + public int sizeAt() { + return at.size(); + } - private void execute(CommandList c) - { - int length = c.size(); + /** + *

sizeUntil.

+ * + * @return a int. + */ + public int sizeUntil() { + return until.size(); + } - for(int i = 0; i < length; i++) - c.remove(0).execute(); - } + /** + *

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 index acac0370010..b6697877a0a 100644 --- a/src/forge/ExternalPanel.java +++ b/src/forge/ExternalPanel.java @@ -1,40 +1,48 @@ package forge; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; + +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; -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JPanel; - /** * ExternalPanel.java - * + * * Created on 13.08.2009 */ /** * The class ExternalPanel. A panel with which some other component can be shown in an external window. - * - * @version V0.0 13.08.2009 + * * @author Clemens Koza + * @version V0.0 13.08.2009 */ public class ExternalPanel extends JPanel { - private static final long serialVersionUID = 9098962430872706173L; - private Component child, head; - private JFrame frame; - + /** 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); @@ -45,18 +53,24 @@ public class ExternalPanel extends JPanel { 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(); + 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(); @@ -69,7 +83,7 @@ public class ExternalPanel extends JPanel { validate(); repaint(); } - + private void bringIn() { add(child); frame.dispose(); @@ -77,12 +91,12 @@ public class ExternalPanel extends JPanel { validate(); repaint(); } - + public void actionPerformed(ActionEvent e) { - if(frame == null) bringOut(); + 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 index 9c23080dad8..ed84cdd19ec 100644 --- a/src/forge/FileFinder.java +++ b/src/forge/FileFinder.java @@ -1,132 +1,185 @@ -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; - -public class FileFinder { - - private Pattern p = null; - private Matcher m = null; - private long totalLength = 0; - private int filesNumber = 0; - private long directoriesNumber = 0; - private static final int FILES = 0; - private static final int DIRECTORIES = 1; - private ArrayList fileNames; - private ArrayList fName; - - - public FileFinder() { - } - - public List findFiles(String startPath, String mask) - throws Exception { - fileNames = new ArrayList(); - fName = new ArrayList(); - return findWithFull(startPath, mask, FILES); - } - - - public long getDirectorySize() { - return totalLength; - } - - public int getFilesNumber() { - return filesNumber; - } - - public long getDirectoriesNumber() { - return directoriesNumber; - } - - private boolean accept(String name) { - - if(p == null) { - - return true; - } - - m = p.matcher(name); - - if(m.matches()) { - return true; - } - else { - return false; - } - } - - - - - 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; - } - - -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); - }}} - } - } - } - -} +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 index 684daff04a3..3bc01678492 100644 --- a/src/forge/FileUtil.java +++ b/src/forge/FileUtil.java @@ -8,61 +8,97 @@ 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++) + for (int i = 0; i < data.size(); i++) io.write(data.get(i) + "\r\n"); - + io.flush(); io.close(); - } catch(Exception ex) { + } 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; - + if (file == null || !file.exists()) return list; + in = new BufferedReader(new FileReader(file)); - + String line; - while((line = in.readLine()) != null) + while ((line = in.readLine()) != null) list.add(line); - } catch(Exception ex) { + } catch (Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("FileUtil : readFile() error, " + ex); } - + return list; }//readFile() -} \ No newline at end of file +} diff --git a/src/forge/GUI_DeckAnalysis.java b/src/forge/GUI_DeckAnalysis.java index c4188ea0cc6..73d2e5934c5 100644 --- a/src/forge/GUI_DeckAnalysis.java +++ b/src/forge/GUI_DeckAnalysis.java @@ -1,1014 +1,1344 @@ -package forge; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; -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.table.DefaultTableModel; - -import com.cloudgarden.layout.AnchorLayout; - - -/** -* 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. -*/ -public class GUI_DeckAnalysis extends javax.swing.JDialog { - - 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; - - - public GUI_DeckAnalysis(JFrame g, TableModel tb) { - super(g); - tModel = tb; - - jF=g; - 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 WListener()); - 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(); - } - } - - - - 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; - } - - 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; - } - - 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; - } - - private JButton getJButtonOk() { - if(jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setLayout(null); - jButtonOk.setText("OK"); - jButtonOk.setBounds(206, 536, 168, 31); - jButtonOk.addMouseListener(new CustomListener()); - } - return jButtonOk; - } - - 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; - } - - private JLabel getJLabel3() { - if(jLabelBlue == null) { - jLabelBlue = new JLabel(); - jLabelBlue.setText("Blue:"); - jLabelBlue.setLayout(null); - jLabelBlue.setBounds(10, 50, 127, 13); - } - return jLabelBlue; - } - - private JLabel getJLabel4() { - if(jLabelGreen == null) { - jLabelGreen = new JLabel(); - jLabelGreen.setText("Green:"); - jLabelGreen.setLayout(null); - jLabelGreen.setBounds(10, 72, 127, 13); - } - return jLabelGreen; - } - - private JLabel getJLabel5() { - if(jLabelRed == null) { - jLabelRed = new JLabel(); - jLabelRed.setText("Red:"); - jLabelRed.setLayout(null); - jLabelRed.setBounds(10, 94, 127, 14); - } - return jLabelRed; - } - - private JLabel getJLabel6() { - if(jLabelWhite == null) { - jLabelWhite = new JLabel(); - jLabelWhite.setText("White:"); - jLabelWhite.setLayout(null); - jLabelWhite.setBounds(10, 116, 127, 13); - } - return jLabelWhite; - } - - private JLabel getJLabel7() { - if(jLabelMultiColor == null) { - jLabelMultiColor = new JLabel(); - jLabelMultiColor.setText("Multicolor:"); - jLabelMultiColor.setLayout(null); - jLabelMultiColor.setBounds(10, 138, 127, 12); - } - return jLabelMultiColor; - } - - private JLabel getJLabel8() { - if(jLabelColorless == null) { - jLabelColorless = new JLabel(); - jLabelColorless.setText("Colorless:"); - jLabelColorless.setLayout(null); - jLabelColorless.setBounds(10, 160, 128, 11); - } - return jLabelColorless; - } - - private JLabel getJLabel1x() { - if(jLabelLand == null) { - jLabelLand = new JLabel(); - jLabelLand.setText("Land: "); - jLabelLand.setLayout(null); - jLabelLand.setBounds(10, 182, 129, 10); - } - return jLabelLand; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - private JLabel getJLabel4x() { - if(jLabelCreature == null) { - jLabelCreature = new JLabel(); - jLabelCreature.setText("Creature:"); - jLabelCreature.setLayout(null); - jLabelCreature.setBounds(10, 53, 127, 13); - } - return jLabelCreature; - } - - private JLabel getJLabel5x() { - if(jLabelEnchant == null) { - jLabelEnchant = new JLabel(); - jLabelEnchant.setText("Enchant:"); - jLabelEnchant.setLayout(null); - jLabelEnchant.setBounds(10, 79, 127, 13); - } - return jLabelEnchant; - } - - private JLabel getJLabel6x() { - if(jLabelInstant == null) { - jLabelInstant = new JLabel(); - jLabelInstant.setText("Instant:"); - jLabelInstant.setLayout(null); - jLabelInstant.setBounds(10, 105, 127, 14); - } - return jLabelInstant; - } - - private JLabel getJLabel7x() { - if(jLabelLandType == null) { - jLabelLandType = new JLabel(); - jLabelLandType.setText("Land:"); - jLabelLandType.setLayout(null); - jLabelLandType.setBounds(10, 130, 127, 13); - } - return jLabelLandType; - } - - private JLabel getJLabel8x() { - if(jLabelPlaneswalker == null) { - jLabelPlaneswalker = new JLabel(); - jLabelPlaneswalker.setText("Planeswalker:"); - jLabelPlaneswalker.setLayout(null); - jLabelPlaneswalker.setBounds(10, 156, 127, 13); - } - return jLabelPlaneswalker; - } - - private JLabel getJLabel10() { - if(jLabelSorcery == null) { - jLabelSorcery = new JLabel(); - jLabelSorcery.setText("Sorcery:"); - jLabelSorcery.setLayout(null); - jLabelSorcery.setBounds(10, 182, 127, 11); - } - return jLabelSorcery; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - private JLabel getJLabel5xx() { - if(jLabelOneMana == null) { - jLabelOneMana = new JLabel(); - jLabelOneMana.setText("One mana:"); - jLabelOneMana.setLayout(null); - jLabelOneMana.setBounds(10, 53, 127, 13); - } - return jLabelOneMana; - } - - private JLabel getJLabel6xx() { - if(jLabelTwoMana == null) { - jLabelTwoMana = new JLabel(); - jLabelTwoMana.setText("Two mana:"); - jLabelTwoMana.setLayout(null); - jLabelTwoMana.setBounds(10, 79, 127, 13); - } - return jLabelTwoMana; - } - - private JLabel getJLabel7xx() { - if(jLabelThreeMana == null) { - jLabelThreeMana = new JLabel(); - jLabelThreeMana.setText("Three mana:"); - jLabelThreeMana.setLayout(null); - jLabelThreeMana.setBounds(10, 105, 127, 14); - } - return jLabelThreeMana; - } - - private JLabel getJLabel8xx() { - if(jLabelFourMana == null) { - jLabelFourMana = new JLabel(); - jLabelFourMana.setText("Four mana:"); - jLabelFourMana.setLayout(null); - jLabelFourMana.setBounds(10, 130, 127, 13); - } - return jLabelFourMana; - } - - private JLabel getJLabel9() { - if(jLabelFiveMana == null) { - jLabelFiveMana = new JLabel(); - jLabelFiveMana.setText("Five mana:"); - jLabelFiveMana.setLayout(null); - jLabelFiveMana.setBounds(10, 156, 127, 13); - } - return jLabelFiveMana; - } - - 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; - } - - 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; - } - - 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(); - AnchorLayout jPanel4Layout = new AnchorLayout(); - 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; - - } - - 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; - } - - 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; - } - - 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; - } - - public class CustomListener implements MouseListener { - - public void mouseClicked(MouseEvent e) { - - - jF.setEnabled(true); - dispose(); - } - - public void mouseEntered(MouseEvent e) { - - } - - public void mouseExited(MouseEvent e) { - - } - - public void mousePressed(MouseEvent e) { - - } - - public void mouseReleased(MouseEvent e) { - - } - } - - public class WListener implements WindowListener { - - public void windowActivated(WindowEvent arg0) { - - } - - public void windowClosed(WindowEvent arg0) { - - } - - public void windowClosing(WindowEvent arg0) { - - jF.setEnabled(true); - - } - - public void windowDeactivated(WindowEvent arg0) { - - } - - public void windowDeiconified(WindowEvent arg0) { - - } - - public void windowIconified(WindowEvent arg0) { - - } - - 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; i1){ - 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=6){mSixMore = mSixMore+1;} - } - - for(int i=0; i=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; - } - - private JScrollPane getJScrollPane1() { - if(jScrollPane1 == null) { - jScrollPane1 = new JScrollPane(); - jScrollPane1.setBounds(2, 2, 582, 268); - jScrollPane1.setSize(580, 268); - jScrollPane1.setViewportView(getJTable1()); - } - return jScrollPane1; - } - - private JLabel getJLabel1xxxxx() { - if(jLabel1 == null) { - jLabel1 = new JLabel(); - jLabel1.setText("Draw Probabilities:"); - jLabel1.setLayout(null); - jLabel1.setBounds(7, 237, 447, 25); - } - return jLabel1; - } - -} +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 index d0c008cdea7..dbfc59389f8 100644 --- a/src/forge/GUI_Filter.java +++ b/src/forge/GUI_Filter.java @@ -1,772 +1,763 @@ - -package forge; - - -import java.awt.Dimension; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; - -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.JSeparator; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.border.BevelBorder; - -import com.cloudgarden.layout.AnchorConstraint; -import com.cloudgarden.layout.AnchorLayout; - - -/** - * 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. - */ -public class GUI_Filter extends javax.swing.JDialog { - - private static final long serialVersionUID = -8475271235196182185L; - private JLabel jLabel1; - private JTextField NameText; - private JLabel jLabel5; - private JTextField cardText; - @SuppressWarnings("unused") - private JTextField cardType; - private JPanel jPanel1; - private JCheckBox jCheckBoxColorless; - private JCheckBox jCheckBoxWhite; - private JCheckBox jCheckBoxRed; - private JCheckBox jCheckBoxGreen; - private JCheckBox jCheckBoxBlue; - private JSeparator jSeparator1; - private JLabel jLabel2; - private JLabel jLabel3; - private JLabel jLabel4; - private JCheckBox jCheckBoxPlaneswalker; - private JCheckBox jCheckBoxArtifact; - private JCheckBox jCheckBoxCreature; - private JCheckBox jCheckBoxEnchant; - private JCheckBox jCheckBoxInstant; - private JCheckBox jCheckBoxLand; - private JCheckBox jCheckBoxSorcery; - private JSeparator jSeparator2; - private JPanel jPanel2; - private JCheckBox jCheckBoxBlack; - private JButton jButtonOk; - //private ButtonGroup buttonGroup1; - private DeckDisplay deckDisplay; - public CardList filterCardList; - int kCode; - - - public GUI_Filter(JFrame g, DeckDisplay display) { - super(g); - deckDisplay = display; - initGUI(); - } - - private void initGUI() { - try { - - AnchorLayout thisLayout = new AnchorLayout(); - getContentPane().setLayout(thisLayout); - { - NameText = new JTextField(); - getContentPane().add( - getJPanel2(), - new AnchorConstraint(293, 972, 837, 534, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJButtonOk(), - new AnchorConstraint(873, 638, 965, 384, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJPanel1(), - new AnchorConstraint(293, 483, 837, 45, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - NameText, - new AnchorConstraint(38, 969, 126, 362, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - NameText.setPreferredSize(new java.awt.Dimension(148, 24)); - NameText.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(); - } - } - }); - } - { - jLabel1 = new JLabel(); - getContentPane().add( - jLabel1, - new AnchorConstraint(4, 313, 153, 41, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJTextField1(), - new AnchorConstraint(159, 969, 248, 360, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJLabel5(), - new AnchorConstraint(126, 313, 275, 41, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - jLabel1.setText("Name:"); - jLabel1.setPreferredSize(new java.awt.Dimension(75, 50)); - jLabel1.setLayout(null); - jLabel1.setFont(new java.awt.Font("Segoe UI", 0, 16)); - jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - } - setVisible(true); - this.setPreferredSize(new java.awt.Dimension(280, 300)); - - Dimension screen = getToolkit().getScreenSize(); - // int x = (screen.width - 280) / 2; - // int y = (screen.height - 300) / 2; - // this.setBounds(x, y, 280, 300); - // this.setResizable(false); - int x = (screen.width - 340) / 2; - int y = (screen.height - 360) / 2; - this.setBounds(x, y, 340, 360); - this.setResizable(true); - this.setTitle("Filter"); - // pack(); - try { - this.setIconImage(null); - } catch(NoSuchMethodError err) { - // setIconImage is @since 1.6 - err.printStackTrace(); - } - this.addWindowListener(new WListener()); - - - } catch(Exception e) { - e.printStackTrace(); - } - } - - private JPanel getJPanel1() { - if(jPanel1 == null) { - jPanel1 = new JPanel(); - AnchorLayout jPanel1Layout = new AnchorLayout(); - jPanel1.setPreferredSize(new java.awt.Dimension(121, 183)); - jPanel1.setLayout(jPanel1Layout); - jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel1.setBackground(new java.awt.Color(192, 192, 192)); - jPanel1.add(getJCheckBoxBlack(), new AnchorConstraint(134, 985, 240, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxColorless(), new AnchorConstraint(878, 983, 950, 84, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxWhite(), new AnchorConstraint(726, 987, 798, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxRed(), new AnchorConstraint(577, 987, 654, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxGreen(), new AnchorConstraint(428, 987, 494, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxBlue(), new AnchorConstraint(279, 987, 356, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJSeparator1(), new AnchorConstraint(107, 987, 139, 12, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJLabel2(), new AnchorConstraint(-20, 990, 123, 16, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - } - return jPanel1; - } - - 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); - } - return jLabel2; - } - - private JSeparator getJSeparator1() { - if(jSeparator1 == null) { - jSeparator1 = new JSeparator(); - jSeparator1.setPreferredSize(new java.awt.Dimension(117, 6)); - jSeparator1.setLayout(null); - } - return jSeparator1; - } - - private JCheckBox getJCheckBoxBlue() { - if(jCheckBoxBlue == null) { - jCheckBoxBlue = new JCheckBox(); - jCheckBoxBlue.setLayout(null); - jCheckBoxBlue.setText("Blue"); - jCheckBoxBlue.setPreferredSize(new java.awt.Dimension(109, 14)); - 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; - } - - private JCheckBox getJCheckBoxGreen() { - if(jCheckBoxGreen == null) { - jCheckBoxGreen = new JCheckBox(); - jCheckBoxGreen.setLayout(null); - jCheckBoxGreen.setText("Green"); - jCheckBoxGreen.setPreferredSize(new java.awt.Dimension(109, 12)); - 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; - } - - private JCheckBox getJCheckBoxRed() { - if(jCheckBoxRed == null) { - jCheckBoxRed = new JCheckBox(); - jCheckBoxRed.setLayout(null); - jCheckBoxRed.setText("Red"); - jCheckBoxRed.setPreferredSize(new java.awt.Dimension(109, 14)); - 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; - } - - private JCheckBox getJCheckBoxWhite() { - if(jCheckBoxWhite == null) { - jCheckBoxWhite = new JCheckBox(); - jCheckBoxWhite.setLayout(null); - jCheckBoxWhite.setText("White"); - jCheckBoxWhite.setPreferredSize(new java.awt.Dimension(109, 13)); - 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; - } - - private JCheckBox getJCheckBoxColorless() { - if(jCheckBoxColorless == null) { - jCheckBoxColorless = new JCheckBox(); - jCheckBoxColorless.setLayout(null); - jCheckBoxColorless.setText("Colorless"); - jCheckBoxColorless.setPreferredSize(new java.awt.Dimension(80, 15)); - 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; - } - - private JButton getJButtonOk() { - if(jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setLayout(null); - jButtonOk.setText("OK"); - jButtonOk.setPreferredSize(new java.awt.Dimension(100, 25)); - jButtonOk.addMouseListener(new CustomListener()); - } - return jButtonOk; - } - - private JCheckBox getJCheckBoxBlack() { - if(jCheckBoxBlack == null) { - jCheckBoxBlack = new JCheckBox(); - jCheckBoxBlack.setLayout(null); - jCheckBoxBlack.setText("Black"); - jCheckBoxBlack.setPreferredSize(new java.awt.Dimension(97, 20)); - 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; - } - - private JPanel getJPanel2() { - if(jPanel2 == null) { - jPanel2 = new JPanel(); - AnchorLayout jPanel2Layout = new AnchorLayout(); - jPanel2.setPreferredSize(new java.awt.Dimension(121, 183)); - jPanel2.setLayout(jPanel2Layout); - jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel2.setBackground(new java.awt.Color(192, 192, 192)); - jPanel2.add(getJSeparator2(), new AnchorConstraint(112, 987, 166, 20, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJLabel3(), new AnchorConstraint(-200, 951, -61, -166, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJLabel4(), new AnchorConstraint(-19, 985, 128, 4, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox1(), new AnchorConstraint(877, 948, 948, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox2(), new AnchorConstraint(751, 948, 827, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox3(), new AnchorConstraint(625, 948, 702, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox4(), new AnchorConstraint(505, 948, 581, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox5(), new AnchorConstraint(379, 948, 450, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox6(), new AnchorConstraint(254, 948, 325, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox7(), new AnchorConstraint(133, 948, 232, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - } - return jPanel2; - } - - private JLabel getJLabel3() { - if(jLabel3 == null) { - jLabel3 = new JLabel(); - jLabel3.setText("Color"); - 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); - } - return jLabel3; - } - - private JLabel getJLabel4() { - if(jLabel4 == null) { - jLabel4 = new JLabel(); - jLabel4.setText("Type"); - jLabel4.setHorizontalAlignment(SwingConstants.CENTER); - jLabel4.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabel4.setPreferredSize(new java.awt.Dimension(105, 27)); - jLabel4.setLayout(null); - } - return jLabel4; - } - - private JSeparator getJSeparator2() { - if(jSeparator2 == null) { - jSeparator2 = new JSeparator(); - jSeparator2.setPreferredSize(new java.awt.Dimension(116, 10)); - jSeparator2.setLayout(null); - } - return jSeparator2; - } - - private JCheckBox getJCheckBox1() { - if(jCheckBoxSorcery == null) { - jCheckBoxSorcery = new JCheckBox(); - jCheckBoxSorcery.setLayout(null); - jCheckBoxSorcery.setText("Sorcery"); - jCheckBoxSorcery.setSelected(true); - jCheckBoxSorcery.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxSorcery.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox2() { - if(jCheckBoxPlaneswalker == null) { - jCheckBoxPlaneswalker = new JCheckBox(); - jCheckBoxPlaneswalker.setLayout(null); - jCheckBoxPlaneswalker.setText("Planeswalker"); - jCheckBoxPlaneswalker.setSelected(true); - jCheckBoxPlaneswalker.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxPlaneswalker.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox3() { - if(jCheckBoxLand == null) { - jCheckBoxLand = new JCheckBox(); - jCheckBoxLand.setLayout(null); - jCheckBoxLand.setText("Land"); - jCheckBoxLand.setSelected(true); - jCheckBoxLand.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxLand.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox4() { - if(jCheckBoxInstant == null) { - jCheckBoxInstant = new JCheckBox(); - jCheckBoxInstant.setLayout(null); - jCheckBoxInstant.setText("Instant"); - jCheckBoxInstant.setSelected(true); - jCheckBoxInstant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxInstant.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox5() { - if(jCheckBoxEnchant == null) { - jCheckBoxEnchant = new JCheckBox(); - jCheckBoxEnchant.setLayout(null); - jCheckBoxEnchant.setText("Enchant"); - jCheckBoxEnchant.setSelected(true); - jCheckBoxEnchant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxEnchant.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox6() { - if(jCheckBoxCreature == null) { - jCheckBoxCreature = new JCheckBox(); - jCheckBoxCreature.setLayout(null); - jCheckBoxCreature.setText("Creature"); - jCheckBoxCreature.setSelected(true); - jCheckBoxCreature.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxCreature.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox7() { - if(jCheckBoxArtifact == null) { - jCheckBoxArtifact = new JCheckBox(); - jCheckBoxArtifact.setLayout(null); - jCheckBoxArtifact.setText("Artifact"); - jCheckBoxArtifact.setSelected(true); - jCheckBoxArtifact.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxArtifact.setPreferredSize(new java.awt.Dimension(93, 18)); - 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; - } - - private JTextField getJTextField1() { - if(cardText == null) { - cardText = new JTextField(); - cardText.setPreferredSize(new java.awt.Dimension(168, 30)); - cardText.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 cardText; - } - - private JLabel getJLabel5() { - if(jLabel5 == null) { - jLabel5 = new JLabel(); - jLabel5.setText("Card Text:"); - jLabel5.setHorizontalAlignment(SwingConstants.CENTER); - jLabel5.setFont(new java.awt.Font("Segoe UI", 0, 16)); - jLabel5.setPreferredSize(new java.awt.Dimension(75, 50)); - jLabel5.setLayout(null); - } - return jLabel5; - } - - - public class CustomListener implements MouseListener { - - public void mouseClicked(MouseEvent e) { - FilterCardTable(); - } - - public void mouseEntered(MouseEvent e) { - - } - - public void mouseExited(MouseEvent e) { - - } - - public void mousePressed(MouseEvent e) { - - } - - public void mouseReleased(MouseEvent e) { - - } - } - - public class WListener implements WindowListener { - - public void windowActivated(WindowEvent arg0) { - - } - - public void windowClosed(WindowEvent arg0) { - - } - - public void windowClosing(WindowEvent arg0) { - Gui_DeckEditor g = (Gui_DeckEditor) deckDisplay; - g.setEnabled(true); - } - - public void windowDeactivated(WindowEvent arg0) { - - } - - public void windowDeiconified(WindowEvent arg0) { - - } - - public void windowIconified(WindowEvent arg0) { - - } - - public void windowOpened(WindowEvent arg0) { - - } - } - - private void FilterCardTable() { - - String name = NameText.getText(); - String cText = cardText.getText(); - CardList filterCardList = AllZone.CardFactory.getAllCards(); - 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(filterCardList, 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(); - - } - -} +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 index 1d3914264b4..6ac832b97bb 100644 --- a/src/forge/GUI_ImportPicture.java +++ b/src/forge/GUI_ImportPicture.java @@ -1,380 +1,371 @@ - -package forge; - - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.Rectangle; -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; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JDialog; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JProgressBar; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - -public class GUI_ImportPicture extends JDialog implements NewConstants { - 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; - - - /** - * @param owner - */ - public GUI_ImportPicture(JFrame owner) { - super(owner); - frame = this; - initialize(); - } - - /** - * This method initializes this - * - * @return void - */ - 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)); - try { - File file = ForgeProps.getFile(IMAGE_BASE); - long freeSpace = file.getFreeSpace(); - freeSpaceM = freeSpace / 1024 / 1024; - jLabelHDDFree.setText("HDD Free Space: " + freeSpaceM + " MB"); - } catch(NoSuchMethodError err) { - // getFreeSpace is @since 1.6 - err.printStackTrace(); - jLabelHDDFree.setText("HDD Free Space could not be determined"); - } - 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()); - } - 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; - } - - public class CustomListener extends MouseAdapter { - @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() { - 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()); - } - } - }); - cFiles.execute(); - } - } - } - } -} // @jve:decl-index=0:visual-constraint="10,10" +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 index 252086fd789..0c815053d56 100644 --- a/src/forge/GUI_Quest_Filter.java +++ b/src/forge/GUI_Quest_Filter.java @@ -1,751 +1,741 @@ - -package forge; - - -import java.awt.Dimension; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.WindowEvent; -import java.awt.event.WindowListener; - -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.JSeparator; -import javax.swing.JTextField; -import javax.swing.SwingConstants; -import javax.swing.border.BevelBorder; - -import com.cloudgarden.layout.AnchorConstraint; -import com.cloudgarden.layout.AnchorLayout; - - -/** - * 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. - */ -public class GUI_Quest_Filter extends javax.swing.JDialog { - - private static final long serialVersionUID = -8475271235196182185L; - private JLabel jLabel1; - private JTextField NameText; - private JLabel jLabel5; - private JTextField cardText; - private JPanel jPanel1; - private JCheckBox jCheckBoxColorless; - private JCheckBox jCheckBoxWhite; - private JCheckBox jCheckBoxRed; - private JCheckBox jCheckBoxGreen; - private JCheckBox jCheckBoxBlue; - private JSeparator jSeparator1; - private JLabel jLabel2; - private JLabel jLabel3; - private JLabel jLabel4; - private JCheckBox jCheckBoxPlaneswalker; - private JCheckBox jCheckBoxArtifact; - private JCheckBox jCheckBoxCreature; - private JCheckBox jCheckBoxEnchant; - private JCheckBox jCheckBoxInstant; - private JCheckBox jCheckBoxLand; - private JCheckBox jCheckBoxSorcery; - private JSeparator jSeparator2; - private JPanel jPanel2; - private JCheckBox jCheckBoxBlack; - private JButton jButtonOk; - private DeckDisplay deckDisplay; - public CardList filterCardList; - int kCode; - - - public GUI_Quest_Filter(JFrame g, DeckDisplay display) { - super(g); - deckDisplay = display; - initGUI(); - } - - private void initGUI() { - try { - - getContentPane().setLayout(new AnchorLayout()); - { - NameText = new JTextField(); - getContentPane().add( - getJPanel2(), - new AnchorConstraint(293, 972, 837, 534, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJButtonOk(), - new AnchorConstraint(873, 638, 965, 384, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJPanel1(), - new AnchorConstraint(293, 483, 837, 45, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - NameText, - new AnchorConstraint(38, 969, 126, 362, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - NameText.setPreferredSize(new java.awt.Dimension(148, 24)); - NameText.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(); - } - } - }); - } - { - jLabel1 = new JLabel(); - getContentPane().add( - jLabel1, - new AnchorConstraint(4, 313, 153, 41, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJTextField1(), - new AnchorConstraint(159, 969, 248, 360, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - getContentPane().add( - getJLabel5(), - new AnchorConstraint(126, 313, 275, 41, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - jLabel1.setText("Name:"); - jLabel1.setPreferredSize(new java.awt.Dimension(75, 50)); - jLabel1.setLayout(null); - jLabel1.setFont(new java.awt.Font("Segoe UI", 0, 16)); - jLabel1.setHorizontalAlignment(SwingConstants.CENTER); - } - setVisible(true); - this.setPreferredSize(new java.awt.Dimension(280, 300)); - - Dimension screen = getToolkit().getScreenSize(); - int x = (screen.width - 280) / 2; - int y = (screen.height - 300) / 2; - this.setBounds(x, y, 280, 300); - this.setResizable(false); - this.setTitle("Filter"); - pack(); - try { - this.setIconImage(null); - } catch(NoSuchMethodError err) { - // setIconImage is @since 1.6 - err.printStackTrace(); - } - this.addWindowListener(new WListener()); - - - } catch(Exception e) { - e.printStackTrace(); - } - } - - - /* - private ButtonGroup getButtonGroup1() { - if(buttonGroup1 == null) { - buttonGroup1 = new ButtonGroup(); - } - return buttonGroup1; - } - */ - - private JPanel getJPanel1() { - if(jPanel1 == null) { - jPanel1 = new JPanel(); - jPanel1.setPreferredSize(new java.awt.Dimension(121, 183)); - jPanel1.setLayout(new AnchorLayout()); - jPanel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel1.setBackground(new java.awt.Color(192, 192, 192)); - jPanel1.add(getJCheckBoxBlack(), new AnchorConstraint(134, 985, 240, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxColorless(), new AnchorConstraint(878, 983, 950, 84, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxWhite(), new AnchorConstraint(726, 987, 798, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxRed(), new AnchorConstraint(577, 987, 654, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxGreen(), new AnchorConstraint(428, 987, 494, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJCheckBoxBlue(), new AnchorConstraint(279, 987, 356, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJSeparator1(), new AnchorConstraint(107, 987, 139, 12, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel1.add(getJLabel2(), new AnchorConstraint(-20, 990, 123, 16, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - } - return jPanel1; - } - - 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); - } - return jLabel2; - } - - private JSeparator getJSeparator1() { - if(jSeparator1 == null) { - jSeparator1 = new JSeparator(); - jSeparator1.setPreferredSize(new java.awt.Dimension(117, 6)); - jSeparator1.setLayout(null); - } - return jSeparator1; - } - - private JCheckBox getJCheckBoxBlue() { - if(jCheckBoxBlue == null) { - jCheckBoxBlue = new JCheckBox(); - jCheckBoxBlue.setLayout(null); - jCheckBoxBlue.setText("Blue"); - jCheckBoxBlue.setPreferredSize(new java.awt.Dimension(109, 14)); - 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; - } - - private JCheckBox getJCheckBoxGreen() { - if(jCheckBoxGreen == null) { - jCheckBoxGreen = new JCheckBox(); - jCheckBoxGreen.setLayout(null); - jCheckBoxGreen.setText("Green"); - jCheckBoxGreen.setPreferredSize(new java.awt.Dimension(109, 12)); - 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; - } - - private JCheckBox getJCheckBoxRed() { - if(jCheckBoxRed == null) { - jCheckBoxRed = new JCheckBox(); - jCheckBoxRed.setLayout(null); - jCheckBoxRed.setText("Red"); - jCheckBoxRed.setPreferredSize(new java.awt.Dimension(109, 14)); - 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; - } - - private JCheckBox getJCheckBoxWhite() { - if(jCheckBoxWhite == null) { - jCheckBoxWhite = new JCheckBox(); - jCheckBoxWhite.setLayout(null); - jCheckBoxWhite.setText("White"); - jCheckBoxWhite.setPreferredSize(new java.awt.Dimension(109, 13)); - 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; - } - - private JCheckBox getJCheckBoxColorless() { - if(jCheckBoxColorless == null) { - jCheckBoxColorless = new JCheckBox(); - jCheckBoxColorless.setLayout(null); - jCheckBoxColorless.setText("Colorless"); - jCheckBoxColorless.setPreferredSize(new java.awt.Dimension(80, 15)); - 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; - } - - private JButton getJButtonOk() { - if(jButtonOk == null) { - jButtonOk = new JButton(); - jButtonOk.setLayout(null); - jButtonOk.setText("OK"); - jButtonOk.setPreferredSize(new java.awt.Dimension(100, 25)); - jButtonOk.addMouseListener(new CustomListener()); - } - return jButtonOk; - } - - private JCheckBox getJCheckBoxBlack() { - if(jCheckBoxBlack == null) { - jCheckBoxBlack = new JCheckBox(); - jCheckBoxBlack.setLayout(null); - jCheckBoxBlack.setText("Black"); - jCheckBoxBlack.setPreferredSize(new java.awt.Dimension(97, 20)); - 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; - } - - private JPanel getJPanel2() { - if(jPanel2 == null) { - jPanel2 = new JPanel(); - jPanel2.setPreferredSize(new java.awt.Dimension(121, 183)); - jPanel2.setLayout(new AnchorLayout()); - jPanel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); - jPanel2.setBackground(new java.awt.Color(192, 192, 192)); - jPanel2.add(getJSeparator2(), new AnchorConstraint(112, 987, 166, 20, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJLabel3(), new AnchorConstraint(-200, 951, -61, -166, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJLabel4(), new AnchorConstraint(-19, 985, 128, 4, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox1(), new AnchorConstraint(877, 948, 948, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox2(), new AnchorConstraint(751, 948, 827, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox3(), new AnchorConstraint(625, 948, 702, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox4(), new AnchorConstraint(505, 948, 581, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox5(), new AnchorConstraint(379, 948, 450, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox6(), new AnchorConstraint(254, 948, 325, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - jPanel2.add(getJCheckBox7(), new AnchorConstraint(133, 948, 232, 79, AnchorConstraint.ANCHOR_REL, - AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL, AnchorConstraint.ANCHOR_REL)); - } - return jPanel2; - } - - private JLabel getJLabel3() { - if(jLabel3 == null) { - jLabel3 = new JLabel(); - jLabel3.setText("Color"); - 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); - } - return jLabel3; - } - - private JLabel getJLabel4() { - if(jLabel4 == null) { - jLabel4 = new JLabel(); - jLabel4.setText("Type"); - jLabel4.setHorizontalAlignment(SwingConstants.CENTER); - jLabel4.setFont(new java.awt.Font("Segoe UI", 0, 14)); - jLabel4.setPreferredSize(new java.awt.Dimension(105, 27)); - jLabel4.setLayout(null); - } - return jLabel4; - } - - private JSeparator getJSeparator2() { - if(jSeparator2 == null) { - jSeparator2 = new JSeparator(); - jSeparator2.setPreferredSize(new java.awt.Dimension(116, 10)); - jSeparator2.setLayout(null); - } - return jSeparator2; - } - - private JCheckBox getJCheckBox1() { - if(jCheckBoxSorcery == null) { - jCheckBoxSorcery = new JCheckBox(); - jCheckBoxSorcery.setLayout(null); - jCheckBoxSorcery.setText("Sorcery"); - jCheckBoxSorcery.setSelected(true); - jCheckBoxSorcery.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxSorcery.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox2() { - if(jCheckBoxPlaneswalker == null) { - jCheckBoxPlaneswalker = new JCheckBox(); - jCheckBoxPlaneswalker.setLayout(null); - jCheckBoxPlaneswalker.setText("Planeswalker"); - jCheckBoxPlaneswalker.setSelected(true); - jCheckBoxPlaneswalker.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxPlaneswalker.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox3() { - if(jCheckBoxLand == null) { - jCheckBoxLand = new JCheckBox(); - jCheckBoxLand.setLayout(null); - jCheckBoxLand.setText("Land"); - jCheckBoxLand.setSelected(true); - jCheckBoxLand.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxLand.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox4() { - if(jCheckBoxInstant == null) { - jCheckBoxInstant = new JCheckBox(); - jCheckBoxInstant.setLayout(null); - jCheckBoxInstant.setText("Instant"); - jCheckBoxInstant.setSelected(true); - jCheckBoxInstant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxInstant.setPreferredSize(new java.awt.Dimension(93, 14)); - 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; - } - - private JCheckBox getJCheckBox5() { - if(jCheckBoxEnchant == null) { - jCheckBoxEnchant = new JCheckBox(); - jCheckBoxEnchant.setLayout(null); - jCheckBoxEnchant.setText("Enchant"); - jCheckBoxEnchant.setSelected(true); - jCheckBoxEnchant.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxEnchant.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox6() { - if(jCheckBoxCreature == null) { - jCheckBoxCreature = new JCheckBox(); - jCheckBoxCreature.setLayout(null); - jCheckBoxCreature.setText("Creature"); - jCheckBoxCreature.setSelected(true); - jCheckBoxCreature.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxCreature.setPreferredSize(new java.awt.Dimension(93, 13)); - 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; - } - - private JCheckBox getJCheckBox7() { - if(jCheckBoxArtifact == null) { - jCheckBoxArtifact = new JCheckBox(); - jCheckBoxArtifact.setLayout(null); - jCheckBoxArtifact.setText("Artifact"); - jCheckBoxArtifact.setSelected(true); - jCheckBoxArtifact.setBackground(new java.awt.Color(192, 192, 192)); - jCheckBoxArtifact.setPreferredSize(new java.awt.Dimension(93, 18)); - 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; - } - - private JTextField getJTextField1() { - if(cardText == null) { - cardText = new JTextField(); - cardText.setPreferredSize(new java.awt.Dimension(168, 30)); - cardText.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 cardText; - } - - private JLabel getJLabel5() { - if(jLabel5 == null) { - jLabel5 = new JLabel(); - jLabel5.setText("Card Text:"); - jLabel5.setHorizontalAlignment(SwingConstants.CENTER); - jLabel5.setFont(new java.awt.Font("Segoe UI", 0, 16)); - jLabel5.setPreferredSize(new java.awt.Dimension(75, 50)); - jLabel5.setLayout(null); - } - return jLabel5; - } - - public class CustomListener implements MouseListener { - - public void mouseClicked(MouseEvent e) { - FilterCardTable(); - } - - public void mouseEntered(MouseEvent e) { - - } - - public void mouseExited(MouseEvent e) { - - } - - public void mousePressed(MouseEvent e) { - - } - - public void mouseReleased(MouseEvent e) { - - } - } - - public class WListener implements WindowListener { - - public void windowActivated(WindowEvent arg0) { - - } - - public void windowClosed(WindowEvent arg0) { - - } - - public void windowClosing(WindowEvent arg0) { - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - deckDisplay.updateDisplay(g.stCardList, deckDisplay.getBottom()); - g.setEnabled(true); - - } - - public void windowDeactivated(WindowEvent arg0) { - - } - - public void windowDeiconified(WindowEvent arg0) { - - } - - public void windowIconified(WindowEvent arg0) { - - } - - public void windowOpened(WindowEvent arg0) { - - } - } - - private void FilterCardTable() { - String name = NameText.getText(); - String cText = cardText.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(); - - } - -} +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 index f910b7aa142..6aafcf0a04e 100644 --- a/src/forge/GameAction.java +++ b/src/forge/GameAction.java @@ -1,15 +1,16 @@ - package forge; -import forge.card.cardFactory.CardFactory; +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.deck.generate.GenerateConstructedDeck; import forge.gui.GuiUtils; import forge.gui.input.Input_Mulligan; import forge.gui.input.Input_PayManaCost; @@ -20,953 +21,1109 @@ import forge.properties.NewConstants.LANG.GameAction.GAMEACTION_TEXT; import javax.swing.*; import java.util.*; +/** + *

GameAction class.

+ * + * @author Forge + * @version $Id: $ + */ public class GameAction { - public void resetActivationsPerTurn(){ - CardList all = AllZoneUtil.getCardsInGame(); - + /** + *

resetActivationsPerTurn.

+ */ + public void resetActivationsPerTurn() { + CardList all = AllZoneUtil.getCardsInGame(); + // Reset Activations per Turn - for(Card card : all){ - for(SpellAbility sa : card.getSpellAbility()) - sa.getRestrictions().resetTurnActivations(); + for (Card card : all) { + for (SpellAbility sa : card.getSpellAbility()) + sa.getRestrictions().resetTurnActivations(); } } - 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()) - { + /** + *

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()) - { + } else if (c.isToken()) { suppress = false; - } - else - { + } 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.CardFactory.copyCard(c); - - //remove counters if destination is not the battlefield - if(!zone.is(Constant.Zone.Battlefield)) - copied.clearCounters(); - - // 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 - } - if (suppress) - AllZone.TriggerHandler.suppressMode("ChangesZone"); + Card copied = null; - zone.add(copied); + // 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)) + if (copied.isToken() && !zone.is(Constant.Zone.Battlefield)) zone.remove(copied); - HashMap runParams = new HashMap(); + HashMap runParams = new HashMap(); runParams.put("Card", copied); - if(prev != null) - { + if (prev != null) { runParams.put("Origin", prev.getZoneName()); - } - else - { - runParams.put("Origin",null); + } else { + runParams.put("Origin", null); } runParams.put("Destination", zone.getZoneName()); - AllZone.TriggerHandler.runTrigger("ChangesZone", runParams); - //AllZone.Stack.chooseOrderOfSimultaneousStackEntryAll(); - - if(suppress) - AllZone.TriggerHandler.clearSuppression("ChangesZone"); + AllZone.getTriggerHandler().runTrigger("ChangesZone", runParams); + //AllZone.getStack().chooseOrderOfSimultaneousStackEntryAll(); - if(prev != null) - { + if (suppress) + AllZone.getTriggerHandler().clearSuppression("ChangesZone"); + + if (prev != null) { if (prev.is(Constant.Zone.Battlefield) && c.isCreature()) - AllZone.Combat.removeFromCombat(c); + AllZone.getCombat().removeFromCombat(c); prev.remove(c); } - return copied; - } - - 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); - } + //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 (zone.is(Constant.Zone.Battlefield) && c.isAura()){ - // TODO: add attachment code here - // Attach to something that can be attached to + + 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; } - public void changeController(CardList list, Player oldController, Player newController){ - if (oldController.equals(newController)) - return; + /** + *

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 - // 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.TriggerHandler.suppressMode("ChangesZone"); - ((PlayerZone_ComesIntoPlay) AllZone.Human_Battlefield).setTriggers(false); - ((PlayerZone_ComesIntoPlay) AllZone.Computer_Battlefield).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.Combat.removeFromCombat(c); - } - - AllZone.TriggerHandler.clearSuppression("ChangesZone"); - ((PlayerZone_ComesIntoPlay) AllZone.Human_Battlefield).setTriggers(true); - ((PlayerZone_ComesIntoPlay) AllZone.Computer_Battlefield).setTriggers(true); - } - - public Card moveToStack(Card c){ - PlayerZone stack = AllZone.getZone(Constant.Zone.Stack, null); - return moveTo(stack, c); - } - - public Card moveToGraveyard(Card c) { - final PlayerZone origZone = AllZone.getZone(c); - final PlayerZone grave = AllZone.getZone(Constant.Zone.Graveyard, c.getOwner()); + PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, c.getOwner()); + PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getController()); - 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)) { + 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); - } - - if (AllZoneUtil.isCardInPlay("Planar Void")) { - CardList pVoids = AllZoneUtil.getCardsInPlay("Planar Void"); - for(int i = 0; i < pVoids.size(); i++) { - Card pVoid = pVoids.get(i); - final Card voidingCard = c; - if (!c.equals(pVoid)) { - Ability ability = new Ability(pVoid, "0") { - @Override - public void resolve() { - if(AllZoneUtil.isCardInZone(grave, voidingCard)) - moveTo(AllZone.getZone(Constant.Zone.Exile, voidingCard.getOwner()), voidingCard); - } - - };// Ability - StringBuilder sb = new StringBuilder(); - sb.append("Planar Void - exile ").append(c); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.add(ability); - } - } - } - //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.GameAction.moveToHand(recoverable); - } - - @Override - public String getStackDescription() - { - StringBuilder SD = new StringBuilder(recoverable.getName()); - SD.append(" - Recover."); - - return SD.toString(); - } - }; + 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; + private static final long serialVersionUID = 5812397026869965462L; - public void execute() - { - AllZone.GameAction.exile(recoverable); + 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.Stack.addSimultaneousStackEntry(abRecover); - //AllZone.GameAction.playSpellAbility(abRecover); - } - else if(shouldRecoverForAI) - { - AllZone.Stack.addSimultaneousStackEntry(abRecover); - //ComputerUtil.playStack(abRecover); - } - if(!grave.hasChanged()) //If the controller declined Recovery or didn't pay the cost, exile the recoverable - { + String recoverCost = recoverable.getKeyword().get(recoverable.getKeywordPosition("Recover")).split(":")[1]; + Cost abCost = new Cost(recoverCost, recoverable.getName(), false); + abRecover.setPayCosts(abCost); - } - } - } - } - return c; + 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 + // 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); + 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); + return moveToLibrary(c, 0); } - - public Card moveToLibrary(Card c, int libPosition){ + + /** + *

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 (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 (p != null) p.remove(c); + + if (c.isToken()) - return c; - + return c; + if (p != null && p.is(Constant.Zone.Battlefield)) - c = AllZone.CardFactory.copyCard(c); - + c = AllZone.getCardFactory().copyCard(c); + + c.clearCounters(); //remove all counters + if (libPosition == -1 || libPosition > library.size()) - 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; + if (AllZoneUtil.isCardExiled(c)) return c; - PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); + PlayerZone removed = AllZone.getZone(Constant.Zone.Exile, c.getOwner()); - return AllZone.GameAction.moveTo(removed, c); + return AllZone.getGameAction().moveTo(removed, c); } - - 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); + + /** + *

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.ComputerPlayer); + CardList hand = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); CardList tHand = hand.getValidCards(uTypes, sa.getActivatingPlayer(), sa.getSourceCard()); - - if(tHand.size() >= numDiscard) { + + 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); + for (int i = 0; i < numDiscard; i++) + tHand.get(i).getController().discard(tHand.get(i), sa); return true; } return false; } - - public void discard_PutIntoPlayInstead(Card c) - { - moveToPlay(c); - if (c.getName().equals("Dodecapod")) - c.setCounter(Counters.P1P1, 2, 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; + // 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.Stack.add(cast); - else - AllZone.InputControl.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.Stack.add(activate); + 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); } - - public boolean checkEndGameSate(){ + + /** + *

checkEndGameSate.

+ * + * @return a boolean. + */ + public boolean checkEndGameSate() { // Win / Lose - boolean humanWins = false; - boolean computerWins = false; - Player computer = AllZone.ComputerPlayer; - Player human = AllZone.HumanPlayer; - - 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(); - } - + boolean humanWins = false; + boolean computerWins = false; + Player computer = AllZone.getComputerPlayer(); + Player human = AllZone.getHumanPlayer(); - 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; + 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; } - - - public void checkStateEffects() { - // sol(10/29) added for Phase updates, state effects shouldn't be checked during Spell Resolution - if (AllZone.Stack.getResolving()) - return; - - boolean refreeze = AllZone.Stack.isFrozen(); - AllZone.Stack.setFrozen(true); - - JFrame frame = (JFrame) AllZone.Display; - if(!frame.isDisplayable()) return; - if(checkEndGameSate()) { - AllZone.Display.savePrefs(); + + /** + *

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(); + new Gui_WinLose(); else - new Gui_WinLose(Constant.Quest.humanList[0], Constant.Quest.computerList[0], - Constant.Quest.humanLife[0], Constant.Quest.computerLife[0]); + 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 < 2; q++) { - //card state effects like Glorious Anthem - for(String effect:AllZone.StaticEffects.getStateBasedMap().keySet()) { - Command com = GameActionUtil.commands.get(effect); - com.execute(); + 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); - GameActionUtil.executeCardStateEffects(); - GameActionUtil.stAnimate.execute(); - GameActionUtil.stSetPT.execute(); - GameActionUtil.stPump.execute(); + //card state effects like Glorious Anthem + for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { + Command com = GameActionUtil.commands.get(effect); + com.execute(); + } - CardList list = AllZoneUtil.getCardsInPlay(); - Card c; + GameActionUtil.stAnimate.execute(); - Iterator it = list.iterator(); + CardList list = AllZoneUtil.getCardsInPlay(); + Card c; - while(it.hasNext()) { - c = it.next(); + Iterator it = list.iterator(); - 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); - } - } - }//if isEquipped() + while (it.hasNext()) { + c = it.next(); - if( c.isEquipping()) { - Card equippedCreature = c.getEquipping().get(0); - if (!AllZoneUtil.isCardInPlay(equippedCreature)) c.unEquipCard(equippedCreature); + 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() - //make sure any equipment that has become a creature stops equipping - if (c.isCreature()) c.unEquipCard(equippedCreature); - }//if isEquipping() + if (c.isEquipping()) { + Card equippedCreature = c.getEquipping().get(0); + if (!AllZoneUtil.isCardInPlay(equippedCreature)) { + c.unEquipCard(equippedCreature); + checkAgain = true; + } - if (c.isAura()) { - for (int i = 0; i < c.getEnchanting().size(); i++) { - Card perm = c.getEnchanting().get(i); - 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() ) ) { - c.unEnchantCard(perm); - //changed from destroy (and rules-wise, I don't think it's a sacrifice) - moveToGraveyard(c); - } - } - }//if isAura + //make sure any equipment that has become a creature stops equipping + if (c.isCreature()) { + c.unEquipCard(equippedCreature); + checkAgain = true; + } + }//if isEquipping() - if (c.isCreature() - && c.getNetDefense() <= c.getDamage() - && !c.hasKeyword("Indestructible")) { - destroy(c); - AllZone.Combat.removeFromCombat(c); //this is untested with instants and abilities but required for First Strike combat phase - } + 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 - else if (c.isCreature() && c.getNetDefense() <= 0) { - destroy(c); - AllZone.Combat.removeFromCombat(c); - } + 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() + }//while it.hasNext() + + if (!checkAgain) break; //do not continue the loop }//for q=0;q<2 - + destroyLegendaryCreatures(); destroyPlaneswalkers(); - - GameActionUtil.stLandManaAbilities.execute(); - - if (!refreeze) - AllZone.Stack.unfreezeStack(); - }//checkStateEffects() - + 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++) { + for (int i = 0; i < list.size(); i++) { c = list.get(i); - - if(c.getCounters(Counters.LOYALTY) <= 0) AllZone.GameAction.moveToGraveyard(c); - + + 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.GameAction.moveToGraveyard(crd); + + if (cl.size() > 1) { + for (Card crd : cl) { + AllZone.getGameAction().moveToGraveyard(crd); } } } - + } - - private void destroyLegendaryCreatures() { + + /** + *

destroyLegendaryCreatures.

+ */ + private void destroyLegendaryCreatures() { CardList a = AllZoneUtil.getTypeInPlay("Legendary"); - while(!a.isEmpty() && !AllZoneUtil.isCardInPlay("Mirror Gallery")) { - CardList b = AllZoneUtil.getCardsInPlay(a.get(0).getName()); + 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.GameAction.sacrificeDestroy(b.get(i)); + if (1 < b.size()) { + for (int i = 0; i < b.size(); i++) + AllZone.getGameAction().sacrificeDestroy(b.get(i)); } } }//destroyLegendaryCreatures() - - public void sacrifice(Card c) { - if(c.getName().equals("Mana Pool")) { - System.out.println("Trying to sacrifice mana pool..."); - return; - } + + /** + *

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(); + HashMap runParams = new HashMap(); runParams.put("Card", c); - AllZone.TriggerHandler.runTrigger("Sacrificed", runParams); - + 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.Stack.add(ability); - 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); } - - 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() - }; + /** + *

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"); - c.addComesIntoPlayCommand(intoPlay); - - Command loseControl = new Command() { - private static final long serialVersionUID = -4514610171270596654L; + Command intoPlay = 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; + 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; } - - public boolean sacrificeDestroy(Card c) { - if(!AllZoneUtil.isCardInPlay(c)) return false; + + /** + *

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); + 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) { + 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.Stack.add(persistAb); + 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; - + || (c.hasKeyword("Indestructible") + && (!c.isCreature() || c.getNetDefense() > 0))) return false; + if (c.canBeShielded() && c.getShield() > 0) { c.subtractShield(); c.setDamage(0); c.tap(); - AllZone.Combat.removeFromCombat(c); + 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; - } + + 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); } - + /** - * prompts Human to see if a target player's library should be shuffled. This should - * only be called when the choice is made by the Human (target can be either), then - * shuffles that player's library if appropriate - * - * @param player the player's library we want to shuffle + *

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 promptForShuffle(final Player player) { - String[] choices = new String[] {"Yes", "No"}; - Object o = GuiUtils.getChoice("Shuffle "+player+"'s library?", choices); - String myChoice = (String) o; - if(myChoice.equals("Yes")) { - player.shuffle(); - } - } - - //removes all damage from player's creatures - public void removeDamage(Player player) { - CardList list = AllZoneUtil.getCreaturesInPlay(player); - for(Card c:list) - c.setDamage(0); - } - - //for Quest fantasy mode - public void newGame(Deck humanDeck, Deck computerDeck, CardList human, CardList computer, int humanLife, int computerLife, Quest_Assignment qa) - { - this.newGame(humanDeck, computerDeck); - - AllZone.ComputerPlayer.setLife(computerLife, null); - AllZone.HumanPlayer.setLife(humanLife, null); - - if (qa != null){ - computer.addAll(forge.quest.data.QuestUtil.getComputerCreatures(AllZone.QuestData, AllZone.QuestAssignment)); + 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.TriggerHandler.registerTrigger(trig); + for (Card c : human) { + for (Trigger trig : c.getTriggers()) { + AllZone.getTriggerHandler().registerTrigger(trig); } - - AllZone.Human_Battlefield.add(c); - c.setSickness(true); + + AllZone.getHumanBattlefield().add(c); + c.setSickness(true); } - - for (Card c: computer) - { - for(Trigger trig : c.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(trig); + + for (Card c : computer) { + for (Trigger trig : c.getTriggers()) { + AllZone.getTriggerHandler().registerTrigger(trig); } - - AllZone.Computer_Battlefield.add(c); - c.setSickness(true); + + AllZone.getComputerBattlefield().add(c); + c.setSickness(true); } Constant.Quest.fantasyQuest[0] = true; } - - private boolean Start_Cut = false; - public void newGame(Deck humanDeck, Deck computerDeck) { - //AllZone.Computer = new ComputerAI_Input(new ComputerAI_General()); - Constant.Quest.fantasyQuest[0] = false; - - AllZone.GameInfo.setPreventCombatDamageThisTurn(false); - AllZone.GameInfo.setHumanNumberOfTimesMulliganed(0); - AllZone.GameInfo.setHumanMulliganedToZero(false); - AllZone.GameInfo.setComputerStartedThisGame(false); - - AllZone.HumanPlayer.reset(); - AllZone.ComputerPlayer.reset(); - AllZone.Phase.reset(); - AllZone.Stack.reset(); - AllZone.Combat.reset(); - AllZone.Display.showCombat(""); - AllZone.Display.loadPrefs(); + 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.Human_Graveyard.reset(); - AllZone.Human_Hand.reset(); - AllZone.Human_Library.reset(); - AllZone.Human_Battlefield.reset(); - AllZone.Human_Exile.reset(); - - AllZone.Computer_Graveyard.reset(); - AllZone.Computer_Hand.reset(); - AllZone.Computer_Library.reset(); - AllZone.Computer_Battlefield.reset(); - AllZone.Computer_Exile.reset(); - - AllZone.InputControl.clearInput(); - - AllZone.StaticEffects.reset(); - - AllZone.HumanPlayer.clearHandSizeOperations(); - AllZone.ComputerPlayer.clearHandSizeOperations(); - - AllZone.TriggerHandler.clearRegistered(); + AllZone.getTriggerHandler().clearRegistered(); forge.card.trigger.Trigger.resetIDs(); - + {//re-number cards just so their unique numbers are low, just for user friendliness - CardFactory c = AllZone.CardFactory; - Card card; - int nextUniqueNumber = 1; + CardFactoryInterface c = AllZone.getCardFactory(); + Card.resetUniqueNumber(); + Random generator = MyRandom.random; - - for(int i = 0; i < humanDeck.countMain(); i++) { + + 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.HumanPlayer); - card.setUniqueNumber(nextUniqueNumber++); - - //if(card.isBasicLand()) { - //String PC = card.getSVar("PicCount"); - //if (PC.matches("[0-9][0-9]?")) - // n = Integer.parseInt(PC); - - 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)); + if (cardName.contains("|")) { + String s[] = cardName.split("\\|", 2); + cardName = s[0]; + setCode = s[1]; } - //System.out.println("human random number:" + card.getRandomPicture()); - //} + 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)); + } - AllZone.Human_Library.add(card); - - for(Trigger trig : card.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(trig); + // 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++) { + 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]; + if (cardName.contains("|")) { + String s[] = cardName.split("\\|", 2); + cardName = s[0]; + setCode = s[1]; } - - card = c.getCard(cardName, AllZone.ComputerPlayer); - card.setUniqueNumber(nextUniqueNumber++); - + + card = c.getCard(cardName, AllZone.getComputerPlayer()); + //if(card.isBasicLand()) { //String PC = card.getSVar("PicCount"); //int n = 0; @@ -974,141 +1131,156 @@ public class GameAction { // n = Integer.parseInt(PC); //if (n > 1) // card.setRandomPicture(generator.nextInt(n)); - //System.out.println("computer random number:" + card.getRandomPicture()); + //System.out.println("computer random number:" + card.getRandomPicture()); //} - + if (!setCode.equals("")) - card.setCurSetCode(setCode); + card.setCurSetCode(setCode); else if ((card.getSets().size() > 0)) // && card.getCurSetCode().equals("")) - card.setRandomSetCode(); + 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)); + 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.Computer_Library.add(card); - - for(Trigger trig : card.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(trig); + AllZone.getComputerLibrary().add(card); + + for (Trigger trig : card.getTriggers()) { + AllZone.getTriggerHandler().registerTrigger(trig); } - + if (card.getSVar("RemAIDeck").equals("True")) - RAICards.add(card.getName()); + 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 0)) - sb.append("\n"); - else if (i != (RAICards.size() - 1)) - sb.append(", "); - } - - JOptionPane.showMessageDialog(null, sb.toString(), "", JOptionPane.INFORMATION_MESSAGE); - + + 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.HumanPlayer.shuffle(); - + + 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.ComputerPlayer).toArray()); - AllZone.Computer_Library.setCards(c); + + if (smoothLand) { + Card[] c = smoothComputerManaCurve(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()).toArray()); + AllZone.getComputerLibrary().setCards(c); } else { - AllZone.Computer_Library.setCards(AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer).toArray()); - AllZone.ComputerPlayer.shuffle(); + 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.HumanPlayer.drawCard(); - AllZone.ComputerPlayer.drawCard(); + 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.ManaPool; + ManaPool mp = AllZone.getManaPool(); mp.setImageFilename("mana_pool"); - AllZone.Human_Battlefield.add(mp); + AllZone.getHumanBattlefield().add(mp); - AllZone.InputControl.setInput(new Input_Mulligan()); + AllZone.getInputControl().setInput(new Input_Mulligan()); Phase.setGameBegins(1); }//newGame() - + //this is where the computer cheats - //changes AllZone.Computer_Library - private Card[] smoothComputerManaCurve(Card[] in) { + //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)); - + 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. + // 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) { + } 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)); - + 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++) + 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", @@ -1120,16 +1292,16 @@ public class GameAction { "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++) { + for (int i = 0; i < allLand.length; i++) { check = in.getName(allLand[i]); - - if(!check.isEmpty()) land.add(check); + + if (!check.isEmpty()) land.add(check); } /* //get non-basic land CardList @@ -1147,201 +1319,235 @@ public class GameAction { //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()) { + while (!land.isEmpty()) { i = (i + 1) % land.size(); - + check = land.get(i); - if(check.isEmpty()) { + 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); + 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); } - }//seeWhoPlaysFirst_CoinToss() - + + 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; - + private Card ComputerCut = null; + + /** + *

seeWhoPlaysFirst.

+ */ public void seeWhoPlaysFirst() { - CardList HLibrary = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); + CardList HLibrary = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); HLibrary = HLibrary.filter(AllZoneUtil.nonlands); - CardList CLibrary = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer); + 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.GameAction.moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.HumanPlayer),AllZone.GameAction.getHumanCut()); - AllZone.GameAction.moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.ComputerPlayer),AllZone.GameAction.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 (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() - - public void computerStartsGame() - { - AllZone.Phase.setPlayerTurn(AllZone.ComputerPlayer); - AllZone.GameInfo.setComputerStartedThisGame(true); + + /** + *

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++) { + + for (int i = 0; i < list.size(); i++) { CardList check = new CardList(list.getCard(i).getAttachedCards()); - if(check.contains(c)) return true; + 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 + // 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() && AllZoneUtil.isCardInZone(AllZone.Human_Hand, c) && AllZone.HumanPlayer.canPlayLand()) - choices.add("Play land"); + 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(AllZone.HumanPlayer); - if(sa.canPlay() && (!sa.isSpell() || !sa.getManaCost().equals(""))) { - choices.add(sa.toString()); - map.put(sa.toString(), sa); - } + 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; + if (choices.size() == 0) + return false; else if (choices.size() == 1) - choice = choices.get(0); + choice = choices.get(0); else - choice = (String) GuiUtils.getChoiceOptional("Choose", choices.toArray()); - + choice = (String) GuiUtils.getChoiceOptional("Choose", choices.toArray()); + if (choice == null) - return false; - - if(choice.equals("Play land")){ - AllZone.HumanPlayer.playLand(c); - return true; + return false; + + if (choice.equals("Play land")) { + AllZone.getHumanPlayer().playLand(c); + return true; } - + SpellAbility ability = map.get(choice); - if(ability != null){ + if (ability != null) { playSpellAbility(ability); return true; } - return false; + 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(); @@ -1355,715 +1561,785 @@ public class GameAction { 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); + 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; - + + 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.HumanPlayer); + 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); + 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.GameAction.moveToStack(c); - } - boolean x = false; - if (sa.getSourceCard().getManaCost().contains("X")) - x = true; - - if (sa.isKickerAbility()) { + 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; + private static final long serialVersionUID = -6531785460264284794L; - public void execute() { - AllZone.Stack.add(sa); + public void execute() { + AllZone.getStack().add(sa); } }; - AllZone.InputControl.setInput(new Input_PayManaCost_Ability(sa.getAdditionalManaCost(),paid1)); - }else { - AllZone.Stack.add(sa, x); - } + 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.InputControl.setInput(sa.getBeforePayMana()); + 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(); - SpellAbility spell = sa; - ManaCost manaCost = new ManaCost(originalCost.toString()); + // 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.Phase.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.Phase.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.Phase.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.Phase.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 + 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 - if(Phase.getGameBegins() == 1) { // Remove GameBegins from Phase and into The starting game code - 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); - String Mana = manaCost.toString(); - CardList Player_Play = AllZoneUtil.getPlayerCardsInPlay(sa.getSourceCard().getController()); - CardList Player_Hand = AllZoneUtil.getPlayerHand(sa.getSourceCard().getController()); - int XBonus = 0; - int Max = 25; - if(sa.isXCost() && !sa.getSourceCard().isCopiedSpell()) sa.getSourceCard().setXManaCostPaid(0); - 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[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("/"); + // 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(sa.getSourceCard()).contains(k[5])) break; - if(string_no == 6 && (sa.getSourceCard().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(sa.getSourceCard()).contains(k[5]) || k[5].equals("All")) { - } else { - k[5] = "Nullified"; - break; - } - } - if(string_no == 6) { - if(sa.getSourceCard().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(sa.getSourceCard().getController()) - || (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().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(sa.getSourceCard()).contains(k[5])) || k[5].equals("All")) - && ((sa.getSourceCard().isType(k[6])) - || (!(sa.getSourceCard().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(sa.getSourceCard())) k[3] = "0"; - } - if(k[7].contains("TargetInHand")) { - if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0"; - } - if(k[7].contains("NonType")) { - if(originalCard.isType(k[6])) k[3] = "0"; - } - if(k[7].contains("OpponentTurn")) { - if(AllZone.Phase.isPlayerTurn(originalCard.getController())) 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(originalCard.getController()); - 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(originalCard, originalCard.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 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); - } - } - } - } - } + 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[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("/"); + 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(sa.getSourceCard()).contains(k[5])) break; - if(string_no == 6 && (sa.getSourceCard().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(sa.getSourceCard()).contains(k[5]) || k[5].equals("All")) { - } else { - k[5] = "Nullified"; - break; - } - } - if(string_no == 6) { - if(sa.getSourceCard().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(sa.getSourceCard().getController()) - || (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().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(sa.getSourceCard()).contains(k[5])) || k[5].equals("All")) - /** - * Chris added a test for Changeling. - * This appears to reduce the cost correctly. - * Works for both the computer and the human. - */ - && ((sa.getSourceCard().isType(k[6])) + 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()); + } - || (!(sa.getSourceCard().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(sa.getSourceCard())) k[3] = "0"; - } - if(k[7].contains("TargetInHand")) { - if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0"; - } - if(k[7].contains("NonType")) { - if(originalCard.isType(k[6])) k[3] = "0"; - } - if(k[7].contains("OpponentTurn")) { - if(AllZone.Phase.isPlayerTurn(originalCard.getController())) 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(originalCard.getController()); - PlayerList = PlayerList.getType(k[7]); - k[3] = String.valueOf(PlayerList.size()); - } + String[] Numbers = new String[Max]; + if (!"WUGRB".contains(k[3])) { - 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(originalCard, originalCard.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(); + int value = 0; + if ("X".equals(k[3])) + value = CardFactoryUtil.xCount(card, card.getSVar("X")); + else + value = Integer.valueOf(k[3]); - for(int check = 0; check < Max; check ++) { - if(Number_ManaCost.equals(Numbers[check])) { - if((spell.isXCost()) || (spell.isMultiKicker()) && (check - Integer.valueOf(k[3])) < 0) XBonus = XBonus - check + Integer.valueOf(k[3]); - if(check - Integer.valueOf(k[3]) < 0) k[3] = String.valueOf(check); - Mana = Mana.replaceFirst(String.valueOf(check),String.valueOf(check - Integer.valueOf(k[3]))); - } - 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 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 XPaid = 0; XPaid < XBonus; XPaid++) sa.getSourceCard().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.Phase.getPlayerTurn(); - CardList playerCreature = AllZoneUtil.getCreaturesInPlay(player); - playerCreature = playerCreature.filter(AllZoneUtil.green); - String mana = manaCost + " "; - if(playerCreature.size() > 0) { - for(int i = 0; i < playerCreature.size(); i++) { - mana = mana.replaceFirst("G ", ""); - } - mana = mana.trim(); - if(mana.equals("")) mana = "0"; - manaCost = new ManaCost(mana); - } - } // Khalni Hydra - return manaCost; + 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.HumanPlayer); - - if (sa.getPayCosts() != null || sa.getTarget() != null){ - 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); - } + sa.setActivatingPlayer(AllZone.getHumanPlayer()); - 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.GameAction.moveToStack(source); - - AllZone.Stack.add(sa); - if(sa.isTapAbility() && !sa.wasCancelled()) sa.getSourceCard().tap(); - if(sa.isUntapAbility()) sa.getSourceCard().untap(); - return; - } - else - AllZone.InputControl.setInput(sa.getAfterPayMana()); - } - else if(sa.getBeforePayMana() == null) - AllZone.InputControl.setInput(new Input_PayManaCost(sa)); - else - AllZone.InputControl.setInput(sa.getBeforePayMana()); - } - } - - public void playSpellAbility_NoStack(SpellAbility sa,boolean skipTargeting) { - sa.setActivatingPlayer(AllZone.HumanPlayer); - - 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){ - sa.resolve(); - if(sa.isTapAbility() && !sa.wasCancelled()) sa.getSourceCard().tap(); - if(sa.isUntapAbility()) sa.getSourceCard().untap(); - return; - } - else - AllZone.InputControl.setInput(sa.getAfterPayMana()); - } - else if(sa.getBeforePayMana() == null) - AllZone.InputControl.setInput(new Input_PayManaCost(sa,true)); - else - AllZone.InputControl.setInput(sa.getBeforePayMana()); - } - } - - public SpellAbility[] canPlaySpellAbility(SpellAbility[] sa) { - ArrayList list = new ArrayList(); - - for(int i = 0; i < sa.length; i++){ - sa[i].setActivatingPlayer(AllZone.HumanPlayer); - if(sa[i].canPlay()) - list.add(sa[i]); + // 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("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); + String Zone1, boolean tapFirstLand, + String Zone2, boolean tapSecondLand) { + if (player.isHuman()) { + humanSearchTwoLand(type, Zone1, tapFirstLand, Zone2, tapSecondLand); } else { - aiSearchTwoLand(type, Zone1, tapFirstLand, Zone2, tapSecondLand); + aiSearchTwoLand(type, Zone1, tapFirstLand, Zone2, tapSecondLand); } - + player.shuffle(); - - } - public void searchLibraryTwoBasicLand(Player player, - String Zone1, boolean tapFirstLand, - String Zone2, boolean tapSecondLand) { + + } + + /** + *

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); } - - private void aiSearchTwoLand(String type, String Zone1, boolean tapFirstLand, - String Zone2, boolean tapSecondLand) { - CardList land = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer); - land = land.getType(type); - PlayerZone firstZone = AllZone.getZone(Zone1, AllZone.ComputerPlayer); - - 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 + /** + *

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); - } + // 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) { + if (land.size() != 0) { //branch 2 - at least 1 land in library Card firstLand = land.remove(0); if (tapFirstLand) - firstLand.tap(); + firstLand.tap(); + + AllZone.getGameAction().moveTo(firstZone, firstLand); - AllZone.GameAction.moveTo(firstZone, firstLand); - //branch 3 - if(Zone2.trim().length() != 0 && (land.size() != 0)) { - PlayerZone secondZone = AllZone.getZone(Zone2, AllZone.ComputerPlayer); + 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.GameAction.moveTo(secondZone, secondLand); + 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.HumanPlayer); - - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); + 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; - + 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"; + firstPrompt = "Choose a land"; else - firstPrompt = "Choose first land"; - + firstPrompt = "Choose first land"; + //branch 2 Object o = GuiUtils.getChoiceOptional(firstPrompt, list.toArray()); - if(o != null) { + if (o != null) { Card c = (Card) o; list.remove(c); if (tapFirstLand) - c.tap(); - moveTo(firstZone, c); + 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.HumanPlayer); + if (o != null) { + PlayerZone secondZone = AllZone.getZone(Zone2, AllZone.getHumanPlayer()); Card c = (Card) o; list.remove(c); if (tapSecondLand) - c.tap(); - moveTo(secondZone, c); + c.tap(); + moveTo(secondZone, c); } } - - public static void main(String[] args) { - GameAction gameAction = new GameAction(); - GenerateConstructedDeck gen = new GenerateConstructedDeck(); - - for(int i = 0; i < 2000; i++) { - CardList list = gen.generateDeck(); - - Card[] card = gameAction.smoothComputerManaCurve(list.toArray()); - - CardList check = new CardList(); - for(int a = 0; a < 30; a++) - check.add(card[a]); - - if(check.getType("Land").size() != 7) { - System.out.println("error - " + check); - break; - } - }//for + + /** + *

setComputerCut.

+ * + * @param computerCut a {@link forge.Card} object. + */ + public void setComputerCut(Card computerCut) { + ComputerCut = computerCut; } - public void setComputerCut(Card computerCut) { - ComputerCut = computerCut; - } + /** + *

getComputerCut.

+ * + * @return a {@link forge.Card} object. + */ + public Card getComputerCut() { + return ComputerCut; + } - public Card getComputerCut() { - return ComputerCut; - } + /** + *

setStartCut.

+ * + * @param start_Cut a boolean. + */ + public void setStartCut(boolean start_Cut) { + Start_Cut = start_Cut; + } - public void setStartCut(boolean start_Cut) { - Start_Cut = start_Cut; - } + /** + *

isStartCut.

+ * + * @return a boolean. + */ + public boolean isStartCut() { + return Start_Cut; + } - public boolean isStartCut() { - return Start_Cut; - } + /** + *

setHumanCut.

+ * + * @param humanCut a {@link forge.Card} object. + */ + public void setHumanCut(Card humanCut) { + HumanCut = humanCut; + } - public void setHumanCut(Card humanCut) { - HumanCut = humanCut; - } - - public Card getHumanCut() { - return 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 index 6174bd72bdf..a04db8a1e44 100644 --- a/src/forge/GameActionUtil.java +++ b/src/forge/GameActionUtil.java @@ -1,15 +1,7 @@ - package forge; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - -import javax.swing.JOptionPane; - import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactory; import forge.card.cardFactory.CardFactoryUtil; import forge.card.spellability.*; import forge.gui.GuiUtils; @@ -17,149 +9,90 @@ 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 { - public static void executeUpkeepEffects() { - AllZone.Stack.freezeStack(); - upkeep_Braid_Of_Fire(); - - upkeep_Slowtrips(); // for "Draw a card at the beginning of the next turn's upkeep." - upkeep_UpkeepCost(); //sacrifice unless upkeep cost is paid - upkeep_DamageUpkeepCost(); //deal damage unless upkeep cost is paid - upkeep_CumulativeUpkeepCost(); //sacrifice unless cumulative upkeep cost is paid - upkeep_Echo(); - // upkeep_CheckEmptyDeck_Lose(); //still a little buggy - - upkeep_The_Abyss(); - upkeep_Mana_Vortex(); - upkeep_Yawgmoth_Demon(); - upkeep_Lord_of_the_Pit(); - upkeep_Drop_of_Honey(); - upkeep_Demonic_Hordes(); - upkeep_Fallen_Empires_Storage_Lands(); - upkeep_Carnophage(); - upkeep_Sangrophage(); - upkeep_Dega_Sanctuary(); - upkeep_Ceta_Sanctuary(); - upkeep_Tangle_Wire(); - upkeep_Dance_of_the_Dead(); - upkeep_Mana_Crypt(); - upkeep_Farmstead(); - - upkeep_Greener_Pastures(); - upkeep_Shapeshifter(); - upkeep_Vesuvan_Doppelganger_Keyword(); - - //Kinship cards - upkeep_Ink_Dissolver(); - upkeep_Kithkin_Zephyrnaut(); - upkeep_Leaf_Crowned_Elder(); - upkeep_Mudbutton_Clanger(); - upkeep_Nightshade_Schemers(); - upkeep_Pyroclast_Consul(); - upkeep_Sensation_Gorger(); - upkeep_Squeaking_Pie_Grubfellows(); - upkeep_Wandering_Graybeard(); - upkeep_Waterspout_Weavers(); - upkeep_Winnower_Patrol(); - upkeep_Wolf_Skull_Shaman(); - - upkeep_Oversold_Cemetery(); - upkeep_Vampire_Lacerator(); - upkeep_Sleeper_Agent(); - upkeep_Pillory_of_the_Sleepless(); - upkeep_Mirror_Sigil_Sergeant(); - upkeep_Dragon_Broodmother(); //put this before bitterblossom and mycoloth, so that they will resolve FIRST - //Win / Lose - // Checks for can't win or can't lose happen in Player.altWinConditionMet() - upkeep_Battle_of_Wits(); - upkeep_Mortal_Combat(); - upkeep_Near_Death_Experience(); - upkeep_Test_of_Endurance(); - upkeep_Helix_Pinnacle(); - upkeep_Barren_Glory(); - upkeep_Felidar_Sovereign(); + /** + *

executeDrawStepEffects.

+ */ + public static void executeDrawStepEffects() { + AllZone.getStack().freezeStack(); + final Player player = AllZone.getPhase().getPlayerTurn(); - upkeep_Karma(); - upkeep_Oath_of_Druids(); - upkeep_Oath_of_Ghouls(); - upkeep_Suspend(); - upkeep_Vanishing(); - upkeep_Fading(); - upkeep_Masticore(); - upkeep_Eldrazi_Monument(); - upkeep_Blaze_Counters(); - upkeep_Dark_Confidant(); // keep this one semi-last - upkeep_Power_Surge(); - upkeep_AI_Aluren(); - // experimental, AI abuse aluren + draw_Sylvan_Library(player); - AllZone.Stack.unfreezeStack(); - } + AllZone.getStack().unfreezeStack(); + } - public static void executeDrawStepEffects() { - AllZone.Stack.freezeStack(); - final Player player = AllZone.Phase.getPlayerTurn(); + /** + *

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(); - draw_Sylvan_Library(player); - - AllZone.Stack.unfreezeStack(); - } - - 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_Cascade(c); + playCard_Ripple(c); playCard_Storm(sa); - playCard_Vengevine(c); - playCard_Demigod_of_Revenge(c); - playCard_Standstill(c); - playCard_Sigil_of_the_Empty_Throne(c); - playCard_Curse_of_Wizardry(c); - playCard_Venser_Emblem(c); - playCard_Ichneumon_Druid(c); + playCard_Vengevine(c); + playCard_Standstill(c); + playCard_Curse_of_Wizardry(c); + playCard_Venser_Emblem(c); + playCard_Ichneumon_Druid(c); - } - - 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.HumanPlayer, "Maelstrom Nexus"); - CardList computerNexus = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, "Maelstrom Nexus"); + /** + *

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; - if (humanNexus.size() > 0){ - if (Phase.PlayerSpellCount == 1 && !c.isCopiedSpell()) - { - for (int i = 0; i < humanNexus.size(); i++) - { - DoCascade(c); - } - } - } - if (computerNexus.size() > 0){ - if (Phase.ComputerSpellCount == 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() + 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(); @@ -179,7 +112,8 @@ public class GameActionUtil { while (cascadedCard == null) { crd = topOfLibrary.get(count++); revealed.add(crd); - if ((!crd.isLand() && CardUtil.getConvertedManaCost(crd.getManaCost()) < CardUtil.getConvertedManaCost(cascCard.getManaCost()))) cascadedCard = crd; + if ((!crd.isLand() && CardUtil.getConvertedManaCost(crd.getManaCost()) < CardUtil.getConvertedManaCost(cascCard.getManaCost()))) + cascadedCard = crd; if (count == topOfLibrary.size()) break; @@ -193,18 +127,18 @@ public class GameActionUtil { 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.GameAction.playCardNoCost(cascadedCard); + AllZone.getGameAction().playCardNoCost(cascadedCard); revealed.remove(cascadedCard); } } else //computer { ArrayList choices = cascadedCard.getBasicSpells(); - for (SpellAbility sa:choices) { + for (SpellAbility sa : choices) { if (sa.canPlayAI()) { ComputerUtil.playStackFree(sa); revealed.remove(cascadedCard); @@ -214,8 +148,8 @@ public class GameActionUtil { } } revealed.shuffle(); - for (Card bottom:revealed) { - AllZone.GameAction.moveToBottomOfLibrary(bottom); + for (Card bottom : revealed) { + AllZone.getGameAction().moveToBottomOfLibrary(bottom); } } }; @@ -223,241 +157,253 @@ public class GameActionUtil { sb.append(c).append(" - Cascade."); ability.setStackDescription(sb.toString()); - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }; Cascade.execute(); } - - 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.HumanPlayer, "Thrumming Stone"); - CardList computerThrummingStone = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, "Thrumming Stone"); + /** + *

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; - 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() + public void 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.Display.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(); + CardList humanThrummingStone = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer(), "Thrumming Stone"); + CardList computerThrummingStone = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Thrumming Stone"); - 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()) { + 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() - 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.GameAction.playCardNoCost(RippledCards[i]); - revealed.remove(RippledCards[i]); - } - } else //computer - { - ArrayList choices = RippledCards[i].getBasicSpells(); + 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 (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.GameAction.moveToBottomOfLibrary(bottom); - } - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - Ripple."); - ability.setStackDescription(sb.toString()); + 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()) { - AllZone.Stack.addSimultaneousStackEntry(ability); + 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(); - } - } - }; - Ripple.execute(); - }//playCard_Ripple() - - 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.CardFactory.copySpellontoStack(source, source, sa, true); - } - }//playCard_Storm() - - public static void playCard_Vengevine(Card c) { - if (c.isCreature() == true && (Phase.PlayerCreatureSpellCount == 2 || Phase.ComputerCreatureSpellCount == 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.GameAction.moveTo(play, card); - } - } - } - }; // ability + 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()); - 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); - AllZone.Stack.addSimultaneousStackEntry(ability); + } + } + }; + Ripple.execute(); + }//playCard_Ripple() - } - }//if - } - }//playCard_Vengevine() - - public static void playCard_Ichneumon_Druid(Card c) { - if (c.isInstant() && (Phase.PlayerInstantSpellCount >= 2 || Phase.ComputerInstantSpellCount >= 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 + /** + *

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() - 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()); + /** + *

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 - AllZone.Stack.addSimultaneousStackEntry(ability); - } - } - }//playCard_Ichneumon_Druid() - - public static void playCard_Venser_Emblem(Card c) - { - final Player controller = c.getController(); + 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()); - CardList list = AllZoneUtil.getPlayerCardsInPlay(controller); + AllZone.getStack().addSimultaneousStackEntry(ability); - 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 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; + } + }//if + } + }//playCard_Vengevine() - @Override + /** + *

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() { @@ -465,926 +411,135 @@ public class GameActionUtil { 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.GameAction.playSpellAbility(ability); - else { - ability.chooseTargetAI(); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - - - public static void playCard_Demigod_of_Revenge(final Card c) { - // not enough boom stick references in this block of code - if(c.getName().equals("Demigod of Revenge")) { - Ability ability2 = new Ability(c, "0") { - @Override - public void resolve() { - CardList evildead = AllZoneUtil.getPlayerGraveyard(c.getController(), "Demigod of Revenge"); - - for(Card c : evildead){ - AllZone.GameAction.moveToPlay(c); - } - } - }; // ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - ").append(c.getController()); - sb.append(" casts Demigod of Revenge, returns all cards named Demigod "); - sb.append("of Revenge from your graveyard to the battlefield."); - ability2.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability2); - - - }//if - }// Demigod of Revenge - - 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.GameAction.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.Stack.addSimultaneousStackEntry(ability2); - - } - - } - - public static void playCard_Sigil_of_the_Empty_Throne(Card c) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController(), "Sigil of the Empty Throne"); - - if(c.isEnchantment()) { - for(int i = 0; i < list.size(); i++) { - final Card card = list.get(0); - - Ability ability2 = new Ability(card, "0") { - @Override - public void resolve() { - CardFactoryUtil.makeToken("Angel", "W 4 4 Angel", card.getController(), "W", new String[] { - "Creature", "Angel"}, 4, 4, new String[] {"Flying"}); - } - }; // ability2 - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(c.getController()); - sb.append(" puts a 4/4 White Angel token with flying onto the battlefield."); - ability2.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability2); - - - } // for - }// if isEnchantment() - } - - 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 a = c.getKeyword(); - for(int i = 0; i < a.size(); i++) { - if(a.get(i).toString().startsWith("Cumulative upkeep")) { - String k[] = a.get(i).toString().split(":"); - c.addCounter(Counters.AGE, 1); - String upkeepCost = CardFactoryUtil.multiplyManaCost(k[1], c.getCounters(Counters.AGE)); - c.setUpkeepCost(upkeepCost); - System.out.println("Multiplied cost: " + upkeepCost); - //c.setUpkeepCost(k[1]); - return true; - } - } - return false; - } - }); - - for(int i = 0; i < list.size(); i++) { - final Card c = list.get(i); - - final Command unpaidCommand = new Command() { - - private static final long serialVersionUID = -8737736216222268696L; - - public void execute() { - AllZone.GameAction.sacrifice(c); - } - }; - - final Command paidCommand = Command.Blank; - - final Ability aiPaid = upkeepAIPayment(c, c.getUpkeepCost()); - - final StringBuilder sb = new StringBuilder(); - sb.append("Upkeep for ").append(c).append("\n"); - final Ability upkeepAbility = new Ability(c, "0") { - @Override - public void resolve() { - if(c.getController().isHuman()) { - payManaDuringAbilityResolve(sb.toString(), c.getUpkeepCost(), paidCommand, unpaidCommand); - } - else - if(ComputerUtil.canPayCost(aiPaid)) - ComputerUtil.playNoStack(aiPaid); - else - AllZone.GameAction.sacrifice(c); - } - }; - upkeepAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(upkeepAbility); - - } - }//upkeepCost - - private static void upkeep_Echo() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.Phase.getPlayerTurn()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("(Echo unpaid)"); - } - }); - - for(int i = 0; i < list.size(); i++) { - final Card c = list.get(i); - if(c.getIntrinsicKeyword().contains("(Echo unpaid)")) { - - final Command paidCommand = Command.Blank; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = -7354791599039157375L; - - public void execute() { - AllZone.GameAction.sacrifice(c); - } - }; - - final Ability aiPaid = upkeepAIPayment(c, c.getEchoCost()); - - final StringBuilder sb = new StringBuilder(); - sb.append("Echo for ").append(c).append("\n"); - - final Ability sacAbility = new Ability(c, "0") { - @Override - public void resolve() { - if(c.getController().isHuman()) { - payManaDuringAbilityResolve(sb.toString(), c.getEchoCost(), paidCommand, unpaidCommand); - } - else //computer - { - if(ComputerUtil.canPayCost(aiPaid)) - ComputerUtil.playNoStack(aiPaid); - else - AllZone.GameAction.sacrifice(c); - } - } - }; - sacAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(sacAbility); - - - c.removeIntrinsicKeyword("(Echo unpaid)"); - } - } - }//echo - - private static void upkeep_Slowtrips() { // Draw a card at the beginning of the next turn's upkeep. - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = player.getSlowtripList(); - - for (int i = 0; i < list.size(); i++) { - Card card = list.get(i); - card.removeIntrinsicKeyword("Draw a card at the beginning of the next turn's upkeep."); //otherwise another slowtrip gets added - - final Ability slowtrip = new Ability(card, "0") { - @Override - public void resolve() { - player.drawCard(); - } - }; - slowtrip.setStackDescription(card.getName() + " - Draw a card"); - - AllZone.Stack.addSimultaneousStackEntry(slowtrip); - - - } - player.clearSlowtripList(); - - //Do the same for the opponent - final Player opponent = player.getOpponent(); - - list = opponent.getSlowtripList(); - - for (int i = 0; i < list.size(); i++) { - Card card = list.get(i); - card.removeIntrinsicKeyword("Draw a card at the beginning of the next turn's upkeep."); //otherwise another slowtrip gets added - - final Ability slowtrip = new Ability(card, "0") { - @Override - public void resolve() { - opponent.drawCard(); - } - }; - slowtrip.setStackDescription(card.getName() + " - Draw a card"); - - AllZone.Stack.addSimultaneousStackEntry(slowtrip); - - } - opponent.clearSlowtripList(); - } - - private static void upkeep_UpkeepCost() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.Phase.getPlayerTurn()); - - for(int i = 0; i < list.size(); i++) { - final Card c = list.get(i); - ArrayList a = c.getKeyword(); - for(int j = 0; j < a.size(); j++) { - String ability = a.get(j); - - //destroy - if(ability.startsWith("At the beginning of your upkeep, destroy CARDNAME")) { - String k[] = ability.split(" pay "); - final String upkeepCost = k[1].toString(); - - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = 8942537892273123542L; - - public void execute() { - if(c.getName().equals("Cosmic Horror")) { - Player player = c.getController(); - player.addDamage(7, c); - } - AllZone.GameAction.destroy(c); - } - }; - - final Command paidCommand = Command.Blank; - - final Ability aiPaid = upkeepAIPayment(c, upkeepCost); - - final StringBuilder sb = new StringBuilder(); - sb.append("Upkeep for ").append(c).append("\n"); - final Ability upkeepAbility = new Ability(c, "0") { - @Override - public void resolve() { - if(c.getController().isHuman()) { - payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand, unpaidCommand); - } - else //computer - { - if (ComputerUtil.canPayCost(aiPaid) - && ! c.hasKeyword("Indestructible")) - ComputerUtil.playNoStack(aiPaid); - else - AllZone.GameAction.destroy(c); - } - } - }; - upkeepAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(upkeepAbility); - }//destroy - - //sacrifice - if(ability.startsWith("At the beginning of your upkeep, sacrifice")) { - String k[] = ability.split(" pay "); - final String upkeepCost = k[1].toString(); - - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = 5612348769167529102L; - - public void execute() { - AllZone.GameAction.sacrifice(c); - } - }; - - final Command paidCommand = Command.Blank; - - final Ability aiPaid = upkeepAIPayment(c, upkeepCost); - - final StringBuilder sb = new StringBuilder(); - sb.append("Upkeep for ").append(c).append("\n"); - final Ability upkeepAbility = new Ability(c, "0") { - @Override - public void resolve() { - if(c.getController().isHuman()) { - payManaDuringAbilityResolve(sb.toString(), upkeepCost, paidCommand, unpaidCommand); - } - else //computer - { - if(ComputerUtil.canPayCost(aiPaid)) - ComputerUtil.playNoStack(aiPaid); - else AllZone.GameAction.sacrifice(c); - } - } - }; - upkeepAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(upkeepAbility); - }//sacrifice - } - - }//for - }//upkeepCost - - - private static void upkeep_DamageUpkeepCost() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.Phase.getPlayerTurn()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - ArrayList a = c.getKeyword(); - for(int i = 0; i < a.size(); i++) { - if(a.get(i).toString().startsWith( - "At the beginning of your upkeep, CARDNAME deals ")) { - String k[] = a.get(i).toString().split("deals "); - String s1 = k[1].substring(0, 2); - s1 = s1.trim(); - c.setUpkeepDamage(Integer.parseInt(s1)); - System.out.println(k[1]); - String l[] = k[1].split(" pay "); - System.out.println(l[1]); - c.setUpkeepCost(l[1]); - - return true; - } - } - return false; - } - }); - - for(int i = 0; i < list.size(); i++) { - final Card c = list.get(i); - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = 8942537892273123542L; - - public void execute() { - Player player = c.getController(); - player.addDamage(c.getUpkeepDamage(), c); - } - }; - - final Command paidCommand = Command.Blank; - - final Ability aiPaid = upkeepAIPayment(c, c.getUpkeepCost()); - - final StringBuilder sb = new StringBuilder(); - sb.append("Upkeep for ").append(c).append("\n"); - final Ability upkeepAbility = new Ability(c, c.getUpkeepCost()) { - @Override - public void resolve() { - if(c.getController().isHuman()) { - payManaDuringAbilityResolve(sb.toString(), c.getUpkeepCost(), paidCommand, unpaidCommand); - - } - else //computer - { - if(ComputerUtil.canPayCost(aiPaid)) ComputerUtil.playNoStack(aiPaid); - else AllZone.GameAction.sacrifice(c); - } - } - }; - upkeepAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(upkeepAbility); - - } - }//damageUpkeepCost - - private static Ability upkeepAIPayment(Card c, String cost){ - return new Ability_Static(c, cost) { - @Override - public void resolve() { - - } - }; - } - - private static void upkeep_The_Abyss() { - /* - * 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. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - final CardList the = AllZoneUtil.getCardsInPlay("The Abyss"); - final CardList magus = AllZoneUtil.getCardsInPlay("Magus of the Abyss"); - - CardList cards = new CardList(); - cards.addAll(the); - cards.addAll(magus); - - for(Card c:cards) { - final Card abyss = c; - - final Ability sacrificeCreature = new Ability(abyss, "") { - @Override - public void resolve() { - if(player.isHuman()) { - if(abyss_getTargets(player, abyss).size() > 0) { - AllZone.InputControl.setInput( new Input() { - private static final long serialVersionUID = 4820011040853968644L; - public void showMessage() { - AllZone.Display.showMessage(abyss.getName()+" - Select one nonartifact creature to destroy"); - ButtonUtil.disableAll(); - } - public void selectCard(Card selected, PlayerZone zone) { - //probably need to restrict by controller also - if(selected.isCreature() && !selected.isArtifact() && CardFactoryUtil.canTarget(abyss, selected) - && zone.is(Constant.Zone.Battlefield) && zone.getPlayer().isHuman()) { - AllZone.GameAction.destroyNoRegeneration(selected); - stop(); - } - }//selectCard() - });//Input - } - } - else { //computer - CardList targets = abyss_getTargets(player,abyss); - CardList indestruct = targets.getKeyword("Indestructible"); - if(indestruct.size() > 0) { - AllZone.GameAction.destroyNoRegeneration(indestruct.get(0)); - } - else { - Card target = CardFactoryUtil.AI_getWorstCreature(targets); - if(null == target) { - //must be nothing valid to destroy - } - else AllZone.GameAction.destroyNoRegeneration(target); - } - } - }//resolve - };//sacrificeCreature - - StringBuilder sb = new StringBuilder(); - sb.append(abyss.getName()).append(" - destroy a nonartifact creature of your choice."); - sacrificeCreature.setStackDescription(sb.toString()); - - if(abyss_getTargets(player,abyss).size() > 0) - AllZone.Stack.addSimultaneousStackEntry(sacrificeCreature); - - }//end for - }//The Abyss - - private static CardList abyss_getTargets(final Player player, Card card) { - CardList creats = AllZoneUtil.getCreaturesInPlay(player); - creats = creats.filter(AllZoneUtil.nonartifacts); - creats = creats.getTargetableCards(card); - return creats; - } - - private static void upkeep_Mana_Vortex() { - /* - * At the beginning of each player's upkeep, that player - * sacrifices a land. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - final CardList vortices = AllZoneUtil.getCardsInPlay("Mana Vortex"); - - for(Card c:vortices) { - final Card vortex = c; - - final Ability sacrificeLand = new Ability(vortex, "") { - @Override - public void resolve() { - CardList choices = AllZoneUtil.getPlayerLandsInPlay(player); - player.sacrificePermanent(vortex.getName()+" - select a land to sacrifice.", choices); - - //if no lands in play, sacrifice all "Mana Vortex"s - if(AllZoneUtil.getLandsInPlay().size() == 0) { - for(Card d:vortices) { - AllZone.GameAction.sacrifice(d); - } - return; - } - }//resolve - };//sacrificeCreature - - StringBuilder sb = new StringBuilder(); - sb.append(vortex.getName()).append(" - "+player+" sacrifices a land."); - sacrificeLand.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(sacrificeLand); - - }//end for - }//Mana_Vortex - - - - private static void upkeep_Yawgmoth_Demon() { - /* - * 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. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - final CardList cards = AllZoneUtil.getPlayerCardsInPlay(player, "Yawgmoth Demon"); - - for(int i = 0; i < cards.size(); i++) { - final Card c = cards.get(i); - - final Ability sacrificeArtifact = new Ability(c, "") { - @Override - public void resolve() { - CardList artifacts = AllZoneUtil.getPlayerCardsInPlay(player); - artifacts = artifacts.filter(AllZoneUtil.artifacts); - - if(player.isHuman()) { - AllZone.InputControl.setInput( new Input() { - private static final long serialVersionUID = -1698502376924356936L; - public void showMessage() { - AllZone.Display.showMessage("Yawgmoth Demon - Select one artifact to sacrifice or be dealt 2 damage"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - tapAndDamage(player); - stop(); - } - public void selectCard(Card artifact, PlayerZone zone) { - //probably need to restrict by controller also - if(artifact.isArtifact() && zone.is(Constant.Zone.Battlefield) - && zone.getPlayer().isHuman()) { - AllZone.GameAction.sacrifice(artifact); - stop(); - } - }//selectCard() - });//Input - } - else { //computer - Card target = CardFactoryUtil.AI_getCheapestPermanent(artifacts, c, false); - if(null == target) { - tapAndDamage(player); - } - else AllZone.GameAction.sacrifice(target); - } - }//resolve - - private void tapAndDamage(Player player) { - c.tap(); - player.addDamage(2, c); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - sacrifice an artifact or "); - sb.append(c.getName()).append(" becomes tapped and deals 2 damage to you."); - sacrificeArtifact.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(sacrificeArtifact); - - }//end for - } - - private static void upkeep_Lord_of_the_Pit() { - /* - * 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. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - CardList lords = AllZoneUtil.getPlayerCardsInPlay(player, "Lord of the Pit"); - lords.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Liege of the Pit")); - final CardList cards = lords; - - for(int i = 0; i < cards.size(); i++) { - final Card c = cards.get(i); - if (c.isFaceDown()) continue; - - final Ability sacrificeCreature = new Ability(c, "") { - @Override - public void resolve() { - //TODO: this should handle the case where you sacrifice 2 LOTPs to each other - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - creatures.remove(c); - if(player.isHuman()) { - AllZone.InputControl.setInput(CardFactoryUtil.input_sacrificePermanent(creatures, c.getName()+" - Select a creature to sacrifice.")); - } - else { //computer - Card target = CardFactoryUtil.AI_getWorstCreature(creatures); - AllZone.GameAction.sacrifice(target); - } - }//resolve - }; - - final Ability sevenDamage = new Ability(c, "") { - @Override - public void resolve() { - player.addDamage(7, c); - } - }; - - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - creatures.remove(c); - if(creatures.size() == 0) { - //there are no creatures to sacrifice, so we must do the 7 damage - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - deals 7 damage to controller"); - sevenDamage.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(sevenDamage); - - } - else { - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - sacrifice a creature."); - sacrificeCreature.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(sacrificeCreature); - - } - }//end for - }// upkeep_Lord_of_the_Pit() - - private static void upkeep_Drop_of_Honey() { - /* - * 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. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - CardList drops = AllZoneUtil.getPlayerCardsInPlay(player, "Drop of Honey"); - drops.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Porphyry Nodes")); - final CardList cards = drops; - - for(int i = 0; i < cards.size(); i++) { - final Card c = cards.get(i); - - final Ability ability = new Ability(c, "") { - @Override - public void resolve() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - if(creatures.size() > 0) { - CardListUtil.sortAttackLowFirst(creatures); - int power = creatures.get(0).getNetAttack(); - if(player.isHuman()) { - AllZone.InputControl.setInput(CardFactoryUtil.input_destroyNoRegeneration(getLowestPowerList(creatures), "Select creature with power: "+power+" to sacrifice.")); - } - else { //computer - Card compyTarget = getCompyCardToDestroy(creatures); - AllZone.GameAction.destroyNoRegeneration(compyTarget); - } - } - }//resolve - - private CardList getLowestPowerList(CardList original) { - CardList lowestPower = new CardList(); - int power = original.get(0).getNetAttack(); - int i = 0; - while(i < original.size() && original.get(i).getNetAttack() == power) { - lowestPower.add(original.get(i)); - i++; - } - return lowestPower; - } - - private Card getCompyCardToDestroy(CardList original) { - CardList options = getLowestPowerList(original); - CardList humanCreatures = options.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getController().isHuman(); - } - }); - if(humanCreatures.isEmpty()) { - options.shuffle(); - return options.get(0); - } - else { - humanCreatures.shuffle(); - return humanCreatures.get(0); - } - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - destroy 1 creature with lowest power."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//end for - }// upkeep_Drop_of_Honey() - - private static void upkeep_Demonic_Hordes() { - - /* - * At the beginning of your upkeep, unless you pay BBB, - * tap Demonic Hordes and sacrifice a land of an opponent's choice. - */ - - final Player player = AllZone.Phase.getPlayerTurn(); - final CardList cards = AllZoneUtil.getPlayerCardsInPlay(player, "Demonic Hordes"); - - for(int i = 0; i < cards.size(); i++) { - - final Card c = cards.get(i); - - final Ability noPay = new Ability(c, "B B B") { - private static final long serialVersionUID = 4820011390853920644L; - @Override - public void resolve() { - CardList playerLand = AllZoneUtil.getPlayerLandsInPlay(player); - - c.tap(); - if (c.getController().isComputer()){ - if (playerLand.size() > 0) - AllZone.InputControl.setInput(CardFactoryUtil.input_sacrificePermanent(playerLand, c.getName()+" - Select a land to sacrifice.")); - } - else { - Card target = CardFactoryUtil.AI_getBestLand(playerLand); - - AllZone.GameAction.sacrifice(target); - } - } //end resolve() - }; //end noPay ability - - if (c.getController().isHuman()) { - String question = "Pay Demonic Hordes upkeep cost?"; - if (GameActionUtil.showYesNoDialog(c, question)) { - final Ability pay = new Ability(c, "0") { - private static final long serialVersionUID = 4820011440853920644L; + 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() { - if (AllZone.getZone(c).is(Constant.Zone.Battlefield)) { - StringBuilder cost = new StringBuilder(); - cost.append("Pay cost for ").append(c).append("\r\n"); - GameActionUtil.payManaDuringAbilityResolve(cost.toString(), noPay.getManaCost(), Command.Blank, Command.Blank); - } - } //end resolve() - }; //end pay ability - pay.setStackDescription("Demonic Hordes - Upkeep Cost"); + c.getController().loseLife(1, card); + } //resolve + };//ability - AllZone.Stack.addSimultaneousStackEntry(pay); - - } //end choice - else { StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - is tapped and you must sacrifice a land of opponent's choice"); - noPay.setStackDescription(sb.toString()); + 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.Stack.addSimultaneousStackEntry(noPay); + AllZone.getStack().addSimultaneousStackEntry(ability); } - } //end human - else { //computer - if((c.getController().isComputer() && (ComputerUtil.canPayCost(noPay)))) { - final Ability computerPay = new Ability(c, "0") { - private static final long serialVersionUID = 4820011440852868644L; - public void resolve() { - ComputerUtil.payManaCost(noPay); - } - }; - computerPay.setStackDescription("Computer pays Demonic Hordes upkeep cost"); + }//if + }//if + }//Curse of Wizardry - AllZone.Stack.addSimultaneousStackEntry(computerPay); + /** + *

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); + } - } - else { - AllZone.Stack.addSimultaneousStackEntry(noPay); + //START ENDOFTURN CARDS - } - } //end computer - - } //end for loop - - } //upkeep_Demonic_Hordes - - //END UPKEEP CARDS - - //START ENDOFTURN CARDS - - public static void endOfTurn_Wall_Of_Reverence() - { - final Player player = AllZone.Phase.getPlayerTurn(); + /** + *

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++) - { + for (int i = 0; i < list.size(); i++) { final Card card = list.get(i); - ability = new Ability(list.get(i), "0") - { - public void resolve() - { + 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()) - { + 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 + } else//computer { CardListUtil.sortAttack(creats); Card c = creats.get(0); @@ -1395,3456 +550,1064 @@ public class GameActionUtil { } } // 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.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }//endOfTurn_Wall_Of_Reverence() - - public static void endOfTurn_Predatory_Advantage() - { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player.getOpponent(), "Predatory Advantage"); - for (int i = 0; i < list.size(); i++) { + + /** + *

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.PlayerCreatureSpellCount == 0) || (player.isComputer() && Phase.ComputerCreatureSpellCount == 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[] {""}); + 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.GameAction.playSpellAbility(abTrig); + AllZone.getGameAction().playSpellAbility(abTrig); } - } - } - - public static void endOfTurn_Lighthouse_Chronologist() - { - final Player player = AllZone.Phase.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.Phase.addExtraTurn(card.getController()); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" - ").append(card.getController()).append(" takes an extra turn."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - - public static void endOfTurn_Krovikan_Horror() - { - final Player player = AllZone.Phase.getPlayerTurn(); - final Player opponent = player.getOpponent(); - horrorReturn(player); - horrorReturn(opponent); - } - - public static void horrorReturn(Player player) - { - // Find each Horror, peek at the card above it, if it's a creature return to hand - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - if (grave.getName("Krovikan Horror").size() == 0) return; - int i = 0; - - while (i+1 < grave.size()){ - Card c = grave.get(i); - ArrayList types = grave.get(i+1).getType(); - if (c.getName().equals("Krovikan Horror") && types.contains("Creature")) { - - if (player.isHuman()) { - String question = "Return Krovikan Horror to your hand?"; - if (GameActionUtil.showYesNoDialog(c, question)) { - AllZone.GameAction.moveToHand(c); - grave.remove(c); - } - // increment counter to next occurance of Krovikan Horror - // if human decides not to return Krovikan Horror to hand - else - i++; - } - // player is computer - else { - AllZone.GameAction.moveToHand(c); - grave.remove(c); - } - } - else - i++; } } - //END ENDOFTURN CARDS - public static void removeAttackedBlockedThisTurn() { - // resets the status of attacked/blocked this turn - Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getCreaturesInPlay(player); + /** + *

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); - 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 + list = list.filter(new CardListFilter() { + public boolean addCard(Card c) { + return c.getName().equals("Lighthouse Chronologist") && c.getCounters(Counters.LEVEL) >= 7; + } + }); - if(c.getCreatureGotBlockedThisCombat()) c.setCreatureGotBlockedThisCombat(false); - } - - AllZone.GameInfo.setAssignedFirstStrikeDamageThisCombat(false); - AllZone.GameInfo.setResolvedFirstStrikeDamageThisCombat(false); - } - + 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) { - AllZone.Display.setCard(c); + 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 = JOptionPane.showConfirmDialog(null, question, title.toString(), JOptionPane.YES_NO_OPTION); - + + 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); + 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 = MyRandom.percentTrue(50); - if(caller.isHuman()) { - choice = (String) GuiUtils.getChoice(source.getName()+" - Call coin flip", choices); - } - else { - choice = choices[MyRandom.random.nextInt(2)]; - } + 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()+" - "+source.getController()+" wins flip.", source.getName(), JOptionPane.PLAIN_MESSAGE); - return true; - } - else{ - JOptionPane.showMessageDialog(null, source.getName()+" - "+source.getController()+" loses flip.", source.getName(), JOptionPane.PLAIN_MESSAGE); - return false; - } + 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; + } } - public static void executeLandfallEffects(Card c) { - if(c.getName().equals("Lotus Cobra")) landfall_Lotus_Cobra(c); - } - - private static boolean showLandfallDialog(Card c) { - AllZone.Display.setCard(c); - String[] choices = {"Yes", "No"}; + /** + *

executeLandfallEffects.

+ * + * @param c a {@link forge.Card} object. + */ + public static void executeLandfallEffects(Card c) { + if (c.getName().equals("Lotus Cobra")) landfall_Lotus_Cobra(c); + } - Object q = null; + /** + *

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"}; - q = GuiUtils.getChoiceOptional("Use " + c.getName() + " Landfall?", choices); + Object q = null; - if(q == null || q.equals("No")) return false; - else return true; - } + q = GuiUtils.getChoiceOptional("Use " + c.getName() + " Landfall?", choices); - private static void landfall_Lotus_Cobra(final Card c) { - Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - String color = ""; + if (q == null || q.equals("No")) return false; + else return true; + } - Object o = GuiUtils.getChoice("Choose mana color", Constant.Color.onlyColors); - color = Input_PayManaCostUtil.getShortColorString((String) o); + /** + *

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 = ""; - Ability_Mana abMana = new Ability_Mana(c, "0", color) { - private static final long serialVersionUID = -2182129023960978132L; - }; - abMana.produceMana(); - } - }; - + Object o = GuiUtils.getChoice("Choose mana color", Constant.Color.onlyColors); + color = Input_PayManaCostUtil.getShortColorString((String) o); - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - add one mana of any color to your mana pool."); - ability.setStackDescription(sb.toString()); + 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(c.getController().isHuman()) { - if(showLandfallDialog(c)) AllZone.Stack.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 - 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 - 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 - 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); + + } + + //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.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } - - if(source.getName().equals("Spiritmonger")) { - Ability ability2 = new Ability(source, "0") { - @Override - public void resolve() { - source.addCounter(Counters.P1P1, 1); - } - }; // ability2 - - StringBuilder sb2 = new StringBuilder(); - sb2.append(source.getName()).append(" - gets a +1/+1 counter"); - ability2.setStackDescription(sb2.toString()); - AllZone.Stack.addSimultaneousStackEntry(ability2); - - } - 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.Stack.addSimultaneousStackEntry(ability2); + 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.GameAction.destroy(affected); } - }; - - final Ability ability2 = new Ability(source, "0") { - @Override - public void resolve() { AllZone.GameAction.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.Stack.addSimultaneousStackEntry(ability2); - } - int amount = affected.getAmountOfKeyword("When CARDNAME is dealt damage, destroy it."); - - for(int i=1 ; i < amount ; i++) - AllZone.Stack.addSimultaneousStackEntry(ability); AllZone.Stack.addSimultaneousStackEntry(ability); + 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.GameAction.destroy(affected); + + if (source.hasKeyword("Deathtouch") + && affected.isCreature()) + AllZone.getGameAction().destroy(affected); - } - - 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)) { + } + + /** + *

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.GameAction.moveTo(hand, target); + 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.Stack.addSimultaneousStackEntry(ability); + src.getController().gainLife(3, source); + } + }; // ability - return; - } - - if(src.getController().isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select target card", list.toArray()); - if(o != null) { - ability.setTargetCard((Card) o); - AllZone.Stack.addSimultaneousStackEntry(ability); + Command res = new Command() { + private static final long serialVersionUID = -7433708170033536384L; - } - }//if - else//computer - { - Card best = CardFactoryUtil.AI_getBestCreature(list); - ability.setTargetCard(best); - AllZone.Stack.addSimultaneousStackEntry(ability); + public void execute() { + CardList list = AllZoneUtil.getPlayerGraveyard(src.getController()); + list = list.filter(AllZoneUtil.creatures); - } - }//execute() + 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(); - } - + + 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) + 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")) { + "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); + 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"); + 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.Stack.addSimultaneousStackEntry(ability2); + AllZone.getStack().addSimultaneousStackEntry(ability2); } } } //not restricted to just combat damage, restricted to players - public static void executeDamageToPlayerEffects(final Player player, final Card c, final int damage) - { - if (damage <= 0) return; - - CardList playerPerms = AllZoneUtil.getPlayerCardsInPlay(player); - - /* - * Backfire - Whenever enchanted creature deals damage to you, Backfire - * deals that much damage to that creature's controller. - */ - if(c.isEnchanted()) { - final String auraName = "Backfire"; - - CardList auras = new CardList(c.getEnchantedBy().toArray()); - auras = auras.getName(auraName); - - if(auras.size() > 0) { - for(Card aura:auras) { - final Card source = aura; - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - c.getController().addDamage(damage, source); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(source.getName()).append(" - deals ").append(damage); - sb.append(" damage to ").append(c.getController()); - ability.setStackDescription(sb.toString()); - - //Backfire triggers only if its controller is damaged - if(aura.getController().isPlayer(player)) - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }//auras > 0 - }//end c.isEnchanted() - - - 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.Stack.addSimultaneousStackEntry(ability); - - } - } - - if(c.getName().equals("Whirling Dervish") || c.getName().equals("Dunerider Outlaw")) - playerCombatDamage_Whirling_Dervish(c); - - if (player.isPlayer(AllZone.HumanPlayer)) c.setDealtDmgToHumanThisTurn(true); - if (player.isPlayer(AllZone.ComputerPlayer)) c.setDealtDmgToComputerThisTurn(true); - } - - - //restricted to combat damage, restricted to players - 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.GameAction.changeController(new CardList(zone), zone.getController(), c.getController()); - } - } - }; - ability.setStackDescription(zone+" - "+c.getController()+" gains control of "+zone); - - AllZone.Stack.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.HumanPlayer.addPoisonCounters(poison); - else - AllZone.ComputerPlayer.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 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 - - 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.Stack.addSimultaneousStackEntry(doubleLife); - - } - } - } - - 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.Stack.addSimultaneousStackEntry(ability); - - } - - - private static void playerCombatDamage_Treva(Card c) { - SpellAbility[] sa = c.getSpellAbility(); - if(c.getController().isHuman()) AllZone.GameAction.playSpellAbility(sa[1]); - else ComputerUtil.playNoStack(sa[1]); - - } - - private static void playerCombatDamage_Rith(Card c) { - SpellAbility[] sa = c.getSpellAbility(); - if(c.getController().isHuman()) AllZone.GameAction.playSpellAbility(sa[1]); - else ComputerUtil.playNoStack(sa[1]); - } - - 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.Stack.addSimultaneousStackEntry(ability2); - - } - }; - AllZone.EndOfTurn.addAt(dealtDmg); - - } // if - } - - 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.ComputerPlayer.getLife() % 2); - if(!(y == 0)) y = 1; - else y = 0; - - x = (AllZone.ComputerPlayer.getLife() / 2) + y; - } else { - y = (AllZone.HumanPlayer.getLife() % 2); - if(!(y == 0)) y = 1; - else y = 0; - - x = (AllZone.HumanPlayer.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.Stack.addSimultaneousStackEntry(ability2); - - } - } - - 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.GameAction.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.Stack.addSimultaneousStackEntry(ability); - - } - } - - 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.Stack.addSimultaneousStackEntry(ability2); - - } - - 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.GameAction.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.Stack.addSimultaneousStackEntry(ability2); - - } - } - - private static void upkeep_AI_Aluren() { - CardList alurens = AllZoneUtil.getCardsInPlay("Aluren"); - if (alurens.size() == 0) - return; - - CardList inHand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - inHand = inHand.getType("Creature"); - CardList playable = new CardList(); - - for(Card c : inHand) - if(CardUtil.getConvertedManaCost(c.getManaCost()) <= 3) - playable.add(c); - - for(Card c : playable) - AllZone.GameAction.playSpellAbilityForFree(c.getSpellPermanent()); - } - - - private static void upkeep_Dance_of_the_Dead() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList dances = AllZoneUtil.getPlayerCardsInPlay(player, "Dance of the Dead"); - for(Card dance:dances) { - final Card source = dance; - final ArrayList list = source.getEnchanting(); - final Card creature = list.get(0); - if(creature.isTapped()) { - Ability vaultChoice = new Ability(source, "0"){ - - @Override - public void resolve(){ - if(GameActionUtil.showYesNoDialog(source, "Untap "+creature.getName()+"?")) { - //prompt for pay mana cost, then untap - final SpellAbility untap = new Ability(source, "1 B") { - @Override - public void resolve() { - creature.untap(); - } - };//Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Untap ").append(creature); - untap.setStackDescription(sb.toString()); - - AllZone.GameAction.playSpellAbility(untap); - } - } - }; - vaultChoice.setStackDescription(source.getName()+" - Untap creature during Upkeep?"); - - AllZone.Stack.addSimultaneousStackEntry(vaultChoice); - - } - } - } - - private static void upkeep_Mana_Crypt() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList crypts = AllZoneUtil.getPlayerCardsInPlay(player, "Mana Crypt"); - for(final Card crypt:crypts) { - SpellAbility ab = new Ability(crypt, "0"){ - - @Override - public void resolve(){ - if(flipACoin(crypt.getController().getOpponent(), crypt)) { - //do nothing - } - else { - crypt.getController().addDamage(3, crypt); - } - } - }; - ab.setStackDescription(crypt.getName()+" - Flip a coin."); - - AllZone.Stack.addSimultaneousStackEntry(ab); - - } - }//upkeep_Mana_Crypt - - private static void upkeep_Farmstead() { - final String auraName = "Farmstead"; - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isEnchantedBy(auraName); - } - }); - - for(final Card land:list) { - CardList auras = new CardList(land.getEnchantedBy().toArray()); - auras = auras.getName(auraName); - for(int i = 0; i < auras.size(); i++) { - Ability ability = new Ability(land, "0") { - @Override - public void resolve() { - if(GameActionUtil.showYesNoDialog(land, "Pay W W, and gain 1 life?")) { - //prompt for pay mana cost - final SpellAbility gain = new Ability(land, "W W") { - @Override - public void resolve() { - land.getController().gainLife(1, land); - } - };//Ability - - StringBuilder sb = new StringBuilder(); - sb.append(land).append(" - gain 1 life."); - gain.setStackDescription(sb.toString()); - - AllZone.GameAction.playSpellAbility(gain); - } - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(land.getName()).append(" - activate Life gain ability?"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - }//upkeep_Farmstead() - - ///////////////////////// - // Start of Kinship cards - ///////////////////////// - - - private static void upkeep_Ink_Dissolver() { - final Player player = AllZone.Phase.getPlayerTurn(); - final Player opponent = player.getOpponent(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Ink Dissolver"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Merfolk", "Wizard" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantToMillOpponent = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and opponent puts the top 3 "); - question.append("cards of his library into his graveyard?"); - if (showYesNoDialog(k, question.toString())) { - wantToMillOpponent = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantToMillOpponent = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantToMillOpponent) - opponent.mill(3); - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Ink Dissolver - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Ink_Dissolver() - - - private static void upkeep_Kithkin_Zephyrnaut() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Kithkin Zephyrnaut"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Kithkin", "Soldier" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantKithkinBuff = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card, Kithkin Zephyrnaut gets +2/+2 and "); - question.append("gains flying and vigilance until end of turn?"); - if (showYesNoDialog(k, question.toString())) { - wantKithkinBuff = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantKithkinBuff = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantKithkinBuff) { - k.addTempAttackBoost(2); - k.addTempDefenseBoost(2); - k.addExtrinsicKeyword("Flying"); - k.addExtrinsicKeyword("Vigilance"); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = 213717084767008154L; - - public void execute() { - k.addTempAttackBoost(-2); - k.addTempDefenseBoost(-2); - k.removeExtrinsicKeyword("Flying"); - k.removeExtrinsicKeyword("Vigilance"); - } - }; - AllZone.EndOfTurn.addUntil(untilEOT); - } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Kithkin Zephyrnaut - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Kithkin_Zephyrnaut() - - - private static void upkeep_Leaf_Crowned_Elder() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Leaf-Crowned Elder"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Treefolk", "Shaman" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantToPlayCard = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal and play this card without paying its mana cost?"); - if (showYesNoDialog(k, question.toString())) { - wantToPlayCard = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantToPlayCard = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantToPlayCard) { - if (player.isHuman()) { - Card c = library.get(0); - AllZone.GameAction.playCardNoCost(c); - } - // player isComputer() - else { - Card c = library.get(0); - ArrayList choices = c.getBasicSpells(); - - for (SpellAbility sa:choices) { - if (sa.canPlayAI()) { - ComputerUtil.playStackFree(sa); - break; - } - } - } - }// wantToPlayCard - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Leaf-Crowned Elder - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Leaf_Crowned_Elder() - - - private static void upkeep_Mudbutton_Clanger() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Mudbutton Clanger"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Goblin", "Warrior" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantGoblinBuff = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and Mudbutton Clanger gets +1/+1 until end of turn?"); - if (showYesNoDialog(k, question.toString())) { - wantGoblinBuff = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantGoblinBuff = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantGoblinBuff) { - k.addTempAttackBoost(1); - k.addTempDefenseBoost(1); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = -103560515951630426L; - - public void execute() { - k.addTempAttackBoost(-1); - k.addTempDefenseBoost(-1); - } - }; - AllZone.EndOfTurn.addUntil(untilEOT); - } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Mudbutton Clanger - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Mudbutton_Clanger() - - - private static void upkeep_Nightshade_Schemers() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Nightshade Schemers"); - final Player opponent = player.getOpponent(); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Faerie", "Wizard" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantOpponentLoseLife = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and opponent loses 2 life?"); - if (showYesNoDialog(k, question.toString())) { - wantOpponentLoseLife = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantOpponentLoseLife = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - if (wantOpponentLoseLife) - opponent.loseLife(2, k); - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Nightshade Schemers - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Nightshade_Schemers() - - - private static void upkeep_Pyroclast_Consul() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Pyroclast Consul"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Elemental", "Shaman" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantDamageCreatures = false; - String[] smallCreatures = { "Creature.toughnessLE2" }; - - CardList humanCreatures = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - humanCreatures = humanCreatures.getValidCards(smallCreatures,k.getController(),k); - humanCreatures = humanCreatures.getNotKeyword("Indestructible"); - - CardList computerCreatures = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - computerCreatures = computerCreatures.getValidCards(smallCreatures,k.getController(),k); - computerCreatures = computerCreatures.getNotKeyword("Indestructible"); - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and Pyroclast Consul deals 2 damage to each creature?"); - if (showYesNoDialog(k, question.toString())) { - wantDamageCreatures = true; - } - } - // player isComputer() - else { - if (humanCreatures.size() > computerCreatures.size()) { - String title = "Computer reveals"; - revealTopCard(title); - wantDamageCreatures = true; - } - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantDamageCreatures) { - CardList allCreatures = AllZoneUtil.getCreaturesInPlay(); - for (final Card crd : allCreatures) { - crd.addDamage(2, k); + /** + *

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); } } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Pyroclast Consul - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); + }; - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Pyroclast_Consul() - - - private static void upkeep_Sensation_Gorger() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Sensation Gorger"); - final Player opponent = player.getOpponent(); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Goblin", "Shaman" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantDiscardThenDraw = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and have both players discard their hand and draw 4 cards?"); - if (showYesNoDialog(k, question.toString())) { - wantDiscardThenDraw = true; - } - } - // player isComputer() - else { - if (library.size() > 4 && hand.size() < 2) { - String title = "Computer reveals"; - revealTopCard(title); - wantDiscardThenDraw = true; - } - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - if (wantDiscardThenDraw) { - player.discardHand(this); - opponent.discardHand(this); - - player.drawCards(4); - opponent.drawCards(4); - } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Sensation Gorger - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Sensation_Gorger() - - - private static void upkeep_Squeaking_Pie_Grubfellows() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Squeaking Pie Grubfellows"); - final Player opponent = player.getOpponent(); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Goblin", "Shaman" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantOpponentDiscard = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and have opponent discard a card?"); - if (showYesNoDialog(k, question.toString())) { - wantOpponentDiscard = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantOpponentDiscard = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantOpponentDiscard) { - opponent.discard(this); - } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Squeaking Pie Grubfellows - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Squeaking_Pie_Grubfellows() - - - private static void upkeep_Wandering_Graybeard() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Wandering Graybeard"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Giant", "Wizard" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantGainLife = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and gain 4 life?"); - if (showYesNoDialog(k, question.toString())) { - wantGainLife = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantGainLife = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - if (wantGainLife) - player.gainLife(4, k); - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Wandering Graybeard - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Wandering_Graybeard() - - - private static void upkeep_Waterspout_Weavers() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Waterspout Weavers"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Merfolk", "Wizard" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantMerfolkBuff = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and each creature you "); - question.append("control gains flying until end of turn?"); - if (showYesNoDialog(k, question.toString())) { - wantMerfolkBuff = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantMerfolkBuff = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantMerfolkBuff) { - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - for (int i = 0; i < creatures.size(); i ++) { - if (!creatures.get(i).hasKeyword("Flying")) { - creatures.get(i).addExtrinsicKeyword("Flying"); - } - } - final Command untilEOT = new Command() { - private static final long serialVersionUID = -1978446996943583910L; - - public void execute() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - for (int i = 0; i < creatures.size(); i ++) { - if (creatures.get(i).hasKeyword("Flying")) { - creatures.get(i).removeExtrinsicKeyword("Flying"); - } - } - } - }; - AllZone.EndOfTurn.addUntil(untilEOT); - } - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Waterspout Weavers - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Waterspout_Weavers() - - - private static void upkeep_Winnower_Patrol() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Winnower Patrol"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Elf", "Warrior" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship) { - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantCounter = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and put a +1/+1 counter on Winnower Patrol?"); - if (showYesNoDialog(k, question.toString())) { - wantCounter = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantCounter = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - if (wantCounter) - k.addCounter(Counters.P1P1, 1); - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Winnower Patrol - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Winnower_Patrol() - - - private static void upkeep_Wolf_Skull_Shaman() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList kinship = AllZoneUtil.getPlayerCardsInPlay(player, "Wolf-Skull Shaman"); - - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - // Players would not choose to trigger Kinship ability if library is empty. - // Useful for games when the "Milling = Loss Condition" check box is unchecked. - - if (kinship.size() == 0 || library.size() <= 0) - return; - - final String[] shareTypes = { "Elf", "Shaman" }; - final Card[] prevCardShown = { null }; - final Card peek[] = { null }; - - for (final Card k : kinship){ - Ability ability = new Ability(k, "0") { // change to triggered abilities when ready - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, player); - if (library.size() <= 0) - return; - - peek[0] = library.get(0); - boolean wantToken = false; - - // We assume that both players will want to peek, ask if they want to reveal. - // We do not want to slow down the pace of the game by asking too many questions. - // Dialogs outside of the Ability appear at the previous end of turn phase !!! - - if (peek[0].isValidCard(shareTypes,k.getController(),k)) { - if (player.isHuman()) { - StringBuilder question = new StringBuilder(); - question.append("Your top card is ").append(peek[0].getName()); - question.append(". Reveal card and put a 2/2 green Wolf creature token onto the battlefield?"); - if (showYesNoDialog(k, question.toString())) { - wantToken = true; - } - } - // player isComputer() - else { - String title = "Computer reveals"; - revealTopCard(title); - wantToken = true; - } - } else if (player.isHuman()) { - String title = "Your top card is"; - revealTopCard(title); - } - - if (wantToken) - CardFactoryUtil.makeToken("Wolf", "G 2 2 Wolf", k.getController(), "G", - new String[] {"Creature", "Wolf"}, 2, 2, new String[] {""}); - }// resolve() - - private void revealTopCard(String title) { - if (peek[0] != prevCardShown[0]) { - GuiUtils.getChoice(title, peek[0]); - prevCardShown[0] = peek[0]; - } - }// revealTopCard() - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Wolf-Skull Shaman - ").append(player); - sb.append(" triggers Kinship"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Wolf_Skull_Shaman() - - - /////////////////////// - // End of Kinship cards - /////////////////////// - - - private static void upkeep_Dark_Confidant() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Dark Confidant") || c.getName().equals("Dark Tutelage"); - } - }); - - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card F_card = list.get(i); - ability = new Ability(F_card, "0") { - @Override - public void resolve() { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(player); - if(lib.size() > 0) { - Card toMove = lib.get(0); - AllZone.GameAction.moveToHand(toMove); - player.loseLife(toMove.getCMC(), F_card); - } - }// resolve() - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append(F_card).append(" - ").append("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."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Dark_Confidant() - - private static void upkeep_Oversold_Cemetery() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList cemeteryList = AllZoneUtil.getPlayerCardsInPlay(player, "Oversold Cemetery"); - if (cemeteryList.isEmpty()) - return; - - CardList graveyardCreatures = AllZoneUtil.getPlayerTypeInGraveyard(player, "Creature"); - - if(graveyardCreatures.size() >= 4) { - for(int i = 0; i < cemeteryList.size(); i++) { - Ability ability = new Ability(cemeteryList.get(0), "0") { - @Override - public void resolve() { - CardList graveyardCreatures = AllZoneUtil.getPlayerTypeInGraveyard(player, "Creature"); - - if(graveyardCreatures.size() >= 4) { - if(player.isHuman()) { - Object o = GuiUtils.getChoiceOptional("Pick a creature to return to hand", - graveyardCreatures.toArray()); - if(o != null) { - Card card = (Card) o; - - AllZone.GameAction.moveToHand(card); - } - } - else if(player.isComputer()) { - Card card = graveyardCreatures.get(0); - AllZone.GameAction.moveToHand(card); - } - } - } - };// Ability - ability.setStackDescription("Oversold Cemetary returns creature from the graveyard to its owner's hand."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - }//Oversold Cemetery - - - public static void upkeep_Suspend() { - Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInExile(player); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasSuspend(); - } - }); - - if (list.size() == 0) return; - - for(final Card c : list){ - int counters = c.getCounters(Counters.TIME); - if (counters > 0) c.subtractCounter(Counters.TIME, 1); - } - }//suspend - - private static void upkeep_Vanishing() { - - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactory.hasKeyword(c, "Vanishing") != -1; - } - }); - 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() { - card.subtractCounter(Counters.TIME, 1); - } - }; // ability - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Vanishing - remove a time counter from it. "); - sb.append("When the last is removed, sacrifice it.)"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - - private static void upkeep_Fading() { - - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactory.hasKeyword(c, "Fading") != -1; - } - }); - 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() { - int fadeCounters = card.getCounters(Counters.FADE); - if (fadeCounters <= 0) - AllZone.GameAction.sacrifice(card); - else - card.subtractCounter(Counters.FADE, 1); - } - }; // ability - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - Fading - remove a fade counter from it. "); - sb.append("If you can't, sacrifice it.)"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - - private static void upkeep_Oath_of_Druids() { - CardList oathList = AllZoneUtil.getCardsInPlay("Oath of Druids"); - if (oathList.isEmpty()) - return; - - final Player player = AllZone.Phase.getPlayerTurn(); - - if (AllZoneUtil.compareTypeAmountInPlay(player, "Creature") < 0) { - for (int i = 0; i < oathList.size(); i++) { - final Card oath = oathList.get(i); - Ability ability = new Ability(oath, "0") { - @Override - public void resolve() { - CardList libraryList = AllZoneUtil.getPlayerCardsInLibrary(player); - PlayerZone battlefield = AllZone.getZone(Constant.Zone.Battlefield, player); - boolean oathFlag = true; - - if (AllZoneUtil.compareTypeAmountInPlay(player, "Creature") < 0) { - if (player.isHuman()){ - StringBuilder question = new StringBuilder(); - question.append("Reveal cards from the top of your library and place "); - question.append("the first creature revealed onto the battlefield?"); - if (!GameActionUtil.showYesNoDialog(oath, question.toString())) { - oathFlag = false; - } - } - else { // if player == Computer - CardList creaturesInLibrary = AllZoneUtil.getPlayerTypeInLibrary(player, "Creature"); - CardList creaturesInBattlefield = AllZoneUtil.getPlayerTypeInPlay(player, "Creature"); - - // if there are at least 3 creatures in library, or none in play with one in library, oath - if (creaturesInLibrary.size() > 2 - || (creaturesInBattlefield.size() == 0 && creaturesInLibrary.size() > 0) ) - oathFlag = true; - else - oathFlag = false; - } - - if (oathFlag) { - CardList cardsToReveal = new CardList(); - int max = libraryList.size(); - for (int i = 0; i < max; i++) { - Card c = libraryList.get(i); - cardsToReveal.add(c); - if (c.isCreature()) { - AllZone.GameAction.moveTo(battlefield, c); - break; - } - else { - AllZone.GameAction.moveToGraveyard(c); - } - }// for loop - if (cardsToReveal.size() > 0) - GuiUtils.getChoice("Revealed cards", cardsToReveal.toArray()); - } - } - } - };// Ability - StringBuilder sb = new StringBuilder(); - sb.append("At the beginning of each player's upkeep, that player chooses target player "); - sb.append("who controls more creatures than he or she does and is his or her opponent. The "); - sb.append("first player may reveal cards from the top of his or her library until he or she "); - sb.append("reveals a creature card. If he or she does, that player puts that card onto the "); - sb.append("battlefield and all other cards revealed this way into his or her graveyard."); + sb.append(lich.getName()).append(" - ").append(lich.getController()); + sb.append(" sacrifices ").append(damage).append(" nontoken Permanents."); ability.setStackDescription(sb.toString()); - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } } - }// upkeep_Oath of Druids() - - private static void upkeep_Oath_of_Ghouls() { - CardList oathList = AllZoneUtil.getCardsInPlay("Oath of Ghouls"); - if (oathList.isEmpty()) - return; - - final Player player = AllZone.Phase.getPlayerTurn(); - - if (AllZoneUtil.compareTypeAmountInGraveyard(player, "Creature") > 0) - { - for(int i = 0; i < oathList.size(); i++) - { - Ability ability = new Ability(oathList.get(0), "0") { - @Override - public void resolve() { - CardList graveyardCreatures = AllZoneUtil.getPlayerTypeInGraveyard(player, "Creature"); - - if(AllZoneUtil.compareTypeAmountInGraveyard(player, "Creature") > 0) { - if(player.isHuman()) { - Object o = GuiUtils.getChoiceOptional("Pick a creature to return to hand", - graveyardCreatures.toArray()); - if(o != null) { - Card card = (Card) o; - - AllZone.GameAction.moveToHand(card); - } - } - else if(player.isComputer()) { - Card card = graveyardCreatures.get(0); - - AllZone.GameAction.moveToHand(card); - } - } - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("At the beginning of each player's upkeep, Oath of Ghouls returns a creature "); - sb.append("from their graveyard to owner's hand if they have more than an opponent."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - }//Oath of Ghouls - - - private static void upkeep_Karma() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList karmas = AllZoneUtil.getCardsInPlay("Karma"); - CardList swamps = AllZoneUtil.getPlayerTypeInPlay(player, "Swamp"); - - // determine how much damage to deal the current player - final int damage = swamps.size(); - - // if there are 1 or more Karmas on the - // battlefield have each of them deal damage. - if(0 < karmas.size()) { - for(Card karma:karmas) { - final Card src = karma; - Ability ability = new Ability(src, "0") { - @Override - public void resolve() { - if(damage>0){ - player.addDamage(damage, src); - } - } - };// Ability - if(damage>0){ - - StringBuilder sb = new StringBuilder(); - sb.append("Karma deals ").append(damage).append(" damage to ").append(player); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - }// if - }// upkeep_Karma() - - - private static void upkeep_Dega_Sanctuary() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Dega Sanctuary"); - - for(Card sanc:list) { - final Card source = sanc; - final Ability ability = new Ability(source, "0") { - public void resolve() { - int gain = 0; - CardList play = AllZoneUtil.getPlayerCardsInPlay(player); - CardList black = play.filter(AllZoneUtil.black); - CardList red = play.filter(AllZoneUtil.red); - if(black.size() > 0 && red.size() > 0) gain = 4; - else if(black.size() > 0 || red.size() > 0) gain = 2; - player.gainLife(gain, source); - } - };//Ability - - StringBuilder sb = new StringBuilder(); - sb.append(source.getName()).append(" - "); - sb.append("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."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//for - }//upkeep_Dega_Sanctuary() - - private static void upkeep_Ceta_Sanctuary() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Ceta Sanctuary"); - - for(Card sanc:list) { - final Card source = sanc; - final Ability ability = new Ability(source, "0") { - public void resolve() { - int draw = 0; - CardList play = AllZoneUtil.getPlayerCardsInPlay(player); - CardList green = play.filter(AllZoneUtil.green); - CardList red = play.filter(AllZoneUtil.red); - - if(green.size() > 0 && red.size() > 0) draw = 2; - else if(green.size() > 0 || red.size() > 0) draw = 1; - - if(draw > 0) { - player.drawCards(draw); - player.discard(1, this, true); - } - } - };//Ability - - StringBuilder sb = new StringBuilder(); - sb.append(source).append(" - "); - sb.append("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."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//for - }//upkeep_Ceta_Sanctuary() - - private static void upkeep_Power_Surge() { - /* - * 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. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getCardsInPlay("Power Surge"); - final int damage = player.getNumPowerSurgeLands(); - - for(Card surge:list) { - final Card source = surge; - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - player.addDamage(damage, source); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append(source).append(" - deals ").append(damage).append(" damage to ").append(player); - ability.setStackDescription(sb.toString()); - - if(damage > 0) { - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }// for - }// upkeep_Power_Surge() - - private static void upkeep_Felidar_Sovereign() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Felidar Sovereign"); - - if(0 < list.size() && player.getLife() >= 40) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - if (player.getLife() >= 40) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Felidar Sovereign - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Felidar_Sovereign - - private static void upkeep_Battle_of_Wits() { - final Player player = AllZone.Phase.getPlayerTurn(); - PlayerZone libraryZone = AllZone.getZone(Constant.Zone.Library, player); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Battle of Wits"); - - if(0 < list.size() && 200 <= libraryZone.size()) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - PlayerZone libraryZone = AllZone.getZone(Constant.Zone.Library, player); - if (libraryZone.size() >= 200) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Battle of Wits - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Battle_of_Wits - - private static void upkeep_Mortal_Combat() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Mortal Combat"); - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - grave = grave.filter(AllZoneUtil.creatures); - - if(0 < list.size() && 20 <= grave.size()) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - grave = grave.filter(AllZoneUtil.creatures); - if (grave.size() >= 20) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Mortal Combat - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Mortal Combat - - private static void upkeep_Helix_Pinnacle() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Helix Pinnacle"); - - for(final Card c : list) { - if (c.getCounters(Counters.TOWER) < 100) continue; - - Ability ability = new Ability(c, "0") { - @Override - public void resolve() { - if (c.getCounters(Counters.TOWER) >= 100) - player.altWinConditionMet(c.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Helix Pinnacle - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Helix_Pinnacle - - private static void upkeep_Near_Death_Experience() { - /* - * At the beginning of your upkeep, if you have exactly 1 life, you win the game. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Near-Death Experience"); - - if(0 < list.size() && player.getLife() == 1) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - if (player.getLife() == 1) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Near-Death Experience - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Near_Death_Experience - - private static void upkeep_Test_of_Endurance() { - /* - * At the beginning of your upkeep, if you have 50 or more life, you win the game. - */ - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Test of Endurance"); - - if(0 < list.size() && player.getLife() >= 50) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - if (player.getLife() >= 50) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append(list.get(0)).append(" - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Test_of_Endurance - - - private static void upkeep_Barren_Glory() { - final Player player = AllZone.Phase.getPlayerTurn(); - PlayerZone handZone = AllZone.getZone(Constant.Zone.Hand, player); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - CardList playList = AllZoneUtil.getPlayerCardsInPlay(player); - playList = playList.filter(new CardListFilter() { - public boolean addCard(Card c) { - return !c.getName().equals("Mana Pool"); - } - }); - - list = list.getName("Barren Glory"); - - if(playList.size() == 1 && list.size() == 1 && handZone.size() == 0) { - final Card source = list.get(0); - Ability ability = new Ability(source, "0") { - @Override - public void resolve() { - CardList handList = AllZoneUtil.getCardsInZone(Constant.Zone.Hand, player); - CardList playList = AllZoneUtil.getCardsInZone(Constant.Zone.Battlefield, player); - playList = playList.getValidCards("Permanents".split(","),source.getController(),source); - playList.remove(source); - - if (playList.size() == 0 && handList.size() == 0) - player.altWinConditionMet(source.getName()); - } - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Barren Glory - ").append(player).append(" wins the game"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// if - }// upkeep_Barren_Glory - - private static void upkeep_Sleeper_Agent() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Sleeper Agent"); - - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card F_card = list.get(i); - ability = new Ability(list.get(i), "0") { - @Override - public void resolve() { - player.addDamage(2, F_card); - } - }; - - ability.setStackDescription("Sleeper Agent deals 2 damage to its controller."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }//upkeep_Sleeper_Agent - - private static void upkeep_Shapeshifter() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Shapeshifter"); - list = list.filter(AllZoneUtil.nonToken); - - for(final Card c:list) { - SpellAbility ability = new Ability(c, "0") { - @Override - public void resolve() { - int num = 0; - if(player.isHuman()) { - String[] choices = new String[7]; - for(int j = 0; j < 7; j++) { - choices[j] = ""+j; - } - String answer = (String)(GuiUtils.getChoiceOptional(c.getName()+" - Choose a number", choices)); - num = Integer.parseInt(answer); - } - else { - num = 3; - } - c.setBaseAttack(num); - c.setBaseDefense(7-num); - } - }; - ability.setStackDescription(c.getName()+" - choose a new number"); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//foreach(Card) - }//upkeep_Shapeshifter - - private static void upkeep_Vesuvan_Doppelganger_Keyword() { - // TODO: what about enchantments? i dont know how great this solution is - final Player player = AllZone.Phase.getPlayerTurn(); - final String keyword = "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."; - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(AllZoneUtil.getKeywordFilter(keyword)); - - for(final Card c:list) { - final SpellAbility ability = new Ability(c, "0") { - @Override - public void resolve() { - final Card[] newTarget = new Card[1]; - newTarget[0] = null; - - final Ability switchTargets = new Ability(c, "0") { - public void resolve() { - if(newTarget[0] != null) { - /* - * 1. need to select new card - DONE - * 1a. need to create the newly copied card with pic and setinfo - * 2. need to add the leaves play command - * 3. need to transfer the keyword - * 4. need to update the clone origin of new card and old card - * 5. remove clone leaves play commands from old - * 5a. remove old from play - * 6. add new to play - */ - - Card newCopy = AllZone.CardFactory.getCard(newTarget[0].getName(), player); - newCopy.setCurSetCode(newTarget[0].getCurSetCode()); - newCopy.setImageFilename(newTarget[0].getImageFilename()); - - //need to add the leaves play command (2) - newCopy.addLeavesPlayCommand(c.getCloneLeavesPlayCommand()); - c.removeTrigger(c.getCloneLeavesPlayCommand(), ZCTrigger.LEAVEFIELD); - newCopy.setCloneLeavesPlayCommand(c.getCloneLeavesPlayCommand()); - - newCopy.addExtrinsicKeyword(keyword); - newCopy.addColor("U", newCopy, false, true); - newCopy.setCloneOrigin(c.getCloneOrigin()); - newCopy.getCloneOrigin().setCurrentlyCloningCard(newCopy); - c.setCloneOrigin(null); - - //5 - PlayerZone play = AllZone.getZone(c); - play.remove(c); - - play.add(newCopy); - } - } - }; - - AllZone.InputControl.setInput(new Input() { - private static final long serialVersionUID = 5662272658873063221L; - - @Override - public void showMessage() { - AllZone.Display.showMessage(c.getName()+" - Select new target creature. (Click Cancel to remain as is.)"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { stop(); } - - @Override - public void selectCard(Card selectedCard, PlayerZone z) { - if(z.is(Constant.Zone.Battlefield) && selectedCard.isCreature() - && CardFactoryUtil.canTarget(c, selectedCard)) { - newTarget[0] = selectedCard; - StringBuilder sb = new StringBuilder(); - sb.append(c.getCloneOrigin()).append(" - switching to copy "+selectedCard.getName()+"."); - switchTargets.setStackDescription(sb.toString()); - AllZone.Stack.add(switchTargets); - stop(); - } - } - }); - } - }; - ability.setStackDescription(c.getName()+" - you may have this creature become a copy of target creature."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//foreach(Card) - }//upkeep_Vesuvan_Doppelganger_Keyword - - private static void upkeep_Tangle_Wire() { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList wires = AllZoneUtil.getCardsInPlay("Tangle Wire"); - - for(final Card source:wires) { - SpellAbility ability = new Ability(source, "0") { - @Override - public void resolve() { - final int num = source.getCounters(Counters.FADE); - final CardList list = AllZoneUtil.getPlayerCardsInPlay(player).filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.isArtifact() || c.isLand() || c.isCreature()) && c.isUntapped(); - } - }); - - for(int i = 0; i < num; i++) { - if(player.isComputer()) { - Card toTap = CardFactoryUtil.AI_getWorstPermanent(list, false, false, false, false); - if(null != toTap) { - toTap.tap(); - list.remove(toTap); - } - } - else { - AllZone.InputControl.setInput(new Input() { - private static final long serialVersionUID = 5313424586016061612L; - public void showMessage() { - if(list.size() == 0) - { - stop(); - return; - } - AllZone.Display.showMessage(source.getName()+" - Select "+num+" untapped artifact(s), creature(s), or land(s) you control"); - ButtonUtil.disableAll(); - } - public void selectCard(Card card, PlayerZone zone) { - if(zone.is(Constant.Zone.Battlefield, AllZone.HumanPlayer) && list.contains(card)) { - card.tap(); - list.remove(card); - stop(); - } - } - }); - } - } - } - }; - ability.setStackDescription(source.getName()+" - "+player+" taps X artifacts, creatures or lands he or she controls."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//foreach(wire) - }//upkeep_Tangle_Wire() - - private static void upkeep_Pillory_of_the_Sleepless() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - list = list.filter(new CardListFilter() { - - public boolean addCard(Card c) { - return c.isCreature() && c.isEnchanted(); - } - }); - - if(list.size() > 0) { - ArrayList enchants; - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card F_card = list.get(i); - enchants = list.get(i).getEnchantedBy(); - for(Card enchant:enchants) { - if(enchant.getName().equals("Pillory of the Sleepless")) { - //final Card c = enchant; - ability = new Ability(enchant, "0") { - @Override - public void resolve() { - player.loseLife(1, F_card); - } - }; - ability.setStackDescription("Pillory of the Sleepless - enchanted creature's controller loses 1 life."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - - }//list > 0 - }//cursed land - - - private static void upkeep_Greener_Pastures() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList self = AllZoneUtil.getPlayerCardsInPlay(player); - CardList opp = AllZoneUtil.getPlayerCardsInPlay(player.getOpponent()); - - self = self.getType("Land"); - opp = opp.getType("Land"); - - if((self.size() == opp.size()) || opp.size() > self.size()) return; - else //active player has more lands - { - Player mostLandsPlayer = null; - if(self.size() > opp.size()) mostLandsPlayer = player; - - final Player mostLands = mostLandsPlayer; - - CardList list = AllZoneUtil.getCardsInPlay("Greener Pastures"); - - Ability ability; - - for(int i = 0; i < list.size(); i++) { - //final Card crd = list.get(i); - ability = new Ability(list.get(i), "0") { - @Override - public void resolve() { - CardFactoryUtil.makeTokenSaproling(mostLands); - }// resolve() - };// Ability - - StringBuilder sb = new StringBuilder(); - sb.append("Greener Pastures - ").append(mostLands).append(" puts a 1/1 green Saproling token onto the battlefield."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - - }//else - }// upkeep_Greener_Pastures() - - private static void upkeep_Masticore() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Masticore"); - - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card crd = list.get(i); - - final Input discard = new Input() { - private static final long serialVersionUID = 2252076866782738069L; - - @Override - public void showMessage() { - AllZone.Display.showMessage(crd + " - Discard a card from your hand"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Hand)) { - c.getController().discard(c, null); - stop(); - } - } - - @Override - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(crd); - stop(); - } - };//Input - - ability = new Ability(crd, "0") { - @Override - public void resolve() { - if(crd.getController().isHuman()) { - if(AllZone.Human_Hand.size() == 0) AllZone.GameAction.sacrifice(crd); - else AllZone.InputControl.setInput(discard); - } else //comp - { - CardList list = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - - if(list.size() != 0) list.get(0).getController().discard(list.get(0),this); - else AllZone.GameAction.sacrifice(crd); - }//else - }//resolve() - };//Ability - - StringBuilder sb = new StringBuilder(); - sb.append(crd).append(" - sacrifice Masticore unless you discard a card."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }//upkeep_Masticore - - - private static void upkeep_Eldrazi_Monument() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Eldrazi Monument"); - - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - ability = new Ability(list.get(i), "0") { - @Override - public void resolve() { - CardList creats = AllZoneUtil.getCreaturesInPlay(player); - - if(creats.size() < 1) { - AllZone.GameAction.sacrifice(card); - return; - } - - if(player.isHuman()) { - Object o = GuiUtils.getChoiceOptional("Select creature to sacrifice", - creats.toArray()); - Card sac = (Card) o; - if(sac == null) { - creats.shuffle(); - sac = creats.get(0); - } - AllZone.GameAction.sacrifice(sac); - } else//computer - { - CardListUtil.sortAttackLowFirst(creats); - AllZone.GameAction.sacrifice(creats.get(0)); - } - } - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append("Eldrazi Monument - ").append(player).append(" sacrifices a creature."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - - }//upkeep_Eldrazi_Monument - - private static void upkeep_Blaze_Counters() { - final Player player = AllZone.Phase.getPlayerTurn(); - - CardList blaze = AllZoneUtil.getPlayerCardsInPlay(player); - blaze = blaze.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isLand() && c.getCounters(Counters.BLAZE) > 0; - } - }); - - for(int i = 0; i < blaze.size(); i++) { - final Card Source = blaze.get(i); - Ability ability = new Ability(blaze.get(i), "0") { - @Override - public void resolve() { - player.addDamage(1, Source); - } - };// ability - - StringBuilder sb = new StringBuilder(); - sb.append(blaze.get(i)).append(" - has a blaze counter and deals 1 damage to "); - sb.append(player).append("."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - - private static void upkeep_Dragon_Broodmother() { - CardList list = AllZoneUtil.getCardsInPlay("Dragon Broodmother"); - - Ability ability; - for(int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - ability = new Ability(card, "0") { - @Override - public void resolve() { - int multiplier = AllZoneUtil.getDoublingSeasonMagnitude(card.getController()); - for(int i = 0; i < multiplier; i++) - makeToken(); - - }// resolve() - - public void makeToken() { - //CardList cl = CardFactoryUtil.makeToken("Dragon", "RG 1 1 Dragon", card, "RG", new String[] {"Creature", "Dragon"}, 1, 1, new String[] {"Flying"} ); - - - final Card c = new Card(); - - c.setOwner(card.getController()); - c.setController(card.getController()); - - c.setName("Dragon"); - c.setImageName("RG 1 1 Dragon"); - //c.setManaCost("RG"); - c.addColor("RG"); - c.setToken(true); - - c.addType("Creature"); - c.addType("Dragon"); - - c.addIntrinsicKeyword("Flying"); - - c.setBaseAttack(1); - c.setBaseDefense(1); - - //final String player = card.getController(); - final int[] numCreatures = new int[1]; - - final SpellAbility devour = new Spell(card) { - - private static final long serialVersionUID = 4158780345303896275L; - - @Override - public void resolve() { - int totalCounters = numCreatures[0] * 2; - c.addCounter(Counters.P1P1, totalCounters); - - } - - @Override - public boolean canPlay() { - return AllZone.Phase.getPlayerTurn().equals(card.getController()) - && card.isFaceDown() && !AllZone.Phase.getPhase().equals("End of Turn") - && AllZoneUtil.isCardInPlay(card); - } - - };//devour - - Command intoPlay = new Command() { - - private static final long serialVersionUID = -9220268793346809216L; - - public void execute() { - - CardList creatsToSac = new CardList(); - CardList creats = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - creats = creats.filter(new CardListFilter() { - public boolean addCard(Card crd) { - return crd.isCreature() && !crd.equals(c); - } - }); - - //System.out.println("Creats size: " + creats.size()); - - if(card.getController().isHuman()) { - Object o = null; - int creatsSize = creats.size(); - - for(int k = 0; k < creatsSize; k++) { - o = GuiUtils.getChoiceOptional("Select creature to sacrifice", - creats.toArray()); - - if(o == null) break; - - Card crd = (Card) o; - creatsToSac.add(crd); - creats.remove(crd); - } - - numCreatures[0] = creatsToSac.size(); - for(int m = 0; m < creatsToSac.size(); m++) { - AllZone.GameAction.sacrifice(creatsToSac.get(m)); - } - - }//human - else { - int count = 0; - for(int i = 0; i < creats.size(); i++) { - Card crd = creats.get(i); - if(crd.getNetAttack() <= 1 && crd.getNetDefense() <= 2) { - AllZone.GameAction.sacrifice(crd); - count++; - } - } - numCreatures[0] = count; - } - AllZone.Stack.addSimultaneousStackEntry(devour); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(c.getName()).append(" - gets 2 +1/+1 counter(s) per devoured creature."); - devour.setStackDescription(sb.toString()); - - devour.setDescription("Devour 2"); - c.addSpellAbility(devour); - c.addComesIntoPlayCommand(intoPlay); - - AllZone.GameAction.moveToPlay(c); - } - };// Ability - ability.setStackDescription("Dragon Broodmother - put a 1/1 red and green Dragon token onto the battlefield."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }// for - }// upkeep_Dragon_Broodmother() - - private static void draw_Sylvan_Library(final Player player) { - /* + 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.getName()+" - Select a card drawn this turn: "+(2-i)+" of 2"; - AllZone.InputControl.setInput(new Input() { - private static final long serialVersionUID = -3389565833121544797L; + final CardList cards = AllZoneUtil.getPlayerCardsInPlay(player, "Sylvan Library"); - @Override - public void showMessage() { - if (AllZone.Human_Hand.size() == 0) stop(); - AllZone.Display.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.GameAction.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()); + 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; - AllZone.Stack.addSimultaneousStackEntry(ability); + @Override + public void showMessage() { + if (AllZone.getHumanHand().size() == 0) stop(); + AllZone.getDisplay().showMessage(prompt); + ButtonUtil.disableAll(); + } - }//end for - } + @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 - private static void upkeep_Carnophage() { - final Player player = AllZone.Phase.getPlayerTurn(); + 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()); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Carnophage"); - if(player.isHuman()) { - for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - String[] choices = {"Yes", "No"}; - Object choice = GuiUtils.getChoice("Pay Carnophage's upkeep?", choices); - if(choice.equals("Yes")) player.loseLife(1, c); - else c.tap(); - } - } - else if(player.isComputer()) for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - if(AllZone.ComputerPlayer.getLife() > 1) player.loseLife(1, c); - else c.tap(); - } - }// upkeep_Carnophage + AllZone.getStack().addSimultaneousStackEntry(ability); - private static void upkeep_Sangrophage() { - final Player player = AllZone.Phase.getPlayerTurn(); + }//end for + } - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Sangrophage"); - if(player.isHuman()) { - for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - String[] choices = {"Yes", "No"}; - Object choice = GuiUtils.getChoice("Pay Sangrophage's upkeep?", choices); - if(choice.equals("Yes")) player.loseLife(2,c); - else c.tap(); - } - } - else if(player.isComputer()) for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - if(AllZone.ComputerPlayer.getLife() > 2) player.loseLife(2,c); - else c.tap(); - } - }// upkeep_Carnophage - - private static void upkeep_Fallen_Empires_Storage_Lands() { - final Player player = AllZone.Phase.getPlayerTurn(); + + /* Constant Conspiracy + public static Command Conspiracy = new Command() { + private static final long serialVersionUID = -752798545956593342L; - CardList all = AllZoneUtil.getPlayerCardsInPlay(player, "Bottomless Vault"); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Dwarven Hold")); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Hollow Trees")); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Icatian Store")); - all.addAll(AllZoneUtil.getPlayerCardsInPlay(player, "Sand Silos")); - - for(Card land:all) { - if(land.isTapped()) land.addCounter(Counters.STORAGE, 1); - } - } //upkeep_Fallen_Empires_Storage_Lands + CardList gloriousAnthemList = new CardList(); - private static void upkeep_Vampire_Lacerator() { - final Player player = AllZone.Phase.getPlayerTurn(); + public void execute() { + //String keyword = "Defender"; - CardList list = AllZoneUtil.getPlayerCardsInPlay(player, "Vampire Lacerator"); + 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()); + } - for(int i = 0; i < list.size(); i++) { - final Card F_card = list.get(i); - if(player.isHuman() && AllZone.ComputerPlayer.getLife() > 10) { - player.loseLife(1, F_card); - } else { - if(player.isComputer() && AllZone.HumanPlayer.getLife() > 10) { - player.loseLife(1, F_card); - } - } - } - }// upkeep_Vampire_Lacerator - - private static void upkeep_Mirror_Sigil_Sergeant() - { - final Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); + list.clear(); - list = list.getName("Mirror-Sigil Sergeant"); + PlayerZone[] zone = new PlayerZone[4]; - Ability ability; - for (int i = 0; i < list.size(); i++) { - final Card card = list.get(i); - ability = new Ability(card, "0") { - public void resolve() { - // CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - // CardList blueList = list.getColor(Constant.Color.Blue); - CardList blueList = AllZoneUtil.getPlayerColorInPlay(player, Constant.Color.Blue); - if (!blueList.isEmpty()) { - CardFactoryUtil.makeToken("Mirror-Sigil Sergeant","W 4 4 Mirror Sigil Sergeant", card.getController(), "5 W", - new String[]{"Creature","Rhino","Soldier"}, 4, 4, new String[]{"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."}); - } - }; + CardList cl = AllZoneUtil.getCardsInPlay("Conspiracy"); - }; // ability + 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); - ability.setStackDescription("Mirror-Sigil Sergeant - put a token onto the battlefield that's a copy of Mirror-Sigil Sergeant."); + for (int outer = 0; outer < zone.length; outer++) { + CardList creature = AllZoneUtil.getCardsInZone(zone[outer]); + creature = creature.getType("Creature"); - AllZone.Stack.addSimultaneousStackEntry(ability); + for (int j = 0; j < creature.size(); j++) { + boolean art = false; + boolean ench = false; - } // for - } //upkeep_Mirror_Sigil_Sergeant + c = creature.get(j); - public static void executeCardStateEffects() { - Wonder.execute(); - Anger.execute(); - Valor.execute(); - Brawn.execute(); - Filth.execute(); + if (c.isArtifact()) art = true; + if (c.isEnchantment()) ench = true; - Sacrifice_NoIslands.execute(); - Sacrifice_NoForests.execute(); - Sacrifice_NoSwamps.execute(); - Sacrifice_NoArtifacts.execute(); - Sacrifice_NoEnchantments.execute(); - Sacrifice_NoLands.execute(); - Sacrifice_NoCreatures.execute(); - Sacrifice_NoOtherCreatures.execute(); - - topCardReveal_Update.execute(); - }// executeCardStateEffects() + 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()); - 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 - - public static Command Mul_Daya_Channelers = new Command() { - private static final long serialVersionUID = -2543659953307485051L; - - CardList landList = new CardList(); - CardList creatList = new CardList(); - - String[] keyword = { "B", "W", "G", "U", "R" }; - - final void addMana(Card c) { - for(int i = 0; i < keyword.length; i++) { - //don't add an extrinsic mana ability if the land can already has the same intrinsic mana ability - //eg. "tap: add G" - if(!c.getIntrinsicManaAbilitiesDescriptions().contains( - keyword[i])) { - //c.addExtrinsicKeyword(keyword[i]); - SpellAbility mana = new Ability_Mana(c, "T", keyword[i], 2) { - private static final long serialVersionUID = 2384540533244132975L; - }; - StringBuilder sb = new StringBuilder(); - sb.append("T: Add ").append(keyword[i]).append(" ").append(keyword[i]).append(" to your mana pool."); - - mana.setType("Extrinsic"); - mana.setDescription(sb.toString()); - c.addSpellAbility(mana); - } - } - } - final void removeMana(Card c) { - c.removeAllExtrinsicManaAbilities(); - } - - public void execute() { - CardList list1 = landList; - CardList list2 = creatList; - - Card c; - // reset all cards in list - aka "old" cards - for(int i = 0; i < list1.size(); i++) { - c = list1.get(i); - removeMana(c); - } - - for(int i = 0; i < list2.size(); i++) { - c = list2.get(i); - c.addSemiPermanentAttackBoost(-3); - c.addSemiPermanentDefenseBoost(-3); - } + gloriousAnthemList.add(c); + } + } + }// for inner + }// execute() + }; //Conspiracy*/ - list1.clear(); - list2.clear(); - CardList cl = AllZoneUtil.getCardsInPlay(); - cl = cl.getName("Mul Daya Channelers"); + /** Constant Elspeth_Emblem */ + public static Command Elspeth_Emblem = new Command() { - for (Card crd:cl) - { - if (CardFactoryUtil.getTopCard(crd)!= null) - { - Card topCard = CardFactoryUtil.getTopCard(crd); - if (topCard.isLand()) { - addMana(crd); - landList.add(crd); - } - else if(topCard.isCreature()) - { - crd.addSemiPermanentAttackBoost(3); - crd.addSemiPermanentDefenseBoost(3); - creatList.add(crd); - } - + private static final long serialVersionUID = 7414127991531889390L; + CardList gloriousAnthemList = new CardList(); - } - }// for outer - }// execute() - }; // Mul Daya + public void execute() { + String keyword = "Indestructible"; - - public static Command Elspeth_Emblem = new Command() { + 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); + } - private static final long serialVersionUID = 7414127991531889390L; - CardList gloriousAnthemList = new CardList(); + list.clear(); - public void execute() { - String keyword = "Indestructible"; + 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."); + } + }); - 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); - } + for (int i = 0; i < emblem.size(); i++) { + CardList perms = AllZoneUtil.getPlayerCardsInPlay(emblem.get(i).getController()); - 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() - }; + 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(); + private static final long serialVersionUID = 2920036758177137722L; + private CardList pumped = new CardList(); + public void execute() { //Reset old cards - for(Card c : pumped) - { + for (Card c : pumped) { c.removeIntrinsicKeyword("Protection from white"); c.removeIntrinsicKeyword("Protection from blue"); c.removeIntrinsicKeyword("Protection from black"); @@ -4857,23 +1620,18 @@ public class GameActionUtil { int maxCMC = -1; //boolean keepLooping = true; CardList creats = AllZoneUtil.getCreaturesInPlay(); - for(Card c : creats) - { - if(c.getCMC() > maxCMC) - { + for (Card c : creats) { + if (c.getCMC() > maxCMC) { pumped.clear(); pumped.add(c); maxCMC = c.getCMC(); - } - else if(c.getCMC() == maxCMC) - { + } else if (c.getCMC() == maxCMC) { pumped.add(c); } } //Pump new cards - for(Card c : pumped) - { + for (Card c : pumped) { c.addIntrinsicKeyword("Protection from white"); c.addIntrinsicKeyword("Protection from blue"); c.addIntrinsicKeyword("Protection from black"); @@ -4882,488 +1640,239 @@ public class GameActionUtil { } } }; - - 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;jKoth_Emblem */ + public static Command Koth_Emblem = new Command() { - if (list.isEmpty() || AllZone.HumanPlayer.getLife() < 5) - setTargetPlayer(AllZone.HumanPlayer); - 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); - } - } - } - - } - }; - - public static Command stPump = new Command() { - /** StaticEffectKeyword - * Syntax:[ k[0] stPump[All][Self][Other] : k[1] Which Cards the Bonus Affects : - * k[2] What Bonus does the Card have : k[3] Special Conditions : k[4] Description - */ - - private static final long serialVersionUID = -7853346190458174501L; - private ArrayList storage = new ArrayList(); - // storage stores the source card and the cards it gave its bonus to, to know what to remove - - 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_WithKeyword = AllZoneUtil.getCardsInPlay(); - cards_WithKeyword.getKeywordsContain("stPump"); - - // check each card - for (int i = 0; i < cards_WithKeyword.size(); i++) { - Card cardWithKeyword = cards_WithKeyword.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("stPump")) { - StaticEffect se = new StaticEffect(); //create a new StaticEffect - se.setSource(cardWithKeyword); - se.setKeywordNumber(j); + private static final long serialVersionUID = -3233715310427996429L; + CardList gloriousAnthemList = new CardList(); - - //get the affected cards - String k[] = keyword.split(":",5); - - if(specialConditionsMet(cardWithKeyword, k[3])) { //special Conditions are Threshold, etc. - - final String affected = k[1]; - final String specific[] = affected.split(","); - CardList affectedCards = AffectedCards(cardWithKeyword, k); // options are All, Self, Enchanted etc. - affectedCards = affectedCards.getValidCards(specific, cardWithKeyword.getController(), cardWithKeyword); - se.setAffectedCards(affectedCards); - - String[] pt = k[2].split("/"); - - Card cardWithXValue; - String xString = cardWithKeyword.getSVar("X").split("$")[0]; - Card cardWithYValue; - String yString = cardWithKeyword.getSVar("Y").split("$")[0]; - - if(xString.startsWith("Imprinted") && !cardWithKeyword.getImprinted().isEmpty()) { - cardWithXValue = cardWithKeyword.getImprinted().get(0); - } - else cardWithXValue = cardWithKeyword; + 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]); + } + } - if(yString.startsWith("Imprinted") && !cardWithKeyword.getImprinted().isEmpty()) { - cardWithYValue = cardWithKeyword.getImprinted().get(0); - } - else cardWithYValue = cardWithKeyword; - - int x = 0; - if (pt[0].contains("X") || pt[1].contains("X")) - x = CardFactoryUtil.xCount(cardWithXValue, cardWithKeyword.getSVar("X").split("\\$")[1]); - se.setXValue(x); - - int y = 0; - if (pt[1].contains("Y")) - y = CardFactoryUtil.xCount(cardWithYValue, cardWithKeyword.getSVar("Y").split("\\$")[1]); - se.setYValue(y); - - addStaticEffects(cardWithKeyword, affectedCards, k[2], x, y); //give the boni to the affected cards + 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.'"); + } + }); - storage.add(se); // store the information - } - } - } - } - }// execute() - - void addStaticEffects(Card source, CardList affectedCards, String Keyword_Details, int xValue, int yValue) { - - int powerbonus = 0; - int toughnessbonus = 0; - String[] Keyword = Keyword_Details.split("/",3); - - Keyword[0] = Keyword[0].replace("+",""); - Keyword[1] = Keyword[1].replace("+",""); - - if(!Keyword[0].contains("X")) powerbonus = Integer.valueOf(Keyword[0]); - else powerbonus = xValue; // the xCount takes places before - - if(Keyword[1].contains("X")) toughnessbonus = xValue; - else if(Keyword[1].contains("Y")) toughnessbonus = yValue; - else toughnessbonus = Integer.valueOf(Keyword[1]); - - for(int i = 0; i < affectedCards.size(); i++) { - Card affectedCard = affectedCards.get(i); - affectedCard.addSemiPermanentAttackBoost(powerbonus); - affectedCard.addSemiPermanentDefenseBoost(toughnessbonus); - if (Keyword.length > 2) { - String Keywords[] = Keyword[2].split(" & "); - for(int j = 0; j < Keywords.length; j++) { - String keyword = Keywords[j]; - if(keyword.startsWith("SVar=")) { - String sVar = source.getSVar(keyword.split("SVar=")[1]); - if (sVar.startsWith("AB")) { // grant the ability - AbilityFactory AF = new AbilityFactory(); - SpellAbility sa = AF.getAbility(sVar, affectedCard); - sa.setType("Temporary"); - - affectedCard.addSpellAbility(sa); - }/* - else if (sVar.startsWith("Mode")){ // grant a Trigger - affectedCard.addTrigger(TriggerHandler.parseTrigger(sVar, affectedCard)); - }*/ - else { // Copy this SVar - affectedCard.setSVar(keyword.split("SVar=")[1], sVar); - } - } - else if(keyword.startsWith("Types=")) { - String[] tmptypes = keyword.split("="); - String[] types = tmptypes[1].split(","); - if(types[0].equals("ChosenType")) { - types[0] = source.getChosenType(); - } - for(String type : types) affectedCard.addType(type); - } - else if(keyword.startsWith("Keyword=")) { - String sVar = source.getSVar(keyword.split("Keyword=")[1]); - affectedCard.addExtrinsicKeyword(sVar); - } - else affectedCard.addExtrinsicKeyword(keyword); - } - } - } - } - - void removeStaticEffect(StaticEffect se) { - Card source = se.getSource(); - CardList affected = se.getAffectedCards(); - int KeywordNumber = se.getKeywordNumber(); - int xValue = se.getXValue(); // the old xValue has to be removed, not the actual one! - int yValue = se.getYValue(); // the old xValue has to be removed, not the actual one! - String parse = source.getKeyword().get(KeywordNumber).toString(); - String k[] = parse.split(":"); - for(int i = 0; i < affected.size(); i++) { - removeStaticEffect(source, affected.get(i),k,xValue, yValue); - } - } - - void removeStaticEffect(Card source, Card affectedCard, String[] Keyword_Details, int xValue, int yValue) { - - int powerbonus = 0; - int toughnessbonus = 0; - String[] Keyword = Keyword_Details[2].split("/",3); - - Keyword[0] = Keyword[0].replace("+",""); - Keyword[1] = Keyword[1].replace("+",""); - - if(!Keyword[0].contains("X")) powerbonus = Integer.valueOf(Keyword[0]); - else powerbonus = xValue; - - if(Keyword[1].contains("X")) toughnessbonus = xValue; - else if(Keyword[1].contains("Y")) toughnessbonus = yValue; - else toughnessbonus = Integer.valueOf(Keyword[1]); - - affectedCard.addSemiPermanentAttackBoost(powerbonus * -1); - affectedCard.addSemiPermanentDefenseBoost(toughnessbonus * -1); - if (Keyword.length > 2) { - String Keywords[] = Keyword[2].split(" & "); - for(int j = 0; j < Keywords.length; j++) { - String keyword = Keywords[j]; - if(keyword.startsWith("SVar=")) { - String sVar = source.getSVar(keyword.split("SVar=")[1]); - if (sVar.startsWith("AB")) { // remove granted abilities - SpellAbility[] spellAbility = affectedCard.getSpellAbility(); - for(SpellAbility s : spellAbility) - { - if (s.getType().equals("Temporary")) - affectedCard.removeSpellAbility(s); - } - } - } - else if(keyword.startsWith("Types=")) { - String[] tmptypes = keyword.split("="); - String[] types = tmptypes[1].split(","); - if(types[0].equals("ChosenType")) { - types[0] = source.getChosenType(); - } - for(String type : types) affectedCard.removeType(type); - } - else if(keyword.startsWith("Keyword=")) { - String sVar = source.getSVar(keyword.split("Keyword=")[1]); - affectedCard.removeExtrinsicKeyword(sVar); - } - affectedCard.removeExtrinsicKeyword(keyword); - } - } - } - - CardList AffectedCards (Card SourceCard, String[] Keyword_Details) { - // [Self], [All], [Other] - CardList Cards_inZone = new CardList(); - String Range = Keyword_Details[0].replaceFirst("stPump", ""); - - if(Range.equals("Self")) { - Cards_inZone.add(SourceCard); - } - if(Range.equals("All")) { - Cards_inZone.addAll(AllZoneUtil.getCardsInPlay()); - //this is a hack for Quick Sliver - if (Keyword_Details.length >= 2 - && (Keyword_Details[2].contains("Flash") - || Keyword_Details[2].contains("CARDNAME can't be countered."))) { - Cards_inZone.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - Cards_inZone.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - Cards_inZone.addAll(AllZoneUtil.getCardsInGraveyard()); - } - //hack for Molten Disaster - /* - // TODO for future use - if(Keyword_Details.length >= 2 && Keyword_Details[2].contains("Split second")) { - Cards_inZone.add(AllZone.Stack.getSpellCardsOnStack()); - } - */ - } - if(Range.equals("Enchanted")) { - if (SourceCard.getEnchanting().size() > 0) - Cards_inZone.addAll(SourceCard.getEnchanting().toArray()); - } - - if(Range.equals("Equipped")) { - if (SourceCard.getEquipping().size() > 0) - Cards_inZone.addAll(SourceCard.getEquipping().toArray()); - } - - return Cards_inZone; - } - }; - - // Special Conditions - 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.Phase.isPlayerTurn(SourceCard.getController())) return false; - } - if(SpecialConditions.contains("notYourTurn")) { - if( !AllZone.Phase.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; - - } - - public static Command stLandManaAbilities = new Command() { - private static final long serialVersionUID = 8005448956536998277L; + 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"); + } + }); - public void execute() { - - - HashMap produces = new HashMap(); - /* + 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"); @@ -5378,1495 +1887,863 @@ public class GameActionUtil { 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 - - public static Command stSetPT = new Command() { - /* - * Syntax: K:stSetPT:power:toughness:Description - * or (for Angry Mob/Gaea's Liege) - * K:stSetPT:power:toughness:condition:altPower:altToughness:Description - * or (for Levels) - * K:stSetPT:power:toughness:condition:altPower:altToughness:condition2:altPower2:altToughness2:Description - */ - private static final long serialVersionUID = -8019071015309088017L; - - public void execute() { - //gather cards in all zones based on rule 112.6a - CardList Cards_WithKeyword = AllZoneUtil.getCardsInGame(); - Cards_WithKeyword = Cards_WithKeyword.filter(new CardListFilter() { - public boolean addCard(Card c) { - if(c.getKeyword().toString().contains("stSetPT")) return true; - return false; - } - }); - - // For each card found, find the keywords which are the stSetPT Keywords - for(int i = 0; i < Cards_WithKeyword.size() ; i++) { - Card card = Cards_WithKeyword.get(i); - ArrayList a = card.getKeyword(); - for(int x = 0; x < a.size(); x++) { - if(a.get(x).toString().startsWith("stSetPT")) { - String parse = card.getKeyword().get(x).toString(); - String k[] = parse.split(":"); - /*for(int z = 0; z < k.length; z++) { - System.out.println("k["+z+"]: "+k[z]); - }*/ - if(k.length < 2) { - System.out.println("Error in stSetPT for: "+card.getName()); - } - else { - //TODO - add some checking here...? - int power = 0; - int toughness = 0; - int altPower = 0; - int altToughness = 0; - boolean altCondition = false; - - int altPower2 = 0; - int altToughness2 = 0; - boolean altCondition2 = false; - - //double condition (for level creatures) - if(k.length > 6) { - String condition2 = k[6]; - if(condition2.startsWith("LevelGE")) { - condition2 = condition2.replace("LevelGE", ""); - int levelReq = Integer.parseInt(condition2); - //System.out.println("condition2, got level: "+levelReq); - if(card.getCounters(Counters.LEVEL) >= levelReq) { - altCondition2 = true; - } - } - } - //single condition (for Gaea's Liege/Angry Mob) - if(k.length > 3) { - String condition = k[3]; - if(condition.equals("isAttacking") - && card.isAttacking()) { - altCondition = true; - } - else if(condition.equals("isYourTurn") - && AllZone.Phase.isPlayerTurn(card.getController())) { - altCondition = true; - } - else if(condition.startsWith("LevelGE")) { - condition = condition.replace("LevelGE", ""); - int levelReq = Integer.parseInt(condition); - //System.out.println("condition, got level: "+levelReq); - if(card.getCounters(Counters.LEVEL) >= levelReq) { - altCondition = true; - } - } - } - - if(altCondition2) { - if(k.length > 6) { - altPower2 = k[7].matches("[0-9][0-9]?") ? Integer.parseInt(k[7]) : CardFactoryUtil.xCount(card,k[7]); - } - if(k.length > 7) { - altToughness2 = k[8].matches("[0-9][0-9]?") ? Integer.parseInt(k[8]) : CardFactoryUtil.xCount(card,k[8]); - } - card.setBaseAttack(altPower2); - card.setBaseDefense(altToughness2); - } - else if(altCondition) { - //System.out.println("In alt condition"); - //System.out.println("Setting power for ("+card.getName()+") to: "+altPower); - //System.out.println("Setting toughness for ("+card.getName()+") to: "+altToughness); - if(k.length > 4) { - altPower = k[4].matches("[0-9][0-9]?") ? Integer.parseInt(k[4]) : CardFactoryUtil.xCount(card,k[4]); - } - if(k.length > 5) { - altToughness = k[5].matches("[0-9][0-9]?") ? Integer.parseInt(k[5]) : CardFactoryUtil.xCount(card,k[5]); - } - card.setBaseAttack(altPower); - card.setBaseDefense(altToughness); - } - else { - //use the base power/toughness to calculate - //System.out.println("Setting power for ("+card.getName()+") to: "+power); - //System.out.println("Setting toughness for ("+card.getName()+") to: "+toughness); - power = k[1].matches("[0-9][0-9]?") ? Integer.parseInt(k[1]) : CardFactoryUtil.xCount(card,k[1]); - toughness = k[2].matches("[0-9][0-9]?") ? Integer.parseInt(k[2]) : CardFactoryUtil.xCount(card,k[2]); - card.setBaseAttack(power); - card.setBaseDefense(toughness); - } - } - - } - } - } - }// execute() - - };//stSetPT - - 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() - }; - - 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 - - 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 - - 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() - }; - - 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 - - public static Command Phylactery_Lich = new Command() { - - private static final long serialVersionUID = -1606115081917467754L; - - public void execute() { - CardList creature = AllZoneUtil.getCardsInPlay("Phylactery Lich"); - int size = creature.size(); - - for(int i = 0; i < size; i++) { - Card c = creature.get(i); - if(!phylacteryExists(c) && c.getFinishedEnteringBF()) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - - private boolean phylacteryExists(Card c) { - CardList play = AllZoneUtil.getPlayerCardsInPlay(c.getController()); - play = play.filter(new CardListFilter() - { - public boolean addCard(Card crd) - { - return crd.getCounters(Counters.PHYLACTERY) > 0; - } - }); - return play.size() > 0; - } - };//Phylactery_Lich - - public static Command topCardReveal_Update = new Command() { - - private static final long serialVersionUID = 8669404698350637963L; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("Play with the top card of your library revealed."); - } - }); - - for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - if (CardFactoryUtil.getTopCard(c)!= null) - c.setTopCardName(CardFactoryUtil.getTopCard(c).getName()); - } - - }//execute() - };//topCardReveal_Update - - public static Command Sacrifice_NoIslands = new Command() { - - private static final long serialVersionUID = 8064452222949253952L; - int islands = 0; - - public void execute() { - CardList creature = AllZoneUtil.getCardsInPlay(); - - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no Islands, sacrifice CARDNAME."); - } - }); - - for(int i = 0; i < creature.size(); i++) { - Card c = creature.get(i); - islands = countIslands(c); - if(islands == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - - private int countIslands(Card c) { - CardList islands = AllZoneUtil.getPlayerTypeInPlay(c.getController(), "Island"); - return islands.size(); - } - - };//Sacrifice_NoIslands - - public static Command Sacrifice_NoForests = new Command() { - private static final long serialVersionUID = -5310856079162962126L; - - public void execute() { - CardList creature = AllZoneUtil.getCardsInPlay(); - - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no Forests, sacrifice CARDNAME."); - } - }); - - for(Card c:creature) { - if(AllZoneUtil.getPlayerTypeInPlay(c.getController(), "Forest").size() == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoForests - - public static Command Sacrifice_NoSwamps = new Command() { - private static final long serialVersionUID = 1961985826678794078L; - - public void execute() { - CardList creature = AllZoneUtil.getCardsInPlay(); - - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no Swamps, sacrifice CARDNAME."); - } - }); - - for(Card c:creature) { - if(AllZoneUtil.getPlayerTypeInPlay(c.getController(), "Swamp").size() == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoForests - - public static Command Sacrifice_NoArtifacts = new Command() { - private static final long serialVersionUID = -2546650213674544590L; - int artifacts = 0; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no artifacts, sacrifice CARDNAME."); - } - }); - - for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - artifacts = AllZoneUtil.getPlayerTypeInPlay(c.getController(), "Artifact").size(); - if(artifacts == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoArtifacts - - private static Command Sacrifice_NoEnchantments = new Command() { - private static final long serialVersionUID = -8280843743243927861L; - int enchs = 0; - - public void execute() { - CardList list = AllZoneUtil.getCardsInPlay(); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no enchantments, sacrifice CARDNAME."); - } - }); - - for(int i = 0; i < list.size(); i++) { - Card c = list.get(i); - enchs = AllZoneUtil.getPlayerTypeInPlay(c.getController(), "Enchantment").size(); - if(enchs == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoEnchantments - - public static Command Sacrifice_NoLands = new Command() { - private static final long serialVersionUID = 2768929064034728027L; - - public void execute() { - CardList cards = AllZoneUtil.getCardsInPlay(); - - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When there are no lands on the battlefield, sacrifice CARDNAME."); - } - }); - - for(Card c:cards) { - if(AllZoneUtil.getLandsInPlay().size() == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoLands - - public static Command Sacrifice_NoCreatures = new Command() { - private static final long serialVersionUID = -177976088524215734L; - - public void execute() { - CardList cards = AllZoneUtil.getCardsInPlay(); - - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When there are no creatures on the battlefield, sacrifice CARDNAME."); - } - }); - - for(Card c:cards) { - if(AllZoneUtil.getCreaturesInPlay().size() == 0) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - };//Sacrifice_NoCreatures - - private static Command Sacrifice_NoOtherCreatures = new Command() { - private static final long serialVersionUID = 6941452572773927921L; - - public void execute() { - CardList cards = AllZoneUtil.getCardsInPlay(); - - cards = cards.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.hasKeyword("When you control no other creatures, sacrifice CARDNAME."); - } - }); - - for(Card c:cards) { - if(AllZoneUtil.getCreaturesInPlay(c.getController()).size() == 1) { - AllZone.GameAction.sacrifice(c); - } - } - - }//execute() - }; //Sacrifice_NoOtherCreatures - - 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 - - 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; - } - }; - - - public static Command Filth = new Command() { - private static final long serialVersionUID = -8423145847505L; - - CardList old = new CardList(); - CardList next = new CardList(); - - public void execute() { - if(Phase.getGameBegins() == 1) { - // reset creatures - removeSwampwalk(old); - - if(isInGrave(AllZone.ComputerPlayer)) addSwampwalk(AllZone.ComputerPlayer); - - if(isInGrave(AllZone.HumanPlayer)) addSwampwalk(AllZone.HumanPlayer); - } - }// execute() - - void addSwampwalk(Player player) { - next.clear(); - CardList playlist = AllZoneUtil.getCreaturesInPlay(player); - for(int i = 0; i < playlist.size(); i++) { - if(!old.contains(playlist.get(i))) next.add(playlist.get(i)); - } - // add creatures to "old" or previous list of creatures - - - addSwampwalk(next); - } - - boolean isInGrave(Player player) { - CardList list = AllZoneUtil.getPlayerGraveyard(player); - CardList lands = AllZoneUtil.getPlayerTypeInPlay(player, "Swamp"); - - if(!list.containsName("Filth") || lands.size() == 0) return false; - else return true; - } - - void removeSwampwalk(CardList list) { - CardList List_Copy = new CardList(); - List_Copy.addAll(list); - for(int i = 0; i < List_Copy.size(); i++) { - Card c = List_Copy.get(i); - if(!isInGrave(c.getController()) && old.contains(c)) { - List_Copy.get(i).removeExtrinsicKeyword("Swampwalk"); - old.remove(c); - } - } - } - - void addSwampwalk(CardList list) { - int Count = list.size(); - for(int i = 0; i < Count; i++) { - list.get(i).addExtrinsicKeyword("Swampwalk"); - old.add(list.get(i)); - } - } - }; // Flith - - public static Command Valor = new Command() { - private static final long serialVersionUID = -846781470342847505L; - - CardList old = new CardList(); - CardList next = new CardList(); - - public void execute() { - if(Phase.getGameBegins() == 1) { - // reset creatures - removeFirstStrike(old); - - if(isInGrave(AllZone.ComputerPlayer)) addFirstStrike(AllZone.ComputerPlayer); - - if(isInGrave(AllZone.HumanPlayer)) addFirstStrike(AllZone.HumanPlayer); - } - }// execute() - - void addFirstStrike(Player player) { - next.clear(); - CardList playlist = AllZoneUtil.getCreaturesInPlay(player); - for(int i = 0; i < playlist.size(); i++) { - if(!old.contains(playlist.get(i))) next.add(playlist.get(i)); - } - // add creatures to "old" or previous list of creatures - - - addFirstStrike(next); - } - - boolean isInGrave(Player player) { - CardList list = AllZoneUtil.getPlayerGraveyard(player); - - CardList lands = AllZoneUtil.getPlayerTypeInPlay(player, "Plains"); - - if(!list.containsName("Valor") || lands.size() == 0) return false; - else return true; - } - - void removeFirstStrike(CardList list) { - CardList List_Copy = new CardList(); - List_Copy.addAll(list); - for(int i = 0; i < List_Copy.size(); i++) { - Card c = List_Copy.get(i); - if(!isInGrave(c.getController()) && old.contains(c)) { - List_Copy.get(i).removeExtrinsicKeyword("First Strike"); - old.remove(c); - } - } - } - - void addFirstStrike(CardList list) { - int Count = list.size(); - for(int i = 0; i < Count; i++) { - list.get(i).addExtrinsicKeyword("First Strike"); - old.add(list.get(i)); - } - } - }; // Valor - - public static Command Anger = new Command() { - private static final long serialVersionUID = -8463420545847505L; - - CardList old = new CardList(); - CardList next = new CardList(); - - public void execute() { - if(Phase.getGameBegins() == 1) { - // reset creatures - removeHaste(old); - - if(isInGrave(AllZone.ComputerPlayer)) addHaste(AllZone.ComputerPlayer); - - if(isInGrave(AllZone.HumanPlayer)) addHaste(AllZone.HumanPlayer); - } - }// execute() - - void addHaste(Player player) { - next.clear(); - CardList playlist = AllZoneUtil.getCreaturesInPlay(player); - for(int i = 0; i < playlist.size(); i++) { - if(!old.contains(playlist.get(i))) next.add(playlist.get(i)); - } - // add creatures to "old" or previous list of creatures - - - addHaste(next); - } - - boolean isInGrave(Player player) { - CardList list = AllZoneUtil.getPlayerGraveyard(player); - CardList lands = AllZoneUtil.getPlayerTypeInPlay(player, "Mountain"); - - if(!list.containsName("Anger") || lands.size() == 0) return false; - else return true; - } - - void removeHaste(CardList list) { - CardList List_Copy = new CardList(); - List_Copy.addAll(list); - for(int i = 0; i < List_Copy.size(); i++) { - Card c = List_Copy.get(i); - if(!isInGrave(c.getController()) && old.contains(c)) { - List_Copy.get(i).removeExtrinsicKeyword("Haste"); - old.remove(c); - } - } - } - - void addHaste(CardList list) { - int Count = list.size(); - for(int i = 0; i < Count; i++) { - list.get(i).addExtrinsicKeyword("Haste"); - old.add(list.get(i)); - } - } - }; // Anger - - public static Command Wonder = new Command() { - private static final long serialVersionUID = -846723300545847505L; - - CardList old = new CardList(); - CardList next = new CardList(); - - public void execute() { - if(Phase.getGameBegins() == 1) { - // reset creatures - removeFlying(old); - - if(isInGrave(AllZone.ComputerPlayer)) addFlying(AllZone.ComputerPlayer); - - if(isInGrave(AllZone.HumanPlayer)) addFlying(AllZone.HumanPlayer); - } - }// execute() - - void addFlying(Player player) { - next.clear(); - CardList playlist = AllZoneUtil.getCreaturesInPlay(player); - for(int i = 0; i < playlist.size(); i++) { - if(!old.contains(playlist.get(i))) next.add(playlist.get(i)); - } - // add creatures to "old" or previous list of creatures - - - addFlying(next); - } - - boolean isInGrave(Player player) { - CardList list = AllZoneUtil.getPlayerGraveyard(player); - CardList lands = AllZoneUtil.getPlayerTypeInPlay(player, "Island"); - - if(!list.containsName("Wonder") || lands.size() == 0) return false; - else return true; - } - - void removeFlying(CardList list) { - CardList List_Copy = new CardList(); - List_Copy.addAll(list); - for(int i = 0; i < List_Copy.size(); i++) { - Card c = List_Copy.get(i); - if(!isInGrave(c.getController()) && old.contains(c)) { - List_Copy.get(i).removeExtrinsicKeyword("Flying"); - old.remove(c); - } - } - } - - void addFlying(CardList list) { - int Count = list.size(); - for(int i = 0; i < Count; i++) { - list.get(i).addExtrinsicKeyword("Flying"); - old.add(list.get(i)); - } - } - }; // Wonder - - public static Command Brawn = new Command() { - private static final long serialVersionUID = -8467814700545847505L; - - CardList old = new CardList(); - CardList next = new CardList(); - - public void execute() { - if(Phase.getGameBegins() == 1) { - // reset creatures - removeTrample(old); - - if(isInGrave(AllZone.ComputerPlayer)) addTrample(AllZone.ComputerPlayer); - - if(isInGrave(AllZone.HumanPlayer)) addTrample(AllZone.HumanPlayer); - } - }// execute() - - void addTrample(Player player) { - next.clear(); - CardList playlist = AllZoneUtil.getCreaturesInPlay(player); - for(int i = 0; i < playlist.size(); i++) { - if(!old.contains(playlist.get(i))) next.add(playlist.get(i)); - } - // add creatures to "old" or previous list of creatures - - addTrample(next); - } - - boolean isInGrave(Player player) { - CardList list = AllZoneUtil.getPlayerGraveyard(player); - CardList lands = AllZoneUtil.getPlayerTypeInPlay(player, "Forest"); - - if(!list.containsName("Brawn") || lands.size() == 0) return false; - else return true; - } - - void removeTrample(CardList list) { - CardList List_Copy = new CardList(); - List_Copy.addAll(list); - for(int i = 0; i < List_Copy.size(); i++) { - Card c = List_Copy.get(i); - if(!isInGrave(c.getController()) && old.contains(c)) { - List_Copy.get(i).removeExtrinsicKeyword("Trample"); - old.remove(c); - } - } - } - - void addTrample(CardList list) { - int Count = list.size(); - for(int i = 0; i < Count; i++) { - list.get(i).addExtrinsicKeyword("Trample"); - old.add(list.get(i)); - } - } - }; // Brawn - - 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 - - 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.HumanPlayer)); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer)); - 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 - - 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.HumanPlayer)); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - spells.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - spells.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer)); - - 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() - }; // - - 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.Computer_Play will be - // returned twice - 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; - } - - 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("Mul_Daya_Channelers", Mul_Daya_Channelers); - commands.put("Muraganda_Petroglyphs", Muraganda_Petroglyphs); - - commands.put("Old_Man_of_the_Sea", Old_Man_of_the_Sea); - commands.put("Phylactery_Lich", Phylactery_Lich); - - 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. - } - - 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(); + 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() - }; - - - 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.ManaPool.clearPool(); - else AllZone.Computer_ManaPool.clearPool(); - } + 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 index 66baf27809a..9169191a06f 100644 --- a/src/forge/GameInfo.java +++ b/src/forge/GameInfo.java @@ -1,104 +1,194 @@ -package forge; - -import java.util.ArrayList; - -import forge.card.mana.ManaCost; - -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(); - - public int getHumanNumberOfTimesMulliganed() - { - return humanNumberOfTimesMulliganed; - } - - public void addHumanNumberOfTimesMulliganed(int n) - { - humanNumberOfTimesMulliganed+=n; - } - - public void setHumanNumberOfTimesMulliganed(int n) - { - humanNumberOfTimesMulliganed = n; - } - - public boolean getHumanMulliganedToZero() - { - return humanMulliganedToZero; - } - - public void setHumanMulliganedToZero(boolean b) - { - humanMulliganedToZero = b; - } - - public void setPreventCombatDamageThisTurn(boolean b) { - preventCombatDamageThisTurn = b; - } - - public boolean isPreventCombatDamageThisTurn() { - return preventCombatDamageThisTurn; - } - - public void setAssignedFirstStrikeDamageThisCombat(boolean b) { - assignedFirstStrikeDamageThisCombat = b; - } - - public boolean getAssignedFirstStrikeDamageThisCombat() { - return assignedFirstStrikeDamageThisCombat; - } - - public void setResolvedFirstStrikeDamageThisCombat(boolean b) - { - resolvedFirstStrikeDamageThisCombat = b; - } - - public boolean getResolvedFirstStrikeDamageThisCombat() { - return resolvedFirstStrikeDamageThisCombat; - } - - public void setComputerStartedThisGame(boolean computerStartedThisGame) { - this.computerStartedThisGame = computerStartedThisGame; - } - - public boolean isComputerStartedThisGame() { - return computerStartedThisGame; - } - - 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(); - } - - 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); - } - - public void clearColorChanges() { - // clear the global color changes at end of each game - globalColorChanges.clear(); - } - - public ArrayList getColorChanges() { - return globalColorChanges; - } - - -} +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/GuiDisplay2.java b/src/forge/GuiDisplay2.java deleted file mode 100644 index ffafa11770c..00000000000 --- a/src/forge/GuiDisplay2.java +++ /dev/null @@ -1,856 +0,0 @@ - -package forge; - - -import forge.gui.GuiUtils; -import forge.gui.game.CardDetailPanel; -import forge.gui.game.CardPanel; -import forge.gui.game.CardPicturePanel; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import javax.swing.*; -import java.awt.BorderLayout; -import java.awt.Frame; -import java.awt.event.*; -import java.util.Observable; -import java.util.Observer; - - -public class GuiDisplay2 extends javax.swing.JFrame implements CardContainer, Display, NewConstants { - private static final long serialVersionUID = 8974795337536720207L; - - //private CardList multiBlockers = new CardList(); - - private GuiInput inputControl; - public static JCheckBoxMenuItem eotCheckboxForMenu = new JCheckBoxMenuItem("Stop at End of Turn", false); - - public boolean stopEOT() { - return eotCheckboxForMenu.isSelected(); - } - - - public GuiDisplay2() { - AllZone.Display = this; - initComponents(); - - addObservers(); - addListeners(); - addMenu(); - - inputControl = new GuiInput(); - } - - @Override - public void setVisible(boolean visible) { - if(visible) { - //causes an error if put in the constructor, causes some random null pointer exception - AllZone.InputControl.updateObservers(); - - //Use both so that when "un"maximizing, the frame isn't tiny - setSize(1024, 740); - setExtendedState(Frame.MAXIMIZED_BOTH); - } - super.setVisible(visible); - } - - /* - public void addAssignDamage(Card attacker, Card blocker, int damage) { - multiBlockers.add(blocker); - } - - public void addAssignDamage(Card attacker, int damage) { - new Gui_MultipleBlockers(attacker, multiBlockers, damage, this); - } - */ - - public void assignDamage(Card attacker, CardList blockers, int damage) { - new Gui_MultipleBlockers(attacker, blockers, damage, this); - } - - private void addMenu() { - JMenuItem humanGraveyard = new JMenuItem("View Graveyard"); - humanGraveyard.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - Card c[] = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer).toArray(); - - if(AllZone.NameChanger.shouldChangeCardName()) c = AllZone.NameChanger.changeCard(c); - - if(c.length == 0) GuiUtils.getChoiceOptional("Player's Grave", new String[] {"no cards"}); - else GuiUtils.getChoiceOptional("Player's Grave", c); - } - }); - - JMenuItem computerGraveyard = new JMenuItem("Computer - View Graveyard"); - computerGraveyard.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - Card c[] = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer).toArray(); - - if(AllZone.NameChanger.shouldChangeCardName()) c = AllZone.NameChanger.changeCard(c); - - if(c.length == 0) GuiUtils.getChoiceOptional("Computer's Grave", new String[] {"no cards"}); - else GuiUtils.getChoiceOptional("Computer's Grave", c); - } - }); - - - JMenuItem concedeGame = new JMenuItem("Concede Game"); - concedeGame.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - dispose(); - Constant.Runtime.matchState.addLose(); - new Gui_WinLose(); - } - }); - - - JMenuItem gameMenu = new JMenu("Menu"); - gameMenu.add(humanGraveyard); - gameMenu.add(computerGraveyard); - // gameMenu.add(this.eotCheckboxForMenu); // The static field GuiDisplay2.eotCheckboxForMenu should be accessed in a static way - gameMenu.add(GuiDisplay2.eotCheckboxForMenu); - gameMenu.add(new JSeparator()); - gameMenu.add(concedeGame); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(gameMenu); - menuBar.add(new MenuItem_HowToPlay()); - this.setJMenuBar(menuBar); - }//addMenu() - - 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() - - 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() - - public void showCombat(String message) { - combatArea.setText(message); - } - - public void showMessage(String s) { - messageArea.setText(s); - } - - private void addListeners() { - //mouse Card Detail - playerHandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - playerLandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - playerCreaturePanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - - oppLandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - oppCreaturePanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - - - //opponent life mouse listener - oppLifeLabel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.ComputerPlayer); - } - }); - - //self life mouse listener - playerLifeLabel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.HumanPlayer); - } - }); - - //self play (land) ---- Mouse - playerLandPanel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object o = playerLandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Battlefield); - } - } - }); - //self play (no land) ---- Mouse - playerCreaturePanel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object o = playerCreaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Battlefield); - } - } - }); - //self hand ---- Mouse - playerHandPanel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object o = playerHandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Hand); - } - } - }); - //***************************************************************** - //computer - - //computer play (land) ---- Mouse - oppLandPanel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object o = oppLandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Computer_Battlefield); - } - } - }); - - //computer play (no land) ---- Mouse - oppCreaturePanel.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - Object o = oppCreaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Computer_Battlefield); - } - } - }); - - }//addListener() - - public Card getCard() { - return detail.getCard(); - } - - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - 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) { - playerHandLabel.setText("" + AllZone.Human_Hand.size()); - playerGraveLabel.setText("" + AllZone.Human_Graveyard.size()); - playerLibraryLabel.setText("" + AllZone.Human_Library.size()); - } - }; - AllZone.Human_Hand.addObserver(o); - AllZone.Human_Graveyard.addObserver(o); - AllZone.Human_Library.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) { - oppHandLabel.setText("" + AllZone.Computer_Hand.size()); - oppGraveLabel.setText("" + AllZone.Computer_Graveyard.size()); - oppLibraryLabel.setText("" + AllZone.Computer_Library.size()); - } - }; - AllZone.Computer_Hand.addObserver(o); - AllZone.Computer_Graveyard.addObserver(o); - AllZone.Computer_Library.addObserver(o); - } - - - //opponent life - oppLifeLabel.setText("" + AllZone.ComputerPlayer.getLife()); - AllZone.ComputerPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.ComputerPlayer.getLife(); - oppLifeLabel.setText("" + life); - } - }); - AllZone.ComputerPlayer.updateObservers(); - - //player life - playerLifeLabel.setText("" + AllZone.HumanPlayer.getLife()); - AllZone.HumanPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.HumanPlayer.getLife(); - playerLifeLabel.setText("" + life); - } - }); - AllZone.HumanPlayer.updateObservers(); - - //stack - AllZone.Stack.addObserver(new Observer() { - public void update(Observable a, Object b) { - stackPanel.removeAll(); - MagicStack stack = AllZone.Stack; - int count = 1; - JLabel label; - - for(int i = stack.size() - 1; 0 <= i; i--) { - String text = stack.peekInstance(i).getStackDescription(); - - //change card name - if(AllZone.NameChanger.shouldChangeCardName()) { - Card c = stack.peekInstance(i).getSourceCard(); - text = AllZone.NameChanger.changeString(c, text); - } - - label = new JLabel("" + (count++) + ". " + text); - - //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) { - GuiDisplay2.this.setCard(cardPanel.getCard()); - }//mouseMoved - }); - - stackPanel.add(cardPanel); - } - - stackPanel.revalidate(); - stackPanel.repaint(); - } - }); - AllZone.Stack.updateObservers(); - //END, stack - - - //self hand - AllZone.Human_Hand.addObserver(new Observer() { - public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - JPanel p = playerHandPanel; - p.removeAll(); - - Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - - //change card names - if(AllZone.NameChanger.shouldChangeCardName()) { - AllZone.Human_Hand.setUpdate(false); - c = AllZone.NameChanger.changeCard(c); - AllZone.Human_Hand.setUpdate(true); - } - - JPanel panel; - for(int i = 0; i < c.length; i++) { - panel = new CardPicturePanel(c[i]); - p.add(panel); - } - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Hand.updateObservers(); - //END, self hand - - //self play (land) - AllZone.Human_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone)a; //unused - JPanel p = playerLandPanel; - p.removeAll(); - - Card[] c = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer).toArray(); - - //change card names - if(AllZone.NameChanger.shouldChangeCardName()) { - AllZone.Human_Battlefield.setUpdate(false); - c = AllZone.NameChanger.changeCard(c); - AllZone.Human_Battlefield.setUpdate(true); - } - - GuiDisplayUtil.setupLandPanel(p, c); - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Battlefield.updateObservers(); - //END - self play (only land) - - - //self play (no land) - AllZone.Human_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone)a; //unused - JPanel p = playerCreaturePanel; - p.removeAll(); - - Card[] c = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer).toArray(); - - //change card names - if(AllZone.NameChanger.shouldChangeCardName()) { - AllZone.Human_Battlefield.setUpdate(false); - c = AllZone.NameChanger.changeCard(c); - AllZone.Human_Battlefield.setUpdate(true); - } - - GuiDisplayUtil.setupNoLandPanel(p, c); - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Battlefield.updateObservers(); - //END - self play (no land) - - - //computer play (no land) - AllZone.Computer_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone)a; //unused - JPanel p = oppCreaturePanel; - p.removeAll(); - - Card[] c = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer).toArray(); - - //change card names - if(AllZone.NameChanger.shouldChangeCardName()) { - AllZone.Computer_Battlefield.setUpdate(false); - c = AllZone.NameChanger.changeCard(c); - AllZone.Computer_Battlefield.setUpdate(true); - } - - GuiDisplayUtil.setupNoLandPanel(p, c); - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Computer_Battlefield.updateObservers(); - //END - computer play (no land) - - //computer play (land) - AllZone.Computer_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone)a; //unused - JPanel p = oppLandPanel; - p.removeAll(); - - Card[] c = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer).toArray(); - - //change card names - if(AllZone.NameChanger.shouldChangeCardName()) { - AllZone.Computer_Battlefield.setUpdate(false); - c = AllZone.NameChanger.changeCard(c); - AllZone.Computer_Battlefield.setUpdate(true); - } - - GuiDisplayUtil.setupLandPanel(p, c); - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Computer_Battlefield.updateObservers(); - //END - computer play (only land) - - }//addObservers() - - /** - * This method is called from within the constructor to initialize the form. WARNING: Do NOT modify this code. - * The content of this method is always regenerated by the Form Editor. - */ - private void initComponents()//GEN-BEGIN:initComponents - { - jMenuBar2 = new javax.swing.JMenuBar(); - jScrollPane1 = new javax.swing.JScrollPane(); - messageArea = new javax.swing.JTextArea(); - jPanel1 = new javax.swing.JPanel(); - cancelButton = new javax.swing.JButton(); - okButton = new javax.swing.JButton(); - jScrollPane2 = new javax.swing.JScrollPane(); - stackPanel = new javax.swing.JPanel(); - jPanel2 = new javax.swing.JPanel(); - jScrollPane3 = new javax.swing.JScrollPane(); - combatArea = new javax.swing.JTextArea(); - jPanel5 = new javax.swing.JPanel(); - jScrollPane4 = new javax.swing.JScrollPane(); - jPanel6 = new javax.swing.JPanel(); - oppLandPanel = new javax.swing.JPanel(); - oppCreaturePanel = new javax.swing.JPanel(); - playerCreaturePanel = new javax.swing.JPanel(); - playerLandPanel = new javax.swing.JPanel(); - playerHandPanel = new javax.swing.JPanel(); - jPanel3 = new javax.swing.JPanel(); - oppLifeLabel = new javax.swing.JLabel(); - jPanel7 = new javax.swing.JPanel(); - playerLifeLabel = new javax.swing.JLabel(); - picturePanel = new javax.swing.JPanel(); - jLabel1 = new javax.swing.JLabel(); - jLabel2 = new javax.swing.JLabel(); - jLabel3 = new javax.swing.JLabel(); - oppHandLabel = new javax.swing.JLabel(); - oppLibraryLabel = new javax.swing.JLabel(); - oppGraveLabel = new javax.swing.JLabel(); - jLabel7 = new javax.swing.JLabel(); - jLabel8 = new javax.swing.JLabel(); - jLabel9 = new javax.swing.JLabel(); - playerHandLabel = new javax.swing.JLabel(); - playerLibraryLabel = new javax.swing.JLabel(); - playerGraveLabel = new javax.swing.JLabel(); - jMenuBar1 = new javax.swing.JMenuBar(); - menuBar = new javax.swing.JMenu(); - detail = new CardDetailPanel(null); - picture = new CardPicturePanel(null); - - getContentPane().setLayout(null); - - setTitle(ForgeProps.getLocalized(LANG.PROGRAM_NAME)); - setFont(new java.awt.Font("Times New Roman", 0, 16)); - addWindowListener(new java.awt.event.WindowAdapter() { - @Override - public void windowClosing(java.awt.event.WindowEvent evt) { - exitForm(evt); - } - }); - - messageArea.setEditable(false); - messageArea.setFont(getFont()); - messageArea.setLineWrap(true); - messageArea.setWrapStyleWord(true); - jScrollPane1.setViewportView(messageArea); - - getContentPane().add(jScrollPane1); - jScrollPane1.setBounds(10, 20, 290, 100); - - jPanel1.setBorder(new javax.swing.border.EtchedBorder()); - cancelButton.setText("Cancel"); - cancelButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - cancelButtonActionPerformed(evt); - } - }); - - jPanel1.add(cancelButton); - - okButton.setText("OK"); - okButton.addActionListener(new java.awt.event.ActionListener() { - public void actionPerformed(java.awt.event.ActionEvent evt) { - okButtonActionPerformed(evt); - - if(AllZone.Phase.isNeedToNextPhase() == true) { - //for debugging: System.out.println("There better be no nextPhase in the stack."); - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.nextPhase(); - } - } - }); - - jPanel1.add(okButton); - - getContentPane().add(jPanel1); - jPanel1.setBounds(10, 130, 290, 40); - - jScrollPane2.setBorder(new javax.swing.border.EtchedBorder()); - stackPanel.setLayout(new java.awt.GridLayout(0, 1, 10, 10)); - - jScrollPane2.setViewportView(stackPanel); - - getContentPane().add(jScrollPane2); - jScrollPane2.setBounds(10, 260, 290, 210); - - jPanel2.setLayout(new java.awt.BorderLayout()); - - jPanel2.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), "Combat")); - combatArea.setEditable(false); - combatArea.setFont(getFont()); - combatArea.setLineWrap(true); - combatArea.setWrapStyleWord(true); - jScrollPane3.setViewportView(combatArea); - - jPanel2.add(jScrollPane3, java.awt.BorderLayout.CENTER); - - getContentPane().add(jPanel2); - jPanel2.setBounds(10, 480, 290, 120); - - jPanel5.setLayout(new java.awt.BorderLayout()); - - jPanel5.setBorder(new javax.swing.border.EmptyBorder(new java.awt.Insets(1, 1, 1, 1))); - jPanel6.setLayout(new java.awt.GridLayout(5, 0, 10, 10)); - - oppLandPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - oppLandPanel.setBorder(new javax.swing.border.EtchedBorder()); - jPanel6.add(oppLandPanel); - - oppCreaturePanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - oppCreaturePanel.setBorder(new javax.swing.border.EtchedBorder()); - jPanel6.add(oppCreaturePanel); - - playerCreaturePanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - playerCreaturePanel.setBorder(new javax.swing.border.EtchedBorder()); - jPanel6.add(playerCreaturePanel); - - playerLandPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - playerLandPanel.setBorder(new javax.swing.border.EtchedBorder()); - jPanel6.add(playerLandPanel); - - playerHandPanel.setLayout(new java.awt.FlowLayout(java.awt.FlowLayout.LEFT)); - - playerHandPanel.setBorder(new javax.swing.border.EtchedBorder()); - jPanel6.add(playerHandPanel); - - jScrollPane4.setViewportView(jPanel6); - - jPanel5.add(jScrollPane4, java.awt.BorderLayout.CENTER); - - getContentPane().add(jPanel5); - jPanel5.setBounds(320, 20, 460, 670); - - jPanel3.setLayout(new java.awt.BorderLayout()); - - jPanel3.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), "Computer")); - oppLifeLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 40)); - oppLifeLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - oppLifeLabel.setText("19"); - oppLifeLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - jPanel3.add(oppLifeLabel, java.awt.BorderLayout.CENTER); - - getContentPane().add(jPanel3); - jPanel3.setBounds(210, 170, 90, 90); - - jPanel7.setLayout(new java.awt.BorderLayout()); - - jPanel7.setBorder(new javax.swing.border.TitledBorder(new javax.swing.border.EtchedBorder(), "Player")); - playerLifeLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 40)); - playerLifeLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); - playerLifeLabel.setText("19"); - playerLifeLabel.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER); - jPanel7.add(playerLifeLabel, java.awt.BorderLayout.CENTER); - - getContentPane().add(jPanel7); - jPanel7.setBounds(210, 600, 90, 90); - - getContentPane().add(detail); - detail.setBounds(790, 20, 230, 300); - - picturePanel.setLayout(new java.awt.BorderLayout()); - - picturePanel.setBorder(new javax.swing.border.EtchedBorder()); - getContentPane().add(picturePanel); - picturePanel.setBounds(790, 350, 230, 300); - - jLabel1.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel1.setText("Library:"); - getContentPane().add(jLabel1); - jLabel1.setBounds(60, 200, 70, 20); - - jLabel2.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel2.setText("Hand:"); - getContentPane().add(jLabel2); - jLabel2.setBounds(60, 170, 60, 20); - - jLabel3.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel3.setText("Grave:"); - getContentPane().add(jLabel3); - jLabel3.setBounds(60, 230, 70, 20); - - oppHandLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - oppHandLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - oppHandLabel.setText("7"); - oppHandLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(oppHandLabel); - oppHandLabel.setBounds(90, 170, 60, 20); - - oppLibraryLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - oppLibraryLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - oppLibraryLabel.setText("60"); - oppLibraryLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(oppLibraryLabel); - oppLibraryLabel.setBounds(90, 200, 60, 20); - - oppGraveLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - oppGraveLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - oppGraveLabel.setText("200"); - oppGraveLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(oppGraveLabel); - oppGraveLabel.setBounds(90, 230, 60, 20); - - jLabel7.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel7.setText("Hand:"); - getContentPane().add(jLabel7); - jLabel7.setBounds(60, 610, 60, 20); - - jLabel8.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel8.setText("Library:"); - getContentPane().add(jLabel8); - jLabel8.setBounds(60, 640, 60, 20); - - jLabel9.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - jLabel9.setText("Grave:"); - getContentPane().add(jLabel9); - jLabel9.setBounds(60, 670, 60, 20); - - playerHandLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - playerHandLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - playerHandLabel.setText("6"); - playerHandLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(playerHandLabel); - playerHandLabel.setBounds(90, 610, 60, 20); - - playerLibraryLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - playerLibraryLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - playerLibraryLabel.setText("54"); - playerLibraryLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(playerLibraryLabel); - playerLibraryLabel.setBounds(90, 640, 60, 20); - - playerGraveLabel.setFont(new java.awt.Font("MS Sans Serif", 0, 18)); - playerGraveLabel.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT); - playerGraveLabel.setText("0"); - playerGraveLabel.setHorizontalTextPosition(javax.swing.SwingConstants.RIGHT); - getContentPane().add(playerGraveLabel); - playerGraveLabel.setBounds(90, 670, 60, 20); - - menuBar.setText("Menu"); - jMenuBar1.add(menuBar); - - setJMenuBar(jMenuBar1); - - pack(); - }//GEN-END:initComponents - - private void cancelButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_cancelButtonActionPerformed - {//GEN-HEADEREND:event_cancelButtonActionPerformed - inputControl.selectButtonCancel(); - }//GEN-LAST:event_cancelButtonActionPerformed - - private void okButtonActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_okButtonActionPerformed - {//GEN-HEADEREND:event_okButtonActionPerformed - inputControl.selectButtonOK(); - }//GEN-LAST:event_okButtonActionPerformed - - /** Exit the Application */ - private void exitForm(java.awt.event.WindowEvent evt)//GEN-FIRST:event_exitForm - { - dispose(); - Constant.Runtime.matchState.addLose(); - new Gui_WinLose(); - }//GEN-LAST:event_exitForm - - - // Variables declaration - do not modify//GEN-BEGIN:variables - private javax.swing.JButton cancelButton; - private javax.swing.JTextArea combatArea; - private javax.swing.JLabel jLabel1; - private javax.swing.JLabel jLabel2; - private javax.swing.JLabel jLabel3; - private javax.swing.JLabel jLabel7; - private javax.swing.JLabel jLabel8; - private javax.swing.JLabel jLabel9; - private javax.swing.JMenuBar jMenuBar1; - @SuppressWarnings("unused") - // jMenuBar2 - private javax.swing.JMenuBar jMenuBar2; - private javax.swing.JPanel jPanel1; - private javax.swing.JPanel jPanel2; - private javax.swing.JPanel jPanel3; - private javax.swing.JPanel jPanel5; - private javax.swing.JPanel jPanel6; - private javax.swing.JPanel jPanel7; - private javax.swing.JScrollPane jScrollPane1; - private javax.swing.JScrollPane jScrollPane2; - private javax.swing.JScrollPane jScrollPane3; - private javax.swing.JScrollPane jScrollPane4; - private javax.swing.JMenu menuBar; - private javax.swing.JTextArea messageArea; - private javax.swing.JButton okButton; - private javax.swing.JPanel oppCreaturePanel; - private javax.swing.JLabel oppGraveLabel; - private javax.swing.JLabel oppHandLabel; - private javax.swing.JPanel oppLandPanel; - private javax.swing.JLabel oppLibraryLabel; - private javax.swing.JLabel oppLifeLabel; - private javax.swing.JPanel picturePanel; - private javax.swing.JPanel playerCreaturePanel; - private javax.swing.JLabel playerGraveLabel; - private javax.swing.JLabel playerHandLabel; - private javax.swing.JPanel playerHandPanel; - private javax.swing.JPanel playerLandPanel; - private javax.swing.JLabel playerLibraryLabel; - private javax.swing.JLabel playerLifeLabel; - private javax.swing.JPanel stackPanel; - private CardDetailPanel detail; - private CardPicturePanel picture; - // End of variables declaration//GEN-END:variables - - public boolean stopAtPhase(Player turn, String phase) { - // is display2 even used? - return true; - } - - public boolean loadPrefs(){ - - return false; - } - - public boolean savePrefs(){ - return false; - } - - - public boolean canLoseByDecking() { - return true; - } -} diff --git a/src/forge/GuiDisplay3.java b/src/forge/GuiDisplay3.java deleted file mode 100644 index 3b9c5aab3c0..00000000000 --- a/src/forge/GuiDisplay3.java +++ /dev/null @@ -1,1346 +0,0 @@ - -package forge; - - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; -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.game.CardPicturePanel; -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 org.jdesktop.swingx.JXMultiSplitPane; -import org.jdesktop.swingx.MultiSplitLayout.Node; - -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.Observable; -import java.util.Observer; - -import static org.jdesktop.swingx.MultiSplitLayout.parseModel; - -public class GuiDisplay3 extends JFrame implements CardContainer, Display, NewConstants, NewConstants.GUI.GuiDisplay, NewConstants.LANG.GuiDisplay { - 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); - - - 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(); - - public GuiDisplay3() { - AllZone.Display = this; - setupActions(); - initComponents(); - - addObservers(); - addListeners(); - addMenu(); - inputControl = new GuiInput(); - } - - @Override - public void setVisible(boolean visible) { - if(visible) { - //causes an error if put in the constructor, causes some random null pointer exception - AllZone.InputControl.updateObservers(); - - //Use both so that when "un"maximizing, the frame isn't tiny - setSize(1024, 740); - System.out.println(getExtendedState()); - setExtendedState(Frame.MAXIMIZED_BOTH); - System.out.println(getExtendedState()); - } - super.setVisible(visible); - } - - public void assignDamage(Card attacker, CardList blockers, int damage) { - if (damage <= 0) - return; - new Gui_MultipleBlockers3(attacker, blockers, damage, this); - } - - /* - public void addAssignDamage(Card attacker, Card blocker, int damage) - { - multiBlockers.add(blocker); - } - - public void addAssignDamage(Card attacker, int damage) { - //new Gui_MultipleBlockers3(attacker, blockers, damage, this); - new Gui_MultipleBlockers3(attacker, multiBlockers, damage, this); - } - */ - - private void setupActions() { - HUMAN_GRAVEYARD_ACTION = new ZoneAction(AllZone.Human_Graveyard, HUMAN_GRAVEYARD); - HUMAN_REMOVED_ACTION = new ZoneAction(AllZone.Human_Exile, HUMAN_REMOVED); - HUMAN_FLASHBACK_ACTION = new ZoneAction(AllZone.Human_Exile, HUMAN_FLASHBACK) { - - private static final long serialVersionUID = 8120331222693706164L; - - @Override - protected Card[] getCards() { - return CardFactoryUtil.getGraveyardActivationCards(AllZone.HumanPlayer).toArray(); - } - - @Override - protected void doAction(Card c) { - if(!c.isLand()) - { - SpellAbility[] sa = c.getSpellAbility(); - sa[1].setActivatingPlayer(AllZone.HumanPlayer); - if(sa[1].canPlay() && !c.isUnCastable()) AllZone.GameAction.playSpellAbility(sa[1]); - } - else // PlayLand checks if the land can be played - AllZone.HumanPlayer.playLand(c); - } - }; - COMPUTER_GRAVEYARD_ACTION = new ZoneAction(AllZone.Computer_Graveyard, COMPUTER_GRAVEYARD); - COMPUTER_REMOVED_ACTION = new ZoneAction(AllZone.Computer_Exile, COMPUTER_REMOVED); - CONCEDE_ACTION = new ConcedeAction(); - } - - private void addMenu() { - 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(); - } - - 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.Computer_Hand, COMPUTER_HAND.BASE); - Action viewAILibrary = new ZoneAction(AllZone.Computer_Library, COMPUTER_LIBRARY.BASE); - Action viewHumanLibrary = new ZoneAction(AllZone.Human_Library, 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 - - - Object[] objDev = { GuiDisplay4.canLoseByDecking, viewAIHand, viewAILibrary, viewHumanLibrary, generateMana, setupBattleField }; - 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() - - 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() - - 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() - - public void showCombat(String message) { - combatArea.setText(message); - } - - public void showMessage(String s) { - messageArea.setText(s); - - Border border = null; - int thickness = 3; - - if (AllZone.Stack.size() > 0 && AllZone.Stack.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); - } - - private void addListeners() { - //mouse Card Detail - playerHandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - playerLandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - playerCreaturePanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - - oppLandPanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - oppCreaturePanel.addMouseMotionListener(GuiDisplayUtil.getCardDetailMouse(this)); - - - //opponent life mouse listener - oppLifeLabel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.ComputerPlayer); - } - }); - - //self life mouse listener - playerLifeLabel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.HumanPlayer); - } - }); - - //self play (land) ---- Mouse - playerLandPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Object o = playerLandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardPanel cardPanel = (CardPanel) o; - - if(cardPanel.getCard().isUntapped()) { - MP3Player mp3 = new MP3Player("tap.mp3"); - mp3.play(); - } - - if(cardPanel.getCard().isTapped() - && (inputControl.input instanceof Input_PayManaCost || inputControl.input instanceof Input_PayManaCost_Ability)) { - - while(cardPanel.connectedCard != null) { - cardPanel = cardPanel.connectedCard; - - if(cardPanel.getCard().isUntapped()) { - - break; - } - } - } - - inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Battlefield); - - } - } - }); - //self play (no land) ---- Mouse - playerCreaturePanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Object o = playerCreaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardPanel cardPanel = (CardPanel) o; - - CardList att = new CardList(AllZone.Combat.getAttackers()); - //CardList block = AllZone.Combat.getAllBlockers(); - - if ((cardPanel.getCard().isTapped() - || cardPanel.getCard().hasSickness() - || ((cardPanel.getCard().hasKeyword("Vigilance")) && att.contains(cardPanel.getCard()))) - && (inputControl.input instanceof Input_Attack)) { - while(cardPanel.connectedCard != null) { - cardPanel = cardPanel.connectedCard; - if(cardPanel.getCard().isUntapped() && !cardPanel.getCard().hasSickness()) { - break; - } - } - } - //right click: - if(e.isMetaDown()) { - if (att.contains(cardPanel.getCard()) - && (inputControl.input instanceof Input_Attack) - && !cardPanel.getCard().hasKeyword("CARDNAME attacks each turn if able.")) { - cardPanel.getCard().untap(); - AllZone.Combat.removeFromCombat(cardPanel.getCard()); - } - - else if (inputControl.input instanceof Input_Block){ - Card crd = cardPanel.getCard(); - if(crd.getController().isHuman()) - AllZone.Combat.removeFromCombat(crd); - ((Input_Block)inputControl.input).removeFromAllBlocking(crd); - } - } - - else inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Battlefield); - } - } - }); - //self hand ---- Mouse - playerHandPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Object o = playerHandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Human_Hand); - okButton.requestFocusInWindow(); - } - } - }); - - //***************************************************************** - //computer - - //computer play (land) ---- Mouse - oppLandPanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Object o = oppLandPanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Computer_Battlefield); - } - } - }); - - //computer play (no land) ---- Mouse - oppCreaturePanel.addMouseListener(new MouseAdapter() { - - @Override - public void mousePressed(MouseEvent e) { - Object o = oppCreaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - inputControl.selectCard(cardPanel.getCard(), AllZone.Computer_Battlefield); - } - } - }); - - - }//addListener() - - public Card getCard() { - return detail.getCard(); - } - - public void setCard(Card card) { - detail.setCard(card); - picture.setCard(card); - } - - 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.Human_Hand.size()); - playerGraveValue.setText("" + AllZone.Human_Graveyard.size()); - playerLibraryValue.setText("" + AllZone.Human_Library.size()); - playerFBValue.setText("" + CardFactoryUtil.getGraveyardActivationCards(AllZone.HumanPlayer).size()); - playerRemovedValue.setText("" + AllZone.Human_Exile.size()); - - } - }; - AllZone.Human_Hand.addObserver(o); - AllZone.Human_Graveyard.addObserver(o); - AllZone.Human_Library.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.Computer_Hand.size()); - oppGraveValue.setText("" + AllZone.Computer_Graveyard.size()); - oppLibraryValue.setText("" + AllZone.Computer_Library.size()); - oppRemovedValue.setText("" + AllZone.Computer_Exile.size()); - } - }; - AllZone.Computer_Hand.addObserver(o); - AllZone.Computer_Graveyard.addObserver(o); - AllZone.Computer_Library.addObserver(o); - } - - - //opponent life - oppLifeLabel.setText("" + AllZone.ComputerPlayer.getLife()); - AllZone.ComputerPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.ComputerPlayer.getLife(); - oppLifeLabel.setText("" + life); - } - }); - AllZone.ComputerPlayer.updateObservers(); - - if (AllZone.QuestData != 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.ComputerPlayer.getPoisonCounters()); - AllZone.ComputerPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int pcs = AllZone.ComputerPlayer.getPoisonCounters(); - oppPCLabel.setText("Poison Counters: " + pcs); - } - }); - AllZone.ComputerPlayer.updateObservers(); - - //player life - playerLifeLabel.setText("" + AllZone.HumanPlayer.getLife()); - AllZone.HumanPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int life = AllZone.HumanPlayer.getLife(); - playerLifeLabel.setText("" + life); - } - }); - AllZone.HumanPlayer.updateObservers(); - - playerPCLabel.setText("Poison Counters: " + AllZone.HumanPlayer.getPoisonCounters()); - AllZone.HumanPlayer.addObserver(new Observer() { - public void update(Observable a, Object b) { - int pcs = AllZone.HumanPlayer.getPoisonCounters(); - playerPCLabel.setText("Poison Counters: " + pcs); - } - }); - AllZone.HumanPlayer.updateObservers(); - - //stack - AllZone.Stack.addObserver(new Observer() { - public void update(Observable a, Object b) { - stackPanel.removeAll(); - MagicStack stack = AllZone.Stack; - 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.Stack.updateObservers(); - //END, stack - - - //self hand - AllZone.Human_Hand.addObserver(new Observer() { - public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - JPanel p = playerHandPanel; - p.removeAll(); - - Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - JPanel panel; - for(int i = 0; i < c.length; i++) { - panel = new CardPanel(c[i]); - p.add(panel); - } - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Hand.updateObservers(); - //END, self hand - - //self play (land) - AllZone.Human_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone) a; //unused - JPanel p = playerLandPanel; - p.removeAll(); - - GuiDisplayUtil.setupLandPanel(p, AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer).toArray()); - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Battlefield.updateObservers(); - //END - self play (only land) - - - //self play (no land) - AllZone.Human_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone) a; //unused - JPanel p = playerCreaturePanel; - p.removeAll(); - - GuiDisplayUtil.setupNoLandPanel(p, AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer).toArray()); - p.revalidate(); - p.repaint(); - } - }); - AllZone.Human_Battlefield.updateObservers(); - //END - self play (no land) - - - //computer play (no land) - AllZone.Computer_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone) a; //unused - JPanel p = oppCreaturePanel; - p.removeAll(); - - GuiDisplayUtil.setupNoLandPanel(p, AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer).toArray()); - - p.revalidate(); - p.repaint(); - } - }); - AllZone.Computer_Battlefield.updateObservers(); - //END - computer play (no land) - - //computer play (land) - AllZone.Computer_Battlefield.addObserver(new Observer() { - public void update(Observable a, Object b) { - //PlayerZone pZone = (PlayerZone) a; //unused - JPanel p = oppLandPanel; - p.removeAll(); - - GuiDisplayUtil.setupLandPanel(p, AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer).toArray()); - p.revalidate(); - p.repaint(); - } - }); - AllZone.Computer_Battlefield.updateObservers(); - //END - computer play (only land) - - }//addObservers() - - 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); - 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); - 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.2 name=compyLand)"// - + " (LEAF weight=0.2 name=compyPlay)"// - + " (LEAF weight=0.2 name=humanPlay)"// - + " (LEAF weight=0.2 name=humanLand)"// - + " (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); - } - - 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()); - } - - 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.Phase.isNeedToNextPhase()) { - //for debugging: System.out.println("There better be no nextPhase in the stack."); - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.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"); - } - - 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); - - //JLabel oppGraveLabel = new JLabel("Grave:", SwingConstants.TRAILING); - 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"); - } - - 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"); - } - - 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"); - } - - private void initZones(JPanel pane) { - JPanel[] zones = {oppLandPanel, oppCreaturePanel, playerCreaturePanel, playerLandPanel, playerHandPanel}; - String[] names = {"compyLand", "compyPlay", "humanPlay", "humanLand", "humanHand"}; - for(int i = 0; i < names.length; i++) { - zones[i].setLayout(null); - zones[i].setBorder(BorderFactory.createEtchedBorder()); - Dimension d = zones[i].getPreferredSize(); - d.height = 100; - zones[i].setPreferredSize(d); - pane.add(new ExternalPanel(new JScrollPane(zones[i])), names[i]); - } - playerHandPanel.setLayout(new FlowLayout(FlowLayout.LEFT)); - } - - private void initCardPicture(JPanel pane) { - pane.add(new ExternalPanel(detail), "detail"); - pane.add(new ExternalPanel(picture), "picture"); - } - - private void cancelButtonActionPerformed(ActionEvent evt) { - inputControl.selectButtonCancel(); - } - - 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.QuestData, AllZone.QuestAssignment); - CardList computerList = forge.quest.data.QuestUtil.getComputerCreatures(AllZone.QuestData, AllZone.QuestAssignment); - - int humanLife = AllZone.QuestData.getLife(); - int computerLife = 20; - - if (AllZone.QuestAssignment!=null) - computerLife = AllZone.QuestAssignment.getComputerLife(); - new Gui_WinLose(humanList, computerList, humanLife, computerLife); - } - } - - // ********** Phase stuff in Display ****************** - 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; - } - - 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); - - return true; - } - - 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(); - - return true; - } - - public static JCheckBoxMenuItem playsoundCheckboxForMenu = new JCheckBoxMenuItem("Play Sound", false); - - // Phases - public static JCheckBoxMenuItem cbAIUpkeep = new JCheckBoxMenuItem("Upkeep", true); - public static JCheckBoxMenuItem cbAIDraw = new JCheckBoxMenuItem("Draw", true); - public static JCheckBoxMenuItem cbAIEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - public static JCheckBoxMenuItem cbAIBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - public static JCheckBoxMenuItem cbAIEndCombat = new JCheckBoxMenuItem("End Combat", true); - - public static JCheckBoxMenuItem cbHumanUpkeep = new JCheckBoxMenuItem("Upkeep", true); - public static JCheckBoxMenuItem cbHumanDraw = new JCheckBoxMenuItem("Draw", true); - public static JCheckBoxMenuItem cbHumanEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - public static JCheckBoxMenuItem cbHumanBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - public static JCheckBoxMenuItem cbHumanEndCombat = new JCheckBoxMenuItem("End Combat", true); - - // ********** End of Phase stuff in Display ****************** - - // ****** Developer Mode ******* - - 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(); - JPanel oppLandPanel = new JPanel(); - JPanel oppCreaturePanel = new JPanel(); - JPanel playerCreaturePanel = new JPanel(); - JPanel playerLandPanel = new JPanel(); - JPanel playerHandPanel = new JPanel(); - 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); - CardPicturePanel picture = new CardPicturePanel(null); - - 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) { - Card[] c = getCards(); - - if(AllZone.NameChanger.shouldChangeCardName()) c = AllZone.NameChanger.changeCard(c); - - if(c.length == 0) GuiUtils.getChoiceOptional(title, new String[] {"no cards"}); - else { - Card choice = GuiUtils.getChoiceOptional(title, c); - if(choice != null) doAction(choice); - } - } - - /* - protected PlayerZone getZone() { - return zone; - } - */ - protected Card[] getCards() { - return AllZoneUtil.getCardsInZone(zone).toArray(); - } - - 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(); - } - } - - public boolean canLoseByDecking(){ - return canLoseByDecking.isSelected(); - } -} - -//very hacky - - -class Gui_MultipleBlockers3 extends JFrame { - private static final long serialVersionUID = 7622818310877381045L; - - private int assignDamage; - private Card att; - private CardList blockers; - private CardContainer guiDisplay; - - private BorderLayout borderLayout1 = new BorderLayout(); - private JPanel mainPanel = new JPanel(); - private JScrollPane jScrollPane1 = new JScrollPane(); - private JLabel numberLabel = new JLabel(); - private JPanel jPanel3 = new JPanel(); - private BorderLayout borderLayout3 = new BorderLayout(); - private JPanel creaturePanel = new JPanel(); - - - public static void main(String[] args) { - CardList list = new CardList(); - list.add(AllZone.CardFactory.getCard("Elvish Piper", null)); - list.add(AllZone.CardFactory.getCard("Lantern Kami", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - - for(int i = 0; i < 2; i++) - new Gui_MultipleBlockers3(null, list, i + 1, null); - } - - Gui_MultipleBlockers3(Card attacker, CardList creatureList, int damage, CardContainer display) { - this(); - assignDamage = damage; - updateDamageLabel();//update user message about assigning damage - guiDisplay = display; - att = attacker; - blockers = creatureList; - - for(int i = 0; i < creatureList.size(); i++) - creaturePanel.add(new CardPanel(creatureList.get(i))); - - if (att.hasKeyword("Trample")) { - Card player = new Card(); - player.setName("Player"); - player.addIntrinsicKeyword("Shroud"); - player.addIntrinsicKeyword("Indestructible"); - creaturePanel.add(new CardPanel(player)); - } - - JDialog dialog = new JDialog(this, true); - dialog.setTitle("Multiple Blockers"); - dialog.setContentPane(mainPanel); - dialog.setSize(470, 260); - dialog.setVisible(true); - } - - public Gui_MultipleBlockers3() { - try { - jbInit(); - } catch(Exception ex) { - ErrorViewer.showError(ex); - } -// setSize(470, 280); -// show(); - } - - private void jbInit() throws Exception { - this.getContentPane().setLayout(borderLayout1); - this.setTitle("Multiple Blockers"); - mainPanel.setLayout(null); - numberLabel.setHorizontalAlignment(SwingConstants.CENTER); - numberLabel.setHorizontalTextPosition(SwingConstants.CENTER); - numberLabel.setText("Assign"); - numberLabel.setBounds(new Rectangle(52, 30, 343, 24)); - jPanel3.setLayout(borderLayout3); - jPanel3.setBounds(new Rectangle(26, 75, 399, 114)); - creaturePanel.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - creaturePanel_mousePressed(e); - } - }); - creaturePanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - creaturePanel_mouseMoved(e); - } - }); - mainPanel.add(jPanel3, null); - jPanel3.add(jScrollPane1, BorderLayout.CENTER); - mainPanel.add(numberLabel, null); - jScrollPane1.getViewport().add(creaturePanel, null); - this.getContentPane().add(mainPanel, BorderLayout.CENTER); - } - - void okButton_actionPerformed(ActionEvent e) { - dispose(); - } - - void creaturePanel_mousePressed(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - - boolean assignedDamage = true; - - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - //c.setAssignedDamage(c.getAssignedDamage() + 1); - CardList cl = new CardList(); - cl.add(att); - - boolean assignedLethalDamageToAllBlockers = true; - for (Card crd : blockers ) - { - if (crd.getTotalAssignedDamage() < ( crd.getNetDefense() - crd.getDamage() )) - assignedLethalDamageToAllBlockers = false; - } - - - if (c.getName().equals("Player") - && att.hasKeyword("Trample") - && assignedLethalDamageToAllBlockers) - { - AllZone.Combat.addDefendingDamage(1, att); - c.addAssignedDamage(1, att); - } - else if (!c.getName().equals("Player")){ - c.addAssignedDamage(1, att); - } - else - assignedDamage = false; - - if (assignedDamage) - { - assignDamage--; - updateDamageLabel(); - if(assignDamage == 0) dispose(); - } - - if(guiDisplay != null) { - guiDisplay.setCard(c); - } - } - //reduce damage, show new user message, exit if necessary - - }//creaturePanel_mousePressed() - - void updateDamageLabel() { - numberLabel.setText("Assign " + assignDamage + " damage - click on card to assign damage"); - } - - void creaturePanel_mouseMoved(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - - if(guiDisplay != null) { - guiDisplay.setCard(c); - } - } - } -} diff --git a/src/forge/GuiDisplay4.java b/src/forge/GuiDisplay4.java index b0941a19230..e2fb75e095b 100644 --- a/src/forge/GuiDisplay4.java +++ b/src/forge/GuiDisplay4.java @@ -6,7 +6,6 @@ import arcane.ui.PlayArea; import arcane.ui.ViewPanel; import arcane.ui.util.Animation; import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; import forge.error.ErrorViewer; import forge.gui.ForgeAction; import forge.gui.GuiUtils; @@ -19,9 +18,13 @@ 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; @@ -39,156 +42,230 @@ 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); - - 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 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.Display = this; + AllZone.setDisplay(this); setupActions(); initComponents(); - + addObservers(); addListeners(); addMenu(); inputControl = new GuiInput(); } - + + /** {@inheritDoc} */ @Override public void setVisible(boolean visible) { - if(visible) { + if (visible) { //causes an error if put in the constructor, causes some random null pointer exception - AllZone.InputControl.updateObservers(); - + 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; + if (damage <= 0) + return; new Gui_MultipleBlockers4(attacker, blockers, damage, this); } + /** + *

setupActions.

+ */ private void setupActions() { - HUMAN_GRAVEYARD_ACTION = new ZoneAction(AllZone.Human_Graveyard, HUMAN_GRAVEYARD); - HUMAN_REMOVED_ACTION = new ZoneAction(AllZone.Human_Exile, HUMAN_REMOVED); - HUMAN_FLASHBACK_ACTION = new ZoneAction(AllZone.Human_Exile, HUMAN_FLASHBACK) { - + 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 Card[] getCards() { - return CardFactoryUtil.getGraveyardActivationCards(AllZone.HumanPlayer).toArray(); + protected Iterable getCardsAsIterable() { + return new ImmutableIterableFrom(CardFactoryUtil.getExternalZoneActivationCards(AllZone.getHumanPlayer())); } - + @Override protected void doAction(Card c) { - if(!c.isLand()) - { - SpellAbility[] sa = c.getSpellAbility(); - sa[1].setActivatingPlayer(AllZone.HumanPlayer); - if(sa[1].canPlay() && !c.isUnCastable()) AllZone.GameAction.playSpellAbility(sa[1]); - } - else // PlayLand checks if the land can be played - AllZone.HumanPlayer.playLand(c); + AllZone.getGameAction().playCard(c); } }; - COMPUTER_GRAVEYARD_ACTION = new ZoneAction(AllZone.Computer_Graveyard, COMPUTER_GRAVEYARD); - COMPUTER_REMOVED_ACTION = new ZoneAction(AllZone.Computer_Exile, COMPUTER_REMOVED); + 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 + // 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); + 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)); - + 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) { + + 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.Computer_Hand, COMPUTER_HAND.BASE); - Action viewAILibrary = new ZoneAction(AllZone.Computer_Library, COMPUTER_LIBRARY.BASE); - Action viewHumanLibrary = new ZoneAction(AllZone.Human_Library, HUMAN_LIBRARY.BASE); + + 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; + 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.devModeGenerateMana(); - } - }; + GuiDisplayUtil.devModeAddCounter(); + } + }; + //end DevMode AddCounter - // + Battlefield setup + - ForgeAction setupBattleField = new ForgeAction(SETUPBATTLEFIELD) { - private static final long serialVersionUID = -6660930759092583160L; + //DevMode Tap + ForgeAction tapPerm = new ForgeAction(TAPPERM) { + private static final long serialVersionUID = -6092045653540313527L; public void actionPerformed(ActionEvent arg0) { - GuiDisplayUtil.devSetupGameState(); - } - }; - // - Battlefield setup - + GuiDisplayUtil.devModeTapPerm(); + } + }; + //end DevMode Tap - Object[] objDev = { GuiDisplay4.canLoseByDecking, viewAIHand, viewAILibrary, viewHumanLibrary, generateMana, setupBattleField }; - 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); - } + //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(); @@ -198,125 +275,145 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo menuBar.add(new MenuItem_HowToPlay()); this.setJMenuBar(menuBar); }//addMenu() - - public boolean canLoseByDecking(){ - return canLoseByDecking.isSelected(); - } - + + /** + *

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); - + messageArea.setText(s); + Border border = null; int thickness = 3; - - if (AllZone.Stack.size() > 0 && AllZone.Stack.peekInstance().getActivatingPlayer().isComputer()) - border = BorderFactory.createLineBorder(new Color(0, 255, 255), thickness); + + 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); + border = BorderFactory.createLineBorder(new Color(30, 0, 255), thickness); else if (s.contains("To Block")) - border = BorderFactory.createLineBorder(new Color(13, 179, 0), thickness); + 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); + border = BorderFactory.createLineBorder(new Color(255, 174, 0), thickness); else if (s.contains("Declare Attackers")) - border = BorderFactory.createLineBorder(new Color(255, 0, 0), thickness); + 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); + border = BorderFactory.createLineBorder(new Color(200, 0, 170), thickness); else - border = new EmptyBorder(1, 1, 1, 1); - + 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) { + if (c != null) { setCard(c); } }//mouseMoved }); - + playerPlayPanel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent me) { Card c = playerPlayPanel.getCardFromMouseOverPanel(); - if(c != null) { + if (c != null) { setCard(c); } }//mouseMoved }); - + oppPlayPanel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent me) { Card c = oppPlayPanel.getCardFromMouseOverPanel(); - if(c != null) { + if (c != null) { setCard(c); } }//mouseMoved @@ -325,265 +422,270 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo //opponent life mouse listener oppLifeLabel.addMouseListener(new MouseAdapter() { - + @Override public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.ComputerPlayer); + inputControl.selectPlayer(AllZone.getComputerPlayer()); } }); - + oppLifeLabel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent me) { - setCard(AllZone.Computer_ManaPool); + setCard(AllZone.getComputerManaPool()); }//mouseMoved }); - + //self life mouse listener playerLifeLabel.addMouseListener(new MouseAdapter() { - + @Override public void mousePressed(MouseEvent e) { - inputControl.selectPlayer(AllZone.HumanPlayer); + 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.isUntapped()) { - MP3Player mp3 = new MP3Player("tap.mp3"); - mp3.play(); - } - + 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()) { + 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.Combat.getAttackers()); - if ((c.isTapped() ||c.hasSickness() || ((c.hasKeyword("Vigilance")) && att.contains(c))) + + 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()) { + 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.hasKeyword("CARDNAME attacks each turn if able.")) { c.untap(); - AllZone.Combat.removeFromCombat(c); + 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 if (inputControl.input instanceof Input_Block) { - if(c.getController().isHuman()) - AllZone.Combat.removeFromCombat(c); - ((Input_Block)inputControl.input).removeFromAllBlocking(c); - } - } else inputControl.selectCard(c, AllZone.Human_Battlefield); + } 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; + if (e.getButton() != MouseEvent.BUTTON1) return; Card c = playerHandPanel.getCardFromMouseOverPanel(); - if(c != null) { - inputControl.selectCard(c, AllZone.Human_Hand); + 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.Computer_Battlefield); + 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.Human_Hand.size()); - playerGraveValue.setText("" + AllZone.Human_Graveyard.size()); - playerLibraryValue.setText("" + AllZone.Human_Library.size()); - playerFBValue.setText("" + CardFactoryUtil.getGraveyardActivationCards(AllZone.HumanPlayer).size()); - playerRemovedValue.setText("" + AllZone.Human_Exile.size()); - + 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.Human_Hand.addObserver(o); - AllZone.Human_Graveyard.addObserver(o); - AllZone.Human_Library.addObserver(o); + 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.Computer_Hand.size()); - oppGraveValue.setText("" + AllZone.Computer_Graveyard.size()); - oppLibraryValue.setText("" + AllZone.Computer_Library.size()); - oppRemovedValue.setText("" + AllZone.Computer_Exile.size()); + oppHandValue.setText("" + AllZone.getComputerHand().size()); + oppGraveValue.setText("" + AllZone.getComputerGraveyard().size()); + oppLibraryValue.setText("" + AllZone.getComputerLibrary().size()); + oppRemovedValue.setText("" + AllZone.getComputerExile().size()); } }; - AllZone.Computer_Hand.addObserver(o); - AllZone.Computer_Graveyard.addObserver(o); - AllZone.Computer_Library.addObserver(o); + AllZone.getComputerHand().addObserver(o); + AllZone.getComputerGraveyard().addObserver(o); + AllZone.getComputerLibrary().addObserver(o); } - + //opponent life - oppLifeLabel.setText("" + AllZone.ComputerPlayer.getLife()); - AllZone.ComputerPlayer.addObserver(new Observer() { + oppLifeLabel.setText("" + AllZone.getComputerPlayer().getLife()); + AllZone.getComputerPlayer().addObserver(new Observer() { public void update(Observable a, Object b) { - int life = AllZone.ComputerPlayer.getLife(); + int life = AllZone.getComputerPlayer().getLife(); oppLifeLabel.setText("" + life); } }); - AllZone.ComputerPlayer.updateObservers(); - - if (AllZone.QuestData != 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); - - } + 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.ComputerPlayer.getPoisonCounters()); - AllZone.ComputerPlayer.addObserver(new Observer() { + + oppPCLabel.setText("Poison Counters: " + AllZone.getComputerPlayer().getPoisonCounters()); + AllZone.getComputerPlayer().addObserver(new Observer() { public void update(Observable a, Object b) { - int pcs = AllZone.ComputerPlayer.getPoisonCounters(); + int pcs = AllZone.getComputerPlayer().getPoisonCounters(); oppPCLabel.setText("Poison Counters: " + pcs); } }); - AllZone.ComputerPlayer.updateObservers(); - + AllZone.getComputerPlayer().updateObservers(); + //player life - playerLifeLabel.setText("" + AllZone.HumanPlayer.getLife()); - AllZone.HumanPlayer.addObserver(new Observer() { + playerLifeLabel.setText("" + AllZone.getHumanPlayer().getLife()); + AllZone.getHumanPlayer().addObserver(new Observer() { public void update(Observable a, Object b) { - int life = AllZone.HumanPlayer.getLife(); + int life = AllZone.getHumanPlayer().getLife(); playerLifeLabel.setText("" + life); } }); - AllZone.HumanPlayer.updateObservers(); - - playerPCLabel.setText("Poison Counters: " + AllZone.HumanPlayer.getPoisonCounters()); - AllZone.HumanPlayer.addObserver(new Observer() { + 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.HumanPlayer.getPoisonCounters(); + int pcs = AllZone.getHumanPlayer().getPoisonCounters(); playerPCLabel.setText("Poison Counters: " + pcs); } }); - AllZone.HumanPlayer.updateObservers(); - + AllZone.getHumanPlayer().updateObservers(); + //stack - AllZone.Stack.addObserver(new Observer() { + AllZone.getStack().addObserver(new Observer() { public void update(Observable a, Object b) { stackPanel.removeAll(); - MagicStack stack = AllZone.Stack; + MagicStack stack = AllZone.getStack(); int count = 1; JLabel label; - - for(int i = stack.size() - 1; 0 <= i; i--) { + + 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.Stack.updateObservers(); + AllZone.getStack().updateObservers(); //END, stack - + //self hand - AllZone.Human_Hand.addObserver(new Observer() { - public void update(Observable a, Object b) { + AllZone.getHumanHand().addObserver(new Observer() { + public void update(Observable a, Object b) { PlayerZone pZone = (PlayerZone) a; - HandArea p = playerHandPanel;; - + 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); + 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(); + if (diff.size() == p.cardPanels.size()) + p.clear(); else { - for(Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); - } + 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); @@ -596,64 +698,67 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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); + + 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.Human_Hand.updateObservers(); + AllZone.getHumanHand().updateObservers(); //END, self hand - + //self play - AllZone.Human_Battlefield.addObserver(new Observer() { + 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.Human_Battlefield.updateObservers(); + AllZone.getHumanBattlefield().updateObservers(); //END - self play - + //computer play - AllZone.Computer_Battlefield.addObserver(new Observer() { + AllZone.getComputerBattlefield().addObserver(new Observer() { public void update(Observable a, Object b) { - PlayerZone pZone = (PlayerZone) a; - + PlayerZone pZone = (PlayerZone) a; + Card c[] = AllZoneUtil.getCardsInZone(pZone).toArray(); - + GuiDisplayUtil.setupPlayZone(oppPlayPanel, c); } }); - AllZone.Computer_Battlefield.updateObservers(); + 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)); + 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); @@ -662,12 +767,12 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(f))); encoder.writeObject(layout); encoder.close(); - } catch(IOException ex) { + } catch (IOException ex) { ex.printStackTrace(); } } }); - + //making the multi split pane Node model; File f = ForgeProps.getFile(LAYOUT_NEW); @@ -677,7 +782,7 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo decoder.close(); pane.getMultiSplitLayout().setModel(model); //pane.getMultiSplitLayout().setFloatingDividers(false); - } catch(Exception ex) { + } catch (Exception ex) { model = parseModel(""// + "(ROW "// + "(COLUMN"// @@ -697,11 +802,11 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo } pane.getMultiSplitLayout().setFloatingDividers(false); getContentPane().add(pane); - + //adding the individual parts - - if(!Gui_NewGame.useLAFFonts.isSelected()) initFonts(pane); - + + if (!Gui_NewGame.useLAFFonts.isSelected()) initFonts(pane); + initMsgYesNo(pane); initOpp(pane); initStackCombat(pane); @@ -709,38 +814,48 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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.setBorder(BorderFactory.createEtchedBorder()); messageArea.setEditable(false); messageArea.setLineWrap(true); messageArea.setWrapStyleWord(true); - + cancelButton.setText("Cancel"); cancelButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { @@ -752,11 +867,11 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo okButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { okButtonActionPerformed(evt); - - if(AllZone.Phase.isNeedToNextPhase()) { + + if (AllZone.getPhase().isNeedToNextPhase()) { // moves to next turn - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.nextPhase(); + AllZone.getPhase().setNeedToNextPhase(false); + AllZone.getPhase().nextPhase(); } okButton.requestFocusInWindow(); } @@ -766,21 +881,21 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo public void keyPressed(KeyEvent arg0) { // TODO make triggers on escape int code = arg0.getKeyCode(); - if(code == KeyEvent.VK_ESCAPE) { + 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); @@ -788,39 +903,43 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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); - + 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); - + 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); - + 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); @@ -830,13 +949,13 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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()); @@ -847,71 +966,81 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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); - + 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); - + 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); - + 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); - + 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); - + 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); @@ -923,7 +1052,7 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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()); @@ -932,403 +1061,290 @@ public class GuiDisplay4 extends JFrame implements CardContainer, Display, NewCo 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); + 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()); + 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(); + savePrefs(); dispose(); Constant.Runtime.matchState.addLose(); if (!Constant.Quest.fantasyQuest[0]) - new Gui_WinLose(); + 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.QuestData, AllZone.QuestAssignment); - CardList computerList = forge.quest.data.QuestUtil.getComputerCreatures(AllZone.QuestData, AllZone.QuestAssignment); - - int humanLife = AllZone.QuestData.getLife(); - int computerLife = 20; - - if (AllZone.QuestAssignment!=null) - computerLife = AllZone.QuestAssignment.getComputerLife(); - new Gui_WinLose(humanList, computerList, humanLife, computerLife); + //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; + 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; } - - 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); + /** + *

loadPrefs.

+ * + * @return a boolean. + */ + public boolean loadPrefs() { + ForgePreferences fp = Gui_NewGame.preferences; - return true; + 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; } - - 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; + + /** + *

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; } - - public static JCheckBoxMenuItem playsoundCheckboxForMenu = new JCheckBoxMenuItem("Play Sound", false); - + + /** Constant playsoundCheckboxForMenu */ + public static JCheckBoxMenuItem playsoundCheckboxForMenu = new JCheckBoxMenuItem("Play Sound", false); + // Phases - public static JCheckBoxMenuItem cbAIUpkeep = new JCheckBoxMenuItem("Upkeep", true); - public static JCheckBoxMenuItem cbAIDraw = new JCheckBoxMenuItem("Draw", true); - public static JCheckBoxMenuItem cbAIEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - public static JCheckBoxMenuItem cbAIBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - public static JCheckBoxMenuItem cbAIEndCombat = new JCheckBoxMenuItem("End Combat", true); - - public static JCheckBoxMenuItem cbHumanUpkeep = new JCheckBoxMenuItem("Upkeep", true); - public static JCheckBoxMenuItem cbHumanDraw = new JCheckBoxMenuItem("Draw", true); - public static JCheckBoxMenuItem cbHumanEndOfTurn = new JCheckBoxMenuItem("End of Turn", true); - public static JCheckBoxMenuItem cbHumanBeginCombat = new JCheckBoxMenuItem("Begin Combat", true); - public static JCheckBoxMenuItem cbHumanEndCombat = new JCheckBoxMenuItem("End Combat", true); - + /** 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 ******* - - public static JCheckBoxMenuItem canLoseByDecking = new JCheckBoxMenuItem("Lose by Decking", true); + + /** 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(); - + + + 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; - + 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) { - Card[] c = getCards(); - - if(AllZone.NameChanger.shouldChangeCardName()) c = AllZone.NameChanger.changeCard(c); - - if(c.length == 0) GuiUtils.getChoiceOptional(title, new String[] {"no cards"}); + 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, c); - if(choice != null) doAction(choice); + Card choice = GuiUtils.getChoiceOptional(title, iter); + if (choice != null) doAction(choice); } } - - /* - protected PlayerZone getZone() { - return zone; - } - */ - protected Card[] getCards() { + + /** + * @deprecated + * @see #getCardsAsIterable() + */ + @SuppressWarnings("unused") + protected Card[] getCards() { return AllZoneUtil.getCardsInZone(zone).toArray(); } - - protected void doAction(Card c) {} + + 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(); } } } -//very hacky - - -class Gui_MultipleBlockers4 extends JFrame { - private static final long serialVersionUID = 7622818310877381045L; - - private int assignDamage; - private Card att; - private CardList blockers; - private CardContainer guiDisplay; - - private BorderLayout borderLayout1 = new BorderLayout(); - private JPanel mainPanel = new JPanel(); - private JScrollPane jScrollPane1 = new JScrollPane(); - private JLabel numberLabel = new JLabel(); - private JPanel jPanel3 = new JPanel(); - private BorderLayout borderLayout3 = new BorderLayout(); - private JPanel creaturePanel = new JPanel(); - - - public static void main(String[] args) { - CardList list = new CardList(); - list.add(AllZone.CardFactory.getCard("Elvish Piper", null)); - list.add(AllZone.CardFactory.getCard("Lantern Kami", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - - for(int i = 0; i < 2; i++) - new Gui_MultipleBlockers4(null, list, i + 1, null); - } - - Gui_MultipleBlockers4(Card attacker, CardList creatureList, int damage, CardContainer display) { - this(); - assignDamage = damage; - updateDamageLabel();//update user message about assigning damage - guiDisplay = display; - att = attacker; - blockers = creatureList; - - for(int i = 0; i < creatureList.size(); i++) - creaturePanel.add(new CardPanel(creatureList.get(i))); - - if (att.hasKeyword("Trample")) { - Card player = new Card(); - player.setName("Player"); - player.addIntrinsicKeyword("Shroud"); - player.addIntrinsicKeyword("Indestructible"); - creaturePanel.add(new CardPanel(player)); - } - - JDialog dialog = new JDialog(this, true); - dialog.setTitle("Multiple Blockers"); - dialog.setContentPane(mainPanel); - dialog.setSize(470, 260); - dialog.setVisible(true); - } - - public Gui_MultipleBlockers4() { - try { - jbInit(); - } catch(Exception ex) { - ErrorViewer.showError(ex); - } - // setSize(470, 280); - // show(); - } - - private void jbInit() throws Exception { - this.getContentPane().setLayout(borderLayout1); - this.setTitle("Multiple Blockers"); - mainPanel.setLayout(null); - numberLabel.setHorizontalAlignment(SwingConstants.CENTER); - numberLabel.setHorizontalTextPosition(SwingConstants.CENTER); - numberLabel.setText("Assign"); - numberLabel.setBounds(new Rectangle(52, 30, 343, 24)); - jPanel3.setLayout(borderLayout3); - jPanel3.setBounds(new Rectangle(26, 75, 399, 114)); - creaturePanel.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - creaturePanel_mousePressed(e); - } - }); - creaturePanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - creaturePanel_mouseMoved(e); - } - }); - mainPanel.add(jPanel3, null); - jPanel3.add(jScrollPane1, BorderLayout.CENTER); - mainPanel.add(numberLabel, null); - jScrollPane1.getViewport().add(creaturePanel, null); - this.getContentPane().add(mainPanel, BorderLayout.CENTER); - } - - void okButton_actionPerformed(ActionEvent e) { - dispose(); - } - - void creaturePanel_mousePressed(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - - boolean assignedDamage = true; - - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - //c.setAssignedDamage(c.getAssignedDamage() + 1); - CardList cl = new CardList(); - cl.add(att); - - boolean assignedLethalDamageToAllBlockers = true; - for (Card crd : blockers ) - { - if (crd.getLethalDamage() > 0 - && (!att.hasKeyword("Deathtouch") || crd.getTotalAssignedDamage() < 1 )) - assignedLethalDamageToAllBlockers = false; - } - - - if (c.getName().equals("Player") - && att.hasKeyword("Trample") - && assignedLethalDamageToAllBlockers) - { - AllZone.Combat.addDefendingDamage(1, att); - c.addAssignedDamage(1, att); - } - else if (!c.getName().equals("Player")){ - c.addAssignedDamage(1, att); - } - else - assignedDamage = false; - - if (assignedDamage) - { - assignDamage--; - updateDamageLabel(); - if(assignDamage == 0) dispose(); - } - - if(guiDisplay != null) { - guiDisplay.setCard(c); - } - } - //reduce damage, show new user message, exit if necessary - - }//creaturePanel_mousePressed() - - void updateDamageLabel() { - numberLabel.setText("Assign " + assignDamage + " damage - click on card to assign damage"); - } - - void creaturePanel_mouseMoved(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - - if(guiDisplay != null) { - guiDisplay.setCard(c); - } - } - } -} - diff --git a/src/forge/GuiDisplayUtil.java b/src/forge/GuiDisplayUtil.java index e58927773bd..b47f1e64111 100644 --- a/src/forge/GuiDisplayUtil.java +++ b/src/forge/GuiDisplayUtil.java @@ -1,178 +1,189 @@ - package forge; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Point; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; -import java.awt.event.MouseMotionListener; -import java.io.BufferedReader; -import java.io.DataInputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -import javax.swing.BorderFactory; -import javax.swing.JFileChooser; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.border.Border; -import javax.swing.event.MouseInputAdapter; - 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)) { + + if ((o != null) && (o instanceof CardPanel)) { CardContainer cardPanel = (CardContainer) o; visual.setCard(cardPanel.getCard()); } }//mouseMoved }; } - + /** - * Returns the listener that updates the card preview panel + *

getBorder.

+ * + * @param card a {@link forge.Card} object. + * @return a {@link javax.swing.border.Border} object. */ - public static MouseMotionListener getCardDetailMouse(final GuiDisplay2 visual) { - return new MouseInputAdapter() { - @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 - - /** - * Could be added to the card panels for the same effect - */ - @Override - public void mouseEntered(MouseEvent e) { - if(!(e.getSource() instanceof CardPanel)) return; - CardContainer panel = (CardContainer) e.getSource(); - visual.setCard(panel.getCard()); - } - }; - } - public static Border getBorder(Card card) { - // color info - if (card == null) - return BorderFactory.createEmptyBorder(2, 2, 2, 2); + // 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; - + 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.Black)) + color = Color.black; - else if (list.get(0).equals(Constant.Color.White)) - color = Color.white; + else if (list.get(0).equals(Constant.Color.Green)) + color = new Color(0, 220, 39); - else if (list.get(0).equals(Constant.Color.Red)) - color = Color.red; + else if (list.get(0).equals(Constant.Color.White)) + color = Color.white; - 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 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); } - - public static void devModeGenerateMana(){ - Card dummy = new Card(); - dummy.setOwner(AllZone.HumanPlayer); - dummy.setController(AllZone.HumanPlayer); - Ability_Mana abMana = new Ability_Mana(dummy, "0", "W U B G R 1", 10) { - private static final long serialVersionUID = -2164401486331182356L; - }; - abMana.produceMana(); + /** + *

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(); - String s = ""; - for(int i = 0; i < list.size(); i++) { - s = list.get(i).toString(); - sb.append(s); - if(s.equals("Creature") || s.equals("Land")) { - sb.append(" - "); - } else sb.append(" "); + 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++) { + for (int i = 0; i < in.length(); i++) { c = in.charAt(i); - if(c == ' ' || c == '-') out.append('_'); - else if(Character.isLetterOrDigit(c) || c == '_') { + 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(); @@ -187,7 +198,13 @@ public class GuiDisplayUtil implements NewConstants { } return out.toString(); } - + + /** + *

setupNoLandPanel.

+ * + * @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(); /* @@ -214,24 +231,30 @@ public class GuiDisplayUtil implements NewConstants { */ - for(int i = 0; i < c.length; 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() + 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.GameAction.isAttachee(c[i]) + && !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); @@ -241,12 +264,19 @@ public class GuiDisplayUtil implements NewConstants { //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++) @@ -272,9 +302,9 @@ public class GuiDisplayUtil implements NewConstants { } */ - if(stack) { + 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); @@ -292,16 +322,16 @@ public class GuiDisplayUtil implements NewConstants { 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); @@ -320,153 +350,154 @@ public class GuiDisplayUtil implements NewConstants { 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++) { + for (int i = 0; i < list.size(); i++) { JPanel addPanel; c = list.get(i); - + addPanel = new CardPanel(c); - + boolean startANewStack = false; - - if(!isStackable(c)) { + + if (!isStackable(c)) { startANewStack = true; } else { String newColor = c.getName(); //CardUtil.getColor(c); - - if(!newColor.equals(color)) { + + if (!newColor.equals(color)) { startANewStack = true; color = newColor; } } - - if(i == 0) { + + if (i == 0) { startANewStack = false; } - - if(!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { + + if (!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { startANewStack = true; } - - if(c.isAura() && c.isEnchanting() && !nextEnchanted) startANewStack = false; - else if(c.isAura() && c.isEnchanting()) { + + if (c.isAura() && c.isEnchanting() && !nextEnchanted) startANewStack = false; + else if (c.isAura() && c.isEnchanting()) { startANewStack = true; nextEnchanted = false; } - - if(c.isLand() && c.isEnchanted()) { + + 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( + + 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() + 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); + 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) { + 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) { + if (atInStack > 1) { x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) + marginX; } else { x = nextXIfNotStacked; } - + atInStack = 0; } else { - if(i != 0) { + 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--) { + + 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) { + 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++) { + for (int i = 0; i < list.size(); i++) { c = list.get(i); /*if(c.isLocalEnchantment()) addPanel = getCardPanel(c, "<< " +c.getName()); @@ -474,38 +505,45 @@ public class GuiDisplayUtil implements NewConstants { 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) { + + 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); @@ -514,285 +552,361 @@ public class GuiDisplayUtil implements NewConstants { 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++) { + for (int i = 0; i < list.size(); i++) { JPanel addPanel; c = list.get(i); addPanel = new CardPanel(c); - + boolean startANewStack = false; - - if(!isStackable(c)) { + + if (!isStackable(c)) { startANewStack = true; } else { String newColor = c.getName(); //CardUtil.getColor(c); - - if(!newColor.equals(color)) { + + if (!newColor.equals(color)) { startANewStack = true; color = newColor; } } - - if(i == 0) { + + if (i == 0) { startANewStack = false; } - - if(!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { + + if (!startANewStack && atInStack == Constant.Runtime.stackSize[0]) { startANewStack = true; } - - if((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting()) + + if ((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting()) && !nextEquippedEnchanted) startANewStack = false; - else if((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting())) { + else if ((c.isEquipment() || c.isAura()) && (c.isEquipping() || c.isEnchanting())) { startANewStack = true; nextEquippedEnchanted = false; } - - if(c.isCreature() && (c.isEquipped() || c.isEnchanted())) { + + 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() + 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() + 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 + + if (((c.isAura() && c.isEnchanting()) || (c.isEquipment() && c.isEquipping())) && prevCard != null && prevCard.isPlaneswalker()) startANewStack = true; - - if(startANewStack) { + + if (startANewStack) { setupConnectedCards(connectedCards); connectedCards.clear(); - + // Fixed distance if last was a stack, looks a bit nicer - if(atInStack > 1) { + if (atInStack > 1) { x += Math.max(addPanel.getPreferredSize().width, addPanel.getPreferredSize().height) + marginX; } else { x = nextXIfNotStacked; } - + atInStack = 0; } else { - if(i != 0) { + 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--) { + + 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) { + + 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++) { + 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); + 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()); - + 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); + 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); + 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) { + for (Card c : cards) { String name = c.getName(); - if(c.isCreature() && c.isToken() && name.equals(tokenName)) ret.add(c); + 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) { + for (Card c : cards) { String name = c.getName(); - if(name.equals(moxName) && !c.isCreature()) ret.add(c); + 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) { + for (Card c : cards) { String name = c.getName(); - if(c.isArtifact() && !c.isCreature() && !c.isLand() && !c.isGlobalEnchantment() + 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); + 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); + 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()) { + 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) { + + 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) { + + 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) { + } 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) { + + } 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) { + + } 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) { + + } 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)) { + + 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") + 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") @@ -806,31 +920,50 @@ public class GuiDisplayUtil implements NewConstants { } } } - + 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); - + + 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) { + 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") || @@ -840,321 +973,419 @@ public class GuiDisplayUtil implements NewConstants { return true; } */ - if(c.isLand() || (c.getName().startsWith("Mox") && !c.getName().equals("Mox Diamond")) + 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--) { + 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; + List tmp, diff; tmp = new ArrayList(); - for(arcane.ui.CardPanel cpa : p.cardPanels) - tmp.add(cpa.gameCard); + 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(); + if (diff.size() == p.cardPanels.size()) + p.clear(); else { - for(Card card : diff) { - p.removeCardPanel(p.getCardPanel(card.getUniqueNumber())); - } + 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 : 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); + + 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.Computer_Battlefield.updateObservers(); - AllZone.Human_Battlefield.updateObservers(); - AllZone.Human_Hand.updateObservers(); + 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_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 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 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.Phase.setPlayerTurn(AllZone.HumanPlayer); - } - if (t_changePlayer.trim().toLowerCase().equals("ai")) { - AllZone.Phase.setPlayerTurn(AllZone.ComputerPlayer); - } + 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.Phase.setDevPhaseState(t_changePhase); + AllZone.getPhase().setDevPhaseState(t_changePhase); } - - if (!t_humanSetupCardsInPlay.trim().toLowerCase().equals("none")) - humanDevSetup = devProcessCardsForZone(humanSetupCardsInPlay, AllZone.HumanPlayer); - if (!t_humanSetupCardsInHand.trim().toLowerCase().equals("none")) - humanDevHandSetup = devProcessCardsForZone(humanSetupCardsInHand, AllZone.HumanPlayer); + if (!t_humanSetupCardsInPlay.trim().toLowerCase().equals("none")) + humanDevSetup = devProcessCardsForZone(humanSetupCardsInPlay, AllZone.getHumanPlayer()); - if (!t_computerSetupCardsInPlay.trim().toLowerCase().equals("none")) - computerDevSetup = devProcessCardsForZone(computerSetupCardsInPlay, AllZone.ComputerPlayer); + 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_computerSetupCardsInHand.trim().toLowerCase().equals("none")) - computerDevHandSetup = devProcessCardsForZone(computerSetupCardsInHand, AllZone.ComputerPlayer); - - if (!t_computerSetupGraveyard.trim().toLowerCase().equals("none")) - computerDevGraveyardSetup = devProcessCardsForZone(computerSetupGraveyard, AllZone.ComputerPlayer); - - if (!t_humanSetupGraveyard.trim().toLowerCase().equals("none")) - humanDevGraveyardSetup = devProcessCardsForZone(humanSetupGraveyard, AllZone.HumanPlayer); - if (!t_humanSetupLibrary.trim().toLowerCase().equals("none")) - humanDevLibrarySetup = devProcessCardsForZone(humanSetupLibrary, AllZone.HumanPlayer); - + humanDevLibrarySetup = devProcessCardsForZone(humanSetupLibrary, AllZone.getHumanPlayer()); + if (!t_computerSetupLibrary.trim().toLowerCase().equals("none")) - computerDevLibrarySetup = devProcessCardsForZone(computerSetupLibrary, AllZone.ComputerPlayer); - + computerDevLibrarySetup = devProcessCardsForZone(computerSetupLibrary, AllZone.getComputerPlayer()); + if (!t_humanSetupExile.trim().toLowerCase().equals("none")) - humanDevExileSetup = devProcessCardsForZone(humanSetupExile, AllZone.HumanPlayer); + humanDevExileSetup = devProcessCardsForZone(humanSetupExile, AllZone.getHumanPlayer()); if (!t_computerSetupExile.trim().toLowerCase().equals("none")) - computerDevExileSetup = devProcessCardsForZone(computerSetupExile, AllZone.ComputerPlayer); + computerDevExileSetup = devProcessCardsForZone(computerSetupExile, AllZone.getComputerPlayer()); - AllZone.TriggerHandler.suppressMode("ChangesZone"); + AllZone.getTriggerHandler().suppressMode("ChangesZone"); - for (Card c : humanDevSetup) - { - AllZone.Human_Hand.add(c); - AllZone.GameAction.moveToPlay(c); - c.setSickness(false); - } - - for (Card c: computerDevSetup) - { - AllZone.Computer_Hand.add(c); - AllZone.GameAction.moveToPlay(c); - c.setSickness(false); - } - - if (computerDevGraveyardSetup.size() > 0) - AllZone.Computer_Graveyard.setCards(computerDevGraveyardSetup.toArray()); - if (humanDevGraveyardSetup.size() > 0) - AllZone.Human_Graveyard.setCards(humanDevGraveyardSetup.toArray()); - - if (computerDevHandSetup.size() > 0) - AllZone.Computer_Hand.setCards(computerDevHandSetup.toArray()); - if (humanDevHandSetup.size() > 0) - AllZone.Human_Hand.setCards(humanDevHandSetup.toArray()); + for (Card c : humanDevSetup) { + AllZone.getHumanHand().add(c); + AllZone.getGameAction().moveToPlay(c); + c.setSickness(false); + } - if(humanDevLibrarySetup.size() > 0) - AllZone.Human_Library.setCards(humanDevLibrarySetup.toArray()); - if(computerDevLibrarySetup.size() > 0) - AllZone.Computer_Library.setCards(computerDevLibrarySetup.toArray()); - - if(humanDevExileSetup.size() > 0) - AllZone.Human_Exile.setCards(humanDevExileSetup.toArray()); - if(computerDevExileSetup.size() > 0) - AllZone.Computer_Exile.setCards(computerDevExileSetup.toArray()); + for (Card c : computerDevSetup) { + AllZone.getComputerHand().add(c); + AllZone.getGameAction().moveToPlay(c); + c.setSickness(false); + } - AllZone.TriggerHandler.clearSuppression("ChangesZone"); - - if (setComputerLife > 0) - AllZone.ComputerPlayer.setLife(setComputerLife, null); - if (setHumanLife > 0) - AllZone.HumanPlayer.setLife(setHumanLife, null); + if (computerDevGraveyardSetup.size() > 0) + AllZone.getComputerGraveyard().setCards(computerDevGraveyardSetup.toArray()); + if (humanDevGraveyardSetup.size() > 0) + AllZone.getHumanGraveyard().setCards(humanDevGraveyardSetup.toArray()); - AllZone.GameAction.checkStateEffects(); - AllZone.Phase.updateObservers(); - AllZone.Human_Exile.updateObservers(); - AllZone.Computer_Exile.updateObservers(); - AllZone.Human_Hand.updateObservers(); - AllZone.Computer_Hand.updateObservers(); - AllZone.Human_Graveyard.updateObservers(); - AllZone.Computer_Graveyard.updateObservers(); - AllZone.Human_Battlefield.updateObservers(); - AllZone.Computer_Battlefield.updateObservers(); - AllZone.Human_Library.updateObservers(); - AllZone.Computer_Library.updateObservers(); - } + if (computerDevHandSetup.size() > 0) + AllZone.getComputerHand().setCards(computerDevHandSetup.toArray()); + if (humanDevHandSetup.size() > 0) + AllZone.getHumanHand().setCards(humanDevHandSetup.toArray()); - 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.CardFactory.getCard(cardinfo[0], player); + 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()); + c.setCurSetCode(c.getMostRecentSet()); else - c.setCurSetCode(cardinfo[1]); - - c.setImageFilename(CardUtil.buildFilename(c)); - for(Trigger trig : c.getTriggers()) { - AllZone.TriggerHandler.registerTrigger(trig); - } - cl.add(c); + 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 index f2ea02de5c9..d85945e017d 100644 --- a/src/forge/GuiInput.java +++ b/src/forge/GuiInput.java @@ -1,54 +1,89 @@ - package forge; +import forge.gui.input.Input; + import java.util.Observable; import java.util.Observer; -import forge.gui.input.Input; - +/** + *

GuiInput class.

+ * + * @author Forge + * @version $Id: $ + */ public class GuiInput extends MyObservable implements Observer { Input input; - + + /** + *

Constructor for GuiInput.

+ */ public GuiInput() { - AllZone.InputControl.addObserver(this); - AllZone.Stack.addObserver(this); - AllZone.Phase.addObserver(this); + AllZone.getInputControl().addObserver(this); + AllZone.getStack().addObserver(this); + AllZone.getPhase().addObserver(this); } - + + /** {@inheritDoc} */ public void update(Observable observable, Object obj) { - Input tmp = AllZone.InputControl.updateInput(); - if(tmp != null) { + 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 index 0c75c337082..f15060fb753 100644 --- a/src/forge/Gui_BoosterDraft.java +++ b/src/forge/Gui_BoosterDraft.java @@ -1,4 +1,3 @@ - package forge; @@ -16,103 +15,116 @@ import javax.swing.border.TitledBorder; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import java.awt.Color; -import java.awt.Frame; -import java.awt.GridLayout; -import java.awt.Rectangle; +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 { - private static final long serialVersionUID = -6055633915602448260L; - - private BoosterDraft 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); - - public static void main(String[] args) { - Constant.Runtime.GameType[0] = Constant.GameType.Draft; - Constant.Runtime.HumanDeck[0] = new Deck(Constant.GameType.Sealed); - - Gui_BoosterDraft g = new Gui_BoosterDraft(); - g.showGui(new BoosterDraftTest()); - } - - + + 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) { + 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); + if ((e.getModifiers() & InputEvent.BUTTON3_MASK) != 0) jButton1_actionPerformed(null); } });//MouseListener - + //get stats from deck deckModel.addTableModelListener(new TableModelListener() { @@ -121,7 +133,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta statsLabel.setText(getStats(deck)); } }); - + //get stats from all cards allCardModel.addTableModelListener(new TableModelListener() { @@ -130,43 +142,63 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta 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()); - + 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) { + } 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"); @@ -214,116 +246,165 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta 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) { + if (n != -1) { setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); - + Card c = allCardModel.rowToCard(n); deckModel.addCard(c); deckModel.resort(); - - if(limitedDeckEditor) { + + 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--; + 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) { + if (n != -1) { setTitle("Deck Editor - " + Constant.Runtime.HumanDeck[0].getName() + " - changed"); - + Card c = deckModel.rowToCard(n); deckModel.removeCard(c); - - if(limitedDeckEditor) { + + 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--; + 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")) { - + 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(); + 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; - + if (checkSaveDeck()) return; + setTitle("Deck Editor"); - + Deck deck = Constant.Runtime.HumanDeck[0]; - while(deck.countMain() != 0) + while (deck.countMain() != 0) deck.addSideboard(deck.removeMain(0)); - - refreshGui(); + + //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) { } - - private void saveAsItem_actionPerformed() {}//saveItem_actionPerformed() - - private void saveItem_actionPerformed() {} - - private void openItem_actionPerformed() {}//openItem_actionPerformed() - - public void deleteItem_actionPerformed() {} - + + /** + *

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("")) { + while (newName.equals("")) { newName = JOptionPane.showInputDialog(null, ForgeProps.getLocalized(RENAME_MESSAGE), ForgeProps.getLocalized(RENAME_TITLE), JOptionPane.QUESTION_MESSAGE); - if(newName == null) break; + if (newName == null) break; } - + //when the user selects "Cancel" - if(newName != null) { + 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"); @@ -333,7 +414,7 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta 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(); @@ -379,13 +460,13 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta 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); @@ -393,52 +474,68 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta // 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 - private void refreshGui() { + +// /** +// *

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]); - + 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.CardFactory.getCard(deck.getMain(i), AllZone.HumanPlayer); - + //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()));; - - + //if (!Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) + // c.setRarity(pack.getRarity(c.getName())); + //; + + deckModel.addCard(c); }//for - - if(deck.isSealed() || deck.isRegular()) { + + if (deck.isSealed() || deck.isRegular()) { //add sideboard to GUI - for(int i = 0; i < deck.countSideboard(); i++) { - c = AllZone.CardFactory.getCard(deck.getSideboard(i), AllZone.HumanPlayer); - c.setRarity(pack.getRarity(c.getName())); + 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 { - CardList all = AllZone.CardFactory.getAllCards(); - for(int i = 0; i < all.size(); i++) - allCardModel.addCard(all.get(i)); + + * 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() { @@ -446,51 +543,79 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta 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++) + for (int i = 0; i < list.size(); i++) deck.addMain(list.get(i).getName()); - - if(deck.isSealed()) { + + if (deck.isSealed()) { //add sideboard to deck list = allCardModel.getCards(); - for(int i = 0; i < list.size(); i++) + 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; - + 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()) { + 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++) { + 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; @@ -498,72 +623,81 @@ public class Gui_BoosterDraft extends JFrame implements CardContainer, NewConsta // n = Integer.parseInt(PC); //if (n > 1) // c.setRandomPicture(r.nextInt(n)); - + if (c.getCurSetCode().equals("")) - c.setCurSetCode(c.getMostRecentSet()); - + 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); + 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++) + 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]); - } - + + 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) { + 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 = 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(); diff --git a/src/forge/Gui_CardShop.java b/src/forge/Gui_CardShop.java index 21572dab760..e39dd45d7b5 100644 --- a/src/forge/Gui_CardShop.java +++ b/src/forge/Gui_CardShop.java @@ -1,6 +1,40 @@ - 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; @@ -8,280 +42,298 @@ import forge.gui.game.CardDetailPanel; import forge.gui.game.CardPicturePanel; 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.MouseInputListener; -import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.table.TableCellRenderer; -import java.awt.Color; -import java.awt.*; -import java.awt.event.*; -import java.text.DecimalFormat; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Map; -import java.util.Random; - +/** + *

+ * Gui_CardShop class. + *

+ * + * @author Forge + * @version $Id: $ + */ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, NewConstants { - private static final long serialVersionUID = 3988857075791576483L; + /** 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(); + 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 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; + 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); } - - public void updateDisplay(CardList top, CardList bottom) { - - this.top = top; - this.bottom = bottom; - + + /** {@inheritDoc} */ + public void updateDisplay(CardList topParam, CardList bottomParam) { + + this.top = topParam; + this.bottom = bottomParam; + topModel.clear(); bottomModel.clear(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + 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 < top.size(); i++) { - c = top.get(i); - + 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.NameChanger.getOriginalName(c.getName()); - if(!pack.getRarity(cardName).equals("error")) { + + cardName = AllZone.getNameChanger().getOriginalName(c.getName()); + if (!pack.getRarity(cardName).equals("error")) { c.setRarity(pack.getRarity(cardName)); } - - //String PC = c.getSVar("PicCount"); + + // 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)); - } + // 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 < bottom.size(); i++) { - c = bottom.get(i); - - // add rarity to card if this is a sealed card pool - if(!customMenu.getGameType().equals(Constant.GameType.Constructed)) c.setRarity(pack.getRarity(c.getName())); - //String PC = c.getSVar("PicCount"); + }// 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)); - + // 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()); - + 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)); + 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); - + // updateDisplay(this.top, this.bottom); + topModel.clear(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + 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++) { + for (int i = 0; i < top.size(); i++) { c = top.get(i); - + // add rarity to card if this is a sealed card pool - - cardName = AllZone.NameChanger.getOriginalName(c.getName()); - if(!pack.getRarity(cardName).equals("error")) { + + 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 + + // 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); - + // this.setJMenuBar(customMenu); - //do not change this!!!! + // 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: + + // show cards, makes this user friendly + // customMenu.newConstructed(); + + // get pricelist: ReadPriceList r = new ReadPriceList(); - Map map = r.getPriceList(); - + Map map = r.getPriceList(); + ReadBoosterPack pack = new ReadBoosterPack(); CardList shop; - - if (questData.getShopList() == null || questData.getShopList().size() == 0) + + 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 { - shop = pack.getShopCards(questData.getWin()); - ArrayList shopListToBeSaved = new ArrayList(); - - for (int i = 0; i shopList = questData.getShopList(); - shop = new CardList(); + java.util.List shopList = questData.getShopList(); + shop = new CardList(); for (String aShopList : shopList) { - Card c = AllZone.CardFactory.getCard(aShopList, null); + 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 + } 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")) { + } else if (c.getRarity().equals("Uncommon")) { c.setValue(50); - } - else if (c.getRarity().equals("Rare")) { + } else if (c.getRarity().equals("Rare")) { c.setValue(200); } } @@ -289,135 +341,145 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, shop.add(c); } } - + java.util.List list = questData.getCardpool(); CardList owned = new CardList(); for (String aList : list) { - Card c = AllZone.CardFactory.getCard(aList, null); + 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 + } 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")) { + } else if (c.getRarity().equals("Uncommon")) { c.setValue(50); - } - else if (c.getRarity().equals("Rare")) { + } else if (c.getRarity().equals("Rare")) { c.setValue(200); } } owned.add(c); } - + customMenu.populateShop(shop, owned); - - double multiPercent = multi*100; + + 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); - + 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) - + }// 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)) { + 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; + if (c == null) + return; Image i = ImageCache.getOriginalImage(c); - if(i == null) return; - if(i.getWidth(null) < 300) return; + if (i == null) + return; + if (i.getWidth(null) < 300) + return; glassPane.setVisible(true); } }); - }//addListeners() - + }// addListeners() + + /** + *

+ * setup. + *

+ */ private void setup() { - multi = 0.20 + (0.001 *questData.getWin()); + 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; + 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 + + addListeners(); + + // construct topTable, get all cards topModel = new CardShopTableModel(new CardList(), this); topModel.addListeners(topTable); - + topTable.setModel(topModel); topModel.resizeCols(topTable); - - //construct bottomModel + + // 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(); @@ -427,63 +489,87 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, 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() - + // 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 { + try { jbInit(); - } catch(Exception ex) { + } 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; + // 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 TableCellRenderer getCellRenderer(int row, int column) { + TableCellRenderer renderer = new DefaultTableCellRenderer() { + private static final long serialVersionUID = -9208011190616028553L; - public String getToolTipText(){ - return this.getText(); - } - }; - return renderer; - } - }; + public String getToolTipText() { + return this.getText(); + } + }; + return renderer; + } + }; - bottomTable = new JTable(){ - private static final long serialVersionUID = -3703821828491920769L; + 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; - } - }; + 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)), @@ -496,8 +582,9 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, 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)); + // 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) { @@ -511,13 +598,19 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, } }); - if(!Gui_NewGame.useLAFFonts.isSelected()) buyButton.setFont(new java.awt.Font("Dialog", 0, 13)); + if (!Gui_NewGame.useLAFFonts.isSelected()) + buyButton.setFont(new java.awt.Font("Dialog", 0, 13)); buyButton.setBounds(new Rectangle(23, 403, 146, 49)); - + detail.setBounds(new Rectangle(765, 23, 239, 323)); picture.setBounds(new Rectangle(765, 372, 239, 338)); - picture.addMouseListener(new CustomListener()); - //Do not lower statsLabel any lower, we want this to be visible at 1024 x 768 screen size + 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)); @@ -527,10 +620,12 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, 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)); + 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)); + 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); @@ -544,153 +639,171 @@ public class Gui_CardShop extends JFrame implements CardContainer, DeckDisplay, 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); + 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) { + 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); - } + + 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!"); } - else - { - JOptionPane.showMessageDialog(null, "Not enough credits!"); - } - }//if(valid row) - }//buyButton_actionPerformed - - + }// 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) { + if (n != -1) { Card c = bottomModel.rowToCard(n); bottomModel.removeCard(c); - + topModel.addCard(c); topModel.resort(); - //bottomModel.removeCard(c); + // bottomModel.removeCard(c); questData.addCardToShopList(c); - + long price = (long) (multi * c.getValue()); if (questData.getWin() <= 50 && price > 500) - price = 500; + price = 500; questData.addCredits(price); questData.removeCard(c); - + creditsLabel.setText("Total credits: " + questData.getCredits()); - - //remove sold cards from all decks: + + // 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); - } + 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 + + // 3 conditions" 0 cards left, select the same row, select next row int size = bottomModel.getRowCount(); - if(size != 0) { - if(size == n) n--; + if (size != 0) { + if (size == n) + n--; bottomTable.addRowSelectionInterval(n, n); } - }//if(valid row) - }//sellButton_actionPerformed - + }// 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 - @SuppressWarnings("unused") - // refreshGui - private void refreshGui() { - Deck deck = Constant.Runtime.HumanDeck[0]; - if(deck == null) //this is just a patch, i know - deck = new Deck(Constant.Runtime.GameType[0]); - - topModel.clear(); - bottomModel.clear(); - - Card c; - ReadBoosterPack pack = new ReadBoosterPack(); - for(int i = 0; i < deck.countMain(); i++) { - c = AllZone.CardFactory.getCard(deck.getMain(i), AllZone.HumanPlayer); - - //add rarity to card if this is a sealed card pool - if(Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) c.setRarity(pack.getRarity(c.getName())); - - bottomModel.addCard(c); - }//for - - if(deck.isSealed() || deck.isDraft()) { - //add sideboard to GUI - for(int i = 0; i < deck.countSideboard(); i++) { - c = AllZone.CardFactory.getCard(deck.getSideboard(i), AllZone.HumanPlayer); - c.setRarity(pack.getRarity(c.getName())); - topModel.addCard(c); - } - } else { - CardList all = AllZone.CardFactory.getAllCards(); - for(int i = 0; i < all.size(); i++) - topModel.addCard(all.get(i)); - } - - topModel.resort(); - bottomModel.resort(); - }////refreshGui() - - public class CustomListener extends MouseAdapter { - } - + /* + * //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 index 39fbc73c60a..3490d836089 100644 --- a/src/forge/Gui_DeckEditor.java +++ b/src/forge/Gui_DeckEditor.java @@ -1,17 +1,37 @@ - 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 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; -import net.miginfocom.swing.MigLayout; - -import javax.swing.*; +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; @@ -19,598 +39,743 @@ 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.Random; +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 { - private static final long serialVersionUID = 130339644136746796L; - - Gui_DeckEditor_Menu customMenu; - - //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(); + /** 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(); - + 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 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 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 whiteCheckBox = new FilterCheckBox("white", "White"); - public JCheckBox blueCheckBox = new FilterCheckBox("blue", "Blue"); - public JCheckBox blackCheckBox = new FilterCheckBox("black", "Black"); - public JCheckBox redCheckBox = new FilterCheckBox("red", "Red"); - public JCheckBox greenCheckBox = new FilterCheckBox("green", "Green"); - public JCheckBox colorlessCheckBox = new FilterCheckBox("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"); - public JCheckBox landCheckBox = new FilterCheckBox("land", "Land"); - public JCheckBox creatureCheckBox = new FilterCheckBox("creature", "Creature"); - public JCheckBox sorceryCheckBox = new FilterCheckBox("sorcery", "Sorcery"); - public JCheckBox instantCheckBox = new FilterCheckBox("instant", "Instant"); - public JCheckBox planeswalkerCheckBox = new FilterCheckBox("planeswalker", "Planeswalker"); - public JCheckBox artifactCheckBox = new FilterCheckBox("artifact", "Artifact"); - public JCheckBox enchantmentCheckBox = new FilterCheckBox("enchant", "Enchantment"); + /* CHOPPIC */ + public JButton filterButton = new JButton(); + private JTextField searchTextField = new JTextField(); + /* CHOPPIC */ - - /*CHOPPIC*/ - private 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; - 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; - + 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(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + 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++) { + 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.NameChanger.getOriginalName(c.getName()); - if(!pack.getRarity(cardName).equals("error")) { + + cardName = AllZone.getNameChanger().getOriginalName(c.getName()); + if (!pack.getRarity(cardName).equals("error")) { c.setRarity(pack.getRarity(cardName)); } - + boolean filteredOut = filterByColor(c); - - if(!filteredOut) { + + if (!filteredOut) { filteredOut = filterByType(c); } - - //String PC = c.getSVar("PicCount"); + + // 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)); - //} - + // 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()); - + 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)); + 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) { + if (!filteredOut) { topModel.addCard(c); } }// for - + // update bottom - for(int i = 0; i < bottom.size(); i++) { + 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"); + 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)); - //} - + // 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)); + 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); - + // updateDisplay(this.top, this.bottom); + topModel.clear(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + 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++) { + for (int i = 0; i < top.size(); i++) { c = top.get(i); - + // add rarity to card if this is a sealed card pool - - cardName = AllZone.NameChanger.getOriginalName(c.getName()); - if(!pack.getRarity(cardName).equals("error")) { + + cardName = AllZone.getNameChanger().getOriginalName(c.getName()); + if (!pack.getRarity(cardName).equals("error")) { c.setRarity(pack.getRarity(cardName)); } - + boolean filteredOut = filterByColor(c); - - if(!filteredOut) { + + if (!filteredOut) { filteredOut = filterByType(c); } - - if(!filteredOut) { - filteredOut = filterByName(c); + + if (!filteredOut) { + filteredOut = filterByName(c); } - - if(!filteredOut) { - filteredOut = filterByCardType(c); + + if (!filteredOut) { + filteredOut = filterByCardType(c); } - - if(!filteredOut) { - filteredOut = filterByCardDescription(c); + + if (!filteredOut) { + filteredOut = filterByCardDescription(c); } - - if(!filteredOut) { - filteredOut = filterByCardSetCode(c); + + if (!filteredOut) { + filteredOut = filterByCardSetCode(c); } - - - - if(!filteredOut) { + + if (!filteredOut) { topModel.addCard(c); } }// for - + topModel.resort(); } - - /*CHOPPIC*/ + + /* CHOPPIC */ + /** + *

+ * filterByName. + *

+ * + * @param c + * a {@link forge.Card} object. + * @return a boolean. + */ private boolean filterByName(Card c) { - boolean filterOut = false; - if(!(searchTextField.getText() == "")){ - filterOut = !(c.getName().toLowerCase().contains(searchTextField.getText().toLowerCase())); - } - return filterOut; + boolean filterOut = false; + filterOut = !(c.getName().toLowerCase().contains(searchTextField.getText().toLowerCase())); + return filterOut; } - /*CHOPPIC*/ - + + /* 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; + 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; + 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; + 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)) { + + if (!whiteCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.White)) { filterOut = true; } } - - if(!blueCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Blue)) { + + if (!blueCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Blue)) { filterOut = true; } } - - if(!blackCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Black)) { + + if (!blackCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Black)) { filterOut = true; } } - - if(!redCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Red)) { + + if (!redCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Red)) { filterOut = true; } } - - if(!greenCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Green)) { + + if (!greenCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Green)) { filterOut = true; } } - - if(!colorlessCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Colorless)) { + + 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()) { + + if (!landCheckBox.isSelected() && c.isLand()) { filterOut = true; } - - if(!creatureCheckBox.isSelected() && c.isCreature()) { + + if (!creatureCheckBox.isSelected() && c.isCreature()) { filterOut = true; } - - if(!sorceryCheckBox.isSelected() && c.isSorcery()) { + + if (!sorceryCheckBox.isSelected() && c.isSorcery()) { filterOut = true; } - - if(!instantCheckBox.isSelected() && c.isInstant()) { + + if (!instantCheckBox.isSelected() && c.isInstant()) { filterOut = true; } - - if(!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { + + if (!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { filterOut = true; } - - if(!artifactCheckBox.isSelected() && c.isArtifact()) { + + if (!artifactCheckBox.isSelected() && c.isArtifact()) { filterOut = true; } - - if(!enchantmentCheckBox.isSelected() && c.isEnchantment()) { + + 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 - + + // 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 + + // 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!!!! + // 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(); - + + // 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); - }//show(Command) - + + 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)) { + 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; + if (c == null) + return; Image i = ImageCache.getOriginalImage(c); - if(i == null) return; - if(i.getWidth(null) < 300) return; + if (i == null) + return; + if (i.getWidth(null) < 300) + return; glassPane.setVisible(true); } }); - }//addListeners() - + }// addListeners() + + /** + *

+ * setup. + *

+ */ private void setup() { addListeners(); - - //construct topTable, get all cards + + // construct topTable, get all cards topModel = new TableModel(new CardList(), this); topModel.addListeners(topTable); - + topTable.setModel(topModel); topModel.resizeCols(topTable); - - //construct bottomModel + + // construct bottomModel bottomModel = new TableModel(this); bottomModel.addListeners(bottomTable); - + bottomTable.setModel(bottomModel); topModel.resizeCols(bottomTable); - - //get stats from deck + + // 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 + // 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 + + // 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. + + // 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() - + * 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()); - + for (int i = 0; i < 5; i++) + show.append(", ").append(color[i]).append(": ").append(CardListUtil.getColor(deck, color[i]).size()); + return show.toString(); - }//getStats() - + }// getStats() + + /** + *

+ * Constructor for Gui_DeckEditor. + *

+ */ public Gui_DeckEditor() { try { jbInit(); - } catch(Exception ex) { + } 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)), @@ -623,8 +788,9 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay 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.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) { @@ -637,69 +803,82 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay addButton_actionPerformed(e); } }); - //addButton.setIcon(downIcon); - if(!Gui_NewGame.useLAFFonts.isSelected()) addButton.setFont(new java.awt.Font("Dialog", 0, 13)); - - /*CHOPPIC*/ + // 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); + filterButton_actionPerformed(e); } }); - if (!Gui_NewGame.useLAFFonts.isSelected()) filterButton.setFont(new java.awt.Font("Dialog", 0, 13)); - /*CHOPPIC*/ - + 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); + clearFilterButton_actionPerformed(e); } }); - if(!Gui_NewGame.useLAFFonts.isSelected()) clearFilterButton.setFont(new java.awt.Font("Dialog", 0, 13)); - + 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)); - + 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)); - + 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)); - + 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); + if (!Gui_NewGame.useLAFFonts.isSelected()) + landCheckBox.setFont(f); landCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) creatureCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + creatureCheckBox.setFont(f); creatureCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) sorceryCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + sorceryCheckBox.setFont(f); sorceryCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) instantCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + instantCheckBox.setFont(f); instantCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) planeswalkerCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + planeswalkerCheckBox.setFont(f); planeswalkerCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) artifactCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + artifactCheckBox.setFont(f); artifactCheckBox.setOpaque(false); - if(!Gui_NewGame.useLAFFonts.isSelected()) enchantmentCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + enchantmentCheckBox.setFont(f); enchantmentCheckBox.setOpaque(false); /** @@ -711,25 +890,32 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay 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)); + + // 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 + // 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"); */ - + 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, split 16"); this.getContentPane().add(landCheckBox, "cell 0 0, egx checkbox, grow, split 15"); this.getContentPane().add(creatureCheckBox, "grow"); this.getContentPane().add(sorceryCheckBox, "grow"); @@ -737,7 +923,7 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay 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"); @@ -747,19 +933,20 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay 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(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, ""); @@ -768,119 +955,172 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay 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 + * 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) { + if (n != -1) { Card c = topModel.rowToCard(n); - - 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(); - - if(!Constant.GameType.Constructed.equals(customMenu.getGameType())) { + + 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 + + // 3 conditions" 0 cards left, select the same row, select next row int size = topModel.getRowCount(); - if(size != 0) { - if(size == n) n--; + if (size != 0) { + if (size == n) + n--; topTable.addRowSelectionInterval(n, n); } - }//if(valid row) - }//addButton_actionPerformed - - /*CHOPPIC*/ + }// if(valid row) + }// addButton_actionPerformed + + /* CHOPPIC */ + /** + *

+ * filterButton_actionPerformed. + *

+ * + * @param e + * a {@link java.awt.event.ActionEvent} object. + */ void filterButton_actionPerformed(ActionEvent e) { - updateDisplay(); + updateDisplay(); } - /*CHOPPIC*/ - + + /* 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(); - + + 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) { + + if (bottomModel.getRowCount() == 0) { JOptionPane.showMessageDialog(null, "Cards in deck not found.", "Analysis Deck", JOptionPane.INFORMATION_MESSAGE); } else { @@ -890,40 +1130,56 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay g.setEnabled(false); } } - + + /** + *

+ * changePictureButton_actionPerformed. + *

+ * + * @param e + * a {@link java.awt.event.ActionEvent} object. + */ void changePictureButton_actionPerformed(ActionEvent e) { - if(cCardHQ != null) { + if (cCardHQ != null) { File file = getImportFilename(); - if(file != null) { + 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) { + while (fis.available() > 0) { length = fis.read(buff); - if(length > 0) fos.write(buff, 0, length); + if (length > 0) + fos.write(buff, 0, length); } fos.flush(); fis.close(); fos.close(); setCard(cCardHQ); - - } catch(IOException e1) { + + } 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(); @@ -931,192 +1187,188 @@ public class Gui_DeckEditor extends JFrame implements CardContainer, DeckDisplay chooser.addPropertyChangeListener(preview); chooser.addChoosableFileFilter(dckFilter); int returnVal = chooser.showOpenDialog(null); - - if(returnVal == JFileChooser.APPROVE_OPTION) { + + 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"; - } - - }; - - + + @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) { + 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); + 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) { + if (n != -1) { Card c = bottomModel.rowToCard(n); bottomModel.removeCard(c); - - if(!Constant.GameType.Constructed.equals(customMenu.getGameType())) { + + if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { topModel.addCard(c); topModel.resort(); } - - //3 conditions" 0 cards left, select the same row, select next row + + // 3 conditions" 0 cards left, select the same row, select next row int size = bottomModel.getRowCount(); - if(size != 0) { - if(size == n) n--; + if (size != 0) { + if (size == n) + n--; bottomTable.addRowSelectionInterval(n, n); } - }//if(valid row) + }// 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 + + // 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]); - + if (deck == null) // this is just a patch, i know + deck = new Deck(Constant.Runtime.GameType[0]); + topModel.clear(); bottomModel.clear(); - + Card c; - ReadBoosterPack pack = new ReadBoosterPack(); - for(int i = 0; i < deck.countMain(); i++) { - c = AllZone.CardFactory.getCard(deck.getMain(i), AllZone.HumanPlayer); - - //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())); - + // 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.CardFactory.getCard(deck.getSideboard(i), AllZone.HumanPlayer); - c.setRarity(pack.getRarity(c.getName())); + }// 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 { - CardList all = AllZone.CardFactory.getAllCards(); - for(int i = 0; i < all.size(); i++) - { - c = all.get(i); - topModel.addCard(c); + for (Card loopCard : AllZone.getCardFactory()) { + topModel.addCard(loopCard); + c = loopCard; // this might not be necessary } } - + topModel.resort(); bottomModel.resort(); - }////refreshGui() - - /*CHOPPIC*/ - /* Custom check box class for filter icons */ - private class FilterCheckBox extends JCheckBox { - private static final long serialVersionUID = -8099263807219520120L; - - private String imagePath = "res/images/deckeditor/"; - private String iconYes; - private String iconNo; - private FilterCheckBox cb; + } // //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(); + // } + // } + // + // } + // } + // + // } + // } - FilterCheckBox(String filterName, String toolTip){ - super("",true); - cb = this; - iconYes = imagePath + "filter_" + filterName + "_y.png"; - iconNo = imagePath + "filter_" + filterName + "_n.png"; - this.setIcon(new ImageIcon(iconYes)); - this.setToolTipText(toolTip); - this.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent actionEvent) { - if(cb.isSelected()){ - cb.setIcon(new ImageIcon(iconYes)); - } - else { - cb.setIcon(new ImageIcon(iconNo)); - } - } - }); - } - } - - /*CHOPPIC*/ - - 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) { -// 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 index 83d3707219a..9174ab48532 100644 --- a/src/forge/Gui_DeckEditor_Menu.java +++ b/src/forge/Gui_DeckEditor_Menu.java @@ -5,6 +5,7 @@ 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; @@ -23,46 +24,61 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; +//import java.util.HashMap; +//import java.util.Map; - -interface DeckDisplay { - public void updateDisplay(CardList top, CardList bottom); - - //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 - public CardList getTop(); - - //bottom shows cards that the user has chosen for his library - public CardList getBottom(); - - public void setTitle(String message); -} - +/** + *

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 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; - private JMenuItem newDraftItem; + /** + *

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; @@ -75,8 +91,22 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { 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"); @@ -96,8 +126,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { clearfilter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { - CardList all = AllZone.CardFactory.getAllCards(); - deckDisplay.updateDisplay(all, deckDisplay.getBottom()); + //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); @@ -132,6 +163,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } + /** + *

setupSortMenu.

+ */ private void setupSortMenu() { JMenuItem name = new JMenuItem("Card Name"); JMenuItem cost = new JMenuItem("Cost"); @@ -250,11 +284,20 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//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"); @@ -266,9 +309,14 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { currentGameType = Constant.GameType.Constructed; setDeckData("", false); - deckDisplay.updateDisplay(AllZone.CardFactory.getAllCards(), new CardList()); + // 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"); @@ -280,27 +328,24 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { currentGameType = Constant.GameType.Constructed; setDeckData("", false); - CardList all = AllZone.CardFactory.getAllCards(); - all.shuffle(); - CardList random = new CardList(); + 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())); - for (int i = 0; i < (15 * 5); i++) { - random.add(all.remove(0)); - } - - random.add(AllZone.CardFactory.getCard("Forest", AllZone.HumanPlayer)); - random.add(AllZone.CardFactory.getCard("Island", AllZone.HumanPlayer)); - random.add(AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer)); - random.add(AllZone.CardFactory.getCard("Mountain", AllZone.HumanPlayer)); - random.add(AllZone.CardFactory.getCard("Swamp", AllZone.HumanPlayer)); - - random.add(AllZone.CardFactory.getCard("Terramorphic Expanse", AllZone.HumanPlayer)); + 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"); @@ -314,11 +359,13 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { GenerateConstructedDeck gen = new GenerateConstructedDeck(); - deckDisplay.updateDisplay(AllZone.CardFactory.getAllCards(), gen.generateDeck()); + // This is an expensive heap operation. + CardList allCards = new CardList(AllZone.getCardFactory()); + deckDisplay.updateDisplay(allCards, gen.generateDeck()); }//new sealed - private void newSealed() { +/* private void newSealed() { if (debugPrint) { System.out.println("New Sealed"); } @@ -331,8 +378,8 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { deckDisplay.updateDisplay(new ReadBoosterPack().getBoosterPack5(), new CardList()); }//new sealed - - private void newDraft() { +*/ +/* private void newDraft() { if (debugPrint) { System.out.println("New Draft"); } @@ -356,24 +403,24 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { cardName = s[0]; } - top.add(AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer)); + top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); } for (int i = 0; i < deck.countSideboard(); i++) { String cardName = deck.getMain(i); - //String setCode = ""; + String setCode = ""; if (cardName.contains("|")) { String s[] = cardName.split("\\|", 2); cardName = s[0]; - //setCode = s[1]; + setCode = s[1]; } - top.add(AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer)); + top.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); } deckDisplay.updateDisplay(top, new CardList()); }//new draft - +*/ private FileFilter dckFilter = new FileFilter() { @Override @@ -388,6 +435,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }; + /** + *

getImportFilename.

+ * + * @return a {@link java.io.File} object. + */ private File getImportFilename() { JFileChooser chooser = new JFileChooser(previousDirectory); @@ -405,6 +457,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//openFileDialog() + /** + *

showDeck.

+ * + * @param deck a {@link forge.deck.Deck} object. + */ private void showDeck(Deck deck) { String gameType = deck.getDeckType(); @@ -421,12 +478,14 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } }//showDeck() + /** + *

importDeck.

+ */ private void importDeck() { File file = getImportFilename(); if (file == null) { - } - else if (file.getName().endsWith(".dck")) { + } 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 @@ -453,6 +512,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//importDeck() + /** + *

downloadDeck.

+ */ private void downloadDeck() { Object o = JOptionPane.showInputDialog(null, "URL(only from http://magic.tcgplayer.com):", @@ -510,8 +572,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { second = rStr.indexOf(">", first); if (first == 0) { rStr = rStr.substring(second + 1); - } - else { + } else { rStr = rStr.substring(0, first) + " " + rStr.substring(second + 1); } } @@ -555,8 +616,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { trueName[trueCount] = name[i]; trueNumber[trueCount] = number[i]; trueCount = trueCount + 1; - } - else { + } else { falseName[falseCount] = name[i]; falseCount = falseCount + 1; } @@ -584,8 +644,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { if (falseCount == 0) { JOptionPane.showMessageDialog(null, "Deck downloads.", "Information", JOptionPane.INFORMATION_MESSAGE); - } - else { + } else { JOptionPane.showMessageDialog(null, "Sorry, cards:" + falseCards + "\nnot supported in this version MTGForge. \nDeck downloads without this cards.", "Information", JOptionPane.INFORMATION_MESSAGE); @@ -602,6 +661,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } + /** + *

exportDeck.

+ */ private void exportDeck() { File filename = getExportFilename(); @@ -614,7 +676,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { //many Deck objects if it is a draft deck Deck deck = getDeck(); - deck.setName(filename.getName().substring(0,filename.getName().length()-4)); + 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 @@ -640,6 +702,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { // @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(); @@ -651,7 +719,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { cardName = s[0]; } - Card c = AllZone.CardFactory.getCard(cardName, null); + Card c = AllZone.getCardFactory().getCard(cardName, null); all.add(c); } @@ -739,6 +807,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//exportDeckText() + /** + *

getExportFilename.

+ * + * @return a {@link java.io.File} object. + */ private File getExportFilename() { //Object o = null; // unused @@ -758,8 +831,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { if (check.endsWith(".dck")) { return file; - } - else { + } else { return new File(check + ".dck"); } } @@ -767,6 +839,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { return null; } + /** + *

openConstructed.

+ */ private void openConstructed() { if (debugPrint) { System.out.println("Open Constructed"); @@ -783,12 +858,17 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { //must be AFTER get user input, since user could cancel currentGameType = Constant.GameType.Constructed; - newDraftItem.setEnabled(false); + //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); @@ -802,21 +882,25 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { setCode = s[1]; } - Card c = AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer); + Card c = AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer()); if (!setCode.equals("")) { c.setCurSetCode(setCode); - } - else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals("")) + } else if ((c.getSets().size() > 0)) // && card.getCurSetCode().equals("")) { c.setRandomSetCode(); } main.add(c); } - deckDisplay.updateDisplay(AllZone.CardFactory.getAllCards(), main); + // 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"); @@ -833,43 +917,58 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { //must be AFTER get user input, since user could cancel currentGameType = Constant.GameType.Sealed; - newDraftItem.setEnabled(false); + + //newDraftItem.setEnabled(false); Deck deck = deckManager.getDeck(name); showSealedDeck(deck); }//open sealed - private void showSealedDeck(Deck deck) { + /** + *

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(); - 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]; + 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); } - - top.add(AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer)); } CardList bottom = 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]; + 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); } - - bottom.add(AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer)); } - deckDisplay.updateDisplay(top, bottom); }//showSealedDeck() + /** + *

openDraft.

+ */ private void openDraft() { if (debugPrint) { System.out.println("Open Draft"); @@ -883,48 +982,48 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { //must be AFTER get user input, since user could cancel currentGameType = Constant.GameType.Draft; - newDraftItem.setEnabled(true); + //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); - String setCode = ""; if (cardName.contains("|")) { String s[] = cardName.split("\\|", 2); cardName = s[0]; - setCode = s[1]; } - Card c = AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer); - c.setCurSetCode(setCode); - top.add(c); + 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); - String setCode = ""; if (cardName.contains("|")) { String s[] = cardName.split("\\|", 2); cardName = s[0]; - setCode = s[1]; } - Card c = AllZone.CardFactory.getCard(cardName, AllZone.HumanPlayer); - c.setCurSetCode(setCode); - bottom.add(c); + bottom.add(AllZone.getCardFactory().getCard(cardName, AllZone.getHumanPlayer())); } deckDisplay.updateDisplay(top, bottom); }//showDraftDeck() + /** + *

save.

+ */ private void save() { if (debugPrint) { System.out.println("Save"); @@ -932,15 +1031,13 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { if (currentDeckName.equals("")) { saveAs(); - } - else if (currentGameType.equals(Constant.GameType.Draft)) { + } 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 + } else//constructed or sealed { setDeckData(currentDeckName, true); deckManager.deleteDeck(currentDeckName); @@ -948,6 +1045,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } }//save + /** + *

saveAs.

+ */ private void saveAs() { if (debugPrint) { System.out.println("Save As"); @@ -957,8 +1057,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { if (name.equals("")) { return; - } - else if (currentGameType.equals(Constant.GameType.Draft)) { + } else if (currentGameType.equals(Constant.GameType.Draft)) { //MUST copy array Deck[] read = deckManager.getDraftDeck(currentDeckName); Deck[] all = new Deck[read.length]; @@ -969,14 +1068,16 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { all[0] = getDeck(); deckManager.addDraftDeck(all); - } - else//constructed and sealed + } else//constructed and sealed { setDeckData(name, true); deckManager.addDeck(getDeck()); } }//save as + /** + *

delete.

+ */ private void delete() { if (debugPrint) { System.out.println("Delete"); @@ -994,8 +1095,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { if (currentGameType.equals(Constant.GameType.Draft)) { deckManager.deleteDraftDeck(currentDeckName); - } - else { + } else { deckManager.deleteDeck(currentDeckName); } @@ -1003,6 +1103,9 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { deckDisplay.updateDisplay(new CardList(), new CardList()); }//delete + /** + *

close.

+ */ public void close() { if (debugPrint) { System.out.println("Close"); @@ -1015,6 +1118,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { 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; @@ -1022,22 +1131,47 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { 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); @@ -1050,8 +1184,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { boolean isUniqueName; if (currentGameType.equals(Constant.GameType.Draft)) { isUniqueName = deckManager.isUniqueDraft(deckName); - } - else { + } else { isUniqueName = deckManager.isUnique(deckName); } @@ -1064,6 +1197,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//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(); @@ -1077,6 +1216,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } + /** + *

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) { @@ -1095,6 +1240,12 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }//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(); @@ -1104,8 +1255,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { for (String s : deckManager.getDraftDecks().keySet()) { list.add(s); } - } - else { + } else { Collection decks = deckManager.getDecks(); for (Deck deck : decks) { if (deckType.equals(deck.getDeckType())) { @@ -1118,6 +1268,11 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { return list; }//getDecks() + /** + *

getDeck.

+ * + * @return a {@link forge.deck.Deck} object. + */ private Deck getDeck() { Deck deck = new Deck(currentGameType); deck.setName(currentDeckName); @@ -1129,29 +1284,33 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { for (int i = 0; i < list.size(); i++) { if (!list.get(i).getCurSetCode().equals("")) { cardName = list.get(i).getName() + "|" + list.get(i).getCurSetCode(); - } - else { + } else { cardName = list.get(i).getName(); } - deck.addMain(AllZone.NameChanger.getOriginalName(cardName)); + 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(); - deck.addSideboard(AllZone.NameChanger.getOriginalName(cardName)); + 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 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"); @@ -1166,8 +1325,8 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { JMenuItem openSealed = new JMenuItem("Open Deck - Sealed"); JMenuItem openDraft = new JMenuItem("Open Deck - Draft"); - newDraftItem = newDraft; - newDraftItem.setEnabled(false); + //newDraftItem = newDraft; + //newDraftItem.setEnabled(false); JMenuItem save = new JMenuItem("Save"); JMenuItem saveAs = new JMenuItem("Save As"); @@ -1177,8 +1336,8 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { JMenu fileMenu = new JMenu("Deck Actions"); fileMenu.add(newConstructed); - fileMenu.add(newSealed); - fileMenu.add(newDraft); + //fileMenu.add(newSealed); + //fileMenu.add(newDraft); fileMenu.addSeparator(); fileMenu.add(openConstructed); @@ -1299,7 +1458,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { }); - newSealed.addActionListener(new ActionListener() { +/* newSealed.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { try { SwingUtilities.invokeLater(new Runnable() { @@ -1313,8 +1472,8 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } } }); - - newDraft.addActionListener(new ActionListener() { +*/ +/* newDraft.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { try { SwingUtilities.invokeLater(new Runnable() { @@ -1328,7 +1487,7 @@ public class Gui_DeckEditor_Menu extends JMenuBar implements NewConstants { } } }); - +*/ openConstructed.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { try { diff --git a/src/forge/Gui_DownloadPictures.java b/src/forge/Gui_DownloadPictures.java deleted file mode 100644 index 3bc328d37d1..00000000000 --- a/src/forge/Gui_DownloadPictures.java +++ /dev/null @@ -1,708 +0,0 @@ -package forge; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - -import java.awt.Component; -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.IOException; -import java.net.InetSocketAddress; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -import java.util.StringTokenizer; - -import javax.swing.AbstractButton; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.ComboBoxModel; -import javax.swing.DefaultBoundedRangeModel; -import javax.swing.DefaultComboBoxModel; -import javax.swing.JButton; -import javax.swing.JComboBox; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JRadioButton; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.esotericsoftware.minlog.Log; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class Gui_DownloadPictures extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - private static final long serialVersionUID = -7890794857949935256L; - - public static void main(String[] args) { - startDownload(null); - } - - public static final Proxy.Type[] types = Proxy.Type.values(); - - //proxy - private int type; - private JTextField addr, port; - - //progress - private Card[] cards; - private int card; - private boolean cancel; - private JProgressBar bar; - - private JOptionPane dlg; - private JButton close; - private JComboBox jComboBox1; - private JLabel jLabel1; - private String url; - - private Gui_DownloadPictures(Card[] 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); - - p0.add(Box.createVerticalStrut(5)); - jLabel1 = new JLabel(); - jLabel1.setText("Please select server:"); - - jLabel1.setAlignmentX(Component.LEFT_ALIGNMENT); - - p0.add(jLabel1); - p0.add(Box.createVerticalStrut(5)); - ComboBoxModel jComboBox1Model = - new DefaultComboBoxModel( - new String[] { "mtgpics.chutography.com", "pics.slightlymagic.net" }); - jComboBox1 = new JComboBox(); - - jComboBox1.setModel(jComboBox1Model); - jComboBox1.setAlignmentX(Component.LEFT_ALIGNMENT); - p0.add(jComboBox1); - p0.add(Box.createVerticalStrut(5)); - -// 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.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]); - } - - @Override - public int getMinimum() { - return 0; - } - - @Override - public int getValue() { - return card; - } - - @Override - public int getExtent() { - return 0; - } - - @Override - public int getMaximum() { - return cards == null? 0:cards.length; - } - - 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)); - } - - 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; - } - - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - public void run() { - BufferedInputStream in = null; - BufferedOutputStream out = null; - - 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; - for(update(0); card < cards.length && !cancel; update(card + 1)) { - try { - - String tsr; - tsr=cards[card].url.substring(7,15); - - if(tsr.equals("[server]")) - { - - String b = cards[card].url.substring(0,7)+jComboBox1.getSelectedItem().toString()+cards[card].url.substring(15,cards[card].url.length()); - url=b; - - }else - { - 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); - - 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) { - flushAndCloseStreams(in, out); - - //delete what was written so far - f.delete(); - - return; - }//if - cancel - - out.write(buf, 0, len); - }//while - read and write file - - } catch(Exception ex) { - Log.error("HQ Pictures", "Error downloading pictures", ex); - } - finally{ - try { - flushAndCloseStreams(in, out); - } catch (IOException e) { - e.printStackTrace(); - } - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - private void flushAndCloseStreams(BufferedInputStream in, BufferedOutputStream out) throws IOException { - if(in != null) - in.close(); - if(out != null){ - out.flush(); - out.close(); - } - } - - public static void startDownload(JFrame frame) { - final Card[] card = getNeededCards(); - - if(card.length == 0) { - JOptionPane.showMessageDialog(frame, ForgeProps.getLocalized(NO_MORE)); - return; - } - - Gui_DownloadPictures download = new Gui_DownloadPictures(card); - JDialog dlg = download.getDlg(frame); - dlg.setVisible(true); - dlg.dispose(); - download.setCancel(true); - }//startDownload() - - private static Card[] getNeededCards() { - //read all card names and urls - Card[] cardA = readFile(CARD_PICTURES_A); - Card[] cardB = readFile(CARD_PICTURES_B); - Card[] cardC = readFile(CARD_PICTURES_C); - Card[] cardD = readFile(CARD_PICTURES_D); - Card[] cardE = readFile(CARD_PICTURES_E); - Card[] cardF = readFile(CARD_PICTURES_F); - Card[] cardG = readFile(CARD_PICTURES_G); - Card[] cardH = readFile(CARD_PICTURES_H); - Card[] cardI = readFile(CARD_PICTURES_I); - Card[] cardJ = readFile(CARD_PICTURES_J); - Card[] cardK = readFile(CARD_PICTURES_K); - Card[] cardL = readFile(CARD_PICTURES_L); - Card[] cardM = readFile(CARD_PICTURES_M); - Card[] cardN = readFile(CARD_PICTURES_N); - Card[] cardO = readFile(CARD_PICTURES_O); - Card[] cardP = readFile(CARD_PICTURES_P); - Card[] cardQ = readFile(CARD_PICTURES_Q); - Card[] cardR = readFile(CARD_PICTURES_R); - Card[] cardS = readFile(CARD_PICTURES_S); - Card[] cardT = readFile(CARD_PICTURES_T); - Card[] cardU = readFile(CARD_PICTURES_U); - Card[] cardV = readFile(CARD_PICTURES_V); - Card[] cardW = readFile(CARD_PICTURES_W); - Card[] cardX = readFile(CARD_PICTURES_X); - Card[] cardY = readFile(CARD_PICTURES_Y); - Card[] cardZ = readFile(CARD_PICTURES_Z); - Card[] cardOther = readFile(CARD_PICTURES_OTHER); - Card[] cardTokenHQ = readFile(CARD_PICTURES_TOKEN_HQ); - ArrayList list = new ArrayList(); - File file; - - CardList all = AllZone.CardFactory.getAllCards(); - - File base = ForgeProps.getFile(IMAGE_BASE); - - //check to see which cards we already have and which cards Forge support - String cCard; - int simbol; - - for(int k=0;k < all.size();k++){ - cCard = GuiDisplayUtil.cleanString(all.getCard(k).getName().toLowerCase())+".jpg"; - File fileTest = new File(base, cCard); - if(!fileTest.exists()) - { - simbol = cCard.codePointAt(0); - switch (simbol) { - case 97: //a - for(int i = 0; i < cardA.length; i++) { - if(cCard.equals(cardA[i].name.toLowerCase())) - { - list.add(cardA[i]); - break; - } - - } - break; - case 98: //b - for(int i = 0; i < cardB.length; i++) { - if(cCard.equals(cardB[i].name.toLowerCase())) - { - list.add(cardB[i]); - break; - } - } - break; - case 99: //c - for(int i = 0; i < cardC.length; i++) { - if(cCard.equals(cardC[i].name.toLowerCase())) - { - list.add(cardC[i]); - break; - } - - } - break; - case 100: //D - for(int i = 0; i < cardD.length; i++) { - - if(cCard.equals(cardD[i].name.toLowerCase())) - { - list.add(cardD[i]); - break; - } - } - break; - case 101: //E - for(int i = 0; i < cardE.length; i++) { - - if(cCard.equals(cardE[i].name.toLowerCase())) - { - list.add(cardE[i]); - break; - } - } - break; - case 102: //F - for(int i = 0; i < cardF.length; i++) { - - if(cCard.equals(cardF[i].name.toLowerCase())) - { - list.add(cardF[i]); - break; - } - } - break; - case 103: //G - for(int i = 0; i < cardG.length; i++) { - - if(cCard.equals(cardG[i].name.toLowerCase())) - { - list.add(cardG[i]); - break; - } - } - break; - case 104: //H - for(int i = 0; i < cardH.length; i++) { - - if(cCard.equals(cardH[i].name.toLowerCase())) - { - list.add(cardH[i]); - break; - } - } - break; - case 105: //I - for(int i = 0; i < cardI.length; i++) { - - if(cCard.equals(cardI[i].name.toLowerCase())) - { - list.add(cardI[i]); - break; - } - } - break; - case 106: //J - for(int i = 0; i < cardJ.length; i++) { - - if(cCard.equals(cardJ[i].name.toLowerCase())) - { - list.add(cardJ[i]); - break; - } - } - break; - case 107: //K - for(int i = 0; i < cardK.length; i++) { - - if(cCard.equals(cardK[i].name.toLowerCase())) - { - list.add(cardK[i]); - break; - } - } - break; - case 108: //L - for(int i = 0; i < cardL.length; i++) { - - if(cCard.equals(cardL[i].name.toLowerCase())) - { - list.add(cardL[i]); - break; - } - } - break; - case 109: //M - for(int i = 0; i < cardM.length; i++) { - - if(cCard.equals(cardM[i].name.toLowerCase())) - { - list.add(cardM[i]); - break; - } - } - break; - case 110: //N - for(int i = 0; i < cardN.length; i++) { - - if(cCard.equals(cardN[i].name.toLowerCase())) - { - list.add(cardN[i]); - break; - } - } - break; - case 111: //O - for(int i = 0; i < cardO.length; i++) { - - if(cCard.equals(cardO[i].name.toLowerCase())) - { - list.add(cardO[i]); - break; - } - } - break; - case 112: //P - for(int i = 0; i < cardP.length; i++) { - - if(cCard.equals(cardP[i].name.toLowerCase())) - { - list.add(cardP[i]); - break; - } - } - break; - case 113: //Q - for(int i = 0; i < cardQ.length; i++) { - - if(cCard.equals(cardQ[i].name.toLowerCase())) - { - list.add(cardQ[i]); - break; - } - } - break; - case 114: //R - for(int i = 0; i < cardR.length; i++) { - - if(cCard.equals(cardR[i].name.toLowerCase())) - { - list.add(cardR[i]); - break; - } - } - break; - case 115: //S - for(int i = 0; i < cardS.length; i++) { - - if(cCard.equals(cardS[i].name.toLowerCase())) - { - list.add(cardS[i]); - break; - } - } - break; - case 116: //T - for(int i = 0; i < cardT.length; i++) { - - if(cCard.equals(cardT[i].name.toLowerCase())) - { - list.add(cardT[i]); - break; - } - } - break; - case 117: //U - for(int i = 0; i < cardU.length; i++) { - - if(cCard.equals(cardU[i].name.toLowerCase())) - { - list.add(cardU[i]); - break; - } - } - break; - case 118: //V - for(int i = 0; i < cardV.length; i++) { - - if(cCard.equals(cardV[i].name.toLowerCase())) - { - list.add(cardV[i]); - break; - } - } - break; - case 119: //W - for(int i = 0; i < cardW.length; i++) { - - if(cCard.equals(cardW[i].name.toLowerCase())) - { - list.add(cardW[i]); - break; - } - } - break; - case 120: //X - for(int i = 0; i < cardX.length; i++) { - - if(cCard.equals(cardX[i].name.toLowerCase())) - { - list.add(cardX[i]); - break; - } - } - break; - case 121: //Y - for(int i = 0; i < cardY.length; i++) { - - if(cCard.equals(cardY[i].name.toLowerCase())) - { - list.add(cardY[i]); - break; - } - } - break; - case 122: //Z - for(int i = 0; i < cardZ.length; i++) { - - if(cCard.equals(cardZ[i].name.toLowerCase())) - { - list.add(cardZ[i]); - break; - } - } - break; - default: break; - } - } - } - for(int i = 0; i < cardOther.length; i++) { - file = new File(base, cardOther[i].name); - if(!file.exists()) list.add(cardOther[i]); - } - base = ForgeProps.getFile(IMAGE_TOKEN); - for(int i = 0; i < cardTokenHQ.length; i++) { - file = new File(base, cardTokenHQ[i].name.substring(3, cardTokenHQ[i].name.length())); - if(!file.exists()) list.add(cardTokenHQ[i]); - } - - - //return all card names and urls that are needed - Card[] out = new Card[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() - - private static Card[] 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 Card(tok.nextToken(), tok.nextToken())); - - line = in.readLine(); - } - - Card[] out = new Card[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.this.type = type; - addr.setEnabled(type != 0); - port.setEnabled(type != 0); - } - } - } - - private static class Card { - final public String name; - final public String url; - - Card(String cardName, String cardURL) { - name = cardName; - url = cardURL; - } - }//Card -} diff --git a/src/forge/Gui_DownloadPictures_LQ.java b/src/forge/Gui_DownloadPictures_LQ.java index 315a28552a5..c80a1610031 100644 --- a/src/forge/Gui_DownloadPictures_LQ.java +++ b/src/forge/Gui_DownloadPictures_LQ.java @@ -1,381 +1,401 @@ -package forge; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -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 javax.swing.AbstractButton; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.DefaultBoundedRangeModel; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JRadioButton; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.esotericsoftware.minlog.Log; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class Gui_DownloadPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - private static final long serialVersionUID = -7890794857949935256L; - - public static void main(String[] args) { - startDownload(null); - } - - 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 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]); - } - - @Override - public int getMinimum() { - return 0; - } - - @Override - public int getValue() { - return card; - } - - @Override - public int getExtent() { - return 0; - } - - @Override - public int getMaximum() { - return cards == null? 0:cards.length; - } - - 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)); - } - - 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; - } - - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - 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 - - 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() - - 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(); - CardList AllCards = AllZone.CardFactory.getAllCards(); - //Log.error("AllCards.size: " + AllCards.size()); - - for (int i=0; i 1) - for (int j=1; j 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() - - 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 -} \ No newline at end of file +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 index 970e9b0f069..d6f905d05d7 100644 --- a/src/forge/Gui_DownloadPrices.java +++ b/src/forge/Gui_DownloadPrices.java @@ -1,271 +1,262 @@ -package forge; - -import java.awt.Point; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.net.Proxy; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; - -import javax.swing.JButton; -import javax.swing.JFrame; -import javax.swing.JPanel; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants.QUEST; -import forge.properties.NewConstants.LANG.Gui_DownloadPrices.DOWNLOADPRICES; - -public class Gui_DownloadPrices extends JFrame { - - 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 - * - * @return void - */ - 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) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } finally { - try { - if (in != null) - in.close(); - if (out != null) - out.close(); - } catch (IOException ex) { - // TODO: handle exception - } - }// 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) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } finally { - try { - if (fr != null) - fr.close(); - if (fw != null) - fw.close(); - } catch (IOException ex) { - // TODO: handle exception - } - } - return; - } - }); - } - return jButton; - } - -} // @jve:decl-index=0:visual-constraint="10,10" +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 index 3585eb55edb..fc078c02a61 100644 --- a/src/forge/Gui_DownloadSetPictures_LQ.java +++ b/src/forge/Gui_DownloadSetPictures_LQ.java @@ -1,498 +1,511 @@ -package forge; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileReader; -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 javax.swing.AbstractButton; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.DefaultBoundedRangeModel; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JRadioButton; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.esotericsoftware.minlog.Log; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class Gui_DownloadSetPictures_LQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - private static final long serialVersionUID = -7890794857949935256L; - - public static void main(String[] args) { - startDownload(null); - } - - 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(); - 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; - } - - - 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]); - } - - @Override - public int getMinimum() { - return 0; - } - - @Override - public int getValue() { - return card; - } - - @Override - public int getExtent() { - return 0; - } - - @Override - public int getMaximum() { - return cards == null? 0:cards.length; - } - - 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)); - } - - 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; - } - - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - 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(1000) + 420); - } - catch (InterruptedException e) - { - Log.error("LQ Set Pictures", "Sleep Error", e); - } - }//for - } - close.setText(ForgeProps.getLocalized(BUTTONS.CLOSE)); - }//run - - 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() - - 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(); - CardList AllCards = AllZone.CardFactory.getAllCards(); - //Log.error("AllCards.size: " + AllCards.size()); - - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); - String URLBase = "http://cardforge.org/fpics/"; - String imgFN = ""; - - for (int i=0; i cSetInfo = c.getSets(); - if (cSetInfo.size() > 0) - { - for (int j=0; j 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(65)) - 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() - - 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 -} \ No newline at end of file +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 index 58a4b4a2932..a14e2ed9ed8 100644 --- a/src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java +++ b/src/forge/Gui_MigrateLocalMWSSetPictures_HQ.java @@ -1,512 +1,521 @@ -package forge; - -import static java.lang.Integer.parseInt; -import static javax.swing.JOptionPane.DEFAULT_OPTION; -import static javax.swing.JOptionPane.PLAIN_MESSAGE; - -import java.awt.Dimension; -import java.awt.EventQueue; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.BufferedInputStream; -import java.io.BufferedOutputStream; -//import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -//import java.io.FileReader; -import java.io.InputStream; -import java.net.InetSocketAddress; -import java.net.MalformedURLException; -import java.net.Proxy; -import java.util.ArrayList; -//import java.util.Random; -//import java.util.StringTokenizer; - -import javax.swing.AbstractButton; -import javax.swing.Box; -import javax.swing.BoxLayout; -import javax.swing.ButtonGroup; -import javax.swing.DefaultBoundedRangeModel; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JProgressBar; -import javax.swing.JRadioButton; -import javax.swing.JTextField; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; - -import com.esotericsoftware.minlog.Log; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class Gui_MigrateLocalMWSSetPictures_HQ extends DefaultBoundedRangeModel implements Runnable, NewConstants, NewConstants.LANG.Gui_DownloadPictures { - - private static final long serialVersionUID = -7890794857949935256L; - - public static void main(String[] args) { - startDownload(null); - } - - 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(); - 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; - } - - - 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]); - } - - @Override - public int getMinimum() { - return 0; - } - - @Override - public int getValue() { - return card; - } - - @Override - public int getExtent() { - return 0; - } - - @Override - public int getMaximum() { - return cards == null? 0:cards.length; - } - - 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)); - } - - 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; - } - - public void setCancel(boolean cancel) { - this.cancel = cancel; - } - - - 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 - - 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() - - 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(); - CardList AllCards = AllZone.CardFactory.getAllCards(); - //Log.error("AllCards.size: " + AllCards.size()); - - //File imgBase = ForgeProps.getFile(NewConstants.IMAGE_BASE); - String URLBase = "C:\\MTGForge\\HQPICS\\"; - String imgFN = ""; - - for (int i=0; i cSetInfo = c.getSets(); - if (cSetInfo.size() > 0) - { - for (int j=0; j 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 -} \ No newline at end of file +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_MultipleBlockers.java b/src/forge/Gui_MultipleBlockers.java deleted file mode 100644 index f5842887e96..00000000000 --- a/src/forge/Gui_MultipleBlockers.java +++ /dev/null @@ -1,140 +0,0 @@ - -package forge; - - -import java.awt.BorderLayout; -import java.awt.Rectangle; -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; - -import javax.swing.JDialog; -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.SwingConstants; - -import forge.gui.game.CardPanel; - - -public class Gui_MultipleBlockers extends JFrame { - private static final long serialVersionUID = -3585314684734680978L; - - private int assignDamage; - private Card att; - private CardContainer guiDisplay; - - private BorderLayout borderLayout1 = new BorderLayout(); - private JPanel mainPanel = new JPanel(); - private JScrollPane jScrollPane1 = new JScrollPane(); - private JLabel numberLabel = new JLabel(); - private JPanel jPanel3 = new JPanel(); - private BorderLayout borderLayout3 = new BorderLayout(); - private JPanel creaturePanel = new JPanel(); - - public static void main(String[] args) { - CardList list = new CardList(); - list.add(AllZone.CardFactory.getCard("Elvish Piper", null)); - list.add(AllZone.CardFactory.getCard("Lantern Kami", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - list.add(AllZone.CardFactory.getCard("Frostling", null)); - - - for(int i = 0; i < 2; i++) - new Gui_MultipleBlockers(list.get(i), list, i + 1, null); - } - - @SuppressWarnings("deprecation") - // dialog.show is deprecated - public Gui_MultipleBlockers(Card attacker, CardList creatureList, int damage, CardContainer display) { - this(); - assignDamage = damage; - updateDamageLabel();//update user message about assigning damage - guiDisplay = display; - att = attacker; - - for(int i = 0; i < creatureList.size(); i++) - creaturePanel.add(new CardPanel(creatureList.get(i))); - - JDialog dialog = new JDialog(this, true); - dialog.setTitle("Multiple Blockers"); - dialog.setContentPane(mainPanel); - dialog.setSize(470, 260); - dialog.show(); - } - - public Gui_MultipleBlockers() { - try { - jbInit(); - } catch(Exception e) { - e.printStackTrace(); - } -// setSize(470, 280); -// show(); - } - - private void jbInit() throws Exception { - this.getContentPane().setLayout(borderLayout1); - this.setTitle("Multiple Blockers"); - mainPanel.setLayout(null); - numberLabel.setHorizontalAlignment(SwingConstants.CENTER); - numberLabel.setHorizontalTextPosition(SwingConstants.CENTER); - numberLabel.setText("Assign"); - numberLabel.setBounds(new Rectangle(52, 30, 343, 24)); - jPanel3.setLayout(borderLayout3); - jPanel3.setBounds(new Rectangle(26, 75, 399, 114)); - creaturePanel.addMouseListener(new java.awt.event.MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - creaturePanel_mousePressed(e); - } - }); - creaturePanel.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { - @Override - public void mouseMoved(MouseEvent e) { - creaturePanel_mouseMoved(e); - } - }); - mainPanel.add(jPanel3, null); - jPanel3.add(jScrollPane1, BorderLayout.CENTER); - mainPanel.add(numberLabel, null); - jScrollPane1.getViewport().add(creaturePanel, null); - this.getContentPane().add(mainPanel, BorderLayout.CENTER); - } - - void okButton_actionPerformed(ActionEvent e) { - dispose(); - } - - void creaturePanel_mousePressed(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - - CardList cl = new CardList(); - cl.add(att); - c.addAssignedDamage(1, att); - - if(guiDisplay != null) guiDisplay.setCard(c); - } - //reduce damage, show new user message, exit if necessary - assignDamage--; - updateDamageLabel(); - if(assignDamage == 0) dispose(); - }//creaturePanel_mousePressed() - - void updateDamageLabel() { - numberLabel.setText("Assign " + assignDamage + " damage - click on card to assign damage"); - } - - void creaturePanel_mouseMoved(MouseEvent e) { - Object o = creaturePanel.getComponentAt(e.getPoint()); - if(o instanceof CardPanel) { - CardContainer cardPanel = (CardContainer) o; - Card c = cardPanel.getCard(); - - if(guiDisplay != null) guiDisplay.setCard(c); - } - } -} diff --git a/src/forge/Gui_NewGame.java b/src/forge/Gui_NewGame.java index b152d325f04..a51e7a146c0 100644 --- a/src/forge/Gui_NewGame.java +++ b/src/forge/Gui_NewGame.java @@ -7,6 +7,7 @@ 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; @@ -32,233 +33,314 @@ 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 { - private static final long serialVersionUID = -2437047615019135648L; + /** Constant serialVersionUID=-2437047615019135648L. */ + private static final long serialVersionUID = -2437047615019135648L; - private final DeckManager deckManager = new DeckManager(ForgeProps.getFile(NEW_DECKS)); - //with the new IO, there's no reason to use different instances - private List allDecks; - 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 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 JRadioButton draftRadioButton = new JRadioButton(); + 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(); - /*CHOPPIC*/ + 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*/ - + /* CHOPPIC */ + // @SuppressWarnings("unused") // titledBorder2 - private static JCheckBox newGuiCheckBox = new JCheckBox("", true); - private static JCheckBox smoothLandCheckBox = new JCheckBox("", false); - private static JCheckBox devModeCheckBox = new JCheckBox("", true); - + /** 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)); - public static JCheckBoxMenuItem removeArtifacts = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.GENERATE.REMOVE_ARTIFACTS)); - public static JCheckBoxMenuItem useLAFFonts = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.FONT)); - public static JCheckBoxMenuItem cardOverlay = new JCheckBoxMenuItem( - ForgeProps.getLocalized(MENU_BAR.OPTIONS.CARD_OVERLAY)); - 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(); - - static public ForgePreferences preferences; + 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); - } + logFile.delete(); 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); - } catch (Exception e) { - Log.error("Error loading preferences"); - } - - 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.Computer = new ComputerAI_Input(new ComputerAI_General()); - new Gui_NewGame(); - } - }); - } catch(Exception ex) { + 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.QuestData = null; + 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; + + 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) { + } catch (Exception ex) { ErrorViewer.showError(ex); } - - if(Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { + + if (Constant.Runtime.GameType[0].equals(Constant.GameType.Constructed)) { singleRadioButton.setSelected(true); updateDeckComboBoxes(); } - if(Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) { + if (Constant.Runtime.GameType[0].equals(Constant.GameType.Sealed)) { sealedRadioButton.setSelected(true); updateDeckComboBoxes(); } - if(Constant.Runtime.GameType[0].equals(Constant.GameType.Draft)) { + if (Constant.Runtime.GameType[0].equals(Constant.GameType.Draft)) { draftRadioButton.setSelected(true); draftRadioButton_actionPerformed(null); } - + addListeners(); - this.setSize(550, 553); + 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() - + 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, ErrorViewer.ALL_THREADS_ACTION, ABOUT_ACTION}; + // 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) { + for (Action a : actions) { menu.add(a); - if (a.equals(LOOK_AND_FEEL_ACTION) - || a.equals(IMPORT_PICTURE) - || a.equals(CARD_STACK_OFFSET_ACTION) + 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); - + + // 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)) ; + cardScale.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + ImageCache.scaleLargerThanOriginal = cardScale.isSelected(); + } + }); - Action[] helpActions = {HOW_TO_PLAY_ACTION}; - for (Action a:helpActions) { + 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()); - + // 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 @@ -266,106 +348,211 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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() - - @SuppressWarnings("unused") - // setupSealed + } // addListeners() + + /** + *

+ * setupSealed. + *

+ */ private void setupSealed() { Deck deck = new Deck(Constant.GameType.Sealed); - - ReadBoosterPack booster = new ReadBoosterPack(); - CardList pack = booster.getBoosterPack5(); - - for(int i = 0; i < pack.size(); i++) - deck.addSideboard(pack.get(i).getName()); - - Constant.Runtime.HumanDeck[0] = deck; + + // 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); - */ - + + /* + * 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*/ + + /* CHOPPIC */ titleLabel.setForeground(Color.WHITE); - /*CHOPPIC*/ - + /* CHOPPIC */ + titleLabel.setHorizontalAlignment(SwingConstants.CENTER); - + this.getContentPane().setLayout(new MigLayout("fill")); - + /* - * Game Type Panel + * 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.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.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 + * 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) { @@ -374,27 +561,47 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA }); /* - * Settings Panel + * 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)); + + // 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(); - } + 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 + * Buttons */ - + deckEditorButton.setToolTipText(""); deckEditorButton.setFont(new java.awt.Font("Dialog", 0, 15)); deckEditorButton.setText(ForgeProps.getLocalized(NEW_GAME_TEXT.DECK_EDITOR)); @@ -403,7 +610,7 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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)); @@ -415,243 +622,292 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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"); + 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(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%"); - + 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); + + /* 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 */ + } - - /*CHOPPIC*/ - /*Update Panel Display*/ + + /* 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); + 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); + 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*/ - + + /* CHOPPIC */ + + /** + *

+ * deckEditorButton_actionPerformed. + *

+ * + * @param e + * a {@link java.awt.event.ActionEvent} object. + */ void deckEditorButton_actionPerformed(ActionEvent e) { - if(editor == null) { + 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() + } // run() } - }//if - - //refresh decks: + } // 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; - + // 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; - + if (humanComboBox.getSelectedItem() == null || computerComboBox.getSelectedItem() == null) { + return; + } + String human = humanComboBox.getSelectedItem().toString(); - + String computer = null; - if(computerComboBox.getSelectedItem() != null) + if (computerComboBox.getSelectedItem() != null) { computer = computerComboBox.getSelectedItem().toString(); - - if(draftRadioButton.isSelected()) { - if(human.equals("New Draft")) { + } + + if (draftRadioButton.isSelected()) { + if (human.equals("New Draft")) { dispose(); - Gui_BoosterDraft draft = new Gui_BoosterDraft(); - //draft.showGui(new BoosterDraft_1()); - - //determine what kind of booster draft to run - ArrayList draftTypes = new ArrayList(); - draftTypes.add("Full Cardpool Draft"); - draftTypes.add("Block Draft"); - draftTypes.add("Custom Draft"); - - String prompt = "Choose Draft Type:"; - Object o = GuiUtils.getChoice(prompt, draftTypes.toArray()); - - if (o.toString().equals("Full Cardpool Draft")) - draft.showGui(new BoosterDraft_1("Full")); - - else if (o.toString().equals("Block Draft")) - draft.showGui(new BoosterDraft_1("Block")); - - else if (o.toString().equals("Custom Draft")) - draft.showGui(new BoosterDraft_1("Custom")); - + + setupDraft(); + return; - } else//load old draft - { + + } 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 (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 sealed = Constant.GameType.Sealed.equals(format); boolean constructed = Constant.GameType.Constructed.equals(format); - + boolean humanGenerate = human.equals("Generate Deck"); -/* boolean humanGenerateMulti3 = human.equals("Generate 3-Color Deck"); - boolean humanGenerateMulti5 = human.equals("Generate 5-Color Gold Deck"); - boolean humanGenerateTheme = human.equals("Generate Theme Deck"); - boolean humanGenerate2Color = human.equals("Generate 2 Color Deck");*/ boolean humanRandom = human.equals("Random"); - if(humanGenerate) { - if(constructed) genDecks("H"); //Constant.Runtime.HumanDeck[0] = generateConstructedDeck(); - else if(sealed) Constant.Runtime.HumanDeck[0] = generateSealedDeck(); - } /*else if(humanGenerateMulti3) { - if(constructed) Constant.Runtime.HumanDeck[0] = generateConstructed3ColorDeck(); - } else if(humanGenerateMulti5) { - if(constructed) Constant.Runtime.HumanDeck[0] = generateConstructed5ColorDeck(); - } else if (humanGenerateTheme) { - if (constructed) Constant.Runtime.HumanDeck[0] = generateConstructedThemeDeck(); - } else if (humanGenerate2Color) { - if (constructed) Constant.Runtime.HumanDeck[0] = generate2ColorDeck("H"); - }*/ else if(humanRandom) { + + 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); + + 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 computerGenerateMulti3 = computer.equals("Generate 3-Color Deck"); - boolean computerGenerateMulti5 = computer.equals("Generate 5-Color Gold Deck"); - boolean computerGenerateTheme = computer.equals("Generate Theme Deck"); - boolean computerGenerate2Color = computer.equals("Generate 2 Color 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(computerGenerateMulti3) { - if(constructed) Constant.Runtime.ComputerDeck[0] = generateConstructed3ColorDeck(); - } else if(computerGenerateMulti5) { - if(constructed) Constant.Runtime.ComputerDeck[0] = generateConstructed5ColorDeck(); - } else if (computerGenerateTheme) { - if (constructed) Constant.Runtime.ComputerDeck[0] = generateConstructedThemeDeck(); - } else if (computerGenerate2Color) { - if (constructed) Constant.Runtime.ComputerDeck[0] = generate2ColorDeck("C"); - }*/ else if(computerRandom) { + + 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); + + 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.Display = new GuiDisplay4(); - else AllZone.Display = new GuiDisplay3(); - + } // 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.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - AllZone.Display.setVisible(true); - + 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; - } - - private void genDecks(String p) - { - Deck d = null; - + } // 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)"); @@ -659,234 +915,326 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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 "; + 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; + + 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++) + + 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++) + + 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++) + + for (int i = 0; i < 60; i++) { deck.addMain(name.get(i).getName()); + } return deck; } - - 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 + * 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; } - - 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; + + /** + *

+ * 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 colors = new ArrayList(); - colors.add("Random"); - colors.add("white"); - colors.add("blue"); - colors.add("black"); - colors.add("red"); - colors.add("green"); - - String c1; + /** + *

+ * 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); + if (p.equals("H")) { + c1 = GuiUtils.getChoice("Select first color.", colors.toArray()).toString(); - } - 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 + * 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]) - || Constant.GameType.Constructed.equals(Constant.Runtime.GameType[0])) { + + 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.Runtime.GameType[0])) { - 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()*/ - + 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; @@ -894,20 +1242,28 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA if (d.getDeckType().equals(gameType)) { list.add(d); } - }//for - - //convert ArrayList to Deck[] + } // for + + // convert ArrayList to Deck[] Deck[] out = new Deck[list.size()]; list.toArray(out); - + return out; - }//getDecks() - + } // 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); @@ -915,33 +1271,42 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA for (Object aKey : key) { humanComboBox.addItem(aKey); } - - for(int i = 0; i < 7; i++) + + 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() */ - + } /* draftRadioButton_actionPerformed() */ + public static class LookAndFeelAction extends AbstractAction { - + private static final long serialVersionUID = -4447498333866711215L; - private Component c; - + 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: + + // 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"); @@ -952,17 +1317,26 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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.api.skin.SubstanceGeminiLookAndFeel"); - LAFMap.put("Graphite Aqua", "org.jvnet.substance.api.skin.SubstanceGraphiteAquaLookAndFeel"); - LAFMap.put("Moderate", "org.jvnet.substance.skin.SubstanceModerateLookAndFeel"); - LAFMap.put("Magellan", "org.jvnet.substance.api.skin.SubstanceMagellanLookAndFeel"); + // 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("Napkin", "net.sourceforge.napkinlaf.NapkinLookAndFeel"); + 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("NimROD", "com.nilo.plaf.nimrod.NimRODLookAndFeel"); + // 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"); @@ -970,7 +1344,7 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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; @@ -978,203 +1352,233 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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); + 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); - } + 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 DownloadAction extends AbstractAction { + public static class BugzReporterAction extends AbstractAction { - private static final long serialVersionUID = 6564425021778307101L; - - public DownloadAction() { - super(ForgeProps.getLocalized(MENU_BAR.MENU.DOWNLOAD)); + public BugzReporterAction() { + super("Report Bug"); } public void actionPerformed(ActionEvent e) { - - Gui_DownloadPictures.startDownload(null); + 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); - } + 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}; - + 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); + 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]; + 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]; + 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}; - + 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); + if (ch.show()) { + try { + int index = ch.getSelectedIndex(); + if (index == -1) { + return; + } + set(index); - } catch(Exception ex) { - ErrorViewer.showError(ex); + } catch (Exception ex) { + ErrorViewer.showError(ex); + } } } - + public static void set(int index) { - preferences.maxStackSize = values[index]; - Constant.Runtime.stackSize[0] = values[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; + 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}; - + + 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); + if (ch.show()) { + try { + int index = ch.getSelectedIndex(); + if (index == -1) { + return; + } + set(index); - } catch(Exception ex) { - ErrorViewer.showError(ex); + } 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]; + 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]; + 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 { + public static class HowToPlayAction extends AbstractAction { private static final long serialVersionUID = 5552000208438248428L; @@ -1185,97 +1589,220 @@ public class Gui_NewGame extends JFrame implements NewConstants, NewConstants.LA 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("I enjoyed programming this project. I'm glad other people also enjoy my program. MTG Forge has turned out to be very successful.\n\nmtgrares@yahoo.com\nhttp://mtgrares.blogspot.com\n\nWritten by: Forge\n\n(Quest icons used created by Teekatas, from his Legendora set:\n http://raindropmemory.deviantart.com)"); - + 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); } } - - 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.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; - } + /** + *

+ * 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; + } + } - 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 */ + 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; - } + private static final long serialVersionUID = 774205995101881824L; + private final int 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); - } + 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); + } } - - /*CHOPPIC*/ - -} \ No newline at end of file + + 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 index f0d58356477..0d2c98273f0 100644 --- a/src/forge/Gui_QuestOptions.java +++ b/src/forge/Gui_QuestOptions.java @@ -9,63 +9,71 @@ import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.Color; -import java.awt.GridLayout; -import java.awt.Rectangle; +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 { - private static final long serialVersionUID = 2018518804206822235L; + /** 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(); + 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(); - public static void main(String[] args) { - new Gui_QuestOptions(); - } - + 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) { + } catch (Exception ex) { ErrorViewer.showError(ex); } - + setup(); setupRadioButtonText(); - this.setSize(540,555); + 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 @@ -74,22 +82,30 @@ public class Gui_QuestOptions extends JFrame { new Gui_NewGame(); } }); - + //is there any saved data? - if(!questData.hasSaveFile()) continueQuestButton.setEnabled(false); + 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++) { + + 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)), @@ -113,24 +129,25 @@ public class Gui_QuestOptions extends JFrame { 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"); @@ -139,7 +156,7 @@ public class Gui_QuestOptions extends JFrame { 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."); @@ -147,7 +164,7 @@ public class Gui_QuestOptions extends JFrame { 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)); @@ -158,20 +175,20 @@ public class Gui_QuestOptions extends JFrame { 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(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); @@ -183,61 +200,71 @@ public class Gui_QuestOptions extends JFrame { 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.QuestData = QuestDataIO.loadData(); - AllZone.QuestData.setDifficultyIndex(); + AllZone.setQuestData(QuestDataIO.loadData()); + AllZone.getQuestData().setDifficultyIndex(); dispose(); - - new QuestFrame(); + + 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; - + + 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[0]); - - if (!choice.equals(0)) - return; + 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.QuestData = questData; - + AllZone.setQuestData(questData); + dispose(); new QuestFrame(); } - + } diff --git a/src/forge/Gui_Quest_DeckEditor.java b/src/forge/Gui_Quest_DeckEditor.java index 2a2f5dfc525..d8a47ec3fff 100644 --- a/src/forge/Gui_Quest_DeckEditor.java +++ b/src/forge/Gui_Quest_DeckEditor.java @@ -1,19 +1,17 @@ - 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 forge.quest.data.QuestBoosterPack; 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; @@ -25,447 +23,515 @@ 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 { - private static final long serialVersionUID = 152061168634545L; - + /** 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(); + + // 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; - private static File previousDirectory = null; - - private CardDetailPanel detail = new CardDetailPanel(null); - private CardPicturePanel picture = new CardPicturePanel(null); - private JPanel glassPane; - + 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(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + top = AllZone.getNameChanger().changeCardsIfNeeded(top); + bottom = AllZone.getNameChanger().changeCardsIfNeeded(bottom); + Card c; String cardName; - //QuestBoosterPack pack = new QuestBoosterPack(); - - java.util.List addedList = AllZone.QuestData.getAddedCards(); - + // QuestBoosterPack pack = new QuestBoosterPack(); - //update top - for(int i = 0; i < top.size(); i++) { + 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"); + + 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)); - //} - + // 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()); - + 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)); + 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++) { + }// 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"); + // 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)); - //} - + // 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()); - + 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)); + 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 - + }// for + topModel.resort(); bottomModel.resort(); - }//updateDisplay - + }// updateDisplay + + /** + *

+ * updateDisplay. + *

+ */ public void updateDisplay() { - //updateDisplay(this.top, this.bottom); - + // updateDisplay(this.top, this.bottom); + topModel.clear(); - - if(AllZone.NameChanger.shouldChangeCardName()) { - top = new CardList(AllZone.NameChanger.changeCard(top.toArray())); - bottom = new CardList(AllZone.NameChanger.changeCard(bottom.toArray())); - } - + + 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++) { + for (int i = 0; i < top.size(); i++) { c = top.get(i); - + // add rarity to card if this is a sealed card pool - - cardName = AllZone.NameChanger.getOriginalName(c.getName()); - if(!pack.getRarity(cardName).equals("error")) { + + cardName = AllZone.getNameChanger().getOriginalName(c.getName()); + if (!pack.getRarity(cardName).equals("error")) { c.setRarity(pack.getRarity(cardName)); } - + boolean filteredOut = filterByColor(c); - - if(!filteredOut) { + + if (!filteredOut) { filteredOut = filterByType(c); } - - if(!filteredOut) { + + 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)) { + + if (!whiteCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.White)) { filterOut = true; } } - - if(!blueCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Blue)) { + + if (!blueCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Blue)) { filterOut = true; } } - - if(!blackCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Black)) { + + if (!blackCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Black)) { filterOut = true; } } - - if(!redCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Red)) { + + if (!redCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Red)) { filterOut = true; } } - - if(!greenCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Green)) { + + if (!greenCheckBox.isSelected()) { + if (CardUtil.getColors(c).contains(Constant.Color.Green)) { filterOut = true; } } - - if(!colorlessCheckBox.isSelected()) { - if(CardUtil.getColors(c).contains(Constant.Color.Colorless)) { + + 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()) { + + if (!landCheckBox.isSelected() && c.isLand()) { filterOut = true; } - - if(!creatureCheckBox.isSelected() && c.isCreature()) { + + if (!creatureCheckBox.isSelected() && c.isCreature()) { filterOut = true; } - - if(!sorceryCheckBox.isSelected() && c.isSorcery()) { + + if (!sorceryCheckBox.isSelected() && c.isSorcery()) { filterOut = true; } - - if(!instantCheckBox.isSelected() && c.isInstant()) { + + if (!instantCheckBox.isSelected() && c.isInstant()) { filterOut = true; } - - if(!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { + + if (!planeswalkerCheckBox.isSelected() && c.isPlaneswalker()) { filterOut = true; } - - if(!artifactCheckBox.isSelected() && c.isArtifact()) { + + if (!artifactCheckBox.isSelected() && c.isArtifact()) { filterOut = true; } - - if(!enchantmentCheckBox.isSelected() && c.isEnchantment()) { + + 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 + + // 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 + + // 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!!!! + + // 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.QuestData; + 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 + + // 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 + + // 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 + // 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.CardFactory.getCard(deck.getMain(i), null)); + for (int i = 0; i < deck.countMain(); i++) { + bottom.add(AllZone.getCardFactory().getCard(deck.getMain(i), null)); } - - java.util.List list = AllZone.QuestData.getCardpool(); + 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 - + // 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) - + }// 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)) { + 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; + if (c == null) + return; Image i = ImageCache.getOriginalImage(c); - if(i == null) return; - if(i.getWidth(null) < 200) return; + if (i == null) + return; + if (i.getWidth(null) < 200) + return; glassPane.setVisible(true); } }); - }//addListeners() - + }// addListeners() + + /** + *

+ * setup. + *

+ */ public void setup() { addListeners(); - - //construct topTable, get all cards + + // construct topTable, get all cards topModel = new TableModel(new CardList(), this); topModel.addListeners(topTable); topTable.setModel(topModel); topModel.resizeCols(topTable); - - //construct bottomModel + + // construct bottomModel bottomModel = new TableModel(this); bottomModel.addListeners(bottomTable); bottomTable.setModel(bottomModel); bottomModel.resizeCols(bottomTable); - - //get stats from deck + + // 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 + // 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(); @@ -475,48 +541,78 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD 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() - + // 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); + 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++) + for (int i = 0; i < 5; i++) show.append(", ").append(color[i]).append(" - ").append(CardListUtil.getColor(deck, color[i]).size()); - + return show.toString(); - }//getStats() - + }// getStats() + + /** + *

+ * Constructor for Gui_Quest_DeckEditor. + *

+ */ public Gui_Quest_DeckEditor() { try { filterUsed = false; jbInit(); - } catch(Exception ex) { + } 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"); @@ -528,8 +624,9 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD 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.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) { @@ -542,43 +639,48 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD addButton_actionPerformed(e); } }); - //addButton.setIcon(downIcon); - if(!Gui_NewGame.useLAFFonts.isSelected()) addButton.setFont(new java.awt.Font("Dialog", 0, 13)); + // 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)); + 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)); + 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)); + 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); + if (!Gui_NewGame.useLAFFonts.isSelected()) + landCheckBox.setFont(f); landCheckBox.setOpaque(false); landCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -586,7 +688,8 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD } }); creatureCheckBox.setBounds(385, 400, 65, 20); - if(!Gui_NewGame.useLAFFonts.isSelected()) creatureCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + creatureCheckBox.setFont(f); creatureCheckBox.setOpaque(false); creatureCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -594,7 +697,8 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD } }); sorceryCheckBox.setBounds(447, 400, 62, 20); - if(!Gui_NewGame.useLAFFonts.isSelected()) sorceryCheckBox.setFont(f); + if (!Gui_NewGame.useLAFFonts.isSelected()) + sorceryCheckBox.setFont(f); sorceryCheckBox.setOpaque(false); sorceryCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -602,16 +706,18 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD } }); instantCheckBox.setBounds(505, 400, 60, 20); - if(!Gui_NewGame.useLAFFonts.isSelected()) instantCheckBox.setFont(f); + 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); + if (!Gui_NewGame.useLAFFonts.isSelected()) + planeswalkerCheckBox.setFont(f); planeswalkerCheckBox.setOpaque(false); planeswalkerCheckBox.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { @@ -619,31 +725,33 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD } }); artifactCheckBox.setBounds(638, 400, 58, 20); - if(!Gui_NewGame.useLAFFonts.isSelected()) artifactCheckBox.setFont(f); + 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); + 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(); } @@ -651,7 +759,7 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD blueCheckBox.setBounds(380, 430, 40, 20); blueCheckBox.setOpaque(false); blueCheckBox.addItemListener(new ItemListener() { - + public void itemStateChanged(ItemEvent e) { updateDisplay(); } @@ -659,7 +767,7 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD blackCheckBox.setBounds(420, 430, 40, 20); blackCheckBox.setOpaque(false); blackCheckBox.addItemListener(new ItemListener() { - + public void itemStateChanged(ItemEvent e) { updateDisplay(); } @@ -667,7 +775,7 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD redCheckBox.setBounds(460, 430, 40, 20); redCheckBox.setOpaque(false); redCheckBox.addItemListener(new ItemListener() { - + public void itemStateChanged(ItemEvent e) { updateDisplay(); } @@ -675,7 +783,7 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD greenCheckBox.setBounds(500, 430, 40, 20); greenCheckBox.setOpaque(false); greenCheckBox.addItemListener(new ItemListener() { - + public void itemStateChanged(ItemEvent e) { updateDisplay(); } @@ -683,30 +791,35 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD 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 CustomListener()); - if(!Gui_NewGame.useLAFFonts.isSelected()) statsLabel.setFont(new java.awt.Font("Dialog", 0, 14)); + 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 + // 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)); + 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); @@ -723,7 +836,7 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD 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); @@ -731,63 +844,78 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD 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); + 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) { + if (n != -1) { Card c = topModel.rowToCard(n); bottomModel.addCard(c); bottomModel.resort(); - if(filterUsed == true) { + if (filterUsed == true) { stCardList.remove(c.getName()); stCardList.shuffle(); } - - if(!Constant.GameType.Constructed.equals(customMenu.getGameType())) { + if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { topModel.removeCard(c); - if(filterUsed == false) { + if (filterUsed == false) { stCardList = this.getTop(); } - + } - - //3 conditions" 0 cards left, select the same row, select next row + + // 3 conditions" 0 cards left, select the same row, select next row int size = topModel.getRowCount(); - if(size != 0) { - if(size == n) n--; + if (size != 0) { + if (size == n) + n--; topTable.addRowSelectionInterval(n, n); } - }//if(valid row) - + }// if(valid row) - }//addButton_actionPerformed - + }// addButton_actionPerformed + + /** + *

+ * analysisButton_actionPerformed. + *

+ * + * @param e + * a {@link java.awt.event.ActionEvent} object. + */ void analysisButton_actionPerformed(ActionEvent e) { - - if(bottomModel.getRowCount() == 0) { + + if (bottomModel.getRowCount() == 0) { JOptionPane.showMessageDialog(null, "Cards in deck not found.", "Analysis Deck", JOptionPane.INFORMATION_MESSAGE); } else { @@ -797,40 +925,56 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD g.setEnabled(false); } } - + + /** + *

+ * changePictureButton_actionPerformed. + *

+ * + * @param e + * a {@link java.awt.event.ActionEvent} object. + */ void changePictureButton_actionPerformed(ActionEvent e) { - if(cCardHQ != null) { + if (cCardHQ != null) { File file = getImportFilename(); - if(file != null) { + 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) { + while (fis.available() > 0) { length = fis.read(buff); - if(length > 0) fos.write(buff, 0, length); + if (length > 0) + fos.write(buff, 0, length); } fos.flush(); fis.close(); fos.close(); setCard(cCardHQ); - - } catch(IOException e1) { + + } 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(); @@ -838,165 +982,188 @@ public class Gui_Quest_DeckEditor extends JFrame implements CardContainer, DeckD chooser.addPropertyChangeListener(preview); chooser.addChoosableFileFilter(dckFilter); int returnVal = chooser.showOpenDialog(null); - - if(returnVal == JFileChooser.APPROVE_OPTION) { + + 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"; - } - - }; - - + + @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) { + 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); + 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) { + if (n != -1) { Card c = bottomModel.rowToCard(n); bottomModel.removeCard(c); - if(filterUsed == true) { + if (filterUsed == true) { stCardList.add(c); } - - if(!Constant.GameType.Constructed.equals(customMenu.getGameType())) { + + if (!Constant.GameType.Constructed.equals(customMenu.getGameType())) { topModel.addCard(c); topModel.resort(); - if(filterUsed == false) { + if (filterUsed == false) { stCardList = this.getTop(); } } - - //3 conditions" 0 cards left, select the same row, select next row + + // 3 conditions" 0 cards left, select the same row, select next row int size = bottomModel.getRowCount(); - if(size != 0) { - if(size == n) n--; + if (size != 0) { + if (size == n) + n--; bottomTable.addRowSelectionInterval(n, n); } - }//if(valid row) - + }// if(valid row) - }//removeButton_actionPerformed - + }// 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 - @SuppressWarnings("unused") - // refreshGui - private void refreshGui() { - Deck deck = Constant.Runtime.HumanDeck[0]; - if(deck == null) //this is just a patch, i know - deck = new Deck(Constant.Runtime.GameType[0]); - - topModel.clear(); - bottomModel.clear(); - - Card c; - ReadBoosterPack pack = new ReadBoosterPack(); - for(int i = 0; i < deck.countMain(); i++) { - c = AllZone.CardFactory.getCard(deck.getMain(i), AllZone.HumanPlayer); - - c.setRarity(pack.getRarity(c.getName())); - - bottomModel.addCard(c); - }//for - - if(deck.isSealed() || deck.isDraft()) { - //add sideboard to GUI - for(int i = 0; i < deck.countSideboard(); i++) { - c = AllZone.CardFactory.getCard(deck.getSideboard(i), AllZone.HumanPlayer); - c.setRarity(pack.getRarity(c.getName())); - topModel.addCard(c); - } - } else { - CardList all = AllZone.CardFactory.getAllCards(); - for(int i = 0; i < all.size(); i++) - topModel.addCard(all.get(i)); - } - - topModel.resort(); - bottomModel.resort(); - }////refreshGui() - - public class CustomListener extends MouseAdapter { -// 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(); -// } -// } -// -// } -// } -// -// } - } - + /* + * //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 index 483cdaa82e3..b1095117e0b 100644 --- a/src/forge/Gui_Quest_DeckEditor_Menu.java +++ b/src/forge/Gui_Quest_DeckEditor_Menu.java @@ -1,8 +1,8 @@ - package forge; import forge.deck.Deck; +import forge.deck.DeckManager; import forge.error.ErrorViewer; import forge.gui.GuiUtils; import forge.quest.data.QuestBattleManager; @@ -13,55 +13,76 @@ import javax.swing.event.ListSelectionListener; import javax.swing.filechooser.FileFilter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.*; +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.QuestData is not null +//presumes AllZone.getQuestData() is not null +/** + *

Gui_Quest_DeckEditor_Menu class.

+ * + * @author Forge + * @version $Id: $ + */ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { - private static final long serialVersionUID = -4052319220021158574L; - + /** 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; - - private static final String deckEditorName = "Deck Editor"; - + 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 - private static File previousDirectory = null; - - private Command exitCommand; - private forge.quest.data.QuestData questData; - private Deck currentDeck; - + /** 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; - - + 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; + if (f.exists()) canEditComputerDecks = true; else canEditComputerDecks = false; - - + + deckDisplay = d; d.setTitle(deckEditorName); - - questData = AllZone.QuestData; - + + questData = AllZone.getQuestData(); + exitCommand = exit; - + setupMenu(); setupFilterMenu(); - - if(canEditComputerDecks) setupComputerMenu(); + + if (canEditComputerDecks) setupComputerMenu(); } - + + /** + *

setupFilterMenu.

+ */ private void setupFilterMenu() { JMenuItem filter = new JMenuItem("New filter"); JMenuItem clearfilter = new JMenuItem("Clear filter"); @@ -69,11 +90,11 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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) { + if (g.stCardList == null) { g.blackCheckBox.setSelected(true); g.blackCheckBox.setEnabled(true); g.blueCheckBox.setSelected(true); @@ -141,9 +162,9 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { }); clearfilter.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { - + Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor) deckDisplay; - if(g.stCardList == null) { + if (g.stCardList == null) { g.blackCheckBox.setSelected(true); g.blackCheckBox.setEnabled(true); g.blueCheckBox.setSelected(true); @@ -201,103 +222,119 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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(isHumanMenu); + 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; - + + if (filename == null) return; + //write is an Object variable because you might just //write one Deck object - Deck deck = convertCardListToDeck(deckDisplay.getBottom());; + 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) { + } 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++) { + for (int i = 0; i < aDeck.countMain(); i++) { String cardName = aDeck.getMain(i); - Card c = AllZone.CardFactory.getCard(cardName, null); - + 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++) { + for (int i = 0; i < all.size(); i++) { Card c = all.get(i); - - if(!noCopies.containsName(c.getName())) noCopies.add(c); + + 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++) { + + for (int i = 0; i < noCopies.size(); i++) { Card c = noCopies.get(i); - if(c.isCreature()) { + 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) { @@ -305,72 +342,88 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { } };//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++) { + + for (int i = 0; i < noCopies.size(); i++) { Card c = noCopies.get(i); - if(!(c.isCreature() || c.isLand())) { + 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++) { + + for (int i = 0; i < noCopies.size(); i++) { Card c = noCopies.get(i); - if(c.isLand()) { + 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) { + } 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(".deck") || f.isDirectory(); + return f.getName().endsWith(".dck") || f.isDirectory(); } - + @Override public String getDescription() { - return "Deck File .deck"; + return "Deck File .dck"; } }; - + return filter; }//getFileFilter() + /** + *

getExportFilename.

+ * + * @return a {@link java.io.File} object. + */ private File getExportFilename() { //Object o = null; // unused @@ -383,19 +436,63 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { int returnVal = save.showSaveDialog(null); - if(returnVal == JFileChooser.APPROVE_OPTION) { + if (returnVal == JFileChooser.APPROVE_OPTION) { File file = save.getSelectedFile(); String check = file.getAbsolutePath(); previousDirectory = file.getParentFile(); - if(check.endsWith(".deck")) return file; + 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(); @@ -440,11 +537,11 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { //setCode = s[1]; } - cardpool.add(AllZone.CardFactory.getCard(cardName, null)); + cardpool.add(AllZone.getCardFactory().getCard(cardName, null)); } } else { QuestBattleManager.addAIDeck(deck); - cardpool = AllZone.CardFactory.getAllCards(); + cardpool = AllZone.getCardFactory().getAllCards(); } //convert Deck main to CardList @@ -459,21 +556,26 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { //setCode = s[1]; } - deckList.add(AllZone.CardFactory.getCard(cardName, null)); + 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) { + if (returnVal == JFileChooser.APPROVE_OPTION) { File file = chooser.getSelectedFile(); previousDirectory = file.getParentFile(); return file; @@ -483,6 +585,9 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { }//openFileDialog() //edit the AI decks + /** + *

setupComputerMenu.

+ */ private void setupComputerMenu() { JMenuItem open = new JMenuItem("Open"); JMenuItem new2 = new JMenuItem("New"); @@ -491,17 +596,17 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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(); @@ -511,138 +616,143 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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; - + 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]; + + 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.CardFactory.getCard(cardName, null)); + deck.add(AllZone.getCardFactory().getCard(cardName, null)); } - CardList cardpool = AllZone.CardFactory.getAllCards(); - + // 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) { - deckDisplay.updateDisplay(AllZone.CardFactory.getAllCards(), new CardList()); - + // 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; - + 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 - + 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("")) { + if (name.equals("")) { name = getUserInput_GetDeckName(QuestBattleManager.getAIDeckNames()); - + //check if user cancels - if(name.equals("")) return; + 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; - + 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; - + 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 - + if (check == JOptionPane.NO_OPTION) return;//stop here + QuestBattleManager.removeAIDeck(currentDeck.getName()); - + //show card pool - CardList cardpool = AllZone.CardFactory.getAllCards(); - deckDisplay.updateDisplay(cardpool, new CardList()); + // This is an expensive heap operation. + CardList cardpool = new CardList(AllZone.getCardFactory()); + deckDisplay.updateDisplay(cardpool, new CardList()); + setComputerPlayer(""); } });//delete - + //AI exit.addActionListener(new ActionListener() { @@ -650,59 +760,69 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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]; + + 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.CardFactory.getCard(cardName, null)); - } + + deck.add(AllZone.getCardFactory().getCard(cardName, null)); + //remove any cards that are in the deck from the card pool - cardpool.remove(d.getMain(i)); + } - + 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"); @@ -711,7 +831,7 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { JMenuItem copy = new JMenuItem("Copy"); JMenuItem delete = new JMenuItem("Delete"); JMenuItem exit = new JMenuItem("Exit"); - + //////////////////////////////////////////// //below is new code @@ -719,217 +839,207 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { JMenuItem addCard = new JMenuItem("Cheat - Add Card"); //add card - addCard.addActionListener(new ActionListener() - { - public void actionPerformed(ActionEvent a) - { - //sort cards by card name - CardList cardList = AllZone.CardFactory.getAllCards(); - TableSorter sorter = new TableSorter(cardList, 1, true); - cardList.sort(sorter); + 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; + //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; + BetterCard(Card c) { + card = c; - //this line is very important - //if you omit this, errors will occur - this.setName(c.getName()); - } + //this line is very important + //if you omit this, errors will occur + this.setName(c.getName()); + } - public String toString() - { - return card.getName(); - } - }//BetterCard + public String toString() { + return card.getName(); + } + }//BetterCard - Card[] card = cardList.toArray(); + Card[] card = cardList.toArray(); - for(int i = 0; i < card.length; i++) - { - card[i] = new BetterCard(card[i]); - } + 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); + 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()); - - */ - - } - }); + //update the "card detail" on the right with the card info + list.addListSelectionListener(new ListSelectionListener() { + public void valueChanged(ListSelectionEvent e) { - Object[] o = {"Add Card to Your Cardpool", new JScrollPane(list)}; - JOptionPane pane = new JOptionPane(o, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); + /* I think that the code that was based in CardDetailUtil + has been changed and moved to a new/different class? - JDialog dialog = pane.createDialog(null, "Cheat - Add Card"); - dialog.setModal(true); - dialog.setVisible(true); + CardDetail cd = (CardDetail)deckDisplay; + cd.updateCardDetail((Card)list.getSelectedValue()); - 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()); + Object[] o = {"Add Card to Your Cardpool", new JScrollPane(list)}; + JOptionPane pane = new JOptionPane(o, JOptionPane.INFORMATION_MESSAGE, JOptionPane.OK_CANCEL_OPTION); - Card c = (Card) list.getSelectedValue(); + JDialog dialog = pane.createDialog(null, "Cheat - Add Card"); + dialog.setModal(true); + dialog.setVisible(true); - Gui_Quest_DeckEditor g = (Gui_Quest_DeckEditor)deckDisplay; - TableModel table = g.getTopTableModel(); - table.addCard(c); - table.resort(); - } - }//actionPerformed() + 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; - + 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; - + 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 - + 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("")) { + if (name.equals("")) { name = getUserInput_GetDeckName(questData.getDeckNames()); - + //check if user cancels - if(name.equals("")) return; + 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; - + 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; - + 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 - + 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() { @@ -937,131 +1047,184 @@ public class Gui_Quest_DeckEditor_Menu extends JMenuBar { 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++) + + 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]); - + + 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 ""; - + + if (o == null) return ""; + String deckName = cleanString(o.toString()); - - if(nameList.contains(deckName) || deckName.equals("")) { + + 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) { + 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 ""; - + + 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.CardFactory.getCard(aList, null); + + 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 index 1092097670e..98a59b50e68 100644 --- a/src/forge/Gui_WinLose.java +++ b/src/forge/Gui_WinLose.java @@ -1,8 +1,6 @@ - package forge; -import forge.deck.Deck; import forge.error.ErrorViewer; import forge.properties.ForgeProps; import forge.properties.NewConstants; @@ -16,80 +14,78 @@ import javax.swing.*; import javax.swing.border.Border; import javax.swing.border.TitledBorder; import java.awt.Color; -import java.awt.Dimension; +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(); + + 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; + private TitledBorder titledBorder1; @SuppressWarnings("unused") // border1 - private Border border1; - - public static void main(String[] args) { - Constant.Runtime.GameType[0] = Constant.GameType.Sealed; - - Constant.Runtime.matchState.addWin(); - Constant.Runtime.matchState.addLose(); - - //setup limited deck - Deck deck = new Deck(Constant.GameType.Sealed); - CardList pack = new CardList(BoosterPack.getBoosterPack(1).toArray()); - - for(int i = 0; i < pack.size(); i++) - if((i % 2) == 0) deck.addSideboard(pack.get(i).getName()); - else deck.addMain(pack.get(i).getName()); - - Constant.Runtime.HumanDeck[0] = deck; - //end - setup limited deck - - new Gui_WinLose(); - } - + 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 { + /* + fantasyQuest = true; + + humanList = human; + computerList = computer; + + humanLife = hLife; + computerLife= cLife; + */ + try { jbInit(); - } catch(Exception ex) { + } 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; @@ -100,69 +96,74 @@ public class Gui_WinLose extends JFrame implements NewConstants { humanLife = 20; computerLife= 20; */ - - try { + + try { jbInit(); - } catch(Exception ex) { + } 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.GameInfo.clearColorChanges(); + 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)) { + 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); - + + 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.Phase.getTurn(); - if (AllZone.GameInfo.isComputerStartedThisGame()) - turn--; - - if (turn < 1) - turn = 1; - - winLose.setWinTurn(game, turn); - winLose.setMulliganedToZero(game, AllZone.GameInfo.getHumanMulliganedToZero()); - - //winLose.setWinTurn(winLose.countWinLose()-1, AllZone.Phase.getTurn()); - - //System.out.println("CountwinLose:" + winLose.countWinLose()); - //System.out.println("You won by turn: " + AllZone.Phase.getTurn()); - } - else - { - titleLabel.setText(ForgeProps.getLocalized(WINLOSE_TEXT.LOSE)); - //System.out.println("You lost by turn: " + AllZone.Phase.getTurn()); + 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)); @@ -204,320 +205,349 @@ public class Gui_WinLose extends JFrame implements NewConstants { 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.Computer_Play.reset();//sometimes computer has creature in play in the 2nd game of the match - - if (!Constant.Quest.fantasyQuest[0]) - AllZone.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - else{ - int extraLife = 0; - if (AllZone.QuestAssignment != null) { - forge.quest.data.QuestUtil.setupQuest(AllZone.QuestAssignment); - if (AllZone.QuestData.getInventory().hasItem("Zeppelin")) - extraLife = 3; - } - //AllZone.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife); - CardList humanList = forge.quest.data.QuestUtil.getHumanPlantAndPet(AllZone.QuestData, AllZone.QuestAssignment); - CardList computerList = new CardList(); - + //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); - int humanLife = AllZone.QuestData.getLife() + extraLife; - int computerLife = 20; - if (AllZone.QuestAssignment!=null) - computerLife = AllZone.QuestAssignment.getComputerLife(); - - AllZone.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife, AllZone.QuestAssignment); - } - AllZone.Display.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.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0]); - else{ - int extraLife = 0; - //AllZone.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife); - if (AllZone.QuestAssignment != null) { - forge.quest.data.QuestUtil.setupQuest(AllZone.QuestAssignment); - if (AllZone.QuestData.getInventory().hasItem("Zeppelin")) - extraLife = 3; - } - - CardList humanList = forge.quest.data.QuestUtil.getHumanPlantAndPet(AllZone.QuestData, AllZone.QuestAssignment); - //CardList computerList = QuestUtil.getComputerCreatures(AllZone.QuestData, AllZone.QuestAssignment); - CardList computerList = new CardList(); - - int humanLife = AllZone.QuestData.getLife() +extraLife; - int computerLife = 20; - - if (AllZone.QuestAssignment!=null) - computerLife = AllZone.QuestAssignment.getComputerLife(); - - AllZone.GameAction.newGame(Constant.Runtime.HumanDeck[0], Constant.Runtime.ComputerDeck[0], humanList, computerList, humanLife, computerLife, AllZone.QuestAssignment); - } - AllZone.Display.setVisible(true); - + 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(); } - - 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") ) { + /** + *

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(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(); + sb.append(""); - 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(); + + 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(); } - - 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; + + /** + *

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; } - - 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; + + /** + *

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.QuestData == null) { - new Gui_NewGame(); - } - else { //Quest + if (AllZone.getQuestData() == null) { + new Gui_NewGame(); + } else { //Quest QuestMatchState matchState = Constant.Runtime.matchState; - forge.quest.data.QuestData quest = AllZone.QuestData; - + 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.QuestData.getCardpool().size()); - if(AllZone.QuestData.getShopList()!= null) - AllZone.QuestData.clearShopList(); - - if(AllZone.QuestData.getAvailableQuests()!= null) - AllZone.QuestData.clearAvailableQuests(); - - if(quest.shouldAddCards(wonMatch)) { + 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 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.QuestAssignment!=null) - { - AllZone.QuestData.addQuestsPlayed(); - Quest_Assignment qa = AllZone.QuestAssignment; - - 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.QuestData.addCard(cardName); - } - AllZone.QuestData.addToNewList(qa.getCardRewardList()); - sb.append("\r\n"); - } - sb.append("Quest Bounty: "); - sb.append(qa.getCreditsReward()); - - AllZone.QuestData.addCredits(qa.getCreditsReward()); - - fileName = "BoxIcon.png"; - icon = getIcon(fileName); - JOptionPane.showMessageDialog(null, sb.toString(), "Quest Rewards for " +qa.getName() , 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.CardFactory.getCard(quest.addRandomRare(), AllZone.HumanPlayer); + 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); } - 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.CardFactory.getCard(quest.addRandomRare(), AllZone.HumanPlayer); + + 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); - + 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.QuestAssignment = null; - + + 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 index 3073d6c2de4..b84fa29fd4f 100644 --- a/src/forge/HandSizeOp.java +++ b/src/forge/HandSizeOp.java @@ -1,19 +1,35 @@ - package forge; - - public class HandSizeOp { - public String Mode; - public int hsTimeStamp; - public int Amount; - - public HandSizeOp(String M,int A,int TS) - { - Mode = M; - Amount = A; - hsTimeStamp = TS; - } - - public String toString() - { - return "Mode(" + Mode + ") Amount(" + Amount + ") Timestamp(" + hsTimeStamp + ")"; - } - } +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 index aaa3eda7dcf..77354d0cc45 100644 --- a/src/forge/HumanPlayer.java +++ b/src/forge/HumanPlayer.java @@ -1,147 +1,200 @@ - -package forge; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - - -public class HumanPlayer extends Player{ - - public HumanPlayer(String myName) { - this(myName, 20, 0); - } - - public HumanPlayer(String myName, int myLife, int myPoisonCounters) { - super(myName, myLife, myPoisonCounters); - } - - public Player getOpponent() { - return AllZone.ComputerPlayer; - } - - //////////////// - /// - /// Methods to ease transition to Abstract Player class - /// - /////////////// - - public boolean isHuman() { return true; } - public boolean isComputer() { return false; } - public boolean isPlayer(Player p1) { - return p1.getName().equals(this.name); - } - - /////////////// - /// - /// End transition methods - /// - /////////////// - - public void mayDrawCards(int n) { - String[] choices = {"Yes", "No"}; - Object choice = GuiUtils.getChoice("Draw "+n+" cards?", choices); - if(choice.equals("Yes")) - drawCards(n); - } - - public void mayDrawCard() { - mayDrawCards(1); - } - - 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.Human_Library.size()) { - - //might have to make this more sophisticated - //dredge library, put card in hand - AllZone.GameAction.moveToHand(c); - - for(int i = 0; i < getDredgeNumber(c); i++) { - Card c2 = AllZone.Human_Library.get(0); - AllZone.GameAction.moveToGraveyard(c2); - } - dredged = true; - } - else { - dredged = false; - } - } - return dredged; - } - - public CardList discard(final int num, final SpellAbility sa, boolean duringResolution) { - AllZone.InputControl.setInput(CardFactoryUtil.input_discard(num, sa), duringResolution); - - // why is CardList returned? - return new CardList(); - } - - public void discardUnless(int num, String uType, SpellAbility sa) { - AllZone.InputControl.setInput(CardFactoryUtil.input_discardNumUnless(num, uType, sa)); - } - - 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.InputControl.setInput(CardFactoryUtil.input_putFromHandToLibrary(libPos, numToLibrary)); - } - - 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.GameAction.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.GameAction.moveToLibrary(c); - } - // no else - a card must have been chosen - } - } - - public void sacrificePermanent(String prompt, CardList choices) { - Input in = CardFactoryUtil.input_sacrificePermanent(choices, prompt); - AllZone.InputControl.setInput(in); - } - - protected void clashMoveToTopOrBottom(Card c) { - String choice = ""; - String choices[] = {"top","bottom"}; - AllZone.Display.setCard(c); - choice = (String) GuiUtils.getChoice(c.getName()+" - Top or bottom of Library", choices); - - if(choice.equals("bottom")) { - AllZone.GameAction.moveToBottomOfLibrary(c); - } - else{ - AllZone.GameAction.moveToLibrary(c); - } - } - -}//end HumanPlayer class \ No newline at end of file +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 index 0254a421bb2..e4df85c039e 100644 --- a/src/forge/ImageCache.java +++ b/src/forge/ImageCache.java @@ -1,4 +1,3 @@ - package forge; @@ -10,7 +9,7 @@ import com.mortennobel.imagescaling.ResampleOp; import forge.properties.ForgeProps; import forge.properties.NewConstants; -import java.awt.Graphics2D; +import java.awt.*; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.File; @@ -25,7 +24,7 @@ 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
  • @@ -36,14 +35,25 @@ import static java.lang.Math.min; *
  • 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; - private static final Pattern FULL_SIZE = Pattern.compile("(.*)#(\\d+.\\d+)"); - private static final String TOKEN = "#Token", NORMAL = "#Normal", TAPPED = "#Tapped"; - + /** 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) { @@ -51,114 +61,135 @@ public class ImageCache implements NewConstants { //DEBUG /*System.out.printf("Currently %d %s in the cache%n", imageCache.size(), imageCache.size() == 1? "image":"images");*/ - //DEBUG + //DEBUG //System.out.printf("New Image for key: %s%n", key); - if(key.endsWith(NORMAL)) { + if (key.endsWith(NORMAL)) { //normal key = key.substring(0, key.length() - NORMAL.length()); return getNormalSizeImage(imageCache.get(key)); - } else if(key.endsWith(TAPPED)) { + } 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()) { + + 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)) { + 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 + 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 + } catch (Exception ex) { + //DEBUG //System.err.println("Exception, no image created"); - if(ex instanceof ComputationException) throw (ComputationException) ex; + 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; + 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); + String key = (card.isFaceDown() && card.getController().isComputer()) ? "Morph" : getKey(card); BufferedImage original = getImage(key); - if(original == null) return null; - + 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; - + 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); + 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)) { + if (!isExpectedSize(key, image)) { imageCache.remove(key); image = imageCache.get(key); } return image; - } catch(NullPointerException ex) { + } 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; + } 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)) { + if (key.endsWith(NORMAL)) { //normal return image.getWidth() == Constant.Runtime.width[0] && image.getHeight() == Constant.Runtime.height[0]; - } else if(key.endsWith(TAPPED)) { + } else if (key.endsWith(TAPPED)) { //tapped return image.getWidth() == Constant.Runtime.height[0] && image.getHeight() == Constant.Runtime.width[0]; @@ -167,9 +198,12 @@ public class ImageCache implements NewConstants { 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()); @@ -235,24 +269,27 @@ public class ImageCache implements NewConstants { key += tkn; // key = GuiDisplayUtil.cleanString(key); -*/ - if (card.isToken() && !card.isCopiedToken()) - return GuiDisplayUtil.cleanString(card.getImageName()) + TOKEN; +*/ + if (card.isToken() && !card.isCopiedToken()) + return GuiDisplayUtil.cleanString(card.getImageName()) + TOKEN; - return card.getImageFilename(); //key; + 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; - + + if (srcWidth == tgtWidth && srcHeight == tgtHeight) return original; + // AffineTransform at = new AffineTransform(); // at.scale((double) tgtWidth / srcWidth, (double) tgtHeight / srcHeight); @@ -269,16 +306,19 @@ public class ImageCache implements NewConstants { 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); @@ -299,13 +339,17 @@ public class ImageCache implements NewConstants { 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; - + if (scale == 1) return original; + // AffineTransform at = new AffineTransform(); // at.scale(scale, scale); // @@ -322,7 +366,10 @@ public class ImageCache implements NewConstants { } - public static void clear(){ + /** + *

clear.

+ */ + public static void clear() { imageCache.clear(); } } diff --git a/src/forge/ImagePreviewPanel.java b/src/forge/ImagePreviewPanel.java index 286f1722c14..714f9a1f44f 100644 --- a/src/forge/ImagePreviewPanel.java +++ b/src/forge/ImagePreviewPanel.java @@ -1,104 +1,114 @@ - -package forge; - - -import java.awt.Color; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Image; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.io.File; - -import javax.swing.ImageIcon; -import javax.swing.JFileChooser; -import javax.swing.JPanel; - - -public class ImagePreviewPanel extends JPanel implements PropertyChangeListener { - - - private static final long serialVersionUID = 2163809931940286240L; - private int width, height; - private ImageIcon icon; - private Image image; - private static final int ACCSIZE = 155; - private Color bg; - - public ImagePreviewPanel() { - setPreferredSize(new Dimension(ACCSIZE, -1)); - bg = getBackground(); - } - - 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(); - } - } - } - - 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); - } - - @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); - } - -} +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/KeyListenerTest.java b/src/forge/KeyListenerTest.java deleted file mode 100644 index aa7d9e7ea7b..00000000000 --- a/src/forge/KeyListenerTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package forge; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; - -public class KeyListenerTest implements KeyListener -{ - -public void keyPressed(KeyEvent arg0) -{ - int code = arg0.getKeyCode(); - - if(code == KeyEvent.VK_ENTER) - { - //Do something here - System.out.println("You pressed enter"); - } - -} -public void keyReleased(KeyEvent arg0) -{ - // TODO Auto-generated method stub - -} -public void keyTyped(KeyEvent arg0) -{ - // TODO Auto-generated method stub - -} - -} \ No newline at end of file diff --git a/src/forge/MP3Player.java b/src/forge/MP3Player.java deleted file mode 100644 index f0c62487126..00000000000 --- a/src/forge/MP3Player.java +++ /dev/null @@ -1,60 +0,0 @@ - -package forge; - - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; - -import javazoom.jl.player.Player; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - -/** - * - * @author shaines - */ -public class MP3Player implements NewConstants { - - private Player player; - private InputStream is; - private File file; - - /** Creates a new instance of MP3Player */ - public MP3Player(String filename) { - File base = ForgeProps.getFile(SOUND_BASE); - file = new File(base, filename); - if(GuiDisplay3.playsoundCheckboxForMenu.isSelected() && file.exists()) { - try { - // Create an InputStream to the file - is = new FileInputStream(file); - } catch(Exception e) { - e.printStackTrace(); - } - } - } - - public void play() { - if(GuiDisplay3.playsoundCheckboxForMenu.isSelected() && file.exists()) { - try { - player = new Player(is); - PlayerThread pt = new PlayerThread(); - pt.start(); - } catch(Exception e) { - e.printStackTrace(); - } - } - } - - class PlayerThread extends Thread { - @Override - public void run() { - try { - player.play(); - } catch(Exception e) { - e.printStackTrace(); - } - } - } -} diff --git a/src/forge/MagicStack.java b/src/forge/MagicStack.java index 744e91d4d31..bd1722a0a57 100644 --- a/src/forge/MagicStack.java +++ b/src/forge/MagicStack.java @@ -1,947 +1,1107 @@ 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; -import com.esotericsoftware.minlog.Log; - -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.mana.ManaCost; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Static; -import forge.card.spellability.Ability_Triggered; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_StackInstance; -import forge.card.spellability.Spell_Permanent; -import forge.card.spellability.Target; -import forge.card.spellability.Target_Selection; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost_Ability; - +/** + *

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; - - public boolean isFrozen() { - return frozen; - } - - public void setFrozen(boolean frozen) { - this.frozen = frozen; - } - - public void reset() { - stack.clear(); - frozen = false; - splitSecondOnStack = 0; - frozenStack.clear(); - this.updateObservers(); - } - - public boolean isSplitSecondOnStack() { - return splitSecondOnStack > 0; - } - - public void incrementSplitSecond(SpellAbility sp){ - if (sp.getSourceCard().hasKeyword("Split Second")) - splitSecondOnStack++; - } - - public void decrementSplitSecond(SpellAbility sp){ - if (sp.getSourceCard().hasKeyword("Split Second")) - splitSecondOnStack--; - - if (splitSecondOnStack < 0) - splitSecondOnStack = 0; - } - - public void freezeStack() { - frozen = true; - } - - 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.GameAction.moveToStack(source); - } - - if (ability.isTrigger()) - unfreezeStack(); - } - - public void unfreezeStack() { - frozen = false; - boolean checkState = !frozenStack.isEmpty(); - while (!frozenStack.isEmpty()) { - SpellAbility sa = frozenStack.pop().getSpellAbility(); - this.add(sa); - } - if (checkState) - AllZone.GameAction.checkStateEffects(); - } - - public void clearFrozen() { - // TODO: frozen triggered abilities and undoable costs have nasty consequences - frozen = false; - frozenStack.clear(); - } - - public void setResolving(boolean b) { bResolving = b; if(!bResolving) chooseOrderOfSimultaneousStackEntryAll(); } - public boolean getResolving() { return bResolving; } - - 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()); - } - } - } - - 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.GameAction.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.GameAction.CostCutting_GetMultiMickerManaCostPaid = MultiKickerPaid; - Mana = Mana.replaceFirst(String.valueOf(check), "0"); - } - else { - Mana = Mana.replaceFirst(String.valueOf(check), String.valueOf(check - MultiKickerPaid)); - MultiKickerPaid = 0; - AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid = MultiKickerPaid; - } - } - Mana = Mana.trim(); - if (Mana.equals("")) - Mana = "0"; - manaCost = new ManaCost(Mana); - } - String Color_cut = AllZone.GameAction.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.GameAction.CostCutting_GetMultiMickerManaCostPaid_Colored = AllZone.GameAction.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 - public ManaCost getReplicateSpellCostChange(SpellAbility sa) { - ManaCost manaCost = new ManaCost(sa.getManaCost()); - //String Mana = manaCost.toString(); - return manaCost; - } - - public void add(final SpellAbility sp) { - 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.Phase.is(Constant.Phase.Cleanup)){ // If something triggers during Cleanup, need to repeat - AllZone.Phase.repeatPhase(); - } - - // TODO: triggered abilities need to be fixed - if (!(sp instanceof Ability_Triggered || sp instanceof Ability_Static)) - AllZone.Phase.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.InputControl.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.InputControl.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.GameAction.CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - - AllZone.InputControl.setInput(new Input_PayManaCost_Ability( - "Multikicker for "+ sa.getSourceCard() + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } - - else { - AllZone.InputControl.setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Mana in Reserve: " - + ((AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid != 0) ? - AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid : "") - + AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid_Colored + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } - } - } - }; - - if (sp.getSourceCard().getController().equals( - AllZone.HumanPlayer)) { - ManaCost manaCost = getMultiKickerSpellCostChange(ability); - - if (manaCost.isPaid()) { - paidCommand.execute(); - } else { - if (AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - AllZone.InputControl.setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Times Kicked: " - + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), paidCommand, unpaidCommand)); - } else { - AllZone.InputControl.setInput(new Input_PayManaCost_Ability("Multikicker for " - + sa.getSourceCard() + "\r\n" + "Mana in Reserve: " + - ((AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid != 0) ? - AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid: "") - + AllZone.GameAction.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.CardFactory.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.GameAction.CostCutting_GetMultiMickerManaCostPaid == 0 - && AllZone.GameAction.CostCutting_GetMultiMickerManaCostPaid_Colored.equals("")) { - - AllZone.InputControl.setInput(new Input_PayManaCost_Ability( - "Replicate for "+ sa.getSourceCard() + "\r\n" - + "Times Kicked: " + sa.getSourceCard().getMultiKickerMagnitude() + "\r\n", - manaCost.toString(), this, unpaidCommand)); - } - - else {*/ - AllZone.InputControl.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.HumanPlayer)) { - ManaCost manaCost = getMultiKickerSpellCostChange(ability); - - if (manaCost.isPaid()) { - paidCommand.execute(); - } else { - AllZone.InputControl.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 trigger - 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.TriggerHandler.runTrigger("SpellAbilityCast", runParams); - - if(sp.isSpell()) - { - runParams.put("Cost", sp.getPayCosts()); - AllZone.TriggerHandler.runTrigger("SpellCast", runParams); - } - if(sp.isAbility()) - { - runParams.put("Cost", sp.getPayCosts()); - AllZone.TriggerHandler.runTrigger("AbilityCast", runParams); - } - if(sp.isCycling()) - { - runParams.clear(); - runParams.put("Card", sp.getSourceCard()); - AllZone.TriggerHandler.runTrigger("Cycled", 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.Display.showMessage("Mana Vortex - select a land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - AllZone.Stack.pop(); - AllZone.GameAction.moveToGraveyard(sp.getSourceCard()); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Battlefield) && c.getController().isHuman() - && c.isLand()) { - AllZone.GameAction.sacrifice(c); - stop(); - } - } - }; - SpellAbility_StackInstance prev = peekInstance(); - if(prev.isSpell() && prev.getSourceCard().getName().equals("Mana Vortex")) { - if(sp.getSourceCard().getController().isHuman()) { - AllZone.InputControl.setInput(in); - } - else {//Computer - CardList lands = AllZoneUtil.getPlayerLandsInPlay(AllZone.ComputerPlayer); - if(!lands.isEmpty()) { - AllZone.ComputerPlayer.sacrificePermanent("prompt", lands); - } - else { - AllZone.Stack.pop(); - AllZone.GameAction.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.Stack.size() > 0) AllZone.Stack.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 i) - { - AllZone.GameAction.moveToBottomOfLibrary(revealed); - } - else - { - AllZone.GameAction.moveToLibrary(revealed); - } - } - else - { - GameActionUtil.showInfoDialg(revealMsg.toString()); - AllZone.GameAction.moveToPlay(revealed); - } - - } - } - } - - if (sp.getTargetCard() != null) - CardFactoryUtil.checkTargetingEffects(sp, sp.getTargetCard()); - - if(simultaneousStackEntryList.size() > 0) - AllZone.Phase.passPriority(); - } - - public int size() { - return stack.size(); - } - - // Push should only be used by add. - 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); - } - } - - 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.Stack.pop(); - - AllZone.Phase.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); - } else { - sa.resolve(); - finishResolving(sa, false); - } - - } - - 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.GameAction.moveToHand(source); - } - - else if (sa.isFlashBackAbility()){ - AllZone.GameAction.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.GameAction.moveToGraveyard(source); - else{ - source.replaceMoveToGraveyard(); - } - } - } - - 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.GameAction.checkStateEffects(); - - AllZone.Phase.setNeedToNextPhase(false); - - if (AllZone.Phase.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()); - } - } - - } - } - - 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.getTargetCard())); - } - 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(source); - } - - if (fizzSA.getSubAbility() != null) - fizzSA = fizzSA.getSubAbility(); - else - break; - } - - return fizzle; - } - - 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... - public SpellAbility_StackInstance peekInstance(int index) { - return stack.get(index); - } - - public SpellAbility peekAbility(int index) { - return stack.get(index).getSpellAbility(); - } - - public SpellAbility_StackInstance peekInstance() { - return stack.peek(); - } - - public SpellAbility peekAbility() { - return stack.peek().getSpellAbility(); - } - - public void remove(SpellAbility sa) { - SpellAbility_StackInstance si = getInstanceFromSpellAbility(sa); - if (si == null) - return; - - remove(si); - } - - public void remove(SpellAbility_StackInstance si) { - if (stack.remove(si)){ - decrementSplitSecond(si.getSpellAbility()); - } - frozenStack.remove(si); - this.updateObservers(); - } - - public SpellAbility_StackInstance getInstanceFromSpellAbility(SpellAbility sa) { - // TODO: Confirm this works! - for(SpellAbility_StackInstance si : stack){ - if (si.getSpellAbility().equals(sa)) - return si; - } - return null; - } - - public boolean hasSimultaneousStackEntries() - { - return simultaneousStackEntryList.size() > 0; - } - - public void addSimultaneousStackEntry(SpellAbility sa) - { - simultaneousStackEntryList.add(sa); - } - - public void chooseOrderOfSimultaneousStackEntryAll() - { - chooseOrderOfSimultaneousStackEntry(AllZone.Phase.getPlayerTurn()); - chooseOrderOfSimultaneousStackEntry(AllZone.Phase.getPlayerTurn().getOpponent()); - } - - public void chooseOrderOfSimultaneousStackEntry(Player activePlayer) - { - if(simultaneousStackEntryList.size() == 0) - return; - - ArrayList activePlayerSAs = new ArrayList(); - for(int i=0;i 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.GameAction.playSpellAbility(next)"); - AllZone.GameAction.playSpellAbility(next); - } - else - { - System.out.println("Stack order: AllZone.Stack.add(next)"); - add(next); - } - } - - if(activePlayerSAs.get(0).isTrigger()) - AllZone.GameAction.playSpellAbility(activePlayerSAs.get(0)); - else - add(activePlayerSAs.get(0)); - //AllZone.GameAction.playSpellAbility(activePlayerSAs.get(0)); - } - } + 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 index 6f457b21fbc..a002536833a 100644 --- a/src/forge/MenuItem_HowToPlay.java +++ b/src/forge/MenuItem_HowToPlay.java @@ -1,161 +1,170 @@ package forge; - - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JMenuItem; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; - 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() { + 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); + .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); + .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); + .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); + .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); + .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); + .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); + .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); + .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); + .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("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); + .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); + .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); + .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); + .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); + .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); + .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); + .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"); - + .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); + .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); + .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); + .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); + .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); + .append(newLine); s.append("2. Haste: Haste lets a creature attack or use any abilities immediately during this turn.") - .append(newLine); + .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); + .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); + .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); + .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); + .append(newLine); s.append("7. Deathtouch: When a creatures with deathtouch deals damage to a creature, that creature is destroyed.") - .append(newLine); + .append(newLine); s.append("8. Defender: Creatures with defender can not attack, they can only block another attacker.") - .append(newLine); + .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); + .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); + .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); + .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); + .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(); - } + + return s.toString(); + } }//MenuItem_HowToPlay diff --git a/src/forge/Move.java b/src/forge/Move.java index 4aaf20a7618..02fe13baf80 100644 --- a/src/forge/Move.java +++ b/src/forge/Move.java @@ -1,40 +1,69 @@ package forge; -public abstract class Move -{ + +/** + *

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; - - public int min(Move move, int depth) - { - if(depth == 0) + + /** + *

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)); + for (int i = 0; i < v.length; i++) + score = Math.min(score, max(v[i], depth - 1, false)); return score; } - public int max(Move move, int depth, boolean first) - { - if(depth == 0) + + /** + *

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)); + for (int i = 0; i < v.length; i++) { + score = Math.max(score, min(v[i], depth - 1)); - if(first && bestScore < score) - { + if (first && bestScore < score) { bestScore = score; bestMove = v[i]; - } + } }//for return score; }//max() -} \ No newline at end of file +} diff --git a/src/forge/MyButton.java b/src/forge/MyButton.java index edacd71ae49..30aa8bd604a 100644 --- a/src/forge/MyButton.java +++ b/src/forge/MyButton.java @@ -1,13 +1,48 @@ package forge; -public interface MyButton -{ -// public MyButton(String buttonText, Command command) - public void select(); - public void setSelectable(boolean b); - public boolean isSelectable(); - public String getText(); - public void setText(String text); +/** + *

MyButton interface.

+ * + * @author Forge + * @version $Id: $ + */ +public interface MyButton { + // public MyButton(String buttonText, Command command) + /** + *

select.

+ */ + public void select(); - public void reset(); //resets the text and calls setSelectable(false) -} \ No newline at end of file + /** + *

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 index b986fb921e8..4b807927f0f 100644 --- a/src/forge/MyObservable.java +++ b/src/forge/MyObservable.java @@ -1,20 +1,28 @@ package forge; + import java.util.Observable; -public class MyObservable extends Observable -{ - public final void updateObservers() - { - this.setChanged(); - this.notifyObservers(); - - if(AllZone.Phase != null && AllZone.Phase.isNeedToNextPhase()){ - if(AllZone.Phase.isNeedToNextPhaseInit()){ - // this is used. - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.nextPhase(); - } - } - } +/** + *

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 index de9abd2e20a..39c9d7667e9 100644 --- a/src/forge/MyRandom.java +++ b/src/forge/MyRandom.java @@ -1,13 +1,24 @@ package forge; + import java.util.Random; -public class MyRandom -{ - public static Random random = new 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(); - //if percent is like 50, the its like 50% of the time will be true - public static boolean percentTrue(int percent) - { - return percent > random.nextInt(100); - } -} \ No newline at end of file + /** + *

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 index 52e3bcee649..9ee5d37324b 100644 --- a/src/forge/NameChanger.java +++ b/src/forge/NameChanger.java @@ -1,125 +1,217 @@ package forge; -import java.io.BufferedReader; -import java.io.FileReader; -import java.util.HashMap; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.Map.Entry; 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 HashMap(); - private Map originalMap = new HashMap(); - - private boolean changeCardName; - + 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; } - - //returns an array of copies - public Card[] changeCard(Card c[]) { - for(int i = 0; i < c.length; i++) - changeCard(c[i]); - - return c; + + /** + * 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++) { + 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; - + + 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; - + + if (o == null) return mutatedName; + return o.toString(); }//getOriginalName() - + + /** + *

readFile.

+ */ @SuppressWarnings("unused") - private void readFile() { + 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)) { + while (line != null && (line.trim().length() != 0)) { processLine(line.trim()); - + line = in.readLine(); }//while }//try - catch(Exception ex) { + 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)) { + while ((line = in.readLine()) != null && (line.trim().length() != 0)) { processLine(line.trim()); }//while - } catch(Exception ex2) { + } catch (Exception ex2) { // Show orig exception ErrorViewer.showError(ex2); throw new RuntimeException(String.format("NameMutator : readFile() error, %s", ex), ex); @@ -127,29 +219,37 @@ public class NameChanger implements NewConstants { //~ } }//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) + + 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()) { + for (Entry e : map.entrySet()) { System.out.println(e.getKey() + " : " + e.getValue()); } } - - public static void main(String[] args) {}//main() -} \ No newline at end of file +} diff --git a/src/forge/Phase.java b/src/forge/Phase.java index b70631d0574..7c54a0462d8 100644 --- a/src/forge/Phase.java +++ b/src/forge/Phase.java @@ -1,136 +1,244 @@ 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; -import com.esotericsoftware.minlog.Log; +/** + *

Phase class.

+ * + * @author Forge + * @version $Id: $ + */ +public class Phase extends MyObservable implements java.io.Serializable { -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Spell_Permanent; + /** Constant serialVersionUID=5207222278370963197L */ + private static final long serialVersionUID = 5207222278370963197L; -public class Phase extends MyObservable -{ - private int phaseIndex; - private int turn; + private int phaseIndex; + private int turn; - private static int GameBegins = 0; - private static int StormCount; - static int PlayerSpellCount; - static int PlayerCreatureSpellCount; - static int PlayerInstantSpellCount; - static int ComputerSpellCount; - static int ComputerCreatureSpellCount; - static int ComputerInstantSpellCount; + // 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.HumanPlayer; + + 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); } - - public void setPlayerTurn(Player s) { - playerTurn = s; - } - - public Player getPlayerTurn() { - return playerTurn; - } - - // priority player - - private Player pPlayerPriority = AllZone.HumanPlayer; - public Player getPriorityPlayer() { - return pPlayerPriority; - } - - public void setPriorityPlayer(Player p) { - pPlayerPriority = p; - } - - private Player pFirstPriority = AllZone.HumanPlayer; - public Player getFirstPriority() { - return pFirstPriority; - } - - public void setFirstPriority(Player p) { - pFirstPriority = p; - } - - public void setPriority(Player p) { - if(AllZone.Stack != null) - AllZone.Stack.chooseOrderOfSimultaneousStackEntryAll(); - pFirstPriority = p; - pPlayerPriority = p; + /** + *

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); + setPriority(playerTurn); } - - private boolean bPhaseEffects = true; + + private boolean bPhaseEffects = true; + + /** + *

doPhaseEffects.

+ * + * @return a boolean. + */ public boolean doPhaseEffects() { - return bPhaseEffects; + return bPhaseEffects; } - + + /** + *

setPhaseEffects.

+ * + * @param b a boolean. + */ public void setPhaseEffects(boolean b) { - bPhaseEffects = b; - } - + bPhaseEffects = b; + } + private boolean bSkipPhase = true; + + /** + *

doSkipPhase.

+ * + * @return a boolean. + */ public boolean doSkipPhase() { - return bSkipPhase; + return bSkipPhase; } - + + /** + *

setSkipPhase.

+ * + * @param b a boolean. + */ public void setSkipPhase(boolean b) { - bSkipPhase = b; - } - - private boolean bCombat = false; - public boolean inCombat() { - return bCombat; + 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; - } - + bCombat = b; + } + private boolean bRepeat = false; + + /** + *

repeatPhase.

+ */ public void repeatPhase() { - bRepeat = true; - } - - private 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 - }; - + 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.HumanPlayer; + playerTurn = AllZone.getHumanPlayer(); resetPriority(); bPhaseEffects = true; needToNextPhase = false; @@ -143,499 +251,779 @@ public class Phase extends MyObservable bRepeat = false; this.updateObservers(); } - - public void turnReset(){ - setStormCount(0); - PlayerSpellCount = 0; - PlayerCreatureSpellCount = 0; - PlayerInstantSpellCount = 0; - ComputerSpellCount = 0; - ComputerCreatureSpellCount = 0; - ComputerInstantSpellCount = 0; + + /** + *

turnReset.

+ */ + public void turnReset() { + setStormCount(0); + setPlayerSpellCount(0); + setPlayerCreatureSpellCount(0); + setPlayerInstantSpellCount(0); + setComputerSpellCount(0); + setComputerCreatureSpellCount(0); + setComputerInstantSpellCount(0); playerTurn.setNumLandsPlayed(0); } - public void handleBeginPhase(){ - AllZone.Phase.setPhaseEffects(false); - // Handle effects that happen at the beginning of phases - final String phase = AllZone.Phase.getPhase(); - final Player turn = AllZone.Phase.getPlayerTurn(); - AllZone.Phase.setSkipPhase(true); + /** + *

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)) { + 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.Phase.setNeedToNextPhase(true); - } - + } 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 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 - AllZone.Phase.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.Phase.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_FirstStrikeDamage)){ - if(!inCombat()) - AllZone.Phase.setNeedToNextPhase(true); - else{ - AllZone.Combat.verifyCreaturesInPlay(); + } else if (phase.equals(Constant.Phase.Combat_Damage)) { + if (!inCombat()) + AllZone.getPhase().setNeedToNextPhase(true); + else { + AllZone.getCombat().verifyCreaturesInPlay(); - // no first strikers, skip this step - if (!AllZone.Combat.setAssignedFirstStrikeDamage()) - AllZone.Phase.setNeedToNextPhase(true); - - else{ - if (!AllZone.GameInfo.isPreventCombatDamageThisTurn()) - Combat.dealAssignedDamage(); - - AllZone.GameAction.checkStateEffects(); - CombatUtil.showCombat(); - } - } - } - - else if (phase.equals(Constant.Phase.Combat_Damage)){ - if(!inCombat()) - AllZone.Phase.setNeedToNextPhase(true); - else{ - AllZone.Combat.verifyCreaturesInPlay(); - - AllZone.Combat.setAssignedDamage(); - - if (!AllZone.GameInfo.isPreventCombatDamageThisTurn()) - Combat.dealAssignedDamage(); - - AllZone.GameAction.checkStateEffects(); - CombatUtil.showCombat(); - } - } - - else if (phase.equals(Constant.Phase.Combat_End)) - { - // End Combat always happens - AllZone.EndOfCombat.executeUntil(); - AllZone.EndOfCombat.executeAt(); + 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(); } - else if(phase.equals(Constant.Phase.End_Of_Turn)) { - AllZone.EndOfTurn.executeAt(); - } - - else if(phase.equals(Constant.Phase.Cleanup)){ - AllZone.Phase.getPlayerTurn().setAssignedDamage(0); - - //reset dealt damage to vars - Player opp = AllZone.Phase.getPlayerTurn().getOpponent(); - CardList oppList = AllZoneUtil.getCreaturesInPlay(opp); - for(int i = 0; i < oppList.size(); i++) { - Card c = oppList.get(i); - c.setDealtDmgToHumanThisTurn(false); - c.setDealtDmgToComputerThisTurn(false); - } - - //Reset Damage received map - CardList list = AllZoneUtil.getCardsInPlay(); - for(Card c:list) { - c.resetPreventNextDamage(); - c.resetReceivedDamageFromThisTurn(); - c.resetDealtDamageToThisTurn(); - } - AllZone.HumanPlayer.resetPreventNextDamage(); - AllZone.ComputerPlayer.resetPreventNextDamage(); - - AllZone.EndOfTurn.executeUntil(); - CardList cHand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - CardList hHand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - for(Card c:cHand) c.setDrawnThisTurn(false); - for(Card c:hHand) c.setDrawnThisTurn(false); - AllZone.HumanPlayer.resetNumDrawnThisTurn(); - AllZone.ComputerPlayer.resetNumDrawnThisTurn(); - } - - if (!AllZone.Phase.isNeedToNextPhase()){ + 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.TriggerHandler.runTrigger("Phase", runParams); - + 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.Stack.unfreezeStack(); + AllZone.getStack().unfreezeStack(); - if(!phase.equals(Constant.Phase.Untap)) //Nobody recieves priority during untap - resetPriority(); - } - + if (!phase.equals(Constant.Phase.Untap)) //Nobody recieves priority during untap + resetPriority(); + } + + /** + *

nextPhase.

+ */ public void nextPhase() { //experimental, add executeCardStateEffects() here: - for(String effect:AllZone.StaticEffects.getStateBasedMap().keySet()) { + for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { Command com = GameActionUtil.commands.get(effect); com.execute(); } - - GameActionUtil.executeCardStateEffects(); - + needToNextPhase = false; // If the Stack isn't empty why is nextPhase being called? - if(AllZone.Stack.size() != 0) { - Log.debug("Phase.nextPhase() is called, but Stack isn't empty."); + 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.ManaPool.clearPool(); - AllZone.Computer_ManaPool.clearPool(); - } - + if (!AllZoneUtil.isCardInPlay("Upwelling")) { + AllZone.getManaPool().clearPool(); + AllZone.getComputerManaPool().clearPool(); + } + if (getPhase().equals(Constant.Phase.Combat_Declare_Attackers)) { - AllZone.Stack.unfreezeStack(); - nCombatsThisTurn++; - } - else if (getPhase().equals(Constant.Phase.Untap)) { - nCombatsThisTurn = 0; + AllZone.getStack().unfreezeStack(); + nCombatsThisTurn++; + } else if (getPhase().equals(Constant.Phase.Untap)) { + nCombatsThisTurn = 0; } - + if (getPhase().equals(Constant.Phase.Combat_End)) { - AllZone.Combat.reset(); - AllZone.Display.showCombat(""); - resetAttackedThisCombat(getPlayerTurn()); - this.bCombat = false; + AllZone.getCombat().reset(); + AllZone.getDisplay().showCombat(""); + resetAttackedThisCombat(getPlayerTurn()); + this.bCombat = false; } - + if (phaseOrder[phaseIndex].equals(Constant.Phase.Cleanup)) - if (!bRepeat) - AllZone.Phase.setPlayerTurn(handleNextTurn()); - - if (is(Constant.Phase.Combat_Declare_Blockers)){ - AllZone.Stack.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 + if (!bRepeat) + AllZone.getPhase().setPlayerTurn(handleNextTurn()); - Player player = getPlayerTurn(); - Player opp = player.getOpponent(); - - bCombat = true; - extraCombats--; - AllZone.Combat.reset(); - AllZone.Combat.setAttackingPlayer(player); - AllZone.Combat.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; + 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)){ + if (getPhase().equals(Constant.Phase.Untap)) { turn++; } // When consecutively skipping phases (like in combat) this section pushes through that block this.updateObservers(); - if(AllZone.Phase != null && AllZone.Phase.isNeedToNextPhase()) { - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.nextPhase(); + 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(); + Player nextTurn = extraTurns.isEmpty() ? getPlayerTurn().getOpponent() : extraTurns.pop(); AllZone.resetZoneMoveTracking(); - - return skipTurnTimeVault(nextTurn); - } - private Player skipTurnTimeVault(Player turn) { + 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() { + CardList vaults = AllZoneUtil.getPlayerCardsInPlay(turn, "Time Vault"); + vaults = vaults.filter(new CardListFilter() { public boolean addCard(Card c) { return c.isTapped(); } }); - - if (vaults.size() > 0){ + + 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(); - } + 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? } - else{ - // TODO: Should AI skip his turn for time vault? - } - } - return turn; - } + } + return turn; + } - public synchronized boolean is(String phase, Player player) { + /** + *

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); } - - public synchronized boolean is(String phase) { + + /** + *

is.

+ * + * @param phase a {@link java.lang.String} object. + * @return a boolean. + */ + public synchronized boolean is(String phase) { return (getPhase().equals(phase)); } - - public boolean isAfter(String phase) { - return phaseIndex > findIndex(phase); - } - - public boolean isBefore(String phase) { - return phaseIndex < findIndex(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; + 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]; + return phaseOrder[phaseIndex]; } - + + /** + *

Getter for the field turn.

+ * + * @return a int. + */ public int getTurn() { return turn; } - public Player getNextTurn(){ - if (extraTurns.isEmpty()) - return getPlayerTurn().getOpponent(); - - return extraTurns.peek(); - } - - public boolean isNextTurn(Player pl){ - Player next = getNextTurn(); - return (pl.equals(next)); - } - - 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); - } - - 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); - } - } - - public void addExtraCombat() { - // Extra combats can only happen - extraCombats++; + /** + *

getNextTurn.

+ * + * @return a {@link forge.Player} object. + */ + public Player getNextTurn() { + if (extraTurns.isEmpty()) + return getPlayerTurn().getOpponent(); + + return extraTurns.peek(); } - public boolean isFirstCombat() { - return (nCombatsThisTurn == 1); + /** + *

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++) { + + 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.GameInfo.setAssignedFirstStrikeDamageThisCombat(false); - AllZone.GameInfo.setResolvedFirstStrikeDamageThisCombat(false); + 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); } } - 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.InputControl.resetInput(); - AllZone.Stack.chooseOrderOfSimultaneousStackEntryAll(); - } - else{ - if (AllZone.Stack.size() == 0){ - // end phase - needToNextPhase = true; - pPlayerPriority = getPlayerTurn(); // this needs to be set early as we exit the phase - } - else{ - if(!AllZone.Stack.hasSimultaneousStackEntries()) - AllZone.Stack.resolveStack(); - } - AllZone.Stack.chooseOrderOfSimultaneousStackEntryAll(); - } + /** + *

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) { + if (needToNextPhaseInit <= 4) { return true; } return false; } - public static boolean canCastSorcery(Player player) - { - return AllZone.Phase.isPlayerTurn(player) && (AllZone.Phase.getPhase().equals(Constant.Phase.Main2) || - AllZone.Phase.getPhase().equals(Constant.Phase.Main1)) && AllZone.Stack.size() == 0; - } - - 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(); - } + /** + *

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; + } - public static void main(String args[]) { - Phase phase = new Phase(); - for(int i = 0; i < phase.phaseOrder.length; i++) { - System.out.println(phase.getPlayerTurn() + " " + phase.getPhase()); - phase.nextPhase(); + /** + *

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(); + } } } - public static void increaseSpellCount(SpellAbility sp){ - StormCount++; + /** + *

incrementComputerInstantSpellCount.

+ * + * @since 1.0.15 + */ + protected static void incrementComputerInstantSpellCount() { + ComputerInstantSpellCount++; + } - if (sp.getActivatingPlayer().isHuman()) { - PlayerSpellCount++; - if (sp instanceof Spell_Permanent && sp.getSourceCard().isCreature()) { - PlayerCreatureSpellCount++; - } - if (sp.getSourceCard().isInstant()) { - PlayerInstantSpellCount++; - } - } - - else { - ComputerSpellCount++; - if (sp instanceof Spell_Permanent && sp.getSourceCard().isCreature()) { - Phase.ComputerCreatureSpellCount++; - } - if (sp.getSourceCard().isInstant()) { - ComputerInstantSpellCount++; - } - } - } + /** + *

incrementComputerCreatureSpellCount.

+ * + * @since 1.0.15 + */ + protected static void incrementComputerCreatureSpellCount() { + ComputerCreatureSpellCount++; + } - public static void setStormCount(int stormCount) { - StormCount = stormCount; - } + /** + *

incrementComputerSpellCount.

+ * + * @since 1.0.15 + */ + protected static void incrementComputerSpellCount() { + ComputerSpellCount++; + } - public static int getStormCount() { - return StormCount; - } + /** + *

incrementPlayerInstantSpellCount.

+ * + * @since 1.0.15 + */ + protected static void incrementPlayerInstantSpellCount() { + PlayerInstantSpellCount++; + } - public static void setGameBegins(int gameBegins) { - GameBegins = gameBegins; - } + /** + *

incrementPlayerCreatureSpellCount.

+ * + * @since 1.0.15 + */ + protected static void incrementPlayerCreatureSpellCount() { + PlayerCreatureSpellCount++; + } - 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 - public void setDevPhaseState(String phaseID) - { - this.phaseIndex = findIndex(phaseID); - } + /** + *

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 index 270e99707aa..1b9d4002223 100644 --- a/src/forge/PhaseUtil.java +++ b/src/forge/PhaseUtil.java @@ -1,429 +1,481 @@ -package forge; - -import java.util.ArrayList; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.gui.input.Input; - -public class PhaseUtil { - // ******* UNTAP PHASE ***** - 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; - } - - public static void handleUntap(){ - Player turn = AllZone.Phase.getPlayerTurn(); - - AllZone.Phase.turnReset(); - - AllZone.Combat.reset(); - AllZone.Combat.setAttackingPlayer(turn); - AllZone.Combat.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.GameAction.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.Phase.setNeedToNextPhase(true); - return; - } - - // Phasing would happen here - - doUntap(); - - //otherwise land seems to stay tapped when it is really untapped - AllZone.Human_Battlefield.updateObservers(); - - AllZone.Phase.setNeedToNextPhase(true); - } - - private static void doUntap() - { - Player player = AllZone.Phase.getPlayerTurn(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - - for(Card c : list) { - if (c.getBounceAtUntap() && c.getName().contains("Undiscovered Paradise") ) - { - AllZone.GameAction.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()+"?"; - if (c.getGainControlTargets().size() > 0) { - ArrayList targets = c.getGainControlTargets(); - prompt += "\r\n"+c.getName()+" is controlling: "; - for (Card target:targets) { - prompt += target.getName(); - } - } - if (GameActionUtil.showYesNoDialog(c, prompt)) { - c.untap(); - } - } - else { //computer - //if it is controlling something by staying tapped, leave it tapped - //if not, untap it - if(!(c.getGainControlTargets().size() > 0)) 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.Phase.getPlayerTurn().isComputer()) { - //search for lands the computer has and only untap 1 - CardList landList = AllZoneUtil.getPlayerLandsInPlay(AllZone.ComputerPlayer); - 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.Display.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.HumanPlayer); - landList = landList.filter(AllZoneUtil.tapped); - if( landList.size() > 0 ) { - AllZone.InputControl.setInput(target); - } - } - } - if( AllZoneUtil.isCardInPlay("Damping Field") || AllZoneUtil.isCardInPlay("Imi Statue")) { - if( AllZone.Phase.getPlayerTurn().isComputer() ) { - CardList artList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.Display.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.HumanPlayer); - artList = artList.filter(AllZoneUtil.artifacts); - artList = artList.filter(AllZoneUtil.tapped); - if( artList.size() > 0 ) { - AllZone.InputControl.setInput(target); - } - } - } - if((AllZoneUtil.isCardInPlay("Smoke") || AllZoneUtil.isCardInPlay("Stoic Angel")) ) { - if( AllZone.Phase.getPlayerTurn().isComputer() ) { - CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - 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.Display.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.HumanPlayer); - creatures = creatures.filter(AllZoneUtil.tapped); - if( creatures.size() > 0 ) { - AllZone.InputControl.setInput(target); - } - } - } - }//end doUntap - - - 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 - - if(c.isEnchantedBy("Venarian Gold") && (c.getCounters(Counters.SLEEP) > 0)) return false; - - if(isAnZerrinRuinsType(getAnZerrinRuinsTypes(), c)) return false; - - return true; - } - - - 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.getCardsInPlay("Hokori, Dust Drinker").size() > 0) - return true; - - if (AllZoneUtil.getPlayerCardsInPlay(AllZone.Phase.getPlayerTurn(), "Mungha Wurm").size() > 0) - return true; - - return false; - } - - private static ArrayList getAnZerrinRuinsTypes() { - ArrayList types = new ArrayList(); - CardList ruins = AllZoneUtil.getCardsInPlay("An-Zerrin Ruins"); - for(Card ruin:ruins) { - types.add(ruin.getChosenType()); - } - return types; - } - - private static boolean isAnZerrinRuinsType(ArrayList types, Card card) { - ArrayList cardTypes = card.getType(); - for(String type:cardTypes) { - if(types.contains(type)) return true; - } - return false; - } - - // ******* UPKEEP PHASE ***** - public static void handleUpkeep(){ - if (skipUpkeep()){ - // Slowtrips all say "on the next turn's upkeep" if there is no upkeep next turn, the trigger will never occur. - Player turn = AllZone.Phase.getPlayerTurn(); - turn.clearSlowtripList(); - turn.getOpponent().clearSlowtripList(); - AllZone.Phase.setNeedToNextPhase(true); - return; - } - - GameActionUtil.executeUpkeepEffects(); - } - - public static boolean skipUpkeep() - { - if (AllZoneUtil.isCardInPlay("Eon Hub")) - return true; - - Player turn = AllZone.Phase.getPlayerTurn(); - - if (AllZoneUtil.getPlayerHand(turn).size() == 0 && AllZoneUtil.isCardInPlay("Gibbering Descent", turn)) - return true; - - return false; - } - - // ******* DRAW PHASE ***** - public static void handleDraw(){ - Player playerTurn = AllZone.Phase.getPlayerTurn(); - - if (skipDraw(playerTurn)){ - AllZone.Phase.setNeedToNextPhase(true); - return; - } - - playerTurn.drawCard(); - GameActionUtil.executeDrawStepEffects(); - } - - private static boolean skipDraw(Player player){ - // starting player skips his draw - if(AllZone.Phase.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 *********** - - public static void verifyCombat(){ - AllZone.Combat.verifyCreaturesInPlay(); - CombatUtil.showCombat(); - } - - public static void handleDeclareAttackers(){ - verifyCombat(); - CardList list = new CardList(); - list.addAll(AllZone.Combat.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); - } - } - - public static void handleAttackingTriggers(){ - CardList list = new CardList(); - list.addAll(AllZone.Combat.getAttackers()); - AllZone.Stack.freezeStack(); - // Then run other Attacker bonuses - //check for exalted: - if (list.size() == 1){ - Player attackingPlayer = AllZone.Combat.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.Stack.unfreezeStack(); - } - - public static void handleDeclareBlockers(){ - verifyCombat(); - - AllZone.Stack.freezeStack(); - - AllZone.Combat.setUnblocked(); - - CardList list = new CardList(); - list.addAll(AllZone.Combat.getAllBlockers()); - - list = list.filter(new CardListFilter(){ - public boolean addCard(Card c) - { - return !c.getCreatureBlockedThisCombat(); - } - }); - - CardList attList = new CardList(); - attList.addAll(AllZone.Combat.getAttackers()); - - CombatUtil.checkDeclareBlockers(list); - - for (Card a:attList){ - CardList blockList = AllZone.Combat.getBlockers(a); - for (Card b:blockList) - CombatUtil.checkBlockedAttackers(a, b); - } - - AllZone.Stack.unfreezeStack(); - CombatUtil.showCombat(); - } - - - // ***** Combat Utility ********** - // TODO: the below functions should be removed and the code blocks that use them should instead use SA_Restriction - public static boolean isBeforeAttackersAreDeclared() { - String phase = AllZone.Phase.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); - } -} +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 index c1098e2171a..f1f456ef1ea 100644 --- a/src/forge/Player.java +++ b/src/forge/Player.java @@ -1,1155 +1,1856 @@ - -package forge; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Random; - -import javax.swing.JOptionPane; - -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -import forge.card.spellability.SpellAbility; - - -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(); - - public Player(String myName) { - this(myName, 20, 0); - } - - public Player(String myName, int myLife, int myPoisonCounters) { - name = myName; - life = myLife; - poisonCounters = myPoisonCounters; - assignedDamage = 0; - preventNextDamage = 0; - lastDrawnCard = null; - numDrawnThisTurn = 0; - nTurns = 0; - altWin = false; - altLose = false; - winCondition = ""; - loseCondition = ""; - maxLandsToPlay = 1; - numLandsPlayed = 0; - - handSizeOperations = new ArrayList(); - } - - 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; - this.updateObservers(); - } - - public String getName() { - return name; - } - - public abstract boolean isHuman(); - public abstract boolean isComputer(); - public abstract boolean isPlayer(Player p1); - - public abstract Player getOpponent(); - - ////////////////////////// - // - // methods for manipulating life - // - ////////////////////////// - - 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; - } - - public int getLife() { - return life; - } - - private void addLife(final int toAdd) { - life += toAdd; - this.updateObservers(); - } - - 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.TriggerHandler.runTrigger("LifeGained", runParams); - } - } - else System.out.println("Player - trying to gain negative or 0 life"); - - return newLifeSet; - } - - 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; - } - - 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.TriggerHandler.runTrigger("LifeLost", runParams); - - return newLifeSet; - } - - public boolean canLoseLife() { - if(AllZoneUtil.isCardInPlay("Platinum Emperion",this)) return false; - return true; - } - - private void subtractLife(final int toSub) { - life -= toSub; - this.updateObservers(); - } - - public boolean canPayLife(int lifePayment) { - if(life < lifePayment) return false; - if(lifePayment > 0 && AllZoneUtil.isCardInPlay("Platinum Emperion",this)) return false; - return true; - } - - 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 - // - ////////////////////////// - - 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); - } - - 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 - 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.TriggerHandler.runTrigger("DamageDone", runParams); - } - } - - 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) - 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) - 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("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; - } - - 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.GameAction.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.GameAction.exile(lib.get(0)); - } - } - //return so things like Lifelink, etc do not trigger. This is a replacement effect I think. - return 0; - } - - return restDamage; - } - - 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; - } - - public void setAssignedDamage(int n) { assignedDamage = n; } - public void addAssignedDamage(int n) { assignedDamage += n; } - public int getAssignedDamage() { return assignedDamage; } - - 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 - public void setpreventNextDamage(int n) { - preventNextDamage = n; - } - - public int getPreventNextDamage() { - return preventNextDamage; - } - - public void addPreventNextDamage(int n) { - preventNextDamage += n; - } - - public void subtractPreventNextDamage(int n) { - preventNextDamage -= n; - } - - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - - ////////////////////////// - // - // methods for handling Poison counters - // - ////////////////////////// - - public void addPoisonCounters(int num) { - poisonCounters += num; - this.updateObservers(); - } - - public void setPoisonCounters(int num) { - poisonCounters = num; - this.updateObservers(); - } - - public int getPoisonCounters() { - return poisonCounters; - } - - public void subtractPoisonCounters(int num) { - poisonCounters -= num; - this.updateObservers(); - } - - public boolean hasShroud() { - return false; - } - - public boolean canTarget(Card card) { - return !hasShroud(); - } - - public boolean canPlaySpells() { - return true; - } - - public boolean canPlayAbilities() { - return true; - } - - public CardList getCards(PlayerZone zone) { - //TODO - return new CardList(); - } - - - //////////////////////////////// - /// - /// replaces AllZone.GameAction.draw* methods - /// - //////////////////////////////// - - public abstract void mayDrawCard(); - - public abstract void mayDrawCards(int numCards); - - public void drawCard() { - drawCards(1); - } - - public void drawCards() { - drawCards(1); - } - - public abstract boolean dredge(); - - public void drawCards(int n) { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, this); - - for(int i = 0; i < n; i++) { - // TODO: any draw replacements would go here, not just Dredge - if(getDredge().size() == 0 || !dredge()) { - doDraw(library); - } - } - } - - private void doDraw(PlayerZone library) { - if(library.size() != 0) { - Card c = library.get(0); - AllZone.GameAction.moveToHand(c); - - setLastDrawnCard(c); - c.setDrawnThisTurn(true); - numDrawnThisTurn++; - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", c); - AllZone.TriggerHandler.runTrigger("Drawn", runParams); - } - //lose: - else if (!Constant.Runtime.DevMode[0] || AllZone.Display.canLoseByDecking()) { - // if devMode is off, or canLoseByDecking is Enabled, run Lose Condition - if (altLoseConditionMet("Milled")){ - AllZone.GameAction.checkStateEffects(); - } - } - } - - 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() - - 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() - - public void resetNumDrawnThisTurn() { - numDrawnThisTurn = 0; - } - - public int getNumDrawnThisTurn() { - return numDrawnThisTurn; - } - - //////////////////////////////// - /// - /// replaces AllZone.GameAction.discard* methods - /// - //////////////////////////////// - - public abstract CardList discard(final int num, final SpellAbility sa, boolean duringResolution); - - public CardList discard(final SpellAbility sa) { - return discard(1, sa, false); - } - - public void discard(Card c, SpellAbility sa) { - doDiscard(c, sa); - } - - public 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.Stack.add(ability); - } - } - - // necro disrupts madness - if (AllZoneUtil.getPlayerCardsInPlay(c.getOwner(), "Necropotence").size() > 0) { - AllZone.GameAction.exile(c); - return; - } - - AllZone.GameAction.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.GameAction.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.GameAction.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.TriggerHandler.runTrigger("Discarded", runParams); - - }//end doDiscard - - public void discardHand(SpellAbility sa) { - CardList list = AllZoneUtil.getPlayerHand(this); - discardRandom(list.size(), sa); - } - - public void discardRandom(SpellAbility sa) { - discardRandom(1, sa); - } - - 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); - } - } - - public abstract void discardUnless(int num, String uType, SpellAbility sa); - - public void mill(int n) { - mill(n, Constant.Zone.Graveyard); - } - - public void mill(int n, String zone) { - CardList lib = AllZoneUtil.getPlayerCardsInLibrary(this); - - int max = Math.min(n, lib.size()); - - PlayerZone destination = AllZone.getZone(zone, this); - - for(int i = 0; i < max; i++) { - AllZone.GameAction.moveTo(destination, lib.get(i)); - } - } - - public abstract void handToLibrary(final int numToLibrary, String libPos); - - //////////////////////////////// - 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.TriggerHandler.runTrigger("Shuffled",runParams); - - }//shuffle - //////////////////////////////// - - //////////////////////////////// - protected abstract void doScry(CardList topN, int N); - - 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()); - } - /////////////////////////////// - - public void playLand(Card land){ - if (canPlayLand()){ - AllZone.GameAction.moveToPlay(land); - CardFactoryUtil.playLandEffects(land); - numLandsPlayed++; - - //check state effects for static animate (Living Lands, Conversion, etc...) - AllZone.GameAction.checkStateEffects(); - - //Run triggers - HashMap runParams = new HashMap(); - runParams.put("Card", land); - AllZone.TriggerHandler.runTrigger("LandPlayed", runParams); - } - - AllZone.Stack.unfreezeStack(); - } - - public boolean canPlayLand(){ - return Phase.canCastSorcery(this) && (numLandsPlayed < maxLandsToPlay || - AllZoneUtil.getPlayerCardsInPlay(this, "Fastbond").size() > 0); - } - - /////////////////////////////// - //// - //// properties about the player and his/her cards/game status - //// - /////////////////////////////// - public boolean hasPlaneswalker() { - return null != getPlaneswalker(); - } - - public Card getPlaneswalker() { - CardList c = AllZoneUtil.getPlayerTypeInPlay(this, "Planeswalker"); - if(null != c && c.size() > 0) return c.get(0); - else return null; - } - - public int getNumPowerSurgeLands() { - return numPowerSurgeLands; - } - - public int setNumPowerSurgeLands(int n) { - numPowerSurgeLands = n; - return numPowerSurgeLands; - } - - public Card getLastDrawnCard() { - return lastDrawnCard; - } - - public Card setLastDrawnCard(Card c) { - lastDrawnCard = c; - return lastDrawnCard; - } - - public Card resetLastDrawnCard() { - Card old = lastDrawnCard; - lastDrawnCard = null; - return old; - } - - public boolean skipNextUntap() { - return skipNextUntap; - } - - public void setSkipNextUntap(boolean b) { - skipNextUntap = b; - } - - public CardList getSlowtripList() { - return slowtripList; - } - - public void clearSlowtripList() { - slowtripList.clear(); - } - - public void addSlowtripList(Card card) { - slowtripList.add(card); - } - - public int getTurn() { return nTurns; } - public void incrementTurn() { nTurns++; } - - //////////////////////////////// - public abstract void sacrificePermanent(String prompt, CardList choices); - - public void sacrificeCreature() { - CardList choices = AllZoneUtil.getCreaturesInPlay(this); - sacrificePermanent("Select a creature to sacrifice.", choices); - } - - public void sacrificeCreature(CardList choices) { - sacrificePermanent("Select a creature to sacrifice.", choices); - } - - // Game win/loss - - public boolean getAltWin(){ - return altWin; - } - - public boolean getAltLose(){ - return altLose; - } - - public String getWinCondition(){ - return winCondition; - } - - public String getLoseCondition(){ - return loseCondition; - } - - public void altWinConditionMet(String s) { - if (cantWin()){ - System.out.println("Tried to win, but currently can't."); - return; - } - altWin = true; - winCondition = s; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - - public boolean hasWon(){ - if (cantWin()) - return false; - - return altWin; - } - - public boolean hasMetalcraft() { - CardList list = AllZoneUtil.getPlayerTypeInPlay(this, "Artifact"); - return list.size() >= 3; - } - - public boolean hasThreshold() { - CardList grave = AllZoneUtil.getPlayerGraveyard(this); - return grave.size() >= 7; - } - - public boolean hasHellbent() { - CardList hand = AllZoneUtil.getPlayerHand(this); - return hand.size() == 0; - } - - private ArrayList handSizeOperations; - - public int getMaxHandSize() { - - int ret = 7; - for(int i=0;i= 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; - } - - public void sortHandSizeOperations() { - if(handSizeOperations.size() < 2) { - return; - } - - int changes = 1; - - while(changes > 0) { - changes = 0; - for(int i=1;i 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; - } - } - - protected abstract void clashMoveToTopOrBottom(Card c); - - //////////////////////////////// - // - // generic Object overrides - // - ///////////////////////////////// - - @Override - public boolean equals(Object o) { - if(o instanceof Player){ - Player p1 = (Player)o; - return p1.getName().equals(name); - } else return false; - } - - @Override - public String toString() { - return name; - } -} \ No newline at end of file +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 index 43cd76d94a3..459ef43debb 100644 --- a/src/forge/PlayerUtil.java +++ b/src/forge/PlayerUtil.java @@ -1,18 +1,289 @@ - -package forge; - - -public class PlayerUtil { - 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; - } -} \ No newline at end of file +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 index 9cf5d1ab274..ac171d202f4 100644 --- a/src/forge/PlayerZone.java +++ b/src/forge/PlayerZone.java @@ -1,36 +1,14 @@ package forge; + import java.util.Observer; //PlayerZone observers the cards that are added to its zone -abstract public class PlayerZone extends MyObservable implements IPlayerZone, Observer -{ +/** + *

Abstract PlayerZone class.

+ * + * @author Forge + * @version $Id: $ + */ +abstract public class PlayerZone extends MyObservable implements IPlayerZone, Observer { } - -interface IPlayerZone -{ - public void setUpdate(boolean b); - public boolean getUpdate(); - - public int size(); - public void add(Object o); - public void add(Card c, int index); - public void addOnce(Object o); - - public Card get(int index); - public void remove(Object o); - - public void setCards(Card c[]); - public Card[] getCards(); - - //removes all cards - public void reset(); - - public boolean is(String zone); - public boolean is(String zone, Player player); - - public Player getPlayer();//the Player that owns this zone - public String getZoneName();//returns the Zone's name like Graveyard - - public String toString(); -} \ No newline at end of file diff --git a/src/forge/PlayerZone_ComesIntoPlay.java b/src/forge/PlayerZone_ComesIntoPlay.java index dc6f875380b..4e48162bedf 100644 --- a/src/forge/PlayerZone_ComesIntoPlay.java +++ b/src/forge/PlayerZone_ComesIntoPlay.java @@ -1,88 +1,96 @@ - 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; - private static boolean SimultaneousEntry = false; // For Cards with Multiple Token Entry. Only Affects Allies at the moment. - static int SimultaneousEntryCounter = 1; // For Cards with Multiple Token Entry. Only Affects Allies at the moment. - + + 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"); - + 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(); - + + 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; + + 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.HumanPlayer.addMaxLandsToPlay(addMax); - AllZone.ComputerPlayer.addMaxLandsToPlay(addMax); - } - else - c.getController().addMaxLandsToPlay(addMax); + + if (adjustLandPlays) { + if (eachPlayer) { + AllZone.getHumanPlayer().addMaxLandsToPlay(addMax); + AllZone.getComputerPlayer().addMaxLandsToPlay(addMax); + } else + c.getController().addMaxLandsToPlay(addMax); } - - if(trigger) { + + 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"); - } + 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."); + 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)); } @@ -97,188 +105,194 @@ public class PlayerZone_ComesIntoPlay extends DefaultPlayerZone { } } }*/ - + //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()); + 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.Stack.addSimultaneousStackEntry(ability); + 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.Stack.addSimultaneousStackEntry(ability); + 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.StaticEffects.getCardToEffectsList().containsKey(c.getName())) { - String[] effects = AllZone.StaticEffects.getCardToEffectsList().get(c.getName()); - for(String effect:effects) { - AllZone.StaticEffects.addStateBasedEffect(effect); + + 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++) { + + 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) + 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.GameAction.moveToPlay(crd); - + AllZone.getGameAction().moveToPlay(crd); + crd.equipCard(c); } } - + } else //computer { - if(AllZoneUtil.isCardInPlayerGraveyard(player, crd) + if (AllZoneUtil.isCardInPlayerGraveyard(player, crd) && AllZoneUtil.isCardInPlay(c) && c.isCreature() && c.getNetAttack() == 1 && c.getNetDefense() == 1) { - AllZone.GameAction.moveToPlay(crd); - + 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.Stack.addSimultaneousStackEntry(ability); + 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; + + 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.HumanPlayer.addMaxLandsToPlay(addMax); - AllZone.ComputerPlayer.addMaxLandsToPlay(addMax); - } - else - c.getController().addMaxLandsToPlay(addMax); - } - - if(leavesTrigger) { - c.leavesPlay(); + if (adjustLandPlays) { + if (eachPlayer) { + AllZone.getHumanPlayer().addMaxLandsToPlay(addMax); + AllZone.getComputerPlayer().addMaxLandsToPlay(addMax); + } else + c.getController().addMaxLandsToPlay(addMax); } - if(AllZone.StaticEffects.getCardToEffectsList().containsKey(c.getName())) { - String[] effects = AllZone.StaticEffects.getCardToEffectsList().get(c.getName()); + + 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) { + for (String effect : effects) { tempEffect = effect; - AllZone.StaticEffects.removeStateBasedEffect(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.StaticEffects.getStateBasedMap().keySet()) { + 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; } - - public static void setSimultaneousEntry(boolean simultaneousEntry) { - SimultaneousEntry = simultaneousEntry; - } - - public static boolean isSimultaneousEntry() { - return SimultaneousEntry; - } } diff --git a/src/forge/QuestData.java b/src/forge/QuestData.java deleted file mode 100644 index 5795d225067..00000000000 --- a/src/forge/QuestData.java +++ /dev/null @@ -1,814 +0,0 @@ - -package forge; - -import com.esotericsoftware.minlog.Log; -import forge.deck.Deck; -import forge.deck.DeckManager; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -import java.io.*; -import java.util.*; - - -//when you create QuestData 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(QuestData data, ArrayList aiDeckNames) -//OR non-static readAIQuestDeckFiles() -//which reads the files "questDecks-easy", "questDecks-medium","questDecks-hard", -@Deprecated -public class QuestData implements NewConstants { - QuestData_Prefs qdPrefs = null; - - private int rankIndex; - private int win; - private int lost; - - private int plantLevel; - private int wolfPetLevel; - private int crocPetLevel; - private int birdPetLevel; - private int houndPetLevel; - - private String selectedPet; - - private int life; - private int estatesLevel; - private int luckyCoinLevel; - private int sleightOfHandLevel; - private int gearLevel; - - private int questsPlayed; - - private long credits; - - private int diffIndex; - private String difficulty; - private String mode = ""; - - private ArrayList easyAIDecks; - private ArrayList mediumAIDecks; - private ArrayList hardAIDecks; - - private Map myDecks = new HashMap(); - private Map aiDecks = new HashMap(); - - //holds String card names - private ArrayList cardPool = new ArrayList(); - private ArrayList newCardList = new ArrayList(); - private ArrayList shopList = new ArrayList(); - - private ArrayList availableQuests = new ArrayList(); - private ArrayList completedQuests = new ArrayList(); - - private QuestData_BoosterPack boosterPack = new QuestData_BoosterPack(); - - //used by shouldAddAdditionalCards() - private Random random = MyRandom.random; - - //feel free to change this to something funnier - private String[] rankArray = { - "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",}; - - - public static final String FANTASY = "Fantasy"; - public static final String REALISTIC = "Realistic"; - - //TODO: Temporary. - public boolean useNewQuestUI = false; - - public QuestData(){ - qdPrefs = new QuestData_Prefs(); - - for(int i = 0; i < qdPrefs.getStartingBasic(); i++) { - cardPool.add("Forest"); - cardPool.add("Mountain"); - cardPool.add("Swamp"); - cardPool.add("Island"); - cardPool.add("Plains"); - } - - for(int i = 0; i < qdPrefs.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"); - } - }//QuestData - - //adds cards to card pool and sets difficulty - public void newGame(int difficulty, String m) { - setDifficulty(difficulty); - - ArrayList list = new ArrayList(); - list.addAll(boosterPack.getCommon(qdPrefs.getStartingCommons(difficulty))); - list.addAll(boosterPack.getUncommon(qdPrefs.getStartingUncommons(difficulty))); - list.addAll(boosterPack.getRare(qdPrefs.getStartingRares(difficulty))); - - //because cardPool already has basic land added to it - cardPool.addAll(list); - credits = qdPrefs.getStartingCredits(); - - mode = m; - if (mode.equals(FANTASY)) - life = 15; - else - life = 20; - } - - - public String[] getOpponents() { - int index = getDiffIndex(); - - if(getWin() < qdPrefs.getWinsForMediumAI(index)) return getOpponents(easyAIDecks); - - if(getWin() < qdPrefs.getWinsForHardAI(index)) return getOpponents(mediumAIDecks); - - return getOpponents(hardAIDecks); - }//getOpponents() - - - static public void readAIQuestDeckFiles(QuestData data, ArrayList aiDeckNames) { - data.easyAIDecks = readFile(ForgeProps.getFile(QUEST.EASY), aiDeckNames); - data.mediumAIDecks = readFile(ForgeProps.getFile(QUEST.MEDIUM), aiDeckNames); - data.hardAIDecks = readFile(ForgeProps.getFile(QUEST.HARD), aiDeckNames); - } - - public void refreshAIQuestDeckFiles(ArrayList aiDeckNames) { - easyAIDecks = readFile(ForgeProps.getFile(QUEST.EASY), aiDeckNames); - mediumAIDecks = readFile(ForgeProps.getFile(QUEST.MEDIUM), aiDeckNames); - hardAIDecks = readFile(ForgeProps.getFile(QUEST.HARD), aiDeckNames); - } - - public String[] getOpponents(ArrayList aiDeck) { - Collections.shuffle(aiDeck); - - return new String[] {aiDeck.get(0).toString(), aiDeck.get(1).toString(), aiDeck.get(2).toString()}; - - }//getOpponents() - - private static ArrayList readFile(File file, ArrayList aiDecks) { - ArrayList list = FileUtil.readFile(file); - - //remove any blank lines - ArrayList noBlankLines = new ArrayList(); - String s; - for(int i = 0; i < list.size(); i++) { - s = list.get(i).toString().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 decks names", - file); - - - for(int i = 0; i < list.size(); i++) - /*if(!aiDecks.contains(list.get(i).toString())) ErrorViewer.showError(new Exception(), - "QuestData : readFile() error, file %s contains the invalid ai deck name: %s", file, - list.get(i));*/ - if (!aiDecks.contains(list.get(i).toString())) - { - aiDecks.add(list.get(i).toString()); - } - - - return list; - }//readFile() - - public void readAIQuestDeckFiles() { - readAIQuestDeckFiles(this, ai_getDeckNames()); - } - - static public QuestData loadData() { - try { - //read file "questData" - ObjectInputStream in = new ObjectInputStream(new FileInputStream(ForgeProps.getFile(QUEST.DATA))); - Object o = in.readObject(); - in.close(); - - QuestData_State state = (QuestData_State) o; - - QuestData data = new QuestData(); - - data.win = state.win; - data.lost = state.lost; - data.credits = state.credits; - data.rankIndex = state.rankIndex; - data.difficulty = state.difficulty; - - data.mode = state.mode; - if (data.mode == null) - data.mode = REALISTIC; - - data.plantLevel = state.plantLevel; - data.wolfPetLevel = state.wolfPetLevel; - data.crocPetLevel = state.crocPetLevel; - data.birdPetLevel = state.birdPetLevel; - data.houndPetLevel = state.houndPetLevel; - data.selectedPet = state.selectedPet; - data.life = state.life; - data.estatesLevel = state.estatesLevel; - data.luckyCoinLevel = state.luckyCoinLevel; - data.sleightOfHandLevel = state.sleightOfHandLevel; - data.gearLevel = state.gearLevel; - data.questsPlayed = state.questsPlayed; - data.availableQuests = state.availableQuests; - data.completedQuests = state.completedQuests; - - data.shopList = state.shopList; - data.cardPool = state.cardPool; - data.myDecks = state.myDecks; - data.aiDecks = state.aiDecks; - - readAIQuestDeckFiles(data, new ArrayList(data.aiDecks.keySet())); - - return data; - }//try - catch(Exception ex) { - ErrorViewer.showError(ex, "Error loading Quest Data"); - throw new RuntimeException(ex); - } - }//loadData() - - - //returns Strings of the card names - public ArrayList getCardpool() { - //make a copy so the internal ArrrayList cannot be changed externally - return new ArrayList(cardPool); - } - - public ArrayList getShopList() { - if (shopList != null) - return new ArrayList(shopList); - else - return null; - } - - public void setShopList(ArrayList list) - { - shopList = list; - } - - - public ArrayList getAvailableQuests() { - if (availableQuests != null) - return new ArrayList(availableQuests); - else - return null; - } - - public void setAvailableQuests(ArrayList list) - { - availableQuests = list; - } - - public void clearAvailableQuests() - { - availableQuests.clear(); - } - - public ArrayList getCompletedQuests() { - if (completedQuests != null) - return new ArrayList(completedQuests); - else - return null; - } - - public void setCompletedQuests(ArrayList list) - { - completedQuests = list; - } - - - public void clearShopList() { - shopList.clear(); - } - - //rename - removeDeck, addDeck - //copy - addDeck - - public void removeDeck(String deckName) { - myDecks.remove(deckName); - } - - public void ai_removeDeck(String deckName) { - aiDecks.remove(deckName); - } - - public void addDeck(Deck d) { - myDecks.put(d.getName(), d); - } - - public void ai_addDeck(Deck d) { - aiDecks.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 - 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() - - //this sets the cards in Deck main - Deck d = getDeckFromMap(myDecks, 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).toString()); - - return d; - } - - //this Deck object is a Constructed deck - //deck.getDeckType() is Constant.GameType.Constructed - //constructed because the computer can use any card - public Deck ai_getDeck(String deckName) { - return getDeckFromMap(aiDecks, deckName); - } - - public Deck ai_getDeckNewFormat(String deckName) { - DeckManager deckManager = new DeckManager(ForgeProps.getFile(QUEST.DECKS)); - return deckManager.getDeck(deckName); - } - - - private Deck getDeckFromMap(Map map, String deckName) { - if(!map.containsKey(deckName)) ErrorViewer.showError(new Exception(), - "QuestData : getDeckFromMap(String deckName) error, deck name not found - %s", deckName); - - return map.get(deckName); - } - - //returns human player decks - //returns ArrayList of String deck names - public ArrayList getDeckNames() { - return getDeckNames_String(myDecks); - }//getDecks() - - //returns AI computer decks - //returns ArrayList of String deck names - public ArrayList ai_getDeckNames() { - return getDeckNames_String(aiDecks); - } - - //returns ArrayList of Deck String names - private ArrayList getDeckNames_String(Map map) { - ArrayList out = new ArrayList(); - - Iterator it = map.keySet().iterator(); - while(it.hasNext()) - out.add(it.next().toString()); - - return out; - } - - //get new cards that were added to your card pool by addCards() - public ArrayList getAddedCards() { - return new ArrayList(newCardList); - } - - //get new cards that were added to your card pool by addCards() - public void addToNewList(ArrayList added) { - newCardList.addAll(added); - } - - //adds 11 cards, to the current card pool - //(I chose 11 cards instead of 15 in order to make things more challenging) - public void addCards() { - int nCommon = qdPrefs.getNumCommon(); - int nUncommon = qdPrefs.getNumUncommon(); - int nRare = qdPrefs.getNumRare(); - - ArrayList newCards = new ArrayList(); - newCards.addAll(boosterPack.getCommon(nCommon)); - newCards.addAll(boosterPack.getUncommon(nUncommon)); - newCards.addAll(boosterPack.getRare(nRare)); - - - cardPool.addAll(newCards); - - //getAddedCards() uses newCardList - newCardList = newCards; - - }//addCards() - - public void addRandomRare(int n) - { - ArrayList newCards = new ArrayList(); - newCards.addAll(boosterPack.getRare(n)); - - cardPool.addAll(newCards); - newCardList.addAll(newCards); - } - - public String addRandomRare() { - - ArrayList newCards = new ArrayList(); - newCards.addAll(boosterPack.getRare(1)); - - cardPool.addAll(newCards); - newCardList.addAll(newCards); - - Card c = AllZone.CardFactory.getCard(newCards.get(0), AllZone.HumanPlayer); - c.setCurSetCode(c.getMostRecentSet()); - return CardUtil.buildFilename(c); - //return GuiDisplayUtil.cleanString(newCards.get(0)); - } - - public void addCard(Card c) - { - cardPool.add(c.getName()); - } - - public void addCard(String s) - { - cardPool.add(s); - } - - public void removeCard(Card c) - { - - String s = c.getName(); - if (!cardPool.contains(s)) - return; - - for(int i=0;i getCards() { - //copy CardList in order to keep private variables private - //if we just return cardPool, it could be changed externally - return new ArrayList(cardPool); - } - - - 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 = qdPrefs.getWinsForRankIncrease(difficulty); - - return numberLevels * nMatches; - } - - //this changes getRank() - public void addWin() { - win++; - - if(win % qdPrefs.getWinsForRankIncrease(diffIndex) == 0) rankIndex++; - }//addWin() - - public void addLost() { - lost++; - } - - public int getWin() { - return win; - } - - public int getLost() { - return lost; - } - - //********************FANTASY STUFF START*********************** - - public void addPlantLevel() - { - plantLevel++; - } - - public int getPlantLevel() - { - return plantLevel; - } - - public void addWolfPetLevel() - { - wolfPetLevel++; - } - - public int getWolfPetLevel() - { - return wolfPetLevel; - } - - public void addCrocPetLevel() - { - crocPetLevel++; - } - - public int getCrocPetLevel() - { - return crocPetLevel; - } - - public void addBirdPetLevel() - { - birdPetLevel++; - } - - public int getBirdPetLevel() - { - return birdPetLevel; - } - - public void addHoundPetLevel() - { - houndPetLevel++; - } - - public int getHoundPetLevel() - { - return houndPetLevel; - } - - public void setSelectedPet(String s) - { - selectedPet = s; - } - - public String getSelectedPet() - { - return selectedPet; - } - - - public void setLife(int n) - { - life = n; - } - - public int getLife() - { - return life; - } - - public void addLife(int n) - { - life+=n; - } - - public int getEstatesLevel() - { - return estatesLevel; - } - - public void addEstatesLevel(int n) - { - estatesLevel+=n; - } - - public int getLuckyCoinLevel() - { - return luckyCoinLevel; - } - - public void addLuckyCoinLevel(int n) - { - luckyCoinLevel+=n; - } - - public int getSleightOfHandLevel() - { - return sleightOfHandLevel; - } - - public void addSleightOfHandLevel(int n) - { - sleightOfHandLevel+=n; - } - - public int getGearLevel() - { - return gearLevel; - } - - public void addGearLevel(int n) - { - gearLevel+=n; - } - - public int getQuestsPlayed() - { - return questsPlayed; - } - - public void addQuestsPlayed() - { - questsPlayed++; - } - - //********************FANTASY STUFF END*********************** - - public void addCredits(long c) - { - credits+=c; - } - - public void subtractCredits(long c) - { - credits-=c; - if (credits < 0) - credits = 0; - } - - public long getCredits() { - return credits; - } - - public String getMode() { - if (mode == null) - return ""; - return mode; - } - //should be called first, because the difficultly won't change - public String getDifficulty() { - return difficulty; - } - - public int getDiffIndex() { - return diffIndex; - } - - public void setDifficulty(int i) { - diffIndex = i; - difficulty = qdPrefs.getDifficulty(i); - } - - public void setDifficultyIndex() { - String[] diffStr = qdPrefs.getDifficulty(); - for(int i = 0; i < diffStr.length; i++) - if (difficulty.equals(diffStr[i])) - diffIndex = i; - } - - public String[] getDifficutlyChoices() { - return qdPrefs.getDifficulty(); - } - - public String getRank() { - //is rankIndex too big? - if(rankIndex == rankArray.length) rankIndex--; - - return rankArray[rankIndex]; - } - - //add cards after a certain number of wins or losses - public boolean shouldAddCards(boolean didWin) { - int n = qdPrefs.getWinsForBooster(diffIndex); - - if(didWin) return getWin() % n == 0; - else return getLost() % n == 0; - } - - public boolean shouldAddAdditionalCards(boolean didWin) { - float chance = 0.5f; - if (getLuckyCoinLevel() >= 1) - chance = 0.65f; - - float r = random.nextFloat(); - Log.debug("Random:" + r); - - if(didWin) return r <= chance; - - else return false; - } - - - //opponentName is one of the Strings returned by getOpponents() - public Deck getOpponentDeck(String opponentName) { - return null; - } - - public boolean hasSaveFile() { - //File f = new File(this.saveFileName); // The static field QuestData.saveFileName should be accessed in a static way - // No warning is given for it below in getBackupFilename - return ForgeProps.getFile(QUEST.DATA).exists(); - } - - //returns somethings like "questData-10" - //find a new filename - @SuppressWarnings("unused") - static private File getBackupFilename() { - //I made this a long because maybe an int would overflow, but who knows - File original = ForgeProps.getFile(QUEST.DATA); - File parent = original.getParentFile(); - String name = original.getName(); - long n = 1; - - File f; - while((f = new File(parent, name + "-" + n)).exists()) - n++; - - return f; - }//getBackupFilename() - - static public void saveData(QuestData q) { - try { - /* - //rename previous file "questData" to something like questData-23 - //just in case there is an error when playing the game or saving - File file = new File(saveFileName); - if(file.exists()) - file.renameTo(getBackupFilename()); - */ - - //setup QuestData_State - QuestData_State state = new QuestData_State(); - state.win = q.win; - state.lost = q.lost; - state.credits = q.credits; - state.difficulty = q.difficulty; - state.mode = q.mode; - state.rankIndex = q.rankIndex; - - state.plantLevel = q.plantLevel; - state.wolfPetLevel = q.wolfPetLevel; - state.crocPetLevel = q.crocPetLevel; - state.birdPetLevel = q.birdPetLevel; - state.houndPetLevel = q.houndPetLevel; - state.selectedPet = q.selectedPet; - state.life = q.life; - state.estatesLevel = q.estatesLevel; - state.luckyCoinLevel = q.luckyCoinLevel; - state.sleightOfHandLevel = q.sleightOfHandLevel; - state.gearLevel = q.gearLevel; - state.questsPlayed = q.questsPlayed; - state.availableQuests = q.availableQuests; - - state.cardPool = q.cardPool; - state.shopList = q.shopList; - state.myDecks = q.myDecks; - state.aiDecks = q.aiDecks; - - //write object - ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(ForgeProps.getFile(QUEST.DATA))); - out.writeObject(state); - out.flush(); - out.close(); - } catch(Exception ex) { - ErrorViewer.showError(ex, "Error saving Quest Data"); - throw new RuntimeException(ex); - } - }//saveData() - - 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++) { - QuestData.saveData(q); - QuestData.loadData(); - } - - System.exit(1); - } - - -} diff --git a/src/forge/QuestData_BoosterPack.java b/src/forge/QuestData_BoosterPack.java deleted file mode 100644 index ec42a6e9a6e..00000000000 --- a/src/forge/QuestData_BoosterPack.java +++ /dev/null @@ -1,325 +0,0 @@ -package forge; -//import java.io.BufferedReader; -//import java.io.File; -//import java.io.FileReader; - -import forge.properties.NewConstants; - -import java.util.*; - -//balance the number of colors and creature/spells for -//new cards that are won in quest mode -@Deprecated -public class QuestData_BoosterPack implements NewConstants { -// final private static String comment = "//"; - - private ArrayList commonCreature = new ArrayList(); - private ArrayList commonSpell = new ArrayList(); - - private ArrayList uncommonCreature = new ArrayList(); - private ArrayList uncommonSpell = new ArrayList(); - - private ArrayList rareCreature = new ArrayList(); - private ArrayList rareSpell = new ArrayList(); - - private Random random = MyRandom.random; - - private String[] colors = { - "gold", Constant.Color.Colorless, Constant.Color.Black, Constant.Color.Blue, Constant.Color.Green, - Constant.Color.Red, Constant.Color.White, - - //repeat colors in order to make Colorless and gold not as popular - Constant.Color.Black, Constant.Color.Blue, Constant.Color.Green, Constant.Color.Red, - Constant.Color.White }; - - - //testing - private ArrayList colorTest = new ArrayList(); - - //prints statistics to make sure everything is working - public static void main(String[] args) { - QuestData_BoosterPack q = new QuestData_BoosterPack(); - - for(int i = 0; i < 100; i++) - q.print(q.getNewCards(6, 3, 1)); - - q.colorStats(); - }//main() - - //testing - //nCommon is the number of common cards - private ArrayList getNewCards(int nCommon, int nUncommon, int nRare) { - ArrayList out = new ArrayList(); - - out.addAll(getCommon(nCommon)); - out.addAll(getUncommon(nUncommon)); - out.addAll(getRare(nRare)); - - return out; - }//getNewCards() - - //testing - private void print(ArrayList list) { - int nCreature = 0; - int nSpell = 0; - - Card c; - for(int i = 0; i < list.size(); i++) { - c = AllZone.CardFactory.getCard(list.get(i).toString(), null); - - if(c.isCreature()) nCreature++; - else nSpell++; - - colorTest.add(getColor(c)); - }//for - System.out.println("creatures " + nCreature + " - noncreatures " + nSpell); - }//print() - - //testing - private void colorStats() { - String[] colors = { - "gold", Constant.Color.Colorless, Constant.Color.Black, Constant.Color.Blue, Constant.Color.Green, - Constant.Color.Red, Constant.Color.White}; - - for(int outer = 0; outer < colors.length; outer++) { - int n = 0; - - for(int z = 0; z < colorTest.size(); z++) { - if(colorTest.get(z).equals(colors[outer])) n++; - } - System.out.println(colors[outer] + " " + n); - } - }//colorStats() - - public QuestData_BoosterPack() { - //setup(ForgeProps.getFile(QUEST.COMMON), commonCreature, commonSpell); - //setup(ForgeProps.getFile(QUEST.UNCOMMON), uncommonCreature, uncommonSpell); - //setup(ForgeProps.getFile(QUEST.RARE), rareCreature, rareSpell); - - CardList AllCards = new CardList(AllZone.CardFactory.getAllCards().toArray()); - - for (int i=0; i getCommon(int n) { - ArrayList bag = new ArrayList(); - String c; - int stop = getLoopStop(n); - - for(int i = 0; i < stop; i++) { - c = colors[getColorIndex(i)]; - - //creatures are more common than spells - bag.add(getColor(c, commonCreature)); - bag.add(getColor(c, commonCreature)); - bag.add(getColor(c, commonSpell)); - } - return getRandom(n, bag); - }//getCommon() - - - public ArrayList getUncommon(int n) { - ArrayList bag = new ArrayList(); - String c; - int stop = getLoopStop(n); - - for(int i = 0; i < stop; i++) { - c = colors[getColorIndex(i)]; - - //creatures are more common than spells - bag.add(getColor(c, uncommonCreature)); - bag.add(getColor(c, uncommonCreature)); - bag.add(getColor(c, uncommonSpell)); - } - return getRandom(n, bag); - }//getUncommon() - - public ArrayList getRare(int n) { - ArrayList bag = new ArrayList(); - String c; - int stop = getLoopStop(n); - - for(int i = 0; i < stop; i++) { - c = colors[getColorIndex(i)]; - - bag.add(getColor(c, rareCreature)); - bag.add(getColor(c, rareSpell)); - } - return getRandom(n, bag); - }//getRare() - - public ArrayList getRare(int n, int colorIndex) { - ArrayList bag = new ArrayList(); - String c; - int stop = getLoopStop(n); - - for(int i = 0; i < stop; i++) { - c = colors[colorIndex]; - - bag.add(getColor(c, rareCreature)); - bag.add(getColor(c, rareSpell)); - } - return getRandom(n, bag); - }//getRare() - - //returns String of the card name that matches the parameter "color" - private String getColor(String color, ArrayList list) { - Collections.shuffle(list, random); - - Card c; - String s; - for(int i = 0; i < list.size(); i++) { - s = list.get(i).toString(); - c = AllZone.CardFactory.getCard(s, null); - if(getColor(c).equals(color)) return s; - } - //just get a random card - //this will happens if there are 0 gold cards - return list.get(0).toString(); - }//getColor() - - - private String getColor(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; - } - } - if(colors.isEmpty()) return Constant.Color.Colorless; - - if(1 < colors.size()) return "gold"; - - ArrayList list = new ArrayList(colors); - return list.get(0).toString(); - } - - private ArrayList getRandom(int n, ArrayList list) { - //must always shuffle since we are starting at 0 - Collections.shuffle(list, random); - - ArrayList out = new ArrayList(); - for(int i = 0; i < n; i++) - out.add(list.get(i)); - - return out; - } - -/* @SuppressWarnings("unchecked") - private void setup(File file, ArrayList creatureList, ArrayList spellList) { - ArrayList all = readFile(file); - - Card c; - String s; - for(int i = 0; i < all.size(); i++) { - s = all.get(i).toString(); - - c = AllZone.CardFactory.getCard(s, ""); - if(c.isCreature()) creatureList.add(s); - else spellList.add(s); - } - }//setup() - - @SuppressWarnings("unchecked") - private ArrayList readFile(File file) { - ArrayList cardList = new ArrayList(); - - 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)) { - if(!line.startsWith(comment)) { - cardList.add(line.trim()); - } - - line = in.readLine(); - }//if - - } catch(Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("QuestBoosterPack : readFile() error, " + ex); - } - - return cardList; - }//readFile() -*/ - public String getRarity(String cardName) { - if(commonCreature.contains(cardName) || commonSpell.contains(cardName)) return "Common"; - else if(uncommonCreature.contains(cardName) || uncommonSpell.contains(cardName)) return "Uncommon"; - else if(rareCreature.contains(cardName) || rareSpell.contains(cardName)) return "Rare"; - else if(cardName.equals("Forest") || cardName.equals("Plains") || cardName.equals("Island") - || cardName.equals("Swamp") || cardName.equals("Mountain") - || cardName.equals("Snow-Covered Forest") || cardName.equals("Snow-Covered Plains") || cardName.equals("Snow-Covered Island") - || cardName.equals("Snow-Covered Swamp") || cardName.equals("Snow-Covered Mountain")) return "Land"; - else return "error"; - } -} \ No newline at end of file diff --git a/src/forge/QuestData_Prefs.java b/src/forge/QuestData_Prefs.java deleted file mode 100644 index c6a481b23e1..00000000000 --- a/src/forge/QuestData_Prefs.java +++ /dev/null @@ -1,365 +0,0 @@ -package forge; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants.QUEST; - -import java.io.BufferedReader; -import java.io.FileReader; -import java.io.Serializable; - -@Deprecated -public class QuestData_Prefs implements Serializable { - private static final long serialVersionUID = 3266336025656577905L; - - private int numDiff = 4; - - // Descriptive difficulty names - private String[] sDifficulty = { "Easy", "Normal", "Hard", "Very Hard" }; - - // Default match wins it takes to gain a booster - private int[] winsForBooster = { 1, 1, 2, 2 }; - private int[] winsForRankIncrease = { 1, 2, 3, 4 }; - private int[] winsForMediumAI = { 6, 6, 11, 11 }; - private int[] winsForHardAI = { 9, 9, 21, 21 }; - private int[] winsForVeryHardAI = { 29, 29, 31, 31 }; - - // Default starting land for a quest - private int startingBasicLand = 20; - private int startingSnowBasicLand = 20; - - // Default starting amount of each rarity - private int[] startingCommons = {45, 40, 40, 40}; - private int[] startingUncommons = {20, 15, 15, 15}; - private int[] startingRares = {10, 10, 10, 10}; - - private int startingCredits = 250; - - private int boosterPackRare = 1; - private int boosterPackUncommon = 3; - private int boosterPackCommon = 9; - - private int matchRewardBase = 10; - private double matchRewardTotalWins = 0.3; - private int matchRewardNoLosses = 10; - - private int matchRewardPoisonWinBonus = 50; - private int matchRewardMilledWinBonus = 40; - private int matchRewardAltWinBonus = 100; - - private int matchRewardWinOnFirstTurn = 1500; - private int matchRewardWinByTurnFive = 250; - private int matchRewardWinByTurnTen = 50; - private int matchRewardWinByTurnFifteen = 5; - private int matchRewardMullToZero = 500; - - public QuestData_Prefs() - { - // if quest.prefs exists - grabPrefsFromFile(); - } - - public 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("winsForVeryHardAI")) - 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."); - } - } - - // getters - public String[] getDifficulty(){ - return sDifficulty; - } - - public String getDifficulty(int index){ - return sDifficulty[index]; - } - - public int getWinsForBooster(int index){ - return winsForBooster[index]; - } - - public int getWinsForRankIncrease(int index){ - return winsForRankIncrease[index]; - } - - public int getWinsForMediumAI(int index){ - return winsForMediumAI[index]; - } - - public int getWinsForHardAI(int index){ - return winsForHardAI[index]; - } - - public int getWinsForVeryHardAI(int index){ - return winsForVeryHardAI[index]; - } - - public int getStartingBasic(){ - return startingBasicLand; - } - - public int getStartingSnowBasic(){ - return startingSnowBasicLand; - } - - public int getStartingCommons(int index){ - return startingCommons[index]; - } - - public int getStartingUncommons(int index){ - return startingUncommons[index]; - } - - public int getStartingRares(int index){ - return startingRares[index]; - } - - public int getStartingCredits(){ - return startingCredits; - } - - public int getNumCommon(){ - return boosterPackCommon; - } - - public int getNumUncommon(){ - return boosterPackUncommon; - } - - public int getNumRare(){ - return boosterPackRare; - } - - - public int getMatchRewardBase(){ - return matchRewardBase; - } - - public double getMatchRewardTotalWins(){ - return matchRewardTotalWins; - } - - public int getMatchRewardNoLosses(){ - return matchRewardNoLosses; - } - - public int getMatchRewardPoisonWinBonus(){ - return matchRewardPoisonWinBonus; - } - - public int getMatchRewardMilledWinBonus(){ - return matchRewardMilledWinBonus; - } - - public int getMatchRewardAltWinBonus(){ - return matchRewardAltWinBonus; - } - - - public int getMatchRewardWinFirst(){ - return matchRewardWinOnFirstTurn; - } - - public int getMatchRewardWinByFifth(){ - return matchRewardWinByTurnFive; - } - - public int getMatchRewardWinByTen(){ - return matchRewardWinByTurnTen; - } - - public int getMatchRewardWinByFifteen(){ - return matchRewardWinByTurnFifteen; - } - - public int getMatchMullToZero(){ - return matchRewardMullToZero; - } - - - // setters - public void setDifficulty(String diff){ - this.sDifficulty = diff.split(","); - } - - public void setWinsForBooster(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - this.winsForBooster[i] = Integer.parseInt(winsStr[i]); - } - - public void setWinsForRank(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - this.winsForRankIncrease[i] = Integer.parseInt(winsStr[i]); - } - - public void setWinsForMediumAI(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - this.winsForMediumAI[i] = Integer.parseInt(winsStr[i]); - } - - public void setWinsForHardAI(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - this.winsForHardAI[i] = Integer.parseInt(winsStr[i]); - } - - public void setStartingBasic(String land){ - this.startingBasicLand = Integer.parseInt(land); - } - - public void setStartingSnowBasic(String land){ - this.startingSnowBasicLand = Integer.parseInt(land); - } - - public void setStartingCommons(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - this.startingCommons[i] = Integer.parseInt(splitStr[i]); - } - - public void setStartingUncommons(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - this.startingUncommons[i] = Integer.parseInt(splitStr[i]); - } - - public void setStartingRares(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - this.startingRares[i] = Integer.parseInt(splitStr[i]); - } - - public void setStartingCredits(String credits){ - this.startingCredits = Integer.parseInt(credits); - } - - public void setNumCommon(String pack){ - this.boosterPackCommon = Integer.parseInt(pack); - } - - public void setNumUncommon(String pack){ - this.boosterPackUncommon = Integer.parseInt(pack); - } - - public void setNumRares(String pack){ - this.boosterPackRare = Integer.parseInt(pack); - } - - - public void setMatchRewardBase(String match){ - this.matchRewardBase = Integer.parseInt(match); - } - - public void setMatchRewardTotalWins(String match){ - this.matchRewardTotalWins = Double.parseDouble(match); - } - - public void setMatchRewardNoLosses(String match){ - this.matchRewardNoLosses = Integer.parseInt(match); - } - - public void setMatchRewardPoisonWinBonus(String match){ - this.matchRewardPoisonWinBonus = Integer.parseInt(match); - } - - public void setMatchRewardMilledWinBonus(String match){ - this.matchRewardMilledWinBonus = Integer.parseInt(match); - } - - public void setMatchRewardAltWinBonus(String match){ - this.matchRewardAltWinBonus = Integer.parseInt(match); - } - - - public void setMatchRewardWinFirst(String match){ - this.matchRewardWinOnFirstTurn = Integer.parseInt(match); - } - - public void setMatchRewardWinByFifth(String match){ - this.matchRewardWinByTurnFive = Integer.parseInt(match); - } - - public void setMatchRewardWinByTen(String match){ - this.matchRewardWinByTurnTen = Integer.parseInt(match); - } - - public void setMatchRewardWinByFifteen(String match){ - this.matchRewardWinByTurnFifteen = Integer.parseInt(match); - } - - public void setMatchMullToZero(String match){ - this.matchRewardMullToZero = Integer.parseInt(match); - } -} diff --git a/src/forge/QuestData_State.java b/src/forge/QuestData_State.java deleted file mode 100644 index 09384faf407..00000000000 --- a/src/forge/QuestData_State.java +++ /dev/null @@ -1,73 +0,0 @@ - -package forge; - - -/** - * QuestData_State.java - * - * Created on 26.10.2009 - */ - - -import forge.deck.Deck; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Map; - - -/** - * The class QuestData_State. - * - * @version V0.0 26.10.2009 - * @author Clemens Koza - */ - - -@Deprecated -public class QuestData_State implements Serializable { - private static final long serialVersionUID = 7007940230351051937L; - - int rankIndex, win, lost; - int plantLevel, wolfPetLevel, crocPetLevel, birdPetLevel, houndPetLevel, life, estatesLevel, luckyCoinLevel, sleightOfHandLevel, gearLevel, questsPlayed; - long credits; - String difficulty, mode, selectedPet; - - ArrayList availableQuests, completedQuests; - ArrayList cardPool, shopList; - Map myDecks, aiDecks; - - public QuestData_State() {} - - /** - * This constructor is used by QestData_State in the default package to create a replacement object for the - * obsolete class. - */ - public QuestData_State(int rankIndex, int win, int lost, int plantLevel, int wolfPetLevel, int crocPetLevel, int birdPetLevel, int houndPetLevel, String selectedPet, int life, int estatesLevel, int luckyCoinLevel, int sleightOfHandLevel, int gearLevel, int questsPlayed, - ArrayList availableQuests, ArrayList completedQuests, long credits, String difficulty, String mode, - ArrayList cardPool, ArrayList shopList, Map myDecks, Map aiDecks) { - this.rankIndex = rankIndex; - this.win = win; - this.lost = lost; - this.plantLevel = plantLevel; - this.wolfPetLevel = wolfPetLevel; - this.crocPetLevel = crocPetLevel; - this.birdPetLevel = birdPetLevel; - this.houndPetLevel = houndPetLevel; - this.life = life; - this.estatesLevel = estatesLevel; - this.luckyCoinLevel = luckyCoinLevel; - this.sleightOfHandLevel = sleightOfHandLevel; - this.gearLevel = gearLevel; - this.questsPlayed = questsPlayed; - this.availableQuests = availableQuests; - this.completedQuests = completedQuests; - this.credits = credits; - this.difficulty = difficulty; - this.mode = mode; - this.cardPool = cardPool; - this.shopList = shopList; - this.myDecks = myDecks; - this.aiDecks = aiDecks; - } -} diff --git a/src/forge/Quest_Assignment.java b/src/forge/Quest_Assignment.java index e07a04d6468..835f161aac8 100644 --- a/src/forge/Quest_Assignment.java +++ b/src/forge/Quest_Assignment.java @@ -1,136 +1,272 @@ -package forge; - -import java.util.ArrayList; - -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(); - - public void setId(int id) { - this.id = id; - } - - public int getId() { - return id; - } - - public void setCreditsReward(long creditsReward) { - this.creditsReward = creditsReward; - } - - public long getCreditsReward() { - return creditsReward; - } - - public void setName(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public String getDesc() { - return desc; - } - - public void setDifficulty(String difficulty) { - this.difficulty = difficulty; - } - - public String getDifficulty() { - return difficulty; - } - - public void setRepeatable(boolean repeatable) { - this.repeatable = repeatable; - } - - public boolean isRepeatable() { - return repeatable; - } - - public void setRequiredNumberWins(int requiredNumberWins) { - this.requiredNumberWins = requiredNumberWins; - } - - public int getRequiredNumberWins() { - return requiredNumberWins; - } - - public void setComputerLife(int computerLife) { - this.computerLife = computerLife; - } - - public int getComputerLife() { - return computerLife; - } - - public void setCardReward(String cardReward) { - this.cardReward = cardReward; - } - - public String getCardReward() { - return cardReward; - } - - public void setIconName(String s) - { - iconName = s; - } - - public String getIconName() - { - return iconName; - } - - public void setHuman(CardList human) { - this.human = human; - } - - public CardList getHuman() { - return human; - } - - public void addCompy(String s) { - this.compy.add(s); - } - - public void clearCompy() - { - this.compy.clear(); - } - - - public ArrayList getCompy() { - return compy; - } - - public void setCardRewardList(ArrayList cardRewardList) { - this.cardRewardList = cardRewardList; - } - - public ArrayList getCardRewardList() { - return cardRewardList; - } -} +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 index 3f6b97b5268..a0055275a11 100644 --- a/src/forge/ReadBoosterPack.java +++ b/src/forge/ReadBoosterPack.java @@ -4,35 +4,29 @@ package forge; //import java.io.BufferedReader; //import java.io.File; //import java.io.FileReader; -import java.util.ArrayList; 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(); - - public static void main(String[] args) { - //testing - ReadBoosterPack r = new ReadBoosterPack(); - - for(int i = 0; i < 1000; i++) { - r.getBoosterPack5(); - } - - System.exit(0); - }//main() - +// 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 @@ -56,16 +50,25 @@ public class ReadBoosterPack implements NewConstants { 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"; - + 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"); @@ -78,187 +81,209 @@ public class ReadBoosterPack implements NewConstants { land.add("Snow-Covered Swamp"); land.add("Snow-Covered Mountain"); land.add("Snow-Covered Island"); - if(land.contains(cardName)) return "Land"; - + 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++) + for (int i = 0; i < 5; i++) list.addAll(getBoosterPack()); - - for(int i = 0; i < 20; i++) { - list.add(AllZone.CardFactory.getCard("Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Swamp", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Swamp", AllZone.HumanPlayer)); + + 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.CardFactory.getCard("Terramorphic Expanse", AllZone.HumanPlayer)); - + + 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++) + + 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++) { + for (int i = 0; i < 7; i++) { variety = getVariety(commonCreatureList); pack.add(getRandomCard(variety)); } - - for(int i = 0; i < 4; i++) { + + for (int i = 0; i < 4; i++) { variety = getVariety(commonNonCreatureList); pack.add(getRandomCard(variety)); } - - if(pack.size() != 15) + + if (pack.size() != 15) throw new RuntimeException("ReadBoosterPack : getBoosterPack() error, pack is not 15 card - " + pack.size()); - + return pack; } - - public CardList getShopCards(int numberWins) - { - CardList list = new CardList(); - - int numberRares = 1 + numberWins / 15; - if (numberRares > 10 ) - numberRares = 10; - - for (int i=0;i 20) - numberUncommons = 20; - - for(int i = 0; i < numberUncommons; i++) - list.add(getRandomCard(uncommonList)); - - int numberCommons = 5 + numberWins/5; - if (numberCommons > 35) - numberCommons = 35; - - for(int i = 0; i < numberCommons; i++) - list.add(getRandomCard(commonList)); - - for (int i = 0;i<10;i++) - { - list.add(AllZone.CardFactory.getCard("Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Swamp", AllZone.HumanPlayer)); - } - - for (int i = 0;i<5;i++) - { - list.add(AllZone.CardFactory.getCard("Snow-Covered Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Swamp", AllZone.HumanPlayer)); - } - - return list; + + /** + *

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++) { + + for (int i = 0; i < color.length; i++) { check = findColor(in, color[i]); - if(check != null) out.add(check); + 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); - + 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++) + for (int i = 0; i < 10; i++) list.shuffle(); - + int index = MyRandom.random.nextInt(list.size()); - - Card c = AllZone.CardFactory.copyCard(list.get(index)); + + 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(); // } //}); - - CardList AllCards = new CardList(AllZone.CardFactory.getAllCards().toArray()); - - for (int i=0; i allCards = new ArrayList(); - private static File zipFile; - - public static void main(String args[]) throws Exception { - try { - ReadCard read = new ReadCard(ForgeProps.getFile(CARDSFOLDER)); - - javax.swing.SwingUtilities.invokeAndWait(read); - // read.run(); - - Card c[] = new Card[read.allCards.size()]; - read.allCards.toArray(c); - for(int i = 0; i < c.length; i++) { - System.out.println(c[i].getName()); - System.out.println(c[i].getManaCost()); - System.out.println(c[i].getType()); - System.out.println(c[i].getSpellText()); - System.out.println(c[i].getKeyword()); - System.out.println(c[i].getBaseAttack() + "/" + c[i].getBaseDefense() + "\n"); - } - } catch(Exception ex) { - ErrorViewer.showError(ex); - System.out.println("Error reading file " + ex); - } - } - - public ArrayList getCards() { - return new ArrayList(allCards); - } - - public ReadCard(String filename) { - this(new File(filename)); - } - - public ReadCard(File file) { - if(!file.exists()) - throw new RuntimeException("ReadCard : constructor error -- file not found -- filename is " - + file.getAbsolutePath()); - - if (!file.isDirectory()) - throw new RuntimeException("ReadCard : constructor error -- not a direcotry -- " - + file.getAbsolutePath()); - zipFile = new File(file, CARDSFOLDER+".zip"); - - if(!zipFile.exists()) - fileList = file.list(); - //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("ReadCard : constructor error -- file not found -- filename is " - // + file.getPath()); - //} - }//ReadCard() - - public void run() { - Card c = null; - ArrayList cardNames = new ArrayList(); - File fl = null; - - if(zipFile.exists()){ - try { - ZipFile zip = new ZipFile(zipFile); - ZipEntry entry; - Enumeration e = zip.entries(); - while(e.hasMoreElements()) { - entry = (ZipEntry) e.nextElement(); - if(!entry.getName().endsWith(".txt")) - continue; - in = new BufferedReader(new InputStreamReader(zip.getInputStream(entry))); - c = new Card(); - loadCard(c, cardNames); - cardNames.add(c.getName()); - allCards.add(c); - in.close(); - } - } catch (Exception e) { - - } - - } else { - for (int i=0; i cardNames) { - String s = readLine(); - while (!s.equals("End")) - { - if (s.startsWith("#")) - { - //no need to do anything, this indicates a comment line - } - - else if (s.startsWith("Name:")) - { - String t = s.substring(5); - //System.out.println(s); - if (cardNames.contains(t)) - { - System.out.println("ReadCard:run() error - duplicate card name: " + t); - throw new RuntimeException("ReadCard:run() error - duplicate card name: " + t); - } - else - c.setName(t); - } - - else if (s.startsWith("ManaCost:")) - { - String t = s.substring(9); - //System.out.println(s); - if (!t.equals("no cost")) - c.setManaCost(t); - } - - else if (s.startsWith("Types:")) - addTypes(c, s.substring(6)); - - else if (s.startsWith("Text:")) - { - String t = s.substring(5); - // if (!t.equals("no text")); - if (t.equals("no text")) t = (""); - c.setText(t); - } - - else if (s.startsWith("PT:")) - { - String t = s.substring(3); - String pt[] = t.split("/"); - int att = pt[0].contains("*") ? 0 : Integer.parseInt(pt[0]); - int def = pt[1].contains("*") ? 0 : Integer.parseInt(pt[1]); - c.setBaseAttackString(pt[0]); - c.setBaseDefenseString(pt[1]); - c.setBaseAttack(att); - c.setBaseDefense(def); - } - - else if (s.startsWith("Loyalty:")) - { - String splitStr[] = s.split(":"); - int loyal = Integer.parseInt(splitStr[1]); - c.setBaseLoyalty(loyal); - } - - else if (s.startsWith("K:")) - { - String t = s.substring(2); - c.addIntrinsicKeyword(t); - } - - else if (s.startsWith("SVar:")) - { - String t[] = s.split(":", 3); - c.setSVar(t[1], t[2]); - } - - else if (s.startsWith("A:")) - { - String t = s.substring(2); - c.addIntrinsicAbility(t); - } - - else if (s.startsWith("T:")) - { - String t = s.substring(2); - c.addTrigger(TriggerHandler.parseTrigger(t, c)); - } - - else if (s.startsWith("SetInfo:")) - { - String t = s.substring(8); - c.addSet(new SetInfo(t)); - } - - s = readLine(); - } // while !End - } -} \ No newline at end of file diff --git a/src/forge/ReadDraftBoosterPack.java b/src/forge/ReadDraftBoosterPack.java index 214e711af63..fa11d22c955 100644 --- a/src/forge/ReadDraftBoosterPack.java +++ b/src/forge/ReadDraftBoosterPack.java @@ -1,243 +1,301 @@ -package forge; - - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.ArrayList; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class ReadDraftBoosterPack 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(); - - public ReadDraftBoosterPack() { - setup(); - } - - //returns "common", "uncommon", or "rare" - 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"; - } - - 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.CardFactory.getCard("Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Swamp", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Forest", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Island", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Plains", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Mountain", AllZone.HumanPlayer)); - list.add(AllZone.CardFactory.getCard("Snow-Covered Swamp", AllZone.HumanPlayer)); - } - - for(int i = 0; i < 4; i++) - list.add(AllZone.CardFactory.getCard("Terramorphic Expanse", AllZone.HumanPlayer)); - - 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)); - - //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; - } - - public CardList getShopCards(int numberWins) - { - CardList list = new CardList(); - - int numberRares = 1 + numberWins / 15; - if (numberRares > 10 ) - numberRares = 10; - - for (int i=0;i 20) - numberUncommons = 20; - - for(int i = 0; i < numberUncommons; i++) - list.add(getRandomCard(uncommonList)); - - int numberCommons = 5 + numberWins/5; - if (numberCommons > 35) - numberCommons = 35; - - for(int i = 0; i < numberCommons; i++) - list.add(getRandomCard(commonList)); - - return list; - } - - //return CardList of 5 or 6 cards, one for each color and maybe an artifact - private CardList getVariety(CardList in) { - CardList out = new CardList(); - - 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() - - 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; - } - - - private Card getRandomCard(CardList list) { - for(int i = 0; i < 10; i++) - list.shuffle(); - - int index = MyRandom.random.nextInt(list.size()); - - Card c = AllZone.CardFactory.copyCard(list.get(index)); - c.setRarity("rare"); - return c; - }//getRandomCard() - - 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.CardFactory.getAllCards(); - - for (int i=0; iReadDraftBoosterPack 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 index 5ec7b8b4137..56078aab27c 100644 --- a/src/forge/ReadPriceList.java +++ b/src/forge/ReadPriceList.java @@ -1,89 +1,109 @@ -package forge; - - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileReader; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -import com.esotericsoftware.minlog.Log; - -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - - - -public class ReadPriceList implements NewConstants { - - final private static String comment = "//"; - - private HashMap priceMap; - - public ReadPriceList() { - setup(); - } - - private void setup() { - priceMap = readFile(ForgeProps.getFile(QUEST.PRICE)); - }//setup() - - private HashMap readFile(File file) { - BufferedReader in; - HashMap map = new HashMap(); - 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() - - public Map getPriceList() - { - return priceMap; - } -} +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 index 68cc0643a26..ed7749ec055 100644 --- a/src/forge/ReadQuest_Assignment.java +++ b/src/forge/ReadQuest_Assignment.java @@ -1,7 +1,6 @@ package forge; import forge.error.ErrorViewer; -import forge.properties.ForgeProps; import forge.properties.NewConstants; import java.io.BufferedReader; @@ -11,185 +10,202 @@ 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; - private ArrayList allQuests = new ArrayList(); - + private BufferedReader in; + ArrayList allQuests = new ArrayList(); + private int totalWins; private List completedQuests = new ArrayList(); - - public static void main(String args[]) throws Exception { - try { - ReadQuest_Assignment read = new ReadQuest_Assignment(ForgeProps.getFile(QUEST.QUESTS), null); - - javax.swing.SwingUtilities.invokeAndWait(read); - // read.run(); - - Quest_Assignment qa[] = new Quest_Assignment[read.allQuests.size()]; - read.allQuests.toArray(qa); - for(int i = 0; i < qa.length; i++) { - System.out.println(qa[i].getId()); - System.out.println(qa[i].getName()); - System.out.println(qa[i].getDesc()); - System.out.println(qa[i].getDifficulty()); - System.out.println(qa[i].isRepeatable()); - System.out.println(qa[i].getRequiredNumberWins()); - } - } catch(Exception ex) { - ErrorViewer.showError(ex); - System.out.println("Error reading file " + ex); - } - } - + + /** + *

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; + List quests = new ArrayList(); + + for (Quest_Assignment qa : allQuests) { + if (availableQuestIds.contains(qa.getId())) + quests.add(qa); + } + + return quests; } - - public Quest_Assignment getQuestById(int i) - { - for(Quest_Assignment qa:allQuests) - { - if (qa.getId() == i) - return qa; - } - return null; + + /** + *

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); + 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()) + + 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) { + } 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 + * 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")) { + + while (!s.equals("End")) { qa = new Quest_Assignment(); - if(s.equals("")) throw new RuntimeException("ReadQuest_Assignment : run() reading error, id is blank"); + 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); + 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); + qa.setRepeatable(true); else - qa.setRepeatable(false); - + 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())) { + + 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); + 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(); + if (s != null) s = s.trim(); return s; - } catch(Exception ex) { + } catch (Exception ex) { ErrorViewer.showError(ex); throw new RuntimeException("ReadQuest_Assignment: readLine(Quest_Assignment) error"); } }//readLine(Quest_Assignment) -} \ No newline at end of file +} diff --git a/src/forge/RunTest.java b/src/forge/RunTest.java deleted file mode 100644 index 8b21884ad84..00000000000 --- a/src/forge/RunTest.java +++ /dev/null @@ -1,324 +0,0 @@ -package forge; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; - -import forge.card.cardFactory.CardFactory; -import forge.card.mana.ManaCost; -import forge.gui.input.Input_PayManaCostUtil; - -public class RunTest -{ - //@SuppressWarnings("unchecked") // HashSet needs - static void test() - { - { - Card c; - CardFactory cf = AllZone.CardFactory; - //********* test Card - c = cf.getCard("Elvish Warrior", AllZone.ComputerPlayer); - check("1", c.getOwner().isComputer()); - check("1.1", c.getName().equals("Elvish Warrior")); - check("2", c.getManaCost().equals("G G")); - check("2.1", c.isCreature()); - check("2.2", c.isType("Elf")); - check("2.3", c.isType("Warrior")); - check("3", c.getText().equals("")); - check("4", c.getNetAttack() == 2); - check("5", c.getNetDefense() == 3); - check("6", c.getKeyword().isEmpty()); - - c = cf.getCard("Shock", null); - check("14", c.isInstant()); - //check("15", c.getText().equals("Shock deals 2 damge to target creature or player.")); - - c = cf.getCard("Bayou", null); - check("17", c.getManaCost().equals("")); - check("18", c.isLand()); - check("19", c.isType("Swamp")); - check("20", c.isType("Forest")); - - //********* test ManaCost - ManaCost manaCost = new ManaCost("G"); - check("21", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("22", manaCost.isPaid()); - - manaCost = new ManaCost("7"); - check("23", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Black); - check("24", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("25", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Colorless); - check("26", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("27", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Red); - check("28", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.White); - check("29", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.White); - check("30", manaCost.isPaid()); - - manaCost = new ManaCost("2 W W G G B B U U R R"); - check("31", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.White); - check("32", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.White); - check("32.1", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Black); - check("33", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Black); - check("34", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("35", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("36", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("37", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("38", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Red); - check("39", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Red); - check("40", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Red); - check("41", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("42", manaCost.isPaid()); - - manaCost = new ManaCost("G G"); - check("43", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("44", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Green); - check("45", manaCost.isPaid()); - - manaCost = new ManaCost("1 U B"); - check("45", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Black); - check("46", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("47", ! manaCost.isPaid()); - manaCost.payMana(Constant.Color.Blue); - check("48", manaCost.isPaid()); - - //********* test CardUtil.getColors() - c = new Card(); - c.setManaCost("G"); - ArrayList color = CardUtil.getColors(c); - check("49", color.contains(Constant.Color.Green)); - check("50", color.size() == 1); - - c = new Card(); - c.setManaCost("W B G R U"); - color = CardUtil.getColors(c); - Set set = new HashSet(color); - System.out.println("color: "+color); - check("51", set.size() == 5); - check("52", color.contains(Constant.Color.Black)); - check("53", color.contains(Constant.Color.Blue)); - check("54", color.contains(Constant.Color.Green)); - check("55", color.contains(Constant.Color.Red)); - check("56", color.contains(Constant.Color.White)); - - c = new Card(); - c.setManaCost("2"); - color = CardUtil.getColors(c); - check("57", color.size() == 1); - check("58", color.contains(Constant.Color.Colorless)); - - c = new Card(); - color = CardUtil.getColors(c); - check("59", color.size() == 1); - check("60", color.contains(Constant.Color.Colorless)); - - c = new Card(); - c.setManaCost(""); - color = CardUtil.getColors(c); - check("61", color.size() == 1); - check("62", color.contains(Constant.Color.Colorless)); - - c = cf.getCard("Bayou", null); - color = CardUtil.getColors(c); - check("63", color.size() == 1); - check("64", color.contains(Constant.Color.Colorless)); - - c = cf.getCard("Elvish Warrior", null); - color = CardUtil.getColors(c); - check("65", color.size() == 1); - check("66", color.contains(Constant.Color.Green)); - - c = new Card(); - c.setManaCost("11 W W B B U U R R G G"); - color = CardUtil.getColors(c); - check("67", color.size() == 5); - - c = new Card(); - c = cf.getCard("Elvish Warrior", null); - c.setManaCost("11"); - color = CardUtil.getColors(c); - check("68", color.size() == 1); - check("69", color.contains(Constant.Color.Colorless)); - - check("70", c.isCreature()); - check("71", ! c.isArtifact()); - check("72", ! c.isBasicLand()); - check("73", ! c.isEnchantment()); - check("74", ! c.isGlobalEnchantment()); - check("75", ! c.isInstant()); - check("76", ! c.isLand()); - check("77", ! c.isAura()); - check("78", c.isPermanent()); - check("79", ! c.isSorcery()); - check("80", ! c.isTapped()); - check("81", c.isUntapped()); - - c = cf.getCard("Swamp", null); - check("82", c.isBasicLand()); - check("83", c.isLand()); - - c = cf.getCard("Bayou", null); - check("84", ! c.isBasicLand()); - check("85", c.isLand()); - - c = cf.getCard("Shock", null); - check("86", ! c.isCreature()); - check("87", ! c.isArtifact()); - check("88", ! c.isBasicLand()); - check("89", ! c.isEnchantment()); - check("90", ! c.isGlobalEnchantment()); - check("91", c.isInstant()); - check("92", ! c.isLand()); - check("93", ! c.isAura()); - check("94", ! c.isPermanent()); - check("95", ! c.isSorcery()); - check("96", ! c.isTapped()); - check("97", c.isUntapped()); - - //test Input_PayManaCostUtil - check("98", Input_PayManaCostUtil.getLongColorString("G").equals(Constant.Color.Green)); - check("99", Input_PayManaCostUtil.getLongColorString("1").equals(Constant.Color.Colorless)); - - /* - check("101", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Green, new ManaCost("5")) == true); - check("102", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Blue, new ManaCost("4")) == true); - check("103", Input_PayManaCostUtil.isManaNeeded(Constant.Color.White, new ManaCost("3")) == true); - check("104", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Black, new ManaCost("2")) == true); - check("105", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Red, new ManaCost("1")) == true); - */ - /* - ManaCost cost = new ManaCost("1 B B"); - Input_PayManaCostUtil.isManaNeeded(Constant.Color.Black, cost); - cost.subtractMana(Constant.Color.Black); - cost.subtractMana(Constant.Color.Green); - check("106", Input_PayManaCostUtil.isManaNeeded(Constant.Color.Green, cost) == false); - */ - - c = new Card(); - Card c2 = new Card(); - c.addIntrinsicKeyword("Flying"); - c2.addIntrinsicKeyword("Flying"); - //check("107", CombatUtil.canBlock(c, c2)); - //check("108", CombatUtil.canBlock(c2, c)); - - c = new Card(); - c2 = new Card(); - c2.addIntrinsicKeyword("Flying"); - check("109", CombatUtil.canBlock(c, c2)); - check("110", ! CombatUtil.canBlock(c2, c)); - - - c = cf.getCard("Fyndhorn Elves", null); - c2 = cf.getCard("Talas Warrior", null); - check("110a", !CombatUtil.canBlock(c2, c)); - check("110b", CombatUtil.canBlock(c, c2)); - - c = new Card(); - c.setName("1"); - c.setUniqueNumber(1); - c2 = new Card(); - c2.setName("2"); - c2.setUniqueNumber(2); - - //test CardList - CardList cardList = new CardList(new Card[] - {c, c2}); - check("111", cardList.contains(c)); - check("112", cardList.contains(c2)); - check("113", cardList.containsName(c)); - check("114", cardList.containsName(c.getName())); - check("115", cardList.containsName(c2)); - check("116", cardList.containsName(c2.getName())); - - c = new Card(); - check("117", c.hasSickness() == true); - c.addIntrinsicKeyword("Haste"); - check("118", c.hasSickness() == false); - - - } - - { - CardFactory cf = AllZone.CardFactory; - CardList c1 = new CardList(); - c1.add(cf.getCard("Shock", null)); - c1.add(cf.getCard("Royal Assassin", null)); - c1.add(cf.getCard("Hymn to Tourach", null)); - - CardList c2 = c1.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return c.isCreature(); - } - }); - check("119", c2.containsName("Royal Assassin")); - check("119", c2.size() == 1); - - c2 = c1.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return c.isInstant(); - } - }); - check("120", c2.containsName("Shock")); - check("121", c2.size() == 1); - - c2 = c1.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return c.getName().equals("Hymn to Tourach"); - } - }); - check("120", c2.containsName("Hymn to Tourach")); - check("121", c2.size() == 1); - - Card card = cf.getCard("Sylvan Basilisk", null); - Card card2 = cf.getCard("Exalted Angel", null); - - check("121a", !CombatUtil.canDestroyAttacker(card, card2, null, false)); - } - { - check("122", CardUtil.getConvertedManaCost("0") == 0); - check("123", CardUtil.getConvertedManaCost("R") == 1); - check("124", CardUtil.getConvertedManaCost("R R") == 2); - check("125", CardUtil.getConvertedManaCost("R R R") == 3); - check("126", CardUtil.getConvertedManaCost("1") == 1); - check("127", CardUtil.getConvertedManaCost("2/R 2/G 2/W 2/B 2/U") == 10); - } - }//test() - static void check(String message, boolean ok) - { - if(! ok) - //throw new RuntimeException("RunTest test error : " +message); - System.out.println("RunTest test error : " +message); - } - public static void main(String args[]) - { - RunTest.test(); - } -} \ No newline at end of file diff --git a/src/forge/SetInfo.java b/src/forge/SetInfo.java index c3f2eac9343..292288f90a2 100644 --- a/src/forge/SetInfo.java +++ b/src/forge/SetInfo.java @@ -1,60 +1,89 @@ -package forge; - -public class SetInfo{ - public String Code; - public String Rarity; - public String URL; - public int PicCount; - - public SetInfo() - { - Code = ""; - Rarity = ""; - URL = ""; - PicCount = 0; - } - - public SetInfo(String c, String r, String u) - { - Code = c; - Rarity = r; - URL = u; - PicCount = 0; - } - - public SetInfo(String c, String r, String u, int p) - { - Code = c; - Rarity = r; - URL = u; - PicCount = p; - } - - 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; - } - - public String toString() - { - return Code; - } - - public boolean equals(Object o) - { - if(o instanceof SetInfo){ - SetInfo siO = (SetInfo) o; - return Code.equals(siO.Code); - } else return false; - - } -} - - +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 index 4a438c35934..b49a1fa073a 100644 --- a/src/forge/SetInfoUtil.java +++ b/src/forge/SetInfoUtil.java @@ -1,294 +1,397 @@ -package forge; - -import java.util.ArrayList; -import java.util.HashMap; - -public class SetInfoUtil { - private static ArrayList> setData = new ArrayList>(); - - private static void loadSetData() { - ArrayList fData = FileUtil.readFile("res/blockdata/setdata.txt"); - - if (fData.size() > 0) { - for (int i=0; i 5) { - HashMap sm = new HashMap(); - - String ss[] = s.split("\\|"); - for (int j=0; j getSetCode2List() - { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i=0; i getSetCode3List() - { - ArrayList scl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i=0; i getSetNameList() - { - ArrayList snl = new ArrayList(); - - if (setData.size() == 0) - loadSetData(); - - for (int i=0; i alSI) - { - if (setData.size() == 0) - loadSetData(); - - int mostRecent = -1; - - for (int i=0; i mostRecent) - { - mostRecent = j; - break; - } - } - } - - } - - if (mostRecent > -1) - return setData.get(mostRecent).get("Code3"); - - return ""; - } - - public static SetInfo getSetInfo_Code(ArrayList SetList, String SetCode) - { - SetInfo si; - - for (int i=0; i> blockData = new ArrayList>(); - - private static void loadBlockData() { - ArrayList fData = FileUtil.readFile("res/blockdata/blocks.txt"); - - if (fData.size() > 0) { - for (int i=0; i 5) { - HashMap sm = new HashMap(); - - String ss[] = s.split("\\|"); - for (int j=0; j getBlockNameList() { - ArrayList bnl = new ArrayList(); - - if (blockData.size() == 0) - loadBlockData(); - - for (int i=0; i getSets_BlockName(String blockName) { - ArrayList sets = new ArrayList(); - - if (blockData.size() == 0) - loadBlockData(); - - for (int i=0; iSetInfoUtil 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 index b46387cb2a8..e79b183e428 100644 --- a/src/forge/SimpleCombat.java +++ b/src/forge/SimpleCombat.java @@ -1,4 +1,3 @@ - package forge; @@ -6,83 +5,132 @@ 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(); - - public 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++) + 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); - + 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()) { + while (it.hasNext()) { Card attack = it.next(); CardList block = map.get(attack); - if(block.size() == 0) list.add(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++) { + 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 { - + 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); + + if (attack.getNetDefense() <= blockerDamage) aDestroy.add(attack); + + if (block.getNetDefense() <= attackerDamage) bDestroy.add(block); } }//while - return new CardList[] {aDestroy, bDestroy}; + 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++) { + for (int i = 0; i < attack.size(); i++) { block = this.getBlockers(attack.get(i)); - if(block.isEmpty()) { + if (block.isEmpty()) { sb.append(attack.get(i)); sb.append(" "); } else { @@ -92,7 +140,7 @@ class SimpleCombat { sb.append(" "); } } - + return sb.toString(); } }//Combat diff --git a/src/forge/StaticEffect.java b/src/forge/StaticEffect.java index 4681e2df48f..4afbad688c5 100644 --- a/src/forge/StaticEffect.java +++ b/src/forge/StaticEffect.java @@ -1,341 +1,635 @@ - -package forge; - - -import java.util.ArrayList; -import java.util.HashMap; -import forge.card.spellability.SpellAbility; - -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; - - //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(); - - - //overwrite SAs - public boolean isOverwriteAbilities() { - return overwriteAbilities; - } - - public void setOverwriteAbilities(boolean overwriteAbilities) { - this.overwriteAbilities = overwriteAbilities; - } - - //original SAs - 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); - } - - 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); - } - } - - public ArrayList getOriginalAbilities(Card c) { - ArrayList returnList = new ArrayList(); - if(originalAbilities.containsKey(c)) { - returnList.addAll(originalAbilities.get(c)); - } - return returnList; - } - - public void clearOriginalAbilities(Card c) { - if(originalAbilities.containsKey(c)) { - originalAbilities.get(c).clear(); - } - } - - public void clearAllOriginalAbilities() { - originalAbilities.clear(); - } - - //overwrite keywords - public boolean isOverwriteKeywords() { - return overwriteKeywords; - } - - public void setOverwriteKeywords(boolean overwriteKeywords) { - this.overwriteKeywords = overwriteKeywords; - } - - //original keywords - 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); - } - - 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); - } - } - - public ArrayList getOriginalKeywords(Card c) { - ArrayList returnList = new ArrayList(); - if(originalKeywords.containsKey(c)) { - returnList.addAll(originalKeywords.get(c)); - } - return returnList; - } - - public void clearOriginalKeywords(Card c) { - if(originalKeywords.containsKey(c)) { - originalKeywords.get(c).clear(); - } - } - - public void clearAllOriginalKeywords() { - originalKeywords.clear(); - } - - //original power/toughness - public void addOriginalPT(Card c, int power, int toughness) { - String pt = power+"/"+toughness; - if(!originalPT.containsKey(c)) { - originalPT.put(c, pt); - } - } - - public int getOriginalPower(Card c) { - int power = -1; - if(originalPT.containsKey(c)) { - power = Integer.parseInt(originalPT.get(c).split("/")[0]); - } - return power; - } - - public int getOriginalToughness(Card c) { - int tough = -1; - if(originalPT.containsKey(c)) { - tough = Integer.parseInt(originalPT.get(c).split("/")[1]); - } - return tough; - } - - public void clearAllOriginalPTs() { - originalPT.clear(); - } - - //should we overwrite types? - public boolean isOverwriteTypes() { - return overwriteTypes; - } - - public void setOverwriteTypes(boolean overwriteTypes) { - this.overwriteTypes = overwriteTypes; - } - - public boolean isKeepSupertype() { - return keepSupertype; - } - - public void setKeepSupertype(boolean keepSupertype) { - this.keepSupertype = keepSupertype; - } - - //should we overwrite land types? - public boolean isRemoveSubTypes() { - return removeSubTypes; - } - - public void setRemoveSubTypes(boolean removeSubTypes) { - this.removeSubTypes = removeSubTypes; - } - - //original types - 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); - } - - 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); - } - } - - public ArrayList getOriginalTypes(Card c) { - ArrayList returnList = new ArrayList(); - if(originalTypes.containsKey(c)) { - returnList.addAll(originalTypes.get(c)); - } - return returnList; - } - - public void clearOriginalTypes(Card c) { - if(originalTypes.containsKey(c)) { - originalTypes.get(c).clear(); - } - } - - public void clearAllOriginalTypes() { - originalTypes.clear(); - } - - //statically assigned types - 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); - } - - public ArrayList getTypes(Card c) { - ArrayList returnList = new ArrayList(); - if(types.containsKey(c)) { - returnList.addAll(types.get(c)); - } - return returnList; - } - - public void removeType(Card c, String type) { - if(types.containsKey(c)) { - types.get(c).remove(type); - } - } - - public void clearTypes(Card c) { - if(types.containsKey(c)) { - types.get(c).clear(); - } - } - - public void clearAllTypes() { - types.clear(); - } - - public String getColorDesc() { - return colorDesc; - } - - public void setColorDesc(String colorDesc) { - this.colorDesc = colorDesc; - } - - //overwrite color - public boolean isOverwriteColors() { - return overwriteColors; - } - - public void setOverwriteColors(boolean overwriteColors) { - this.overwriteColors = overwriteColors; - } - - public HashMap getTimestamps() { - return timestamps; - } - - public long getTimestamp(Card c) { - long stamp = -1; - Long l = timestamps.get(c); - if(null != l) { - stamp = l.longValue(); - } - return stamp; - } - - public void addTimestamp(Card c, long timestamp) { - timestamps.put(c, Long.valueOf(timestamp)); - } - - public void clearTimestamps() { - timestamps.clear(); - } - - public void setSource(Card card) { - source = card; - } - - public Card getSource() { - return source; - } - - public void setKeywordNumber(int i) { - keywordNumber = i; - } - - public int getKeywordNumber() { - return keywordNumber; - } - - public CardList getAffectedCards() { - return affectedCards; - } - - public void setAffectedCards(CardList list) { - affectedCards = list; - } - - public void setXValue(int x) { - xValue = x; - } - - public int getXValue() { - return xValue; - } - - public void setYValue(int y) { - yValue = y; - } - - public int getYValue() { - return yValue; - } - -}//end class StaticEffect +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 index d5d6311cfd9..3a8f3835b97 100644 --- a/src/forge/StaticEffects.java +++ b/src/forge/StaticEffects.java @@ -1,114 +1,234 @@ -package forge; -import java.util.HashMap; - -import com.esotericsoftware.minlog.Log; - -import forge.card.cardFactory.CardFactoryUtil; - - -public class StaticEffects -{ - //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 - private static HashMap cardToEffectsList = new HashMap(); - - public StaticEffects() - { - 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("Gemhide Sliver", new String[] {"Gemhide_Sliver"}); - - cardToEffectsList.put("Homarid", new String[] {"Homarid"}); - cardToEffectsList.put("Iona, Shield of Emeria", new String[] {"Iona_Shield_of_Emeria"}); - //cardToEffectsList.put("Joiner Adept", new String[] {"Joiner_Adept"}); - cardToEffectsList.put("Liu Bei, Lord of Shu", new String[] {"Liu_Bei"}); - - //cardToEffectsList.put("Magus of the Tabernacle", new String[] {"Magus_of_the_Tabernacle"}); - cardToEffectsList.put("Meddling Mage", new String[] {"Meddling_Mage"}); - cardToEffectsList.put("Mul Daya Channelers", new String[] {"Mul_Daya_Channelers"}); - cardToEffectsList.put("Muraganda Petroglyphs", new String[] {"Muraganda_Petroglyphs"}); - cardToEffectsList.put("Old Man of the Sea", new String[] {"Old_Man_of_the_Sea"}); - - cardToEffectsList.put("Phylactery Lich", new String[]{"Phylactery_Lich"}); - //cardToEffectsList.put("Plague Rats", new String[] {"Plague_Rats"}); - cardToEffectsList.put("Tarmogoyf", new String[] {"Tarmogoyf"}); - //cardToEffectsList.put("The Tabernacle at Pendrell Vale", new String[] {"The_Tabernacle_at_Pendrell_Vale"}); - - cardToEffectsList.put("Umbra Stalker", new String[] {"Umbra_Stalker"}); - cardToEffectsList.put("Wolf", new String[] {"Sound_the_Call_Wolf"}); - - } - - public HashMap getCardToEffectsList() - { - return cardToEffectsList; - } - - public void addStateBasedEffect(String s) - { - if (stateBasedMap.containsKey(s)) - stateBasedMap.put(s, stateBasedMap.get(s)+1); - else - stateBasedMap.put(s, 1); - } - - public void removeStateBasedEffect(String s) - { - if (stateBasedMap.containsKey(s)) { - stateBasedMap.put(s, stateBasedMap.get(s)-1); - if(stateBasedMap.get(s) == 0) - stateBasedMap.remove(s); - } - } - - public HashMap getStateBasedMap() - { - return stateBasedMap; - } - - public void reset() - { - stateBasedMap.clear(); - } - - public void rePopulateStateBasedList() - { - reset(); - - CardList cards = AllZoneUtil.getCardsInPlay(); - - Log.debug("== Start add state effects =="); - for (int i=0;iStaticEffects 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 index 9529cfec649..7887f8ac507 100644 --- a/src/forge/TableModel.java +++ b/src/forge/TableModel.java @@ -1,360 +1,453 @@ - -package forge; - - -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.Arrays; - -import javax.swing.JTable; -import javax.swing.table.AbstractTableModel; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; - - -class 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; - - public TableModel(CardContainer cd) { - this(new CardList(), cd); - } - - public TableModel(CardList inData, CardContainer in_cardDetail) { - cardDetail = in_cardDetail; - //intialize dataNoCopies and dataCopies - addCard(inData); - } - - - public void resizeCols(final JTable table) { - TableColumn column = null; - for(int i = 0; i < table.getColumnCount(); i++) { - column = table.getColumnModel().getColumn(i); - - if(i == 0) { - column.setPreferredWidth(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()); - }*/ - } - - public void clear() { - dataNoCopies.clear(); - dataCopies.clear(); - //fireTableDataChanged(); - } - - public CardList getCards() { - CardList all = new CardList(); - all.addAll(dataCopies); - all.addAll(dataNoCopies); - - return all; - } - - public void removeCard(Card c) { - //remove card from "dataCopies", - //if not found there, remove card from "dataNoCopies" - int index = findCardName(c.getName(), dataCopies); - - if(index != -1) //found card name - dataCopies.remove(index); - else { - index = findCardName(c.getName(), dataNoCopies); - dataNoCopies.remove(index); - } - - fireTableDataChanged(); - } - - private int findCardName(String name, CardList list) { - for(int i = 0; i < list.size(); i++) - if(list.get(i).getName().equals(name)) return i; - - return -1; - } - - public void addCard(Card c) { - if(0 == countQuantity(c, dataNoCopies)) dataNoCopies.add(c); - else dataCopies.add(c); - } - - public void addCard(CardList c) { - for(int i = 0; i < c.size(); i++) - addCard(c.get(i)); - - fireTableDataChanged(); - } - - public Card rowToCard(int row) { - return dataNoCopies.get(row); - } - - private int countQuantity(Card c) { - return countQuantity(c, dataNoCopies) + countQuantity(c, dataCopies); - } - - //CardList data is either class members "dataNoCopies" or "dataCopies" - private int countQuantity(Card c, CardList data) { - int count = 0; - for(int i = 0; i < data.size(); i++) { - //are the card names and set code the same? - Card dc = data.get(i); - if(dc.getName().equals(c.getName()) && - dc.getCurSetCode().equals(c.getCurSetCode())) count++; - } - - return count; - } - - public int getRowCount() { - return dataNoCopies.size(); - } - - public int getColumnCount() { - return column.length; - } - - @Override - public String getColumnName(int n) { - return column[n]; - } - - public Object getValueAt(int row, int column) { - return getColumn(dataNoCopies.get(row), column); - } - - private Object getColumn(Card c, int column) { - switch(column) { - case 0: - return Integer.valueOf(countQuantity(c)); - case 1: - return c.getName(); - case 2: - return c.getManaCost(); - case 3: - return TableSorter.getColor(c); - case 4: - return GuiDisplayUtil.formatCardType(c); - case 5: - //return c.isCreature()? c.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"; - } - } - - public void addListeners(final JTable table) { - //updates card detail, listens to any key strokes - table.addKeyListener(new KeyListener() { - public void keyPressed(KeyEvent ev) {} - - public void keyTyped(KeyEvent ev) {} - - public void keyReleased(KeyEvent ev) { - int row = table.getSelectedRow(); - if(row != -1) { - cardDetail.setCard(dataNoCopies.get(row)); - } - } - }); - //updates card detail, listens to any mouse clicks - table.addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - int row = table.getSelectedRow(); - if(row != -1) { - cardDetail.setCard(dataNoCopies.get(row)); - } - } - }); - - //sorts - MouseListener mouse = new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - TableColumnModel columnModel = table.getColumnModel(); - int viewColumn = columnModel.getColumnIndexAtX(e.getX()); - int column = table.convertColumnIndexToModel(viewColumn); - - - if(column != -1) { - //sort ascending - @SuppressWarnings("unused") - boolean change = sort(column, true); - - //if(! change) - // sort(column, false);//sort descending - - //fireTableDataChanged(); - } - }//mousePressed() - };//MouseListener - table.getTableHeader().addMouseListener(mouse); - }//addCardListener() - - //called by the GUI when a card is added to re-sort - public void resort() { - sort(recentSortedColumn, recentAscending); - //this.fireTableDataChanged(); - } - - //returns true if any data changed positions - // @SuppressWarnings("unchecked") - // Arrays.sort - public boolean sort(int column, boolean ascending) { - //used by addCard() to resort the cards - recentSortedColumn = column; - recentAscending = ascending; - - CardList all = new CardList(); - all.addAll(dataNoCopies); - 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 +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 index f7970ae5ee3..8f5b5934c02 100644 --- a/src/forge/TableSorter.java +++ b/src/forge/TableSorter.java @@ -1,4 +1,3 @@ - package forge; @@ -6,149 +5,173 @@ 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; -public class TableSorter implements Comparator, NewConstants -{ - private final int column; - private boolean ascending; - private boolean col7mod; + private CardList all; - private CardList all; + //used by compare() + @SuppressWarnings("rawtypes") + private Comparable aCom = null; + @SuppressWarnings("rawtypes") + private Comparable bCom = null; - //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; - //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 - // 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; + } - public TableSorter(CardList in_all, int in_column, boolean in_ascending) - { - all = new CardList(in_all.toArray()); - column = in_column; - ascending = in_ascending; - } - - 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; - } + /** + *

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; + } - final public int compare(Card a, Card b) - { + /** + *

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 (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 (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 (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() + if (ascending) + return aCom.compareTo(bCom); + else + return bCom.compareTo(aCom); + }//compare() - 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++; + /** + *

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; - } + return count; + } - final private Integer getRarity(Card c) - { + /** + *

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")) @@ -163,7 +186,7 @@ public class TableSorter implements Comparator, NewConstants 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")) @@ -179,37 +202,57 @@ public class TableSorter implements Comparator, NewConstants */ } - final private Long getValue(Card c) - { - return c.getValue(); - } + /** + *

getValue.

+ * + * @param c a {@link forge.Card} object. + * @return a {@link java.lang.Long} object. + */ + final private Long getValue(Card c) { + return c.getValue(); + } - final public static String getColor(Card c) - { - ArrayList list = CardUtil.getColors(c); + /** + *

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(); + if (list.size() == 1) + return list.get(0).toString(); - return "multi"; - } - - 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); - } + return "multi"; + } - final private Comparable getType(Card c) - { - return c.getType().toString(); - } + /** + *

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); + } -} \ No newline at end of file + /** + *

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/Test.java b/src/forge/Test.java deleted file mode 100644 index fed84a1538b..00000000000 --- a/src/forge/Test.java +++ /dev/null @@ -1,10 +0,0 @@ -package forge; -class Test -{ - public static void main(String[] args) - { - - - System.exit(0); - } -} diff --git a/src/forge/TestMove.java b/src/forge/TestMove.java deleted file mode 100644 index de38cdb7e12..00000000000 --- a/src/forge/TestMove.java +++ /dev/null @@ -1,93 +0,0 @@ - -package forge; - - -import java.util.ArrayList; - - -class TestMove extends Move { - private final int myNumber; - - private static int classNumber = -1; - private static int[] array; - - private static int classIndex; - private int myIndex = -1; - - public static void main(String[] args) { - test(); - } - - //branching 2 - //fully test depths 1 and 2, one test of depth 3 - public static void test() { - TestMove t; - - t = new TestMove(new int[] {4, 1, 6, 3, 2, 7, 6, 9}); - test("1", t.max(t, 3, true) == 7); - - t = new TestMove(new int[] {1, 2}); - test("2", t.max(t, 1, true) == 2); - - t = new TestMove(new int[] {2, 1}); - test("3", t.max(t, 1, true) == 2); - - - t = new TestMove(new int[] {1, 2, 3, 4}); - test("4", t.max(t, 2, true) == 3); - - t = new TestMove(new int[] {2, 1, 4, 3}); - test("5", t.max(t, 2, true) == 3); - - t = new TestMove(new int[] {4, 3, 1, 2}); - test("6", t.max(t, 2, true) == 3); - - t = new TestMove(new int[] {3, 4, 2, 1}); - test("7", t.max(t, 2, true) == 3); - } - - public static void test(String message, boolean shouldBeTrue) { - if(!shouldBeTrue) throw new RuntimeException(message); - } - - public TestMove(int i_array[]) { - this(); - - classIndex = 0; - array = i_array; - } - - public TestMove() { - myNumber = classNumber; - classNumber++; - } - - public int getClassNumber() { - return classNumber; - } - - public int getMyNumber() { - return myNumber; - } - - @Override - public Move[] generateMoves() { - ArrayList list = new ArrayList(); - - for(int i = 0; i < 2; i++) - list.add(new TestMove()); - - Move m[] = new Move[list.size()]; - list.toArray(m); - return m; - } - - @Override - public int getScore() { - if(myIndex == -1) { - myIndex = classIndex; - classIndex++; - } - return array[myIndex]; - }//getScore() -} diff --git a/src/forge/TestPanel.java b/src/forge/TestPanel.java deleted file mode 100644 index dfbd9762685..00000000000 --- a/src/forge/TestPanel.java +++ /dev/null @@ -1,45 +0,0 @@ -package forge; -import java.awt.Color; -import java.awt.Rectangle; - -import javax.swing.JFrame; -import javax.swing.JLabel; -import javax.swing.JPanel; - -import forge.error.ErrorViewer; - - -public class TestPanel extends JFrame { - /** - * - */ - private static final long serialVersionUID = 1L; - private JPanel jPanel1 = new JPanel(); - private JLabel jLabel1 = new JLabel(); - - public static void main(String[] args) { - TestPanel p = new TestPanel(); - p.setSize(300, 300); - p.setVisible(true); - } - - public TestPanel() { - try { - jbInit(); - } catch(Exception ex) { - ErrorViewer.showError(ex); - ex.printStackTrace(); - } - } - - private void jbInit() throws Exception { - this.getContentPane().setLayout(null); - jPanel1.setForeground(Color.orange); - jPanel1.setBounds(new Rectangle(15, 36, 252, 156)); - jLabel1.setFont(new java.awt.Font("Dialog", 1, 12)); - jLabel1.setForeground(new Color(70, 90, 163)); - jLabel1.setText("jLabel1"); - this.getContentPane().add(jPanel1, null); - jPanel1.add(jLabel1, null); - } -} diff --git a/src/forge/Time.java b/src/forge/Time.java index 48b25fd62dd..38c577d4ef2 100644 --- a/src/forge/Time.java +++ b/src/forge/Time.java @@ -1,24 +1,45 @@ package forge; -public class Time -{ - private long startTime; - private long stopTime; - public Time() {start();} +/** + *

Time class.

+ * + * @author Forge + * @version $Id: $ + */ +public class Time { + private long startTime; + private long stopTime; - public void start() - { - startTime = System.currentTimeMillis(); - } + /** + *

Constructor for Time.

+ */ + public Time() { + start(); + } - public double stop() - { - stopTime = System.currentTimeMillis(); - return getTime(); - } + /** + *

start.

+ */ + public void start() { + startTime = System.currentTimeMillis(); + } - public double getTime() - { - return (stopTime - startTime) / 1000.0; - } -} \ No newline at end of file + /** + *

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 index 2fa9bc05746..2e50e9a744a 100644 --- a/src/forge/UndoCommand.java +++ b/src/forge/UndoCommand.java @@ -1,6 +1,19 @@ package forge; -public interface UndoCommand extends Command -{ + +/** + *

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 index 300ece20fc6..d06d676c1c7 100644 --- a/src/forge/ZCTrigger.java +++ b/src/forge/ZCTrigger.java @@ -1,34 +1,54 @@ - package forge; - -enum ZoneNames { - -} - +/** + *

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 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; + 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 index a31152f881b..6422aa72134 100644 --- a/src/forge/card/abilityFactory/AbilityFactory.java +++ b/src/forge/card/abilityFactory/AbilityFactory.java @@ -1,1382 +1,1798 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.GameActionUtil; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_Restriction; -import forge.card.spellability.SpellAbility_Condition; -import forge.card.spellability.Target; - -public class AbilityFactory { - - private Card hostC = null; - - public Card getHostCard() - { - return hostC; - } - - private HashMap mapParams = new HashMap(); - - public HashMap getMapParams() - { - return mapParams; - } - - private boolean isAb = false; - private boolean isSp = false; - private boolean isDb = false; - - public boolean isAbility() - { - return isAb; - } - - public boolean isSpell() - { - return isSp; - } - - public boolean isDrawback() { - return isDb; - } - - private Cost abCost = null; - - public Cost getAbCost() - { - return abCost; - } - - private boolean isTargeted = false; - private boolean hasValid = false; - private Target abTgt = null; - - public boolean isTargeted() - { - return isTargeted; - } - - public boolean hasValid() - { - return hasValid; - } - - public Target getAbTgt() - { - return abTgt; - } - - public boolean isCurse(){ - return mapParams.containsKey("IsCurse"); - } - - private boolean hasSubAb = false; - - public boolean hasSubAbility() - { - return hasSubAb; - } - - private boolean hasSpDesc = false; - - public boolean hasSpDescription() - { - return hasSpDesc; - } - - private String API = ""; - public String getAPI() { return API; } - - //******************************************************* - - 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 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; - } - - 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")) { - list = new CardList(); - list.add((Card)ability.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 - 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")){ - Object crd = sa.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; - } - - 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")){ - Object o = null; - if (defined.endsWith("Controller")){ - String triggeringType = defined.substring(9); - triggeringType = triggeringType.substring(0,triggeringType.length()-10); - Object c = sa.getTriggeringObject(triggeringType); - if(c instanceof Card) - { - o = ((Card)c).getController(); - } - } - else if (defined.endsWith("Owner")){ - String triggeringType = defined.substring(9); - triggeringType = triggeringType.substring(0,triggeringType.length()-5); - Object c = sa.getTriggeringObject(triggeringType); - if(c instanceof Card) - { - o = ((Card)c).getOwner(); - } - } - else { - String triggeringType = defined.substring(9); - o = sa.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.Combat.getAttackingPlayer(); - if (!players.contains(p)) - players.add(p); - } - else if (defined.equals("DefendingPlayer")){ - Player p = AllZone.Combat.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; - } - - 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")) - { - String triggeringType = defined.substring(9); - if(sa.getTriggeringObject(triggeringType) instanceof SpellAbility) - s = (SpellAbility)sa.getTriggeringObject(triggeringType); - } - - if (s != null) - sas.add(s); - - return sas; - } - - 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; - } - - - public static SpellAbility findRootAbility(SpellAbility sa){ - SpellAbility parent = sa; - while (parent instanceof Ability_Sub) - parent = ((Ability_Sub)parent).getParent(); - - return parent; - } - - 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; - } - - 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; - } - - 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; - } - - /* - public static void resolveSubAbility(SpellAbility sa){ - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null){ - abSub.resolve(); - } - }*/ - - 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); - } - } - - public static void passUnlessCost(final SpellAbility sa) { - 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); - AllZone.Stack.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.HumanPlayer); - resolveSubAbilities(sa); - AllZone.Stack.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); - AllZone.Stack.finishResolving(sa, false); - } - else { - sa.resolve(); - if(params.containsKey("PowerSink")) GameActionUtil.doPowerSink(AllZone.ComputerPlayer); - resolveSubAbilities(sa); - AllZone.Stack.finishResolving(sa, false); - } - } - } - - public static void resolve(SpellAbility sa) { - if (sa == null) return; - AbilityFactory af = sa.getAbilityFactory(); - 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); - AllZone.Stack.finishResolving(sa, false); - } - else passUnlessCost(sa); - } else - resolveSubAbilities(sa); - } - - public static void resolveSubAbilities(SpellAbility sa) { - Ability_Sub abSub = sa.getSubAbility(); - if(abSub == null) return; - //check conditions - if (AbilityFactory.checkConditional(abSub)) { - abSub.resolve(); - } - resolveSubAbilities(abSub); - } - -}//end class AbilityFactory \ No newline at end of file +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 index 3907bfc1bf9..da556e5bf1b 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_AlterLife.java +++ b/src/forge/card/abilityFactory/AbilityFactory_AlterLife.java @@ -1,1073 +1,1233 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.Player; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -public class AbilityFactory_AlterLife { - // An AbilityFactory subclass for Gaining, Losing, or Setting Life totals. - - // ************************************************************************* - // ************************* GAIN LIFE ************************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.ComputerPlayer.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.ComputerPlayer); - 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 (!ComputerUtil.canPayCost(sa)) - return false; - - if (!AllZone.ComputerPlayer.canGainLife()) - return false; - - //Don't use lifegain before main 2 if possible - if(AllZone.Phase.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, source.getAbilityUsed()); - - Target tgt = sa.getTarget(); - if (tgt != null){ - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - } - - 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); - } - - 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.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - } - - 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; - } - - 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(af.getHostCard())) - p.gainLife(lifeAmount, sa.getSourceCard()); - } - - // ************************************************************************* - // ************************* LOSE LIFE ************************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.HumanPlayer.getLife(); - int aiLife = AllZone.ComputerPlayer.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.ComputerPlayer); - 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 (!ComputerUtil.canPayCost(sa)) - return false; - - if (!AllZone.HumanPlayer.canLoseLife()) - return false; - - //Don't use loselife before main 2 if possible - if(AllZone.Phase.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, source.getAbilityUsed()); - - Target tgt = sa.getTarget(); - - if (sa.getTarget() != null){ - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.HumanPlayer); - } - - 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); - } - - 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.HumanPlayer); - } - - 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.ComputerPlayer)){ - // For cards like Foul Imp, ETB you lose life - if (amount + 3 > AllZone.ComputerPlayer.getLife()) - return false; - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - 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(af.getHostCard())) - p.loseLife(lifeAmount, sa.getSourceCard()); - - } - - // ************************************************************************* - // ************************** Poison Counters ****************************** - // ************************************************************************* - // - // Made more sense here than in AF_Counters since it affects players and their health - - 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; - } - - 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; - } - - 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; - } - - 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.HumanPlayer); - } - 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; - } - - 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(af.getHostCard())) - p.addPoisonCounters(amount); - } - - 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(); - } - - 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.HumanPlayer.getPoisonCounters(); - //int humanLife = AllZone.HumanPlayer.getLife(); - //int aiPoison = AllZone.ComputerPlayer.getPoisonCounters(); - int aiLife = AllZone.ComputerPlayer.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.ComputerPlayer); - 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; - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - //Don't use poison before main 2 if possible - if(AllZone.Phase.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.HumanPlayer); - } - - return true; - } - - // ************************************************************************* - // ************************** SET LIFE ************************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.ComputerPlayer.getLife(); - int hlife = AllZone.HumanPlayer.getLife(); - HashMap params = af.getMapParams(); - String amountStr = params.get("LifeAmount"); - - if(!ComputerUtil.canPayCost(sa)) - return false; - - if(!AllZone.ComputerPlayer.canGainLife()) - return false; - - //Don't use setLife before main 2 if possible - if(AllZone.Phase.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, source.getAbilityUsed()); - - Target tgt = sa.getTarget(); - if(tgt != null){ - tgt.resetTargets(); - if(tgt.canOnlyTgtOpponent()) { - tgt.addTarget(AllZone.HumanPlayer); - //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.HumanPlayer.canLoseLife()) return false; - } - else { - if(amount > life && life <= 10) tgt.addTarget(AllZone.ComputerPlayer); - else if(hlife > amount) tgt.addTarget(AllZone.HumanPlayer); - else if(amount > life) tgt.addTarget(AllZone.ComputerPlayer); - 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); - } - - private static boolean setLifeDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory){ - int life = AllZone.ComputerPlayer.getLife(); - int hlife = AllZone.HumanPlayer.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.HumanPlayer) || (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.HumanPlayer); - else { - if(amount > life && life <= 10) tgt.addTarget(AllZone.ComputerPlayer); - else if(hlife > amount) tgt.addTarget(AllZone.HumanPlayer); - else if(amount > life) tgt.addTarget(AllZone.ComputerPlayer); - else return false; - } - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - 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(af.getHostCard())) - p.setLife(lifeAmount, sa.getSourceCard()); - } - -}//end class AbilityFactory_AlterLife +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 index 44cbaa7c0a3..a857a2ebe6e 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Animate.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Animate.java @@ -1,660 +1,885 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Arrays; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -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; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -public class AbilityFactory_Animate { - - //************************************************************** - // *************************** Animate ************************* - //************************************************************** - - 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; - - public boolean canPlayAI() { - return animateCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateResolve(af, this); - } - - public String getStackDescription() { - return animateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateTriggerAI(af, this, mandatory); - } - }; - return abAnimate; - } - - public static SpellAbility createSpellAnimate(final AbilityFactory af) { - final SpellAbility spAnimate = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = -4047747186919390147L; - - public boolean canPlayAI() { - return animateCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateResolve(af, this); - } - - public String getStackDescription() { - return animateStackDescription(af, this); - } - }; - return spAnimate; - } - - 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); - } - - public String getStackDescription() { - return animateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateTriggerAI(af, this, mandatory); - } - }; - return dbAnimate; - } - - private static String animateStackDescription(final AbilityFactory af, SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Hashtable 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(" "); - 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 sb.append(" until end of turn."); - } - else sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) - sb.append(abSub.getStackDescription()); - - return sb.toString(); - } - - private static boolean animateCanPlayAI(final AbilityFactory af, SpellAbility sa) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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 activate during main2 unless this effect is permanent - if(AllZone.Phase.getPhase().equals(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()); - } - - 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() - - 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; - } - - 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; - } - - 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 reasonalbly - //good job of picking a good target - return false; - } - - private static void animateResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - Card host = af.getHostCard(); - Hashtable svars = host.getSVars(); - - //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); - - 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 - final String finalDesc = params.containsKey("Colors") ? - CardUtil.getShortColorsString(new ArrayList(Arrays.asList(params.get("Colors").split(",")))) : ""; - - //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(","))); - - 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 ArrayList originalColors = c.getColor(); - final ArrayList originalTypes = c.getType(); - final int origPower = c.getBaseAttack(); - final int origToughness = c.getBaseDefense(); - - final long timestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords); - - //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.TriggerHandler.registerTrigger(parsedTrigger); - } - } - - final Command unanimate = new Command() { - private static final long serialVersionUID = -5861759814760561373L; - - public void execute() { - doUnanimate(c, origPower, origToughness, originalTypes, finalDesc, keywords, addedAbilities, addedTriggers, timestamp); - } - }; - - if(!permanent) { - if(params.containsKey("UntilEndOfCombat")) AllZone.EndOfCombat.addUntil(unanimate); - else AllZone.EndOfTurn.addUntil(unanimate); - } - } - }//animateResolve - - private static long doAnimate(Card c, AbilityFactory af, int power, int toughness, ArrayList types, String colors, ArrayList keywords) { - HashMap params = af.getMapParams(); - if (power != -1) c.setBaseAttack(power); - if (toughness != -1) c.setBaseDefense(toughness); - - ArrayList supertypes = new ArrayList(); - if(params.containsKey("KeepSupertypes")) { - for(String t : c.getType()) { - if(CardUtil.isASuperType(t)) supertypes.add(t); - } - } - ArrayList cardtypes = new ArrayList(); - if (params.containsKey("KeepCardTypes")) { - for (String t : c.getType()) { - if (CardUtil.isACardType(t)) cardtypes.add(t); - } - } - if (params.containsKey("OverwriteTypes")) c.clearAllTypes(); - types.addAll(supertypes); - types.addAll(cardtypes); - for (String r : types) { - // if the card doesn't have that type, add it - if (!c.isType(r)) - c.addType(r); - } - 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 timestamp = c.addColor(colors, c, !params.containsKey("OverwriteColors"), true); - return timestamp; - } - - private static void doUnanimate(Card c, int originalPower, int originalToughness, ArrayList originalTypes, String colorDesc, ArrayList originalKeywords, ArrayList addedAbilities, ArrayList addedTriggers, long timestamp) { - c.setBaseAttack(originalPower); - c.setBaseDefense(originalToughness); - - c.clearAllTypes(); - for(String type : originalTypes) { - c.addType(type); - } - - //TODO - this will have to handle adding back original colors - c.removeColor(colorDesc, c, false, timestamp); - - 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.TriggerHandler.removeRegisteredTrigger(t); - c.removeTrigger(t); - } - - //any other unanimate cleanup - if(!c.isCreature()) c.unEquipAllCards(); - } - - //************************************************************** - // ************************ AnimateAll ************************* - //************************************************************** - - 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; - - public boolean canPlayAI() { - return animateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateAllResolve(af, this); - } - - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateAllTriggerAI(af, this, mandatory); - } - }; - return abAnimateAll; - } - - public static SpellAbility createSpellAnimateAll(final AbilityFactory af) { - final SpellAbility spAnimateAll = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 2946847609068706237L; - - public boolean canPlayAI() { - return animateAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - animateAllResolve(af, this); - } - - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - }; - return spAnimateAll; - } - - 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); - } - - public String getStackDescription() { - return animateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return animateAllTriggerAI(af, this, mandatory); - } - }; - return dbAnimateAll; - } - - 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(); - } - - 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 animateCanPlayAI() - - 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; - } - - 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; - } - - private static void animateAllResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Hashtable svars = host.getSVars(); - - //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); - - 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 - final String finalDesc = params.containsKey("Colors") ? - CardUtil.getShortColorsString(new ArrayList(Arrays.asList(params.get("Colors").split(",")))) : ""; - - //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 ArrayList originalTypes = c.getType(); - final int origPower = c.getBaseAttack(); - final int origToughness = c.getBaseDefense(); - - final long timestamp = doAnimate(c, af, power, toughness, types, finalDesc, keywords); - - //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.TriggerHandler.registerTrigger(parsedTrigger); - } - } - - final Command unanimate = new Command() { - private static final long serialVersionUID = -5861759814760561373L; - - public void execute() { - doUnanimate(c, origPower, origToughness, originalTypes, finalDesc, keywords, addedAbilities, addedTriggers, timestamp); - } - }; - - if(!permanent) { - if(params.containsKey("UntilEndOfCombat")) AllZone.EndOfCombat.addUntil(unanimate); - else AllZone.EndOfTurn.addUntil(unanimate); - } - } - }//animateResolve - -}//end class AbilityFactory_Animate \ No newline at end of file +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 index f540bf62413..663ad84bcf7 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java +++ b/src/forge/card/abilityFactory/AbilityFactory_ChangeZone.java @@ -1,1509 +1,1765 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.ComputerUtil; -import forge.Constant; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Player; -import forge.PlayerZone; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; - -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 - - - 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; - - 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; - } - - public static SpellAbility createSpellChangeZone(final AbilityFactory AF){ - final SpellAbility spChangeZone = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3270484211099902059L; - - 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; - } - - 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; - } - - public static boolean isHidden(String origin, boolean hiddenOverride){ - return (hiddenOverride || origin.equals("Library") || origin.equals("Hand") || origin.equals("Sideboard")); - } - - public static boolean isKnown(String origin){ - return (origin.equals("Graveyard") || origin.equals("Exile") || origin.equals("Battlefield") || origin.equals("Stack")); - } - - 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"); - } - - 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; - } - - 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; - } - - 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; - } - - 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 ""; - } - - 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 ******* - // ************************************************************************************* - - 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.ComputerPlayer); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if(ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) ; // SubCounter is fine - - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - Random r = MyRandom.random; - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - ArrayList pDefined; - Target tgt = af.getAbTgt(); - if(tgt != null && tgt.canTgtPlayer()) { - if (af.isCurse()) - tgt.addTarget(AllZone.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - 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 = filterListByType(list, params, sa); - } - - if (list.isEmpty()) - return false; - } - - chance &= (r.nextFloat() < .8); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - 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.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - } - - return true; - } - - 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 - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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.HumanPlayer.canTarget(source)) - tgt.addTarget(AllZone.HumanPlayer); - else if (mandatory && AllZone.ComputerPlayer.canTarget(source)) - tgt.addTarget(AllZone.ComputerPlayer); - } - else{ - if (AllZone.ComputerPlayer.canTarget(source)) - tgt.addTarget(AllZone.ComputerPlayer); - else if (mandatory && AllZone.HumanPlayer.canTarget(source)) - tgt.addTarget(AllZone.HumanPlayer); - } - - 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 = filterListByType(list, params, sa); - - if (list.isEmpty()) - return false; - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - return subAb.doTrigger(mandatory); - - return true; - } - - 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(); - } - - private static void changeHiddenOriginResolve(AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - - ArrayList 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); - } - } - } - - private static void changeHiddenOriginResolveHuman(AbilityFactory af, SpellAbility sa, Player player){ - HashMap params = af.getMapParams(); - Card card = af.getHostCard(); - Target tgt = af.getAbTgt(); - if (tgt != null){ - ArrayList players = tgt.getTargetPlayers(); - player = players.get(0); - if (players.contains(player) && !player.canTarget(sa.getSourceCard())) - 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 = filterListByType(altFetchList, params, 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 = filterListByType(fetchList, params, 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); - if (remember != null) - card.addRemembered(c); - - 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(); - } - AllZone.GameAction.moveToLibrary(c, libraryPos); - } - else if (destination.equals("Battlefield")){ - if (params.containsKey("Tapped")) - c.tap(); - if (params.containsKey("GainControl")) - c.setController(sa.getActivatingPlayer()); - - AllZone.GameAction.moveTo(AllZone.getZone(destination, c.getController()),c); - } - else - AllZone.GameAction.moveTo(destZone, c); - - //for imprinted since this doesn't use Target - if(params.containsKey("Imprint")) card.addImprinted(c); - } - 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(); - } - - 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.getSourceCard())) - return; - } - } - - String origin = params.get("Origin"); - - CardList fetchList = AllZoneUtil.getCardsInZone(origin, player); - fetchList = filterListByType(fetchList, params, 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 0) - GuiUtils.getChoice(picked, fetched.toArray()); - else - GuiUtils.getChoice(picked, new String[]{ "" } ); - } - } - - // *********** Utility functions for Hidden ******************** - private static CardList filterListByType(CardList list, HashMap params, SpellAbility sa){ - String type = params.get("ChangeType"); - 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); - } - - private static Card basicManaFixing(CardList list){ // Search for a Basic Land - return basicManaFixing(list, "Plains, Island, Swamp, Mountain, Forest"); - } - - private static Card basicManaFixing(CardList list, String type){ // type = basic land types - CardList combined = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - combined.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - - 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); - } - - 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) ********** - // ************************************************************************************* - - 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"); - - 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.ComputerPlayer); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if(ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.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; - } - } - - if (!ComputerUtil.canPayCost(sa)) - 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 = null; - if (af.getMapParams().containsKey("Defined")){ - // add hooks into AF_Defined function - retrieval = knownDetermineDefined(sa, params.get("Defined"), origin); - } - - if (retrieval == null) - return false; - - if (retrieval.get(0) == source){ - 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 - - } - else if (origin.equals("Battlefield")){ - // 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) - return false; - } - } - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return ((r.nextFloat() < pct) && chance); - } - - private static boolean changeKnownOriginPlayDrawbackAI(AbilityFactory af, SpellAbility sa){ - if (sa.getTarget() == null) - return true; - - return changeKnownPreferredTarget(af, sa, false); - } - - 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(); - - if (tgt != null) - tgt.resetTargets(); - - CardList list = AllZoneUtil.getCardsInZone(origin); - list = list.getValidCards(tgt.getValidTgts(), AllZone.ComputerPlayer, 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); - - // 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 now only bounce opponents stuff, but consider my stuff that might die - if (destination.equals("Exile") || origin.equals("Battlefield")) - list = list.getController(AllZone.HumanPlayer); - - 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; - } - - 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.ComputerPlayer, 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; - } - - 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; - } - - - 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(); - } - - 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.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.GameAction.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()); - - AllZone.GameAction.moveTo(AllZone.getZone(destination, tgtC.getController()),tgtC); - - if(params.containsKey("Ninjutsu") || params.containsKey("Attacking")) { - AllZone.Combat.addAttacker(tgtC); - AllZone.Combat.addUnblockedAttacker(tgtC); - } - } - else - { - AllZone.GameAction.moveTo(AllZone.getZone(destination, pl), tgtC); - } - } - } - } - } - - // **************************** Known Utility ************************************** - 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 ***************** - // ************************************************************************************* - 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; - } - - 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; - } - - 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; - } - - - 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.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()) - ; // subcounter is fine - - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - Random r = MyRandom.random; - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - // 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.HumanPlayer); - humanType = filterListByType(humanType, params, sa); - CardList computerType = AllZoneUtil.getCardsInZone(origin, AllZone.ComputerPlayer); - computerType = filterListByType(computerType, params, 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.Phase.is(Constant.Phase.Main1, AllZone.ComputerPlayer)) - return false; - } - else if (origin.equals("Graveyard")){ - Target tgt = af.getAbTgt(); - if (tgt != null){ - if(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer).isEmpty()) - return false; - tgt.resetTargets(); - tgt.addTarget(AllZone.HumanPlayer); - } - } - 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) && chance); - } - - 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; - } - - 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(); - } - - 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 = filterListByType(cards, params, 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") && params.containsKey("Tapped")) - c.tap(); - if (params.containsKey("GainControl")){ - c.setController(sa.getActivatingPlayer()); - AllZone.GameAction.moveToPlay(c, sa.getActivatingPlayer()); - } - else - AllZone.GameAction.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.HumanPlayer).size() > 0) - AllZone.HumanPlayer.shuffle(); - if (cards.getOwner(AllZone.ComputerPlayer).size() > 0) - AllZone.ComputerPlayer.shuffle(); - } - } - - -} +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 index baffe393b83..03234492d05 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Choose.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Choose.java @@ -1,226 +1,490 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - -import javax.swing.JOptionPane; - -import forge.AllZone; -import forge.Card; -import forge.CardUtil; -import forge.ComputerUtil; -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; -import forge.gui.GuiUtils; - -public class AbilityFactory_Choose { - // ************************************************************************* - // ************************* ChooseType ************************************ - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - private static String chooseTypeStackDescription(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 type."); - - Ability_Sub abSub = sa.getSubAbility(); - if(abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - private static boolean chooseTypeCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return chooseTypeTriggerAI(af, sa, false); - } - - 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.ComputerPlayer); - } - else{ - ArrayList tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); - for (Player p : tgtPlayers) - if (p.isHuman() && !mandatory) - return false; - } - return true; - } - - 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(), af.getMapParams().get("Defined"), sa); - - for(Player p : tgtPlayers) { - if (tgt == null || p.canTarget(af.getHostCard())) { - - 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 { - //not implemented for AI - } - if( CardUtil.isACreatureType(chosenType) && !invalidTypes.contains(chosenType)) { - valid = true; - card.setChosenType(chosenType); - } - } - } - } - } - } - - // ************************************************************************* - // ************************* ChooseColor *********************************** - // ************************************************************************* - - //TODO - or possibly, just merge this into choose type with different paths - //AI may be different enough to justify its own - -}//end class AbilityFactory_Choose +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 index fbb1b292e77..f974b62eb01 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Clash.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Clash.java @@ -1,335 +1,383 @@ -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.HashMap; - -public class AbilityFactory_Clash { - - public static SpellAbility getAbility(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; - } - - public static SpellAbility getSpell(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; - } - - public static SpellAbility getDrawback(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; - } - - 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); - - win.resolve(); - } - 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); - - otherwise.resolve(); - } - runParams.put("Won","False"); - } - - AllZone.TriggerHandler.runTrigger("Clashed",runParams); - } - - // ************************************************************************* - // ************************* FlipACoin ************************************* - // ************************************************************************* - - public static SpellAbility getAbilityFlip(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; - } - - public static SpellAbility getSpellFlip(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; - } - - public static SpellAbility getDrawbackFlip(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; - } - - 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(); - } - - private static void flipResolve(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card host = af.getHostCard(); - Player player = host.getController(); - - AbilityFactory AF_Outcomes = new AbilityFactory(); - boolean victory = GameActionUtil.flipACoin(player, 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); - - win.resolve(); - } - //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); - - lose.resolve(); - } - //runParams.put("Won","False"); - } - - //AllZone.TriggerHandler.runTrigger("FlipsACoin",runParams); - } - -}//end class AbilityFactory_Clash +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 index a6c147d1287..ac75cd823d1 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Cleanup.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Cleanup.java @@ -1,44 +1,60 @@ -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. -public class AbilityFactory_Cleanup { - - 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; - } - - private static void doResolve(AbilityFactory AF,SpellAbility sa) - { - HashMap params = AF.getMapParams(); - - if (params.containsKey("ClearRemembered")) - sa.getSourceCard().clearRemembered(); - } -} +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 index 169adab41e3..3bcf2b68bdd 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Combat.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Combat.java @@ -1,176 +1,445 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.CombatUtil; -import forge.ComputerUtil; -import forge.Constant; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; - -public class AbilityFactory_Combat { - //************************************************************** - // ****************************** FOG ************************** - //************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - public static boolean fogCanPlayAI(final AbilityFactory af, SpellAbility sa){ - // AI should only activate this during Human's Declare Blockers phase - if (AllZone.Phase.isPlayerTurn(sa.getActivatingPlayer())) return false; - if (!AllZone.Phase.is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)) return false; - - // Only cast when Stack is empty, so Human uses spells/abilities first - if (AllZone.Stack.size() != 0) return false; - - // Don't cast it, if the effect is already in place - if(AllZone.GameInfo.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.Combat); - } - - public static boolean fogPlayDrawbackAI(final AbilityFactory af, SpellAbility sa){ - // AI should only activate this during Human's turn - boolean chance; - if (AllZone.Phase.isPlayerTurn(sa.getActivatingPlayer().getOpponent())) - chance = AllZone.Phase.isBefore(Constant.Phase.Combat_FirstStrikeDamage); - else - chance = AllZone.Phase.isAfter(Constant.Phase.Combat_Damage); - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.chkAI_Drawback(); - - return chance; - } - - 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.Phase.isPlayerTurn(sa.getActivatingPlayer().getOpponent())) - chance = AllZone.Phase.isBefore(Constant.Phase.Combat_FirstStrikeDamage); - else - chance = AllZone.Phase.isAfter(Constant.Phase.Combat_Damage); - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return chance && abSub.doTrigger(mandatory); - } - - return chance; - } - - public static void fogResolve(final AbilityFactory af, final SpellAbility sa){ - - // Expand Fog keyword here depending on what we need out of it. - AllZone.GameInfo.setPreventCombatDamageThisTurn(true); - } -} +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 index 0280c989b6f..9f5accea2fa 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Copy.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Copy.java @@ -1,524 +1,604 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.MyRandom; -import forge.PlayerZone_ComesIntoPlay; -import forge.card.cardFactory.CardFactory; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -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; -import forge.card.trigger.Trigger; - -public class AbilityFactory_Copy { - - // ************************************************************************* - // ************************* CopyPermanent ********************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - private static boolean copyPermanentCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - //TODO - I'm sure someone can do this AI better - - HashMap params = af.getMapParams(); - if(params.containsKey("AtEOT") && !AllZone.Phase.is(Constant.Phase.Main1)) { - return false; - } - else return copyPermanentTriggerAI(af, sa, false); - } - - 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; - - 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, source.getAbilityUsed() + 1); - - ////// - // 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 randomReturn && abSub.chkAI_Drawback(); - } - } - return randomReturn; - } - - 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]; - - PlayerZone_ComesIntoPlay.setSimultaneousEntry(true); - - for(int i = 0; i < multiplier; i++) { - if(i + 1 == multiplier) PlayerZone_ComesIntoPlay.setSimultaneousEntry(false); - //TODO: Use central copy methods - Card copy; - if(!c.isToken()) { - //copy creature and put it onto the battlefield - copy = AllZone.CardFactory.getCard(c.getName(), sa.getActivatingPlayer()); - - //when copying something stolen: - copy.setController(sa.getActivatingPlayer()); - - copy.setToken(true); - copy.setCopiedToken(true); - } - else { //isToken() - copy = CardFactory.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.TriggerHandler.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.GameAction.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.GameAction.sacrifice(target[index]); //maybe do a setSacrificeAtEOT, but probably not. - } - else if(params.get("AtEOT").equals("Exile")) { - AllZone.GameAction.exile(target[index]); - } - - //Slight hack in case we copy a creature with triggers - AllZone.TriggerHandler.removeAllFromCard(target[index]); - } - } - }; - - Command atEOT = new Command() { - private static final long serialVersionUID = -4184510100801568140L; - - public void execute() { - sac.setStackDescription(params.get("AtEOT")+" "+target[index]+"."); - AllZone.Stack.addSimultaneousStackEntry(sac); - } - };//Command - if(params.containsKey("AtEOT")) { - AllZone.EndOfTurn.addAt(atEOT); - } - //end copied Kiki code - - } - }//end canTarget - }//end foreach Card - }//end resolve - - // ************************************************************************* - // ************************* CopySpell ************************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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 "); - 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(); - } - - private static boolean copySpellCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return false; - } - - 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; - } - - 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); - - for(SpellAbility tgtSA: tgtSpells) { - if (tgt == null || CardFactoryUtil.canTarget(card, tgtSA.getSourceCard())) { - - //copied from Twincast - AllZone.CardFactory.copySpellontoStack(card, tgtSA.getSourceCard(), true); - //end copied from Twincast - - }//end canTarget - }//end foreach SpellAbility - }//end resolve - -}//end class AbilityFactory_Copy +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 index 6c5ce63a2a0..6fae19c04ac 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java +++ b/src/forge/card/abilityFactory/AbilityFactory_CounterMagic.java @@ -1,395 +1,434 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.ComputerUtil; -import forge.MyRandom; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_StackInstance; -import forge.card.spellability.Target; -import forge.card.spellability.Target_Selection; - -//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 - -public class AbilityFactory_CounterMagic { - - private AbilityFactory af = null; - private HashMap params = null; - private String destination = null; - private String unlessCost = null; - - 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(); - - } - - 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; - } - - 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 - 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; - } - - private boolean counterCanPlayAI(final AbilityFactory af, final SpellAbility sa){ - boolean toReturn = true; - Cost abCost = af.getAbCost(); - final Card source = sa.getSourceCard(); - if(AllZone.Stack.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.ComputerPlayer); - typeList = typeList.getValidCards(type.split(","), source.getController(), source); - if(ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - Target tgt = sa.getTarget(); - if (tgt != null) { - - SpellAbility topSA = AllZone.Stack.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.HumanPlayer); - 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; - } - - public boolean counterDoTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory){ - boolean toReturn = true; - if(AllZone.Stack.size() < 1) { - return false; - } - - Target tgt = sa.getTarget(); - if (tgt != null) { - SpellAbility topSA = AllZone.Stack.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.HumanPlayer); - 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; - } - - 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.Stack.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.GameAction.destroy(tgtSACard); - } - - if(params.containsKey("RememberTargets")) - { - if(params.get("RememberTargets").equals("True")) - { - af.getHostCard().addRemembered(tgtSACard); - } - } - } - }//end counterResolve - - 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 - - private void removeFromStack(SpellAbility tgtSA, SpellAbility srcSA, SpellAbility_StackInstance si) { - AllZone.Stack.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.GameAction.moveToGraveyard(tgtSA.getSourceCard()); - } - else if(destination.equals("Exile")) { - AllZone.GameAction.exile(tgtSA.getSourceCard()); - } - else if(destination.equals("TopOfLibrary")) { - AllZone.GameAction.moveToLibrary(tgtSA.getSourceCard()); - } - else if(destination.equals("Hand")) { - AllZone.GameAction.moveToHand(tgtSA.getSourceCard()); - } - else if(destination.equals("BottomOfLibrary")) { - AllZone.GameAction.moveToBottomOfLibrary(tgtSA.getSourceCard()); - } - else if(destination.equals("ShuffleIntoLibrary")) { - AllZone.GameAction.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 +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 index a44da54e5e7..e6781ced911 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Counters.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Counters.java @@ -1,1416 +1,1647 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.Player; -import forge.PlayerZone; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -public class AbilityFactory_Counters { - // An AbilityFactory subclass for Putting or Removing Counters on Cards. - - // ******************************************* - // ********** PutCounters ***************** - // ******************************************* - - 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; - } - - 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; - } - - 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; - } - - 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); - } - - for (Card c : tgtCards) { - sb.append(" ").append(c.getName()); - } - - sb.append("."); - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null){ - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - 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.HumanPlayer : AllZone.ComputerPlayer; - - - 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.ComputerPlayer); - 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; - } - } - - if (!ComputerUtil.canPayCost(sa)) - 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, source.getAbilityUsed()); - - // 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, amount); - } - - 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.Phase.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 - - 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.HumanPlayer : AllZone.ComputerPlayer; - - 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 - - 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.HumanPlayer : AllZone.ComputerPlayer; - 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, amount); - - else{ - if (type.equals("P1P1")){ - choice = CardFactoryUtil.AI_getWorstCreature(list); - } - else{ - choice = CardFactoryUtil.getRandomCard(list); - } - } - } - - abTgt.addTarget(choice); - } - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - chance &= subAb.doTrigger(mandatory); - - return true; - } - - 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; - } - - private static Card chooseBoonTarget(CardList list, String type, final int amount){ - Card choice; - if (type.equals("P1P1")){ - choice = CardFactoryUtil.AI_getBestCreature(list); - } - 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; - } - - 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 ***************** - // ******************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.HumanPlayer : AllZone.ComputerPlayer; - - - 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.ComputerPlayer); - 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; - } - } - - if (!ComputerUtil.canPayCost(sa)) - 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, source.getAbilityUsed()); - - //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); - } - - 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.HumanPlayer : AllZone.ComputerPlayer; - - // 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; - } - - 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; - } - - 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 ******************** - // ******************************************* - - 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 shouldProliferateAI(this); - } - - @Override - public void resolve() { - proliferateResolve(af, this); - } - - @Override - public String getStackDescription() { - return proliferateStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerProliferateAI(this, mandatory); - } - }; - - return abProliferate; - } - - 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 shouldProliferateAI(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; - } - - 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 shouldProliferateAI(this); - } - - @Override - public void resolve() { - proliferateResolve(af, this); - } - - @Override - public String getStackDescription(){ - return proliferateStackDescription(this); - } - - @Override - public boolean chkAI_Drawback() { - return shouldProliferateAI(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerProliferateAI(this, mandatory); - } - }; - - return dbProliferate; - } - - 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(); - } - - private static boolean shouldProliferateAI(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; - } - - private static boolean doTriggerProliferateAI(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; - } - - private static void proliferateResolve(final AbilityFactory AF, SpellAbility sa) { - CardList hperms = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - hperms = hperms.filter(new CardListFilter() { - public boolean addCard(Card crd) - { - return !crd.getName().equals("Mana Pool") /*&& crd.hasCounters()*/; - } - }); - - CardList cperms = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.InputControl.setInput(new Input() { - private static final long serialVersionUID = -1779224307654698954L; - - @Override - public void showMessage() { - ButtonUtil.enableOnlyCancel(); - AllZone.Display.showMessage("Proliferate: Choose permanents and/or players"); - } - - @Override - public void selectButtonCancel() { - AllZone.Stack.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.HumanPlayer.getPoisonCounters() > 0) - AllZone.HumanPlayer.addPoisonCounters(1); - } - if (player.isComputer() && selComputer == false) { - selComputer = true; - if (AllZone.ComputerPlayer.getPoisonCounters() > 0) - AllZone.ComputerPlayer.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.HumanPlayer.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.HumanPlayer.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.HumanPlayer.getPoisonCounters() > 0) - AllZone.HumanPlayer.addPoisonCounters(1); - - } //comp - } - - // ******************************************* - // ********** PutCounterAll ****************** - // ******************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.HumanPlayer); - cList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - - 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 (!ComputerUtil.canPayCost(sa)) - return false; - - if (tgt != null){ - Player pl; - if (curse) - pl = AllZone.HumanPlayer; - else - pl = AllZone.ComputerPlayer; - - 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, source.getAbilityUsed()); - - 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); - } - - private static boolean putAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - return putAllCanPlayAI(af, sa); - } - - 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 *************** - // ******************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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; - } - - private static boolean removeCounterAllPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { - return removeCounterAllCanPlayAI(af, sa); - } - - 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 +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 index 880186c0957..ade7a2a01b8 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_DealDamage.java +++ b/src/forge/card/abilityFactory/AbilityFactory_DealDamage.java @@ -1,855 +1,986 @@ - -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -public class AbilityFactory_DealDamage { - private AbilityFactory AF = null; - - private String damage; - - public AbilityFactory_DealDamage(AbilityFactory newAF) - { - AF = newAF; - - damage = AF.getMapParams().get("NumDmg"); - - // Note: TgtOpp should not be used, Please use ValidTgts$ Opponent instead - } - - // ****************************************************************************************************** - // ***************************** DAMAGE ***************************************************************** - // ****************************************************************************************************** - - 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); - AF.getHostCard().setAbilityUsed(AF.getHostCard().getAbilityUsed() + 1); - - } - - @Override - public boolean doTrigger(boolean mandatory) { - return damageDoTriggerAI(AF, this, mandatory); - } - };// Ability_Activated - - return abDamage; - } - - 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; - } - - 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; - } - - 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(); - } - - private int getNumDamage(SpellAbility saMe) { - return AbilityFactory.calculateAmount(saMe.getSourceCard(), damage, saMe); - } - - 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); - } - - private boolean doCanPlayAI(SpellAbility saMe) - { - if (!ComputerUtil.canPayCost(saMe)) - return false; - - 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.HumanPlayer.getLife() - dmg > 0){ - //only sacrifice something that's supposed to be sacrificed - String sacType = abCost.getSacType(); - CardList typeList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.HumanPlayer.getLife() - dmg > 0 && AF.getAbCost().getCounterType().equals(Counters.P1P1)) - return false; - } - if (AF.getAbCost().getLifeCost()) { - if(AllZone.HumanPlayer.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.Phase.is(Constant.Phase.End_Of_Turn, AllZone.HumanPlayer)) - return true; - else - return false; - } - - if (AF.isAbility()) - { - Random r = MyRandom.random; // prevent run-away activations - if(r.nextFloat() <= Math.pow(.6667, AF.getHostCard().getAbilityUsed())) - 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; - } - - private boolean shouldTgtP(SpellAbility sa, int d, final boolean noPrevention) { - int restDamage = d; - Player human = AllZone.HumanPlayer; - Player comp = AllZone.ComputerPlayer; - - 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.Phase.is(Constant.Phase.End_Of_Turn) || AllZone.Phase.is(Constant.Phase.Main2)) && - AllZone.Phase.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; - } - - 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.ComputerPlayer, 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; - } - - private boolean damageTargetAI(SpellAbility saMe, int dmg) { - Target tgt = AF.getAbTgt(); - - if (tgt == null) - return damageChooseNontargeted(saMe, dmg); - - return damageChoosingTargets(saMe, tgt, dmg, false); - } - - 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.HumanPlayer)) - continue; - } - - Card c = chooseTgtC(dmg,noPrevention, AllZone.HumanPlayer, 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.HumanPlayer)) - continue; - } - - else if (tgt.canTgtCreature()) { - Card c = chooseTgtC(dmg, noPrevention, AllZone.HumanPlayer, 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.HumanPlayer)) - 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; - } - - 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; - } - - 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.ComputerPlayer, mandatory); - if (c != null) { - tgt.addTarget(c); - continue; - } - } - - if (tgt.canTgtPlayer()) { - if (tgt.addTarget(AllZone.ComputerPlayer)) - continue; - } - - // if we get here then there isn't enough targets, this is the only time we can return false - return false; - } - return true; - } - - 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; - } - - - 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(AF.getHostCard())) { - if (noPrevention) - p.addDamageWithoutPrevention(dmg, source); - else - p.addDamage(dmg, source); - } - } - } - } - - // ****************************************************************************************************** - // ***************************** DAMAGEALL ************************************************************** - // ****************************************************************************************************** - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.HumanPlayer, dmg); - CardList computerList = getKillableCreatures(af, sa, AllZone.ComputerPlayer, dmg); - - //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.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) ; //OK - - if (abCost.getSubCounter()){ - // OK - } - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - ///// - - // 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.ComputerPlayer.getLife() <= AllZone.ComputerPlayer.predictDamage(dmg, source, false)) - return false; - - //if we can kill human, do it - if((validP.contains("Each") || validP.contains("EachOpponent")) - && AllZone.HumanPlayer.getLife() <= AllZone.HumanPlayer.predictDamage(dmg, source, false)) - return true; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - 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); - } - - 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; - } - - 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.ComputerPlayer.getLife() <= AllZone.ComputerPlayer.predictDamage(dmg, source, false)) - return false; - - //if we can kill human, do it - if((validP.contains("Each") || validP.contains("EachOpponent")) - && AllZone.HumanPlayer.getLife() <= AllZone.HumanPlayer.predictDamage(dmg, source, false)) - break; - - // Evaluate creatures getting killed - CardList humanList = getKillableCreatures(af, sa, AllZone.HumanPlayer, dmg); - CardList computerList = getKillableCreatures(af, sa, AllZone.ComputerPlayer, 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; - } - - private void damageAllResolve(final AbilityFactory af, final SpellAbility sa){ - HashMap params = af.getMapParams(); - Card card = sa.getSourceCard(); - - int dmg = getNumDamage(sa); - - String valid = ""; - String players = ""; - - if(params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - if(params.containsKey("ValidPlayers")) - players = params.get("ValidPlayers"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), card.getController(), card); - - 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 { - //anything else to go here? - } - } -} +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 index f0f7d3ac385..44df55fc8a9 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Debuff.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Debuff.java @@ -1,611 +1,729 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CombatUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.card.cardFactory.CardFactoryUtil; -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.SpellAbility_Restriction; -import forge.card.spellability.Target; - -public class AbilityFactory_Debuff { - // ************************************************************************* - // ***************************** Debuff ************************************ - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - private static ArrayList getKeywords(HashMap params) { - ArrayList kws = new ArrayList(); - if(params.containsKey("Keywords")) { - kws.addAll(Arrays.asList(params.get("Keywords").split(" & "))); - } - return kws; - } - - 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(); - } - - 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; - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - SpellAbility_Restriction restrict = sa.getRestrictions(); - - // Phase Restrictions - if (AllZone.Stack.size() == 0 && AllZone.Phase.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; - } - - 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() - - 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.Phase.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() - - private static CardList getCurseCreatures(AbilityFactory af, SpellAbility sa, final ArrayList kws) { - Card hostCard = af.getHostCard(); - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - 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() - - 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.HumanPlayer); - CardList forced = list.getController(AllZone.ComputerPlayer); - 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() - - 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; - } - - 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.EndOfTurn.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 ********************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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, source.getAbilityUsed()); //to prevent runaway activations - - if(params.containsKey("ValidCards")) { - valid = params.get("ValidCards"); - } - - CardList comp = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - comp = comp.getValidCards(valid, hostCard.getController(), hostCard); - CardList human = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - 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.Phase.isAfter(Constant.Phase.Combat_Begin)) - return false; - - if (comp.size() > human.size()) - return false; - - return (r.nextFloat() < .6667) && chance; - }//debuffAllCanPlayAI() - - 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.EndOfTurn.addUntil(new Command() { - private static final long serialVersionUID = 7486231071095628674L; - - public void execute() { - if(AllZoneUtil.isCardInPlay(tgtC)){ - for(String kw : hadIntrinsic) { - tgtC.addIntrinsicKeyword(kw); - } - } - } - }); - } - } - }//debuffAllResolve() - - private static boolean debuffAllTriggerAI(AbilityFactory af, SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - return true; - } - - private static boolean debuffAllChkDrawbackAI(AbilityFactory af, SpellAbility sa) { - return true; - } - - 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 +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 index b3769ed3627..a2ac5243c05 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java +++ b/src/forge/card/abilityFactory/AbilityFactory_DelayedTrigger.java @@ -1,94 +1,226 @@ -package forge.card.abilityFactory; - -import forge.AllZone; -import forge.card.spellability.Ability_Sub; -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. - */ -public class AbilityFactory_DelayedTrigger { - private static AbilityFactory tempCreator = new AbilityFactory(); - - 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); //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(AF,this); //To change body of implemented methods use File | Settings | File Templates. - } - - @Override - public void resolve() { - doResolve(AF,this); - } - }; - - return drawback; - } - - 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(); - } - } - - private static boolean doTriggerAI(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(!params.containsKey("OptionalDecider")) - { - return trigsa.doTrigger(true); - } - else - { - return trigsa.doTrigger(!params.get("OptionalDecider").equals("You")); - } - } - - 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.TriggerHandler.registerDelayedTrigger(delTrig); - } -} +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 index f0316eab753..b9afee330db 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Destroy.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Destroy.java @@ -1,635 +1,687 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.ComputerUtil; -import forge.MyRandom; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -public class AbilityFactory_Destroy { - // An AbilityFactory subclass for destroying permanents - // ********************************************************************************* - // ************************** DESTROY ********************************************** - // ********************************************************************************* - 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; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return destroyStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellDestroy(final AbilityFactory AF){ - final SpellAbility spDestroy = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -317810567632846523L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return destroyStackDescription(af, this); - } - - public boolean canPlayAI() - { - return destroyCanPlayAI(af, this); - } - - @Override - public void resolve() { - destroyResolve(af, this); - } - - }; - return spDestroy; - } - - 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; - - final AbilityFactory af = AF; - - @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; - } - - public 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.HumanPlayer); - 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.ComputerPlayer); - typeList = typeList.getValidCards(sacType.split(","), source.getController(), source); - if(ComputerUtil.getCardPreference(source, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) return false; - - if (abCost.getSubCounter()){ - // OK - } - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - // 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); - } - - public 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.HumanPlayer); - - // 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; - } - - 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(); - } - - public 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.GameAction.destroyNoRegeneration(tgtC); - else - AllZone.GameAction.destroy(tgtC); - } - } - } - - // ********************************************************************************* - // ************************ DESTROY ALL ******************************************** - // ********************************************************************************* - 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 AbilityFactory af = AF; - final HashMap params = af.getMapParams(); - - final boolean noRegen = params.containsKey("NoRegen"); - - @Override - public String getStackDescription(){ - return destroyAllStackDescription(af, this, noRegen); - } - - 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; - } - - 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 AbilityFactory af = AF; - 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); - } - - public boolean canPlayAI() - { - return destroyAllCanPlayAI(af, this, noRegen); - } - - @Override - public void resolve() { - destroyAllResolve(af, this, noRegen); - } - - }; - return spDestroyAll; - } - - public static SpellAbility createDrawbackDestroyAll(final AbilityFactory AF){ - final SpellAbility dbDestroyAll = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -242160421677518351L; - final AbilityFactory af = AF; - 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; - } - - public static String destroyAllStackDescription(final AbilityFactory af, SpellAbility sa, boolean noRegen){ - // when getStackDesc is called, just build exactly what is happening - - 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(); - } - - public 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.HumanPlayer); - CardList computerlist = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - - 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.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - if (abCost.getDiscardCost()) ;//OK - - if (abCost.getSubCounter()){ - // OK - } - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - // 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); - } - - public 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 = list.getValidCards(Valid.split(","), card.getController(), card); - - boolean remDestroyed = params.containsKey("RememberDestroyed"); - if (remDestroyed) - card.clearRemembered(); - - if(noRegen){ - for(int i = 0; i < list.size(); i++) - if (AllZone.GameAction.destroyNoRegeneration(list.get(i)) && remDestroyed) - card.addRemembered(list.get(i)); - } - else{ - for(int i = 0; i < list.size(); i++) - if (AllZone.GameAction.destroy(list.get(i)) && remDestroyed) - card.addRemembered(list.get(i)); - } - } - -}//end class AbilityFactory_Destroy +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 index 4f3481b1d0f..0fc208458b1 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Effect.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Effect.java @@ -1,274 +1,340 @@ -package forge.card.abilityFactory; - -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.Command; -import forge.ComputerUtil; -import forge.MyRandom; -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; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -public class AbilityFactory_Effect { - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - } - - return ((r.nextFloat() < .6667)); - } - - 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; - } - - 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; - - if(params.containsKey("Abilities")) - effectAbilities = params.get("Abilities").split(","); - - if(params.containsKey("Triggers")) - effectTriggers = params.get("Triggers").split(","); - - if(params.containsKey("SVars")) - effectSVars = params.get("SVars").split(","); - - if(params.containsKey("Keywords")) - effectKeywords = params.get("Keywords").split(","); - - //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()); - - // 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.TriggerHandler.removeAllFromCard(e); - } - - }; - eff.addLeavesPlayCommand(LPCommand); - Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, eff); - eff.addTrigger(parsedTrigger); - AllZone.TriggerHandler.registerTrigger(parsedTrigger); - } - } - - //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); - } - } - - // 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.GameAction.exile(e); - } - }; - - if (duration == null || duration.equals("EndOfTurn")) - AllZone.EndOfTurn.addUntil(endEffect); - } - - // TODO: Add targeting to the effect so it knows who it's dealing with - - AllZone.GameAction.moveToPlay(eff); - } -} +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 index 9be471a6d39..a7986697f2c 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java +++ b/src/forge/card/abilityFactory/AbilityFactory_EndGameCondition.java @@ -1,370 +1,455 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; - - -import forge.AllZone; -import forge.Card; -import forge.ComputerUtil; -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; - -public class AbilityFactory_EndGameCondition { - // *********************************************************************************************** - // ***************************************** Wins Game ******************************************* - // *********************************************************************************************** - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - public static boolean winsGameCanPlayAI(final AbilityFactory af, final SpellAbility sa){ - if (AllZone.ComputerPlayer.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; - } - - 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; - } - - 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 ******************************************* - // *********************************************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - public static boolean losesGameCanPlayAI(final AbilityFactory af, final SpellAbility sa){ - if (AllZone.HumanPlayer.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.HumanPlayer); - } - - // In general, don't return true. - // But this card wins the game, I can make an exception for that - return true; - } - - 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.HumanPlayer.cantLose()) - return false; - - Target tgt = sa.getTarget(); - if (tgt != null) { - tgt.resetTargets(); - tgt.addTarget(AllZone.HumanPlayer); - } - - // WinGame abilities usually don't have subAbilities but for consistency... - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - 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()); - } - -} +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 index e8657ea5185..df8ae0faccc 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_GainControl.java +++ b/src/forge/card/abilityFactory/AbilityFactory_GainControl.java @@ -1,363 +1,477 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Hashtable; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.Command; -import forge.Constant; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability; -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; - -//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 - -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; - - 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; - } - } - - public SpellAbility getSpell() { - SpellAbility spControl = new Spell(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 3125489644424832311L; - - @Override - public boolean canPlayAI() { - return doTgtAI(this); - } - - @Override - public void resolve() { - doResolve(this); - }//resolve - - @Override - public String getStackDescription(){ - return gainControlStackDescription(this); - } - };//SpellAbility - - return spControl; - } - - public SpellAbility getAbility() { - - final SpellAbility abControl = new Ability_Activated(hostCard, AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -4384705198674678831L; - - @Override - public boolean canPlayAI() { - return doTgtAI(this); - } - - @Override - public void resolve() { - doResolve(this); - hostCard.setAbilityUsed(hostCard.getAbilityUsed() + 1); - } - - @Override - public String getStackDescription(){ - return gainControlStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTgtAI(this); - } - };//Ability_Activated - - return abControl; - } - - 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(); - } - - private boolean doTgtAI(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.HumanPlayer); - 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) { - Hashtable 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.Phase.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; - - } - - private void doResolve(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.GameAction.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.EndOfTurn.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 - } - - 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.GameAction.destroyNoRegeneration(c); - } - else { - AllZone.GameAction.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.Stack.addSimultaneousStackEntry(ability); - } - - }; - return destroy; - } - - 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.GameAction.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; - } -} +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 index 37da89b79af..ce870822476 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Mana.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Mana.java @@ -1,518 +1,907 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Constant; -import forge.Counters; -import forge.Player; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input_PayManaCostUtil; - -public class AbilityFactory_Mana { - // ****************************** MANA ************************ - 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; - } - - 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 - 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; - } - - public static boolean manaCanPlayAI(final AbilityFactory af){ - // AI cannot use this properly until he has a ManaPool - return false; - } - - 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(); - } - - 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.GameAction.sacrifice(card); - } - } - - doDrawback(af, abMana, card); - } - - 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 ************************ - 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; - } - - 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; - } - - public static boolean manaReflectedCanPlayAI(final AbilityFactory af){ - // AI cannot use this properly until he has a ManaPool - return false; - } - - 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 - 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; - } - - 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; - } - - 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; - } - - 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 ********************** - - 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); - } - } - - 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")); - } -} +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 index 30ad6bfea26..7dcb523fb64 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java +++ b/src/forge/card/abilityFactory/AbilityFactory_PermanentState.java @@ -1,1370 +1,1678 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.ComputerUtil; -import forge.Counters; -import forge.MyRandom; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -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; -import forge.gui.GuiUtils; - -public class AbilityFactory_PermanentState { - // **************************************** - // ************** Untap ******************* - // **************************************** - 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; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return untapStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellUntap(final AbilityFactory AF){ - final SpellAbility spUntap = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return untapStackDescription(af, this); - } - - public boolean canPlayAI() - { - return untapCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapResolve(af, this); - } - - }; - return spUntap; - } - - public static SpellAbility createDrawbackUntap(final AbilityFactory AF){ - final SpellAbility dbUntap = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @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; - } - - public 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(); - } - - public static boolean untapCanPlayAI(final AbilityFactory af, SpellAbility sa){ - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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, source.getAbilityUsed()+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; - } - - public 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; - } - - public 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; - } - - public static boolean untapPrefTargeting(Target tgt, AbilityFactory af, SpellAbility sa, boolean mandatory){ - Card source = sa.getSourceCard(); - - CardList untapList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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; - } - - public 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; - } - - public 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; - } - - public 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")) - chooseUntapUpTo(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(); - } - } - } - - public static void chooseUntapUpTo(AbilityFactory af, SpellAbility sa, HashMap params){ - int num = Integer.parseInt(params.get("Amount")); - String valid = params.get("UntapType"); - - Player activatingPlayer = sa.getActivatingPlayer(); - - // Reuse existing UntapUpTo Input - if (activatingPlayer.isHuman()) - AllZone.InputControl.setInput(CardFactoryUtil.input_UntapUpToNType(num, valid)); - else{ - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.getType(valid); - list = list.filter(AllZoneUtil.tapped); - - int count = 0; - while(list.size() != 0 ) - for(int i = 0; i < num && i < list.size(); i++){ - - Card c = CardFactoryUtil.AI_getBestLand(list); - c.untap(); - list.remove(c); - count++; - } - } - } - - // **************************************** - // ************** Tap ********************* - // **************************************** - - 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; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return tapStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellTap(final AbilityFactory AF){ - final SpellAbility spTap = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return tapStackDescription(af, this); - } - - public boolean canPlayAI() - { - return tapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapResolve(af, this); - } - - }; - return spTap; - } - - public static SpellAbility createDrawbackTap(final AbilityFactory AF){ - final SpellAbility dbTap = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @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; - } - - public static String tapStackDescription(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("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(); - } - - public static boolean tapCanPlayAI(final AbilityFactory af, SpellAbility sa){ - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - 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; - } - - public 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; - } - - public 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; - } - - public static boolean tapPrefTargeting(Card source, Target tgt, AbilityFactory af, SpellAbility sa, boolean mandatory){ - CardList tapList = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - 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; - } - - public 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; - } - - public 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; - } - - public 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 ***************** - // **************************************** - 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; - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return untapAllStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellUntapAll(final AbilityFactory AF){ - final SpellAbility spUntap = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = 5713174052551899363L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - return untapAllStackDescription(af, this); - } - - public boolean canPlayAI() { - return untapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - untapAllResolve(af, this); - } - - }; - return spUntap; - } - - 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; - } - - private static boolean untapAllPlayDrawbackAI(final AbilityFactory af, SpellAbility sa){ - return true; - } - - 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(); - } - - private static boolean untapAllCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - /* - * All cards using this currently have SVar:RemAIDeck:True - */ - return false; - } - - public static boolean untapAllTrigger(AbilityFactory af, SpellAbility sa, boolean mandatory){ - if (!ComputerUtil.canPayCost(sa)) - return false; - - if (mandatory) - return true; - - - return false; - } - - private static String untapAllStackDescription(AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - // when getStackDesc is called, just build exactly what is happening - 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 ***************** - // **************************************** - 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; - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return tapAllStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellTapAll(final AbilityFactory AF){ - final SpellAbility spUntap = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = -62401571838950166L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - return tapAllStackDescription(af, this); - } - - public boolean canPlayAI() { - return tapAllCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapAllResolve(af, this); - } - - }; - return spUntap; - } - - public static SpellAbility createDrawbackTapAll(final AbilityFactory AF){ - final SpellAbility dbTap = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @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; - } - - private static void tapAllResolve(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).tap(); - } - - 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? - - - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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, source.getAbilityUsed())) - 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; - } - - private static CardList getTapAllTargets(String valid, Card source) { - CardList tmpList = AllZoneUtil.getCardsInPlay(); - tmpList = tmpList.getValidCards(valid, source.getController(), source); - tmpList = tmpList.getTargetableCards(source); - tmpList = tmpList.filter(AllZoneUtil.untapped); - return tmpList; - } - - - private static String tapAllStackDescription(AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - // when getStackDesc is called, just build exactly what is happening - 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(); - } - - public 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, source.getAbilityUsed())) - 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; - } - - private static boolean tapAllPlayDrawbackAI(final AbilityFactory af, SpellAbility sa){ - return true; - } - - - // **************************************** - // ************** Tap or Untap ************ - // **************************************** - - 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; - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return tapOrUntapStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellTapOrUntap(final AbilityFactory AF){ - final SpellAbility spTapOrUntap = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -8870476840484788521L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return tapOrUntapStackDescription(af, this); - } - - public boolean canPlayAI() - { - return tapOrUntapCanPlayAI(af, this); - } - - @Override - public void resolve() { - tapOrUntapResolve(af, this); - } - - }; - return spTapOrUntap; - } - - public static SpellAbility createDrawbackTapOrUntap(final AbilityFactory AF){ - final SpellAbility dbTapOrUntap = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -8282868583712773337L; - final AbilityFactory af = AF; - - @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; - } - - 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(); - } - - private static boolean tapOrUntapCanPlayAI(final AbilityFactory af, SpellAbility sa){ - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(.6667, source.getAbilityUsed()); - - 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; - } - - 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; - } - - 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; - } - - 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))){ - 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(); - } - } - } - - //Phasing? Something else? Who knows! - -}// end of AbilityFactory_PermanentState class +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 index 6433a344523..627d58c869f 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java +++ b/src/forge/card/abilityFactory/AbilityFactory_PreventDamage.java @@ -1,317 +1,383 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListUtil; -import forge.CombatUtil; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -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; - -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 - - 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); - af.getHostCard().setAbilityUsed(af.getHostCard().getAbilityUsed() + 1); - } - - @Override - public String getStackDescription(){ - return preventDamageStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doPreventDamageTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerate; - } - - 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; - } - - 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; - } - - 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(); - } - - 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; - - if (!ComputerUtil.canPayCost(sa)) - 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); - - if (AllZone.Stack.size() > 0){ - // check stack for something that will kill this - } - else{ - if (AllZone.Phase.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.Combat)); - } - } - - chance = flag; - } - else{ // if nothing on the stack, and it's not declare blockers. no need to regen - return false; - } - } - } - else if (AllZone.Stack.size() == 0 && AllZone.Phase.is(Constant.Phase.Combat_Declare_Blockers_InstantAbility)){ - tgt.resetTargets(); - - if(tgt.canTgtPlayer() && CombatUtil.wouldLoseLife(AllZone.Combat) - && (CombatUtil.lifeInDanger(AllZone.Combat) || sa.isAbility())) { - tgt.addTarget(AllZone.ComputerPlayer); - chance = true; - } - else { - // filter AIs battlefield by what I can target - CardList targetables = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.ComputerPlayer, 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; - } - - 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; - } - - 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.ComputerPlayer, hostCard); - CardList compTargetables = targetables.getController(AllZone.ComputerPlayer); - - 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.Phase.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; - } - - 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(af.getHostCard())) { - p.addPreventNextDamage(numDam); - } - } - } - }//doResolve -} +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 index 40cef11fc07..c5a3a6cbbd7 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Pump.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Pump.java @@ -1,940 +1,1057 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CombatUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.card.cardFactory.CardFactoryUtil; -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.SpellAbility_Restriction; -import forge.card.spellability.Target; - -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; - - 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; i0) - return true; - - //will the creature attack (only relevant for sorcery speed)? - if (CardFactoryUtil.AI_doesCreatureAttack(c) && AllZone.Phase.isBefore(Constant.Phase.Combat_Declare_Attackers) - && AllZone.Phase.isPlayerTurn(AllZone.ComputerPlayer)) - 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.Combat.getAttackerBlockedBy(c)))) - return true; - - //is the creature unblocked and the spell will pump its power? - if (AllZone.Phase.isAfter(Constant.Phase.Combat_Declare_Blockers) && AllZone.Combat.isAttacking(c) - && AllZone.Combat.isUnblocked(c) && attack > 0) - return true; - - //is the creature in blocked and the blocker would survive - if (AllZone.Phase.isAfter(Constant.Phase.Combat_Declare_Blockers) && AllZone.Combat.isAttacking(c) - && AllZone.Combat.isBlocked(c) - && CombatUtil.blockerWouldBeDestroyed(AllZone.Combat.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.Combat) && AllZone.Phase.isAfter(Constant.Phase.Combat_Declare_Attackers) - && CombatUtil.canBlock(c, AllZone.Combat) && AllZone.Phase.isPlayerTurn(AllZone.HumanPlayer)) - return true; - - return false; - } - }); - return list; - }//getPumpCreatures() - - private CardList getCurseCreatures(SpellAbility sa, final int defense, int attack) - { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - 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() - - 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.ComputerPlayer.getLife() - AF.getAbCost().getLifeAmount() < 4) - 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; - } - - if (!ComputerUtil.canPayCost(sa)) - return false; - - SpellAbility_Restriction restrict = sa.getRestrictions(); - - // Phase Restrictions - if (AllZone.Stack.size() == 0 && AllZone.Phase.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.Stack.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() - - private boolean pumpTgtAI(SpellAbility sa, int defense, int attack, boolean mandatory) - { - if(!mandatory && AllZone.Phase.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.Stack.size() == 0){ - // If the cost is tapping, don't activate before declare attack/block - if (sa.getPayCosts() != null && sa.getPayCosts().getTap()){ - if (AllZone.Phase.isBefore(Constant.Phase.Combat_Declare_Attackers) && AllZone.Phase.isPlayerTurn(AllZone.ComputerPlayer)) - list.remove(sa.getSourceCard()); - if (AllZone.Phase.isBefore(Constant.Phase.Combat_Declare_Blockers) && AllZone.Phase.isPlayerTurn(AllZone.HumanPlayer)) - 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() - - 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.HumanPlayer); - forced = list.getController(AllZone.ComputerPlayer); - } - else{ - pref = list.getController(AllZone.ComputerPlayer); - forced = list.getController(AllZone.HumanPlayer); - } - - 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() - - - 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 - - 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() - - 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 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 0) - { - for (int i=0; i= CardFactoryUtil.evaluateCreatureList(human)) - return false; - - return chance; - }//end Curse - - //don't use non curse PumpAll after Combat_Begin until AI is improved - if(AllZone.Phase.isAfter(Constant.Phase.Combat_Begin)) - return false; - - if (comp.size() <= human.size() || comp.size() <= 1) - return false; - - return (r.nextFloat() < .6667) && chance; - }//pumpAllCanPlayAI() - - private void pumpAllResolve(SpellAbility sa) { - String valid = ""; - - if(params.containsKey("ValidCards")) - valid = params.get("ValidCards"); - - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards(valid.split(","), hostCard.getController(), hostCard); - - for(Card c:list){ - final Card tgtC = c; - - // only pump things in play - if (!AllZoneUtil.isCardInPlay(tgtC)) - continue; - - final int a = getNumAttack(sa); - final int d = getNumDefense(sa); - - tgtC.addTempAttackBoost(a); - tgtC.addTempDefenseBoost(d); - - for (int i=0; i 0) { - for (int i=0; iAbilityFactory_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 index 4274246602b..112de4a686f 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Regenerate.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Regenerate.java @@ -1,565 +1,660 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListUtil; -import forge.CombatUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -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 **************************** - //************************************************************** - - 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); - af.getHostCard().setAbilityUsed(af.getHostCard().getAbilityUsed() + 1); - } - - @Override - public String getStackDescription(){ - return regenerateStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return doTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerate; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.ComputerPlayer); - typeList = typeList.getValidCards(type.split(","), hostCard.getController(), hostCard); - if(ComputerUtil.getCardPreference(hostCard, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - if (!ComputerUtil.canPayCost(sa)) - 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.Stack.size() > 0){ - // check stack for something that will kill this - } - else{ - if (AllZone.Phase.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.ComputerPlayer); - targetables = targetables.getValidCards(tgt.getValidTgts(), AllZone.ComputerPlayer, hostCard); - - if (targetables.size() == 0) - return false; - - if (AllZone.Stack.size() > 0){ - // check stack for something on the stack will kill anything i control - } - else{ - if (AllZone.Phase.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 - - 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; - } - - 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.ComputerPlayer, hostCard); - CardList compTargetables = targetables.getController(AllZone.ComputerPlayer); - - 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.Phase.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; - } - - 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.EndOfTurn.addUntil(untilEOT); - } - } - }//regenerateResolve - - //************************************************************** - // ********************* RegenerateAll ************************* - //************************************************************** - - 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); - af.getHostCard().setAbilityUsed(af.getHostCard().getAbilityUsed() + 1); - } - - @Override - public String getStackDescription(){ - return regenerateAllStackDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return regenerateAllDoTriggerAI(af, this, mandatory); - } - - };//Ability_Activated - - return abRegenerateAll; - } - - 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; - } - - 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; - } - - 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(); - } - - 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.ComputerPlayer); - typeList = typeList.getValidCards(type.split(","), hostCard.getController(), hostCard); - if(ComputerUtil.getCardPreference(hostCard, "SacCost", typeList) == null) - return false; - } - if (abCost.getLifeCost()){ - if (AllZone.ComputerPlayer.getLife() - abCost.getLifeAmount() < 4) - return false; - } - } - - if (!ComputerUtil.canPayCost(sa)) - 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.Stack.size() > 0){ - //TODO - check stack for something on the stack will kill anything i control - } - else{ - - if (AllZone.Phase.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; - } - - 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; - } - - 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.EndOfTurn.addUntil(untilEOT); - } - } - }//regenerateAllResolve - -}//end class AbilityFactory_Regenerate +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 index 657e9cab4cd..5276bfcce65 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Reveal.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Reveal.java @@ -1,1055 +1,1229 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Random; -import java.util.Arrays; - -import javax.swing.JOptionPane; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Player; -import forge.PlayerZone; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; - -public class AbilityFactory_Reveal { - - // ************************************************************************* - // ************************* Dig ******************************************* - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - private static boolean digCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - HashMap params = af.getMapParams(); - Card source = sa.getSourceCard(); - - if (!ComputerUtil.canPayCost(sa)) - return false; - - //currently to restrict everything except Mulch - String changeNum = params.get("ChangeNum"); - if (changeNum != null && !changeNum.equalsIgnoreCase("All")) return false; - - 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, source.getAbilityUsed() + 1); - - Target tgt = sa.getTarget(); - Player libraryOwner = AllZone.ComputerPlayer; - - if (sa.getTarget() != null){ - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.HumanPlayer); - libraryOwner = AllZone.HumanPlayer; - } - - //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; - } - - 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.ComputerPlayer); - } - - return true; - } - - 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(af.getHostCard())) { - - 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.GameAction.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.GameAction.moveToLibrary(c, libraryPosition); - } - else { - AllZone.GameAction.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.GameAction.moveToLibrary(chosen, libraryPosition); - } - else { - Card c = AllZone.GameAction.moveTo(zone, chosen); - if(destZone1.equals("Battlefield") && !keywords.isEmpty()) { - for(String kw : keywords) c.addExtrinsicKeyword(kw); - } - } - //AllZone.GameAction.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 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") && 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.GameAction.moveToLibrary(chosen, libraryPosition2); - rest.remove(chosen); - } - } - 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.GameAction.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 - 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 *************************** - //********************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - private static boolean revealHandCanPlayAI(final AbilityFactory af, SpellAbility sa){ - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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.ComputerPlayer.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, source.getAbilityUsed()+1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - } - - private static boolean revealHandTargetAI(AbilityFactory af, SpellAbility sa, boolean primarySA, boolean mandatory) { - Target tgt = af.getAbTgt(); - Card source = sa.getSourceCard(); - - int humanHandSize = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer).size(); - - if (tgt != null) { - // ability is targeted - tgt.resetTargets(); - - boolean canTgtHuman = AllZone.HumanPlayer.canTarget(source); - - if (!canTgtHuman || humanHandSize == 0) - return false; - else - tgt.addTarget(AllZone.HumanPlayer); - } - else { - //if it's just defined, no big deal - } - - return true; - }// revealHandTargetAI() - - 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; - } - - 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(af.getHostCard())){ - 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 ********************************* - //********************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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(af.getHostCard())){ - p.scry(num); - } - } - } - - 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.ComputerPlayer); - } - - return true; - }// scryTargetAI() - - private static boolean scryTriggerAI(AbilityFactory af, SpellAbility sa) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - return scryTargetAI(af, sa); - }// scryTargetAI() - - 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(); - } - - 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, source.getAbilityUsed()+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 ************************ - //********************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - private static boolean rearrangeTopOfLibraryTrigger(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) - { - if(!ComputerUtil.canPayCost(sa)) - return false; - - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return false; - } - - 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(af.getHostCard())) - 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 shuffle true if a shuffle is desired at the end, false otherwise - */ - 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.GameAction.moveToLibrary(c_1, i - 1); - } - if(mayshuffle) { - if(GameActionUtil.showYesNoDialog(src, "Do you want to shuffle the library?")) - { - player.shuffle(); - } - } - } - -}//end class AbilityFactory_Reveal +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 index ac5ea5dbb9e..c06832f6548 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Sacrifice.java @@ -1,344 +1,661 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.ComputerUtil; -import forge.Constant; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -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; - -public class AbilityFactory_Sacrifice { - //************************************************************** - // *************************** Sacrifice *********************** - //************************************************************** - - 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; - - final AbilityFactory af = AF; - - public boolean canPlayAI() - { - return sacrificeCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - public String getStackDescription(){ - return sacrificeDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeTriggerAI(af, this, mandatory); - } - }; - return abSacrifice; - } - - public static SpellAbility createSpellSacrifice(final AbilityFactory AF){ - final SpellAbility spSacrifice = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - - public boolean canPlayAI() - { - return sacrificeCanPlayAI(af, this); - } - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - public String getStackDescription(){ - return sacrificeDescription(af, this); - } - }; - return spSacrifice; - } - - public static SpellAbility createDrawbackSacrifice(final AbilityFactory AF){ - final SpellAbility dbSacrifice = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -5141246507533353605L; - - final AbilityFactory af = AF; - - @Override - public void resolve() { - sacrificeResolve(af, this); - } - - @Override - public boolean chkAI_Drawback() { - return sacrificePlayDrawbackAI(af, this); - } - - public String getStackDescription(){ - return sacrificeDescription(af, this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return sacrificeTriggerAI(af, this, mandatory); - } - }; - return dbSacrifice; - } - - 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(); - } - - 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.HumanPlayer); - 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; - } - - 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; - } - - 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; - } - - 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.HumanPlayer.canTarget(sa.getSourceCard())) - tgt.addTarget(AllZone.HumanPlayer); - 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.HumanPlayer); - humanList = humanList.getValidCards(valid.split(","), sa.getActivatingPlayer(), sa.getSourceCard()); - CardList computerList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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; - } - - 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.GameAction.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.GameAction.sacrifice(toSac); - } - } - else if( valid.equals("TriggeredCard")) { - Card equipee = (Card)sa.getTriggeringObject("Card"); - if(tgts.contains(card.getController()) && AllZoneUtil.isCardInPlay(equipee)) { - AllZone.GameAction.sacrifice(equipee); - } - } - else{ - for(Player p : tgts){ - - if (p.isComputer()) - sacrificeAI(p, amount, valid, sa); - else - sacrificeHuman(p, amount, valid, sa, msg); - } - } - } - - - 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); - } - - 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.InputControl.setInput(CardFactoryUtil.input_sacrificePermanentsFromList(amount, list, message), true); - } - -} \ No newline at end of file +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 index 0f08cee3b9f..4cf67ecb5f4 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Token.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Token.java @@ -1,458 +1,471 @@ -package forge.card.abilityFactory; - -import java.util.HashMap; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.MyRandom; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; - -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 boolean tokenTapped; - private boolean tokenAttacking; - - public AbilityFactory_Token(final AbilityFactory af) { - AF = af; - - HashMap mapParams = af.getMapParams(); - String image; - String[] keywords; - - if(mapParams.containsKey("TokenKeywords")) { - 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; - } - - 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"; - } - - 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); - AF.getHostCard().setAbilityUsed(AF.getHostCard().getAbilityUsed() + 1); - } - - @Override - public String getStackDescription() { - return doStackDescription(this); - } - - @Override - public boolean doTrigger(boolean mandatory) { - return tokenDoTriggerAI(this, mandatory); - } - }; - - return abToken; - } - - 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; - } - - 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; - } - - private boolean tokenCanPlayAI(SpellAbility sa){ - Cost cost = sa.getPayCosts(); - if (!ComputerUtil.canPayCost(sa)) // If there is a cost payment it's usually not mandatory - return false; - - for(String type : tokenTypes){ - if (type.equals("Legendary")){ - // Don't kill AIs Legendary tokens - if (AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, 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.Phase.isBefore(Constant.Phase.Main2) && AllZone.Phase.isPlayerTurn(AllZone.ComputerPlayer) && !haste) - return false; - if((AllZone.Phase.isAfter(Constant.Phase.Combat_Begin) || AllZone.Phase.isPlayerTurn(AllZone.HumanPlayer)) && 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.Phase.is(Constant.Phase.Combat_Declare_Attackers_InstantAbility, AllZone.HumanPlayer)) - // 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, source.getAbilityUsed()); - - Target tgt = sa.getTarget(); - if (tgt != null){ - tgt.resetTargets(); - if (tgt.canOnlyTgtOpponent()) - tgt.addTarget(AllZone.HumanPlayer); - else - tgt.addTarget(AllZone.ComputerPlayer); - } - - 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.ComputerPlayer); - 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.ComputerPlayer.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); - } - - private boolean tokenDoTriggerAI(SpellAbility sa, boolean mandatory){ - if (!ComputerUtil.canPayCost(sa)) - return false; - - return true; - } - - 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(); - } - - 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;iAbilityFactory_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 index 389eb16ba37..46274d76697 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_Turns.java +++ b/src/forge/card/abilityFactory/AbilityFactory_Turns.java @@ -1,188 +1,232 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.ComputerUtil; -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; - -public class AbilityFactory_Turns { - - // ************************************************************************* - // ************************* ADD TURN ************************************** - // ************************************************************************* - - 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; - } - - 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; - } - - 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; - } - - 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(); - } - - private static boolean addTurnCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - return addTurnTriggerAI(af, sa, false); - } - - private static boolean addTurnTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { - if (!ComputerUtil.canPayCost(sa)) - return false; - - HashMap params = af.getMapParams(); - - Target tgt = sa.getTarget(); - - if(sa.getTarget() != null){ - tgt.resetTargets(); - sa.getTarget().addTarget(AllZone.ComputerPlayer); - } - 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; - } - - 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(af.getHostCard())) { - for(int i = 0; i < numTurns; i++) { - AllZone.Phase.addExtraTurn(p); - } - } - } - } - -}//end class AbilityFactory_Turns +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 index ff3cee46614..676de1b6c2e 100644 --- a/src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java +++ b/src/forge/card/abilityFactory/AbilityFactory_ZoneAffecting.java @@ -1,1318 +1,1501 @@ -package forge.card.abilityFactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Random; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListUtil; -import forge.CardUtil; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; - -public class AbilityFactory_ZoneAffecting { - - //********************************************************************** - //******************************* DRAW ********************************* - //********************************************************************** - 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; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - // when getStackDesc is called, just build exactly what is happening - return drawStackDescription(af, this); - } - - 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; - } - - public static SpellAbility createSpellDraw(final AbilityFactory AF){ - final SpellAbility spDraw = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - // when getStackDesc is called, just build exactly what is happening - return drawStackDescription(af, this); - } - - public boolean canPlayAI(){ - return drawCanPlayAI(af, this); - } - - @Override - public void resolve() { - drawResolve(af, this); - } - - }; - return spDraw; - } - - public static SpellAbility createDrawbackDraw(final AbilityFactory AF){ - final SpellAbility dbDraw = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - // when getStackDesc is called, just build exactly what is happening - 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; - } - - public 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){ - for(Player p : tgtPlayers) - sb.append(p.toString()).append(" "); - - int numCards = 1; - if (params.containsKey("NumCards")) - numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - sb.append("draws (").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(); - } - - public static boolean drawCanPlayAI(final AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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.ComputerPlayer.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.Phase.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.Phase.is(Constant.Phase.End_Of_Turn) && AllZone.Phase.isNextTurn(AllZone.ComputerPlayer))) - chance = .9; // 90% for end of opponents turn - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, source.getAbilityUsed()+1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - } - - public 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.ComputerPlayer).size(); - int humanLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.HumanPlayer).size(); - int computerLibrarySize = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.ComputerPlayer).size(); - int computerMaxHandSize = AllZone.ComputerPlayer.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.HumanPlayer.canTarget(source); - boolean canTgtComp = AllZone.ComputerPlayer.canTarget(source); - boolean tgtHuman = false; - - if (!canTgtHuman && !canTgtComp) - return false; - - if (canTgtHuman && !AllZone.HumanPlayer.cantLose() && numCards >= humanLibrarySize) { - // Deck the Human? DO IT! - tgt.addTarget(AllZone.HumanPlayer); - 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.Phase.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.ComputerPlayer); - else - tgt.addTarget(AllZone.HumanPlayer); - } - 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.Phase.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() - - public 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; - } - - public 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(sa.getSourceCard(), params.get("Defined"), sa); - - boolean optional = params.containsKey("OptionalDecider"); - boolean slowDraw = params.containsKey("NextUpkeep"); - - for(Player p : tgtPlayers) - if (tgt == null || p.canTarget(af.getHostCard())){ - 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); - - } - } - - //********************************************************************** - //******************************* MILL ********************************* - //********************************************************************** - - 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; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return millStackDescription(this, af); - } - - 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; - } - - public static SpellAbility createSpellMill(final AbilityFactory AF){ - final SpellAbility spMill = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @Override - public String getStackDescription(){ - return millStackDescription(this, af); - } - - public boolean canPlayAI(){ - return millCanPlayAI(af, this); - } - - @Override - public void resolve() { - millResolve(af, this); - } - - }; - return spMill; - } - - public static SpellAbility createDrawbackMill(final AbilityFactory AF){ - final SpellAbility dbMill = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()){ - private static final long serialVersionUID = -4990932993654533449L; - - final AbilityFactory af = AF; - - @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 millTargetAI(af, this, false); - } - - }; - return dbMill; - } - - public 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(); - } - - public static boolean millCanPlayAI(final AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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.ComputerPlayer.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.Phase.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.Phase.is(Constant.Phase.End_Of_Turn) && AllZone.Phase.isNextTurn(AllZone.ComputerPlayer))) - chance = .9; // 90% for end of opponents turn - - boolean randomReturn = r.nextFloat() <= Math.pow(chance, source.getAbilityUsed()+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.HumanPlayer).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - - return randomReturn; - } - - public static boolean millTargetAI(AbilityFactory af, SpellAbility sa, boolean mandatory){ - Target tgt = af.getAbTgt(); - HashMap params = af.getMapParams(); - - if (tgt != null){ - tgt.resetTargets(); - Card source = sa.getSourceCard(); - if (!AllZone.HumanPlayer.canTarget(source)){ - if (mandatory && AllZone.ComputerPlayer.canTarget(source)){ - tgt.addTarget(AllZone.ComputerPlayer); - return true; - } - return false; - } - - int numCards = AbilityFactory.calculateAmount(sa.getSourceCard(), params.get("NumCards"), sa); - - CardList pLibrary = AllZoneUtil.getCardsInZone(Constant.Zone.Library, AllZone.HumanPlayer); - - if (pLibrary.size() == 0){ // deck already empty, no need to mill - if (!mandatory) - return false; - - tgt.addTarget(AllZone.HumanPlayer); - return true; - } - - if (numCards >= pLibrary.size()){ - // Can Mill out Human's deck? Do it! - tgt.addTarget(AllZone.HumanPlayer); - 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.ComputerPlayer); - // else - tgt.addTarget(AllZone.HumanPlayer); - } - return true; - } - - public 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; - } - - public 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.HumanPlayer).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - - // check SubAbilities DoTrigger? - Ability_Sub abSub = sa.getSubAbility(); - if (abSub != null) { - return abSub.doTrigger(mandatory); - } - - return true; - } - - public static void millResolve(final AbilityFactory af, final SpellAbility sa){ - HashMap params = af.getMapParams(); - - 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(af.getHostCard())) - p.mill(numCards, destination); - } - - ////////////////////// - // - //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$<...> - - 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; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - 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; - } - - public static SpellAbility createSpellDiscard(final AbilityFactory AF) { - final SpellAbility spDiscard = new Spell(AF.getHostCard(), AF.getAbCost(), AF.getAbTgt()) { - private static final long serialVersionUID = 4348585353456736817L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - return discardStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return discardCanPlayAI(af, this); - } - - @Override - public void resolve() { - discardResolve(af, this); - } - - }; - return spDiscard; - } - - public static SpellAbility createDrawbackDiscard(final AbilityFactory AF) { - final SpellAbility dbDiscard = new Ability_Sub(AF.getHostCard(), AF.getAbTgt()) { - private static final long serialVersionUID = 4348585353456736817L; - final AbilityFactory af = AF; - - @Override - public String getStackDescription() { - // when getStackDesc is called, just build exactly what is happening - 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; - } - - 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(af.getHostCard())) { - 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.ComputerPlayer.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.HumanPlayer.discard(dC, sa); // is this right? - } - } - } - } - } - } - } - - 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(); - } - - private static boolean discardCanPlayAI(final AbilityFactory af, SpellAbility sa){ - HashMap params = af.getMapParams(); - // AI cannot use this properly until he can use SAs during Humans turn - if (!ComputerUtil.canPayCost(sa)) - return false; - - 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.ComputerPlayer.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.HumanPlayer).size() > 0; - - if (tgt != null){ - if (!humanHasHand) - return false; - discardTargetAI(af); - } - 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.HumanPlayer).size()); - source.setSVar("PayX", Integer.toString(cardsToDiscard)); - } - } - - //Don't use draw abilities before main 2 if possible - if(AllZone.Phase.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.Phase.is(Constant.Phase.End_Of_Turn) && AllZone.Phase.isNextTurn(AllZone.ComputerPlayer))) - chance = .9; // 90% for end of opponents turn - - Random r = MyRandom.random; - boolean randomReturn = r.nextFloat() <= Math.pow(chance, source.getAbilityUsed()+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; - } - - private static boolean discardTargetAI(AbilityFactory af) { - Target tgt = af.getAbTgt(); - if(tgt!= null) { - if (AllZone.HumanPlayer.canTarget(af.getHostCard())){ - tgt.addTarget(AllZone.HumanPlayer); - return true; - } - } - return false; - }// discardTargetAI() - - - 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)){ - if (mandatory && AllZone.ComputerPlayer.canTarget(af.getHostCard())) - tgt.addTarget(AllZone.ComputerPlayer); - else - return false; - } - } - - return true; - }// discardCheckDrawbackAI() - - 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); - } - // TODO: check for some extra things - return true; - }// discardCheckDrawbackAI() - - //********************************************************************** - //******************************* Shuffle ****************************** - //********************************************************************** - - 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; - } - - 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; - } - - 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; - } - - 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 RevealHand. "); - } - 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(); - } - - 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, source.getAbilityUsed()+1); - - if (AbilityFactory.playReusable(sa)) - randomReturn = true; - - Ability_Sub subAb = sa.getSubAbility(); - if (subAb != null) - randomReturn &= subAb.chkAI_Drawback(); - return randomReturn; - */ - } - - private static boolean shuffleTargetAI(AbilityFactory af, SpellAbility sa, boolean primarySA, boolean mandatory) { - return false; - }// revealHandTargetAI() - - 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; - } - - 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(af.getHostCard())) { - if(optional && sa.getActivatingPlayer().isHuman() && !GameActionUtil.showYesNoDialog(host, "Have "+p+" shuffle?")) { - ; //do nothing - } - else { - p.shuffle(); - } - } - } - } - -}//end class AbilityFactory_ZoneAffecting +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/CardFactory.java b/src/forge/card/cardFactory/CardFactory.java deleted file mode 100644 index 95f43dfcfb2..00000000000 --- a/src/forge/card/cardFactory/CardFactory.java +++ /dev/null @@ -1,3220 +0,0 @@ -package forge.card.cardFactory; - - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.swing.JOptionPane; - -import com.esotericsoftware.minlog.Log; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.FileUtil; -import forge.GameActionUtil; -import forge.HandSizeOp; -import forge.Player; -import forge.PlayerZone; -import forge.ReadCard; - -import forge.card.abilityFactory.AbilityFactory; - -import forge.card.mana.ManaCost; - -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Static; -import forge.card.spellability.Ability_Sub; -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.card.trigger.Trigger; - -import forge.error.ErrorViewer; - -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCostUtil; -import forge.gui.input.Input_PayManaCost; - -import forge.properties.ForgeProps; -import forge.properties.NewConstants; - -public class CardFactory implements NewConstants { - // String cardname is the key, Card is the value - private Map map = new HashMap(); - - private CardList allCards = new CardList(); - - private HashSet removedCardList; - private Card blankCard = new Card(); //new code - - public CardFactory(String filename) { - this(new File(filename)); - } - public CardList CopiedList = new CardList(); - public CardFactory(File file) { - SpellAbility spell = new SpellAbility(SpellAbility.Spell, blankCard) { - //neither computer nor human play can play this card - @Override - public boolean canPlay() { - return false; - } - - @Override - public void resolve() {} - }; - blankCard.addSpellAbility(spell); - spell.setManaCost("1"); - blankCard.setName("Removed Card"); - - //owner and controller will be wrong sometimes - //but I don't think it will matter - //theoretically blankCard will go to the wrong graveyard - blankCard.setOwner(AllZone.HumanPlayer); - blankCard.setController(AllZone.HumanPlayer); - - removedCardList = new HashSet(FileUtil.readFile(ForgeProps.getFile(REMOVED))); - - - try { - readCards(file); - - // initialize CardList allCards - Iterator it = map.keySet().iterator(); - Card c; - while(it.hasNext()) { - c = getCard(it.next().toString(), AllZone.HumanPlayer); - allCards.add(c); - //System.out.println("cardName: " + c.getName()); - - } - } catch(Exception ex) { - ErrorViewer.showError(ex); - } - }// constructor - - public CardList getAllCards() { - return new CardList(allCards.toArray()); - }// getAllCards() - - public CardList getCards() { - return allCards; - }// getAllCards() - - - private void readCards(File file) { - map.clear(); - - ReadCard read = new ReadCard(ForgeProps.getFile(CARDSFOLDER)); - try { - read.run(); - // javax.swing.SwingUtilities.invokeAndWait(read); - } catch(Exception ex) { - ErrorViewer.showError(ex); - throw new RuntimeException("CardFactory : readCards() thread error - " + ex.getMessage()); - } - - ArrayList simpleList = read.getCards(); - Card s; - Iterator it = simpleList.iterator(); - while(it.hasNext()) { - s = it.next(); - map.put(s.getName(), s); - //System.out.println("cardName: " + s.getName()); - } - }// readCard() - - //TODO - this can probably be deleted. I don't think it's used. - final public Card dynamicCopyCard(Card in) - { - if (in.isCreature()) { - Card card2 = new Card(); - card2 = CardFactory_Creatures.getCard(in, in.getName(), in.getOwner(), this); - - return card2; - } else if (in.isAura()) { - Card card2 = new Card(); - card2 = CardFactory_Auras.getCard(in, in.getName(), in.getOwner()); - - return card2; - } else if (in.isEquipment()) { - Card card2 = new Card(); - card2 = CardFactory_Equipment.getCard(in, in.getName(), in.getOwner()); - - return card2; - } else if (in.isPlaneswalker()) { - Card card2 = new Card(); - card2 = CardFactory_Planeswalkers.getCard(in, in.getName(), in.getOwner()); - - return card2; - } else if (in.isLand()) { - Card card2 = new Card(); - card2 = CardFactory_Lands.getCard(in, in.getName(), in.getOwner(), this); - - return card2; - } - else - { - Card out = getCard(in.getName(), in.getOwner()); - out.setUniqueNumber(in.getUniqueNumber()); - return out; - } - } - - final public Card copyCard(Card in) { - - Card out = getCard(in.getName(), in.getOwner()); - out.setUniqueNumber(in.getUniqueNumber()); - - out.setSVars(in.getSVars()); - out.setSets(in.getSets()); - out.setCurSetCode(in.getCurSetCode()); - out.setImageFilename(in.getImageFilename()); - out.setEquipping(in.getEquipping()); - out.setEquippedBy(in.getEquippedBy()); - out.setEnchantedBy(in.getEnchantedBy()); - out.setEnchanting(in.getEnchanting()); - out.setClones(in.getClones()); - out.setCounters(in.getCounters()); - return out; - - } - - final public Card copyCardintoNew(Card in) { - - Card out = copyStats(in); - out.setOwner(in.getOwner()); - CardList all = AllZone.CardFactory.getAllCards(); - CardList tokens = AllZoneUtil.getCardsInPlay(); - tokens = tokens.filter(AllZoneUtil.token); - all.addAll(tokens); - all.addAll(CopiedList); - int Unumber = 0; - for(int i = 0; i < all.size(); i++) { - if(all.get(i).getUniqueNumber() > Unumber) Unumber = all.get(i).getUniqueNumber(); - } - out.setUniqueNumber(Unumber + 4); // +4 because +1 didn't work lol. - out.setCopiedSpell(true); - for(Trigger t : out.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(t); - } - CopiedList.add(out); - return out; - - } - - public final void copySpellontoStack(Card source, Card original, SpellAbility sa, boolean bCopyDetails) { - if (sa.getPayCosts() == null){ - copySpellontoStack(source, source, bCopyDetails); - return; - } - Card c = AllZone.CardFactory.copyCard(original); - c.setController(source.getController()); - c.setCopiedSpell(true); - - SpellAbility[] sas = c.getSpellAbility(); - SpellAbility copySA = null; - for(int i = 0; i < sas.length; i++) { - if(original.getAbilityUsed() == i) { - copySA = sas[i]; - } - } - - if (copySA == null){ - StringBuilder sb = new StringBuilder(); - sb.append("Couldn't find matching SpellAbility to copy Source: ").append(source); - sb.append(" Spell to Copy: ").append(source); - System.out.println(sb.toString()); - return; - } - - if (bCopyDetails){ - c.addXManaCostPaid(original.getXManaCostPaid()); - c.addMultiKickerMagnitude(original.getMultiKickerMagnitude()); - if(original.isKicked()) c.setKicked(true); - c.addReplicateMagnitude(original.getReplicateMagnitude()); - if(sa.isReplicate()) copySA.setIsReplicate(true); - } - - if(source.getController().isHuman()) - AllZone.GameAction.playSpellAbilityForFree(copySA); - - else if(copySA.canPlayAI()) - ComputerUtil.playStackFree(copySA); - } - - - public final void copySpellontoStack(Card source, Card original, boolean bCopyDetails) { - SpellAbility[] sas = original.getSpellAbility(); - SpellAbility sa = null; - for(int i = 0; i < sas.length; i++) { - if(original.getAbilityUsed() == i) { - sa = sas[i]; - } - } - - if (sa == null){ - StringBuilder sb = new StringBuilder(); - sb.append("Couldn't find matching SpellAbility to copy Source: ").append(source); - sb.append(" Spell to Copy: ").append(source); - System.out.println(sb.toString()); - return; - } - - if (sa.getPayCosts() != null){ - copySpellontoStack(source, original, sa, bCopyDetails); - return; - } - - Card c = AllZone.CardFactory.copyCardintoNew(original); - - SpellAbility copySA = null; - for(SpellAbility s : c.getSpellAbility()){ - if (s.equals(sa)) - copySA = s; - } - - if (copySA == null){ - StringBuilder sb = new StringBuilder(); - sb.append("Couldn't find matching SpellAbility to copy Source: ").append(source); - sb.append(" Spell to Copy: ").append(source); - System.out.println(sb.toString()); - return; - } - - c.setController(source.getController()); - if(bCopyDetails) { - c.addXManaCostPaid(original.getXManaCostPaid()); - c.addMultiKickerMagnitude(original.getMultiKickerMagnitude()); - if(original.isKicked()) c.setKicked(true); - c.addReplicateMagnitude(original.getReplicateMagnitude()); - if(sa.isReplicate()) copySA.setIsReplicate(true); - - // I have no idea what get choice does? - if(c.hasChoices()) { - for(int i = 0; i < original.getChoices().size(); i++) { - c.addSpellChoice(original.getChoice(i)); - } - for(int i = 0; i < original.getChoiceTargets().size(); i++) { - c.setSpellChoiceTarget(original.getChoiceTarget(i)); - } - } - } - - if(sa.getTargetCard() != null) - copySA.setTargetCard(sa.getTargetCard()); - - if(sa.getTargetPlayer() != null) { - if(sa.getTargetPlayer().isHuman() - || (sa.getTargetPlayer().isComputer())) - copySA.setTargetPlayer(sa.getTargetPlayer()); - } - - if(source.getController().isHuman()) - AllZone.GameAction.playSpellAbilityForFree(copySA); - - else if(copySA.canPlayAI()) - ComputerUtil.playStackFree(copySA); - } - - //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - //this is the new getCard() method, you have to remove the old getCard() - final public Card getCard(String cardName, Player owner) { - if(removedCardList.contains(cardName) || cardName.equals(blankCard.getName())) return blankCard; - - return getCard2(cardName, owner); - } - - 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 - 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; - } - - final private Card getCard2(final String cardName, final Player owner) { - //o should be Card object - Object o = map.get(cardName); - if(o == null) throw new RuntimeException("CardFactory : getCard() invalid card name - " + cardName); - - final Card card = copyStats(o); - card.setOwner(owner); - card.setController(owner); - //may have to change the spell - //this is so permanents like creatures and artifacts have a "default" spell - if(!card.isLand()) card.addSpellAbility(new Spell_Permanent(card)); - - 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); - } - - // Support for using string variables to define Count$ for X or Y - // Or just about any other String that a card object needs at any given time - // TODO: To Be Removed - while(hasKeyword(card, "SVar") != -1) { - int n = hasKeyword(card, "SVar"); - if(n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":", 3); - - if(k.length > 2) card.setSVar(k[1], k[2]); - } - } - - - 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.GameAction.sacrificeDestroy(CardsinPlay.get(i)); - }//execute() - };//Command - card.addComesIntoPlayCommand(intoPlay); - } - - if (hasKeyword(card, "Multikicker") != -1) - { - int n = 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(hasKeyword(card, "SearchRebel") != -1) { - int n = hasKeyword(card, "SearchRebel"); - if(n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - final String manacost = k[1]; - - card.addSpellAbility(CardFactoryUtil.ability_Rebel_Search(card, manacost)); - } - }//Rebel search - - 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(CardFactoryUtil.ability_Morph_Up(card, cost, orgManaCost, attack, defense)); - card.addSpellAbility(CardFactoryUtil.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(CardFactoryUtil.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]; - - /* - final SpellAbility devour = new Spell(card) { - private static final long serialVersionUID = 4888189840817163900L; - - @Override - public void resolve() { - int totalCounters = numCreatures[0] * multiplier; - - card.addCounter(Counters.P1P1, totalCounters); - - if(card.getName().equals("Skullmulcher")) { - for(int i = 0; i < numCreatures[0]; i++) { - card.getController().drawCard(); - } - } - - } - - @Override - public boolean canPlay() { - return AllZone.Phase.getPlayerTurn().equals(card.getController()) && card.isFaceDown() - && AllZoneUtil.isCardInPlay(card); - } - - };//devour*/ - - 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()); - - 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++) { - AllZone.GameAction.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) { - AllZone.GameAction.sacrifice(c); - count++; - } - //is this needed? - AllZone.Computer_Battlefield.updateObservers(); - } - numCreatures[0] = count; - } - int totalCounters = numCreatures[0] * multiplier; - - card.addCounter(Counters.P1P1, totalCounters); - - if(card.getName().equals("Skullmulcher")) { - for(int i = 0; i < numCreatures[0]; i++) { - card.getController().drawCard(); - } - } - - } - }; - /* - devour.setStackDescription(card.getName() + " - gets " + magnitude - + " +1/+1 counter(s) per devoured creature."); - devour.setDescription("Devour " + magnitude); - card.addSpellAbility(devour);*/ - 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.ComputerPlayer); - choices = choices.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && c.isArtifact(); - } - }); - if(choices.size() != 0){ - ability.setTargetCard(CardFactoryUtil.AI_getBestCreature(choices)); - - if (ability.getTargetCard() != null){ - ability.setStackDescription("Put " + card.getCounters(Counters.P1P1) - + " +1/+1 counter/s from " + card + " on " + ability.getTargetCard()); - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - else{ - AllZone.InputControl.setInput(CardFactoryUtil.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 = CardFactoryUtil.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 - - - //************************************************** - // AbilityFactory cards - ArrayList IA = card.getIntrinsicAbilities(); - if (IA.size() > 0) - { - if (card.isInstant() || card.isSorcery()) - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - - for (int i=0; i 0; - } - }; - card.clearFirstSpellAbility(); - card.addFirstSpellAbility(spell); - } - //*************** END ************ END ************************* - - - //*************** START *********** START ************************** - else if(cardName.equals("Bridge from Below")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = 7254358703158629514L; - - @Override - public boolean canPlayAI() { - return false; - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - } - //*************** END ************ END ************************* - - - //*************** START *********** START ************************** - else if(cardName.equals("Conspiracy") || cardName.equals("Cover of Darkness") - || cardName.equals("Door of Destinies") || cardName.equals("Engineered Plague") - || cardName.equals("Shared Triumph") || cardName.equals("Belbe's Portal") - || cardName.equals("Steely Resolve") || cardName.equals("Xenograft")) { - final String[] input = new String[1]; - final Player player = card.getController(); - - final SpellAbility ability = new Ability_Static(card, "0") { - @Override - public void resolve() { - if(player.isHuman()) { - input[0] = JOptionPane.showInputDialog(null, "Which creature type?", "Pick type", - JOptionPane.QUESTION_MESSAGE); - - 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" - } else { - String chosenType = CardFactoryUtil.chooseCreatureTypeAI(card); - if(!chosenType.equals("")) input[0] = chosenType; - else input[0] = "Sliver"; //what to put here for the AI??? - } - - card.setChosenType(input[0]); - } - };//ability - Command intoPlay = new Command() { - private static final long serialVersionUID = 5634360316643996274L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append("As ").append(card.getName()).append(" enters the battlefield, choose a creature type."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Sarpadian Empires, Vol. VII")) { - - final String[] choices = {"Citizen", "Camarid", "Thrull", "Goblin", "Saproling"}; - - final Player player = card.getController(); - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - String type = ""; - String imageName = ""; - String color = ""; - - if(player.isComputer()) { - type = "Thrull"; - imageName = "B 1 1 Thrull"; - color = "B"; - } else if(player.isHuman()) { - Object q = GuiUtils.getChoiceOptional("Select type of creature", choices); - if(q != null){ - if(q.equals("Citizen")) { - type = "Citizen"; - imageName = "W 1 1 Citizen"; - color = "W"; - } else if(q.equals("Camarid")) { - type = "Camarid"; - imageName = "U 1 1 Camarid"; - color = "U"; - } else if(q.equals("Thrull")) { - type = "Thrull"; - imageName = "B 1 1 Thrull"; - color = "B"; - } else if(q.equals("Goblin")) { - type = "Goblin"; - imageName = "R 1 1 Goblin"; - color = "R"; - } else if(q.equals("Saproling")) { - type = "Saproling"; - imageName = "G 1 1 Saproling"; - color = "G"; - } - } - } - card.setChosenType(type); - - final String t = type; - final String in = imageName; - final String col = color; - //card.setChosenType(input[0]); - - Cost a1Cost = new Cost("3 T", cardName, true); - final Ability_Activated a1 = new Ability_Activated(card, a1Cost, null) { - - private static final long serialVersionUID = -2114111483117171609L; - - @Override - public void resolve() { - CardFactoryUtil.makeToken(t, in, card.getController(), col, new String[] {"Creature", t}, 1, 1, - new String[] {""}); - } - - }; - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getController()); - sb.append(" puts a 1/1 ").append(t).append(" token onto the battlefield"); - a1.setStackDescription(sb.toString()); - - card.addSpellAbility(a1); - } - };//ability - Command intoPlay = new Command() { - private static final long serialVersionUID = 7202704600935499188L; - - public void execute() { - ability.setStackDescription("As Sarpadian Empires, Vol. VII enters the battlefield, choose white Citizen, blue Camarid, black Thrull, red Goblin, or green Saproling."); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.setText("As Sarpadian Empires, Vol. VII enters the battlefield, choose white Citizen, blue Camarid, black Thrull, red Goblin, or green Saproling.\r\n" - + "3, Tap: Put a 1/1 creature token of the chosen color and type onto the battlefield.\r\n" - + card.getText()); // In the slight chance that there may be a need to add a note to this card. - card.addComesIntoPlayCommand(intoPlay); - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("That Which Was Taken")) { - Cost abCost = new Cost("4 T", cardName, true); - Target target = new Target(card,"Select target permanent other than "+cardName, new String[] {"Permanent.Other"}); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -8996435083734446340L; - - @Override - public void resolve() { - Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) - c.addCounter(Counters.DIVINITY, 1); - } - - @Override - public boolean canPlayAI() { - CardList perms = getPerms(); - - return perms.size()>0; - } - - @Override - public void chooseTargetAI() { - CardList a = getPerms(); - if (a.size()>0) { - setTargetCard(a.get(0)); - } - } - - CardList getPerms() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.filter(new CardListFilter(){ - public boolean addCard(Card c) - { - return c.getCounters(Counters.DIVINITY) == 0 && (CardUtil.getConvertedManaCost(c.getManaCost()) > 3 || c.getNetAttack() > 4) && - !c.getName().equals("That Which Was Taken"); - } - }); - return list; - } - };//SpellAbility - ability.setDescription(abCost+"Put a divinity counter on target permanent other than "+cardName+"."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Necrogenesis")) { - final SpellAbility necrogen = new Ability(card, "2") { - private static final long serialVersionUID = 1299216756153970592L; - - @Override - public void resolve() { - Card c = getTargetCard(); - if (AllZone.getZone(c).is(Constant.Zone.Graveyard)){ - // target is still in the grave, ability resolves - AllZone.GameAction.exile(c); - CardFactoryUtil.makeTokenSaproling(card.getController()); - } - } - - @Override - public boolean canPlayAI(){ - return false; - } - - @Override - public boolean canPlay(){ - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer)); - return list.getType("Creature").size() > 0 && super.canPlay(); - } - }; - Input necroTarget = new Input() { - - boolean once = false; - private static final long serialVersionUID = 8243511353958609599L; - - @Override - public void showMessage() { - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer)); - list = list.getType("Creature"); - if (list.size() == 0 || once) { - once = false; - stop(); - } - else { - Object o = GuiUtils.getChoice("Choose card to exile", list.toArray()); - if (o!=null) - { - Card c = (Card)o; - necrogen.setTargetCard(c); - once = true; - - AllZone.Stack.addSimultaneousStackEntry(necrogen); - - } - } - stop(); - } - }; - - necrogen.setDescription("2: Exile target creature card in a graveyard. Put a 1/1 green Saproling creature token onto the battlefield."); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()); - sb.append(" exiles target creature card in a graveyard. Puts a 1/1 green Saproling creature token onto the battlefield."); - necrogen.setStackDescription(sb.toString()); - - necrogen.setAfterPayMana(necroTarget); - card.addSpellAbility(necrogen); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Night Soil")) { - final SpellAbility nightSoil = new Ability(card, "1") { - @Override - public void resolve() { - CardFactoryUtil.makeTokenSaproling(card.getController()); - } - - @Override - public boolean canPlayAI(){ - return false; - } - - @Override - public boolean canPlay(){ - CardList grave = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - CardList aiGrave = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - return (grave.getType("Creature").size() > 1 || aiGrave.getType("Creature").size() > 1) && super.canPlay(); - } - }; - Input soilTarget = new Input() { - - boolean once = false; - private static final long serialVersionUID = 8243511353958609599L; - - @Override - public void showMessage() { - CardList grave = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - CardList aiGrave = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - grave = grave.getType("Creature"); - aiGrave = aiGrave.getType("Creature"); - - if (once || (grave.size() < 2 && aiGrave.size() < 2)) { - once = false; - stop(); - } - else { - CardList chooseGrave; - if (grave.size() < 2) - chooseGrave = aiGrave; - else if (aiGrave.size() < 2) - chooseGrave = grave; - else{ - chooseGrave = aiGrave; - chooseGrave.addAll(grave); - } - - Object o = GuiUtils.getChoice("Choose first creature to exile", chooseGrave.toArray()); - if (o!=null) - { - CardList newGrave; - Card c = (Card)o; - if (c.getOwner().isHuman()){ - newGrave = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - } - else { - newGrave = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - } - - newGrave = newGrave.getType("Creature"); - newGrave.remove(c); - - Object o2 = GuiUtils.getChoice("Choose second creature to exile", newGrave.toArray()); - if (o2!=null) - { - Card c2 = (Card)o2; - newGrave.remove(c2); - AllZone.GameAction.exile(c); - AllZone.GameAction.exile(c2); - once = true; - - AllZone.Stack.addSimultaneousStackEntry(nightSoil); - - } - } - } - stop(); - } - }; - - nightSoil.setDescription("1, Exile two creature cards from a single graveyard: Put a 1/1 green Saproling creature token onto the battlefield."); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()).append(" puts a 1/1 green Saproling creature token onto the battlefield."); - nightSoil.setStackDescription(sb.toString()); - - nightSoil.setAfterPayMana(soilTarget); - card.addSpellAbility(nightSoil); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Necropotence")) { - final CardList necroCards = new CardList(); - - final Command necro = new Command() { - private static final long serialVersionUID = 4511445425867383336L; - - public void execute() { - //put cards removed by Necropotence into the player's hand - if(necroCards.size() > 0) { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getController()); - - for(int i = 0; i < necroCards.size(); i++) { - hand.add(necroCards.get(i)); - } - necroCards.clear(); - } - } - }; - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - PlayerZone library = AllZone.getZone(Constant.Zone.Library, card.getController()); - - if(library.size() != 0) { - Card c = library.get(0); - library.remove(c); - - // TODO: Necro really exiles face down, but for now we'll just do it this way - // c.setIsFaceDown(true); - // AllZone.GameAction.exile(c); - necroCards.add(c); //add card to necro so that it goes into hand at end of turn - AllZone.EndOfTurn.addAt(necro); - } - } - - @Override - public boolean canPlayAI() { - return false; - } - };//SpellAbility - - ability.setDescription("Pay 1 life: Set aside the top card of your library face down. At the end of your turn, put that card into your hand."); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()); - sb.append(" - Set aside the top card of your library face down. At the end of your turn, put that card into your hand."); - ability.setStackDescription(sb.toString()); - - card.addSpellAbility(ability); - - //instead of paying mana, pay life and add to stack - //Input showMessage() is always the first method called - Input payLife = new Input() { - private static final long serialVersionUID = -3846772748411690084L; - - @Override - public void showMessage() { - boolean paid = card.getController().payLife(1, card); - - //this order is very important, do not change - stop(); - if (paid) - AllZone.Stack.add(ability); - } - };//Input - ability.setBeforePayMana(payLife); - - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Aluren")) { - final Ability ability1 = new Ability(card, "0") { - @Override - public void resolve() { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, AllZone.HumanPlayer); - - if (hand.size() == 0) return; - - CardList creatures = new CardList(); - - for (int i = 0; i < hand.size(); i++) { - if (hand.get(i).isCreature() - && CardUtil.getConvertedManaCost(hand.get(i).getManaCost()) <= 3) creatures.add(hand.get(i)); - } - - if (creatures.size() == 0) return; - - - Object o = GuiUtils.getChoiceOptional("Select target creature to play", - creatures.toArray()); - if(o != null) { - Card c = (Card) o; - AllZone.Stack.add(c.getSpellPermanent()); - } - - - } - - @Override - public boolean canPlayAI() { - return false; - - } - - @Override - public boolean canPlay() { - if(AllZone.getZone(card).is(Constant.Zone.Battlefield)) return true; - else return false; - }//canPlay() - };//SpellAbility ability1 - - - ability1.setDescription("Any player may play creature cards with converted mana cost 3 or less without paying their mana cost any time he or she could play an instant."); - ability1.setStackDescription("Aluren - Play creature with converted manacost 3 or less for free."); - ability1.getRestrictions().setAnyPlayer(true); - card.addSpellAbility(ability1); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Volrath's Dungeon")) { - - Cost dungeonCost = new Cost("Discard<1/Card>", cardName, true); - Target dungeonTgt = new Target(card,"Volrath's Dungeon - Target player" , "player".split(",")); - - final SpellAbility dungeon = new Ability_Activated(card, dungeonCost, dungeonTgt){ - private static final long serialVersionUID = 334033015590321821L; - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.HumanPlayer); - } - - @Override - public void resolve() { - Player target = getTargetPlayer(); - CardList targetHand = AllZoneUtil.getPlayerHand(target); - - if (targetHand.size() == 0) return; - - if (target.isHuman()){ - Object discard = GuiUtils.getChoice("Select Card to place on top of library.", targetHand.toArray()); - - Card card = (Card)discard; - AllZone.GameAction.moveToLibrary(card); - } - else if (target.isComputer()){ - AllZone.ComputerPlayer.handToLibrary(1, "Top"); - } - } - - @Override - public boolean canPlayAI() { - return AllZone.Computer_Hand.size() > 0 && AllZone.Human_Hand.size() > 0 && super.canPlay(); - } - - };//SpellAbility dungeon - - - Cost bailCost = new Cost("PayLife<5>", cardName, true); - final SpellAbility bail = new Ability_Activated(card, bailCost, null){ - private static final long serialVersionUID = -8990402917139817175L; - - @Override - public void resolve() { - AllZone.GameAction.destroy(card); - } - - @Override - public boolean canPlay() { - return super.canPlay(); - } - - @Override - public boolean canPlayAI() { - return card.getController().isHuman() && AllZone.ComputerPlayer.getLife() >= 9 && - super.canPlay() && AllZone.Computer_Hand.size() > 0; - } - - };//SpellAbility pay bail - - dungeon.setDescription("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."); - dungeon.setStackDescription("CARDNAME - Target player chooses a card in hand and puts on top of library."); - dungeon.getRestrictions().setSorcerySpeed(true); - - bail.getRestrictions().setAnyPlayer(true); - bail.getRestrictions().setPlayerTurn(true); - bail.setDescription("Pay 5 Life: Destroy Volrath's Dungeon. Any player may activate this ability but only during his or her turn."); - bail.setStackDescription("Destroy CARDNAME."); - - card.addSpellAbility(dungeon); - card.addSpellAbility(bail); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Mox Diamond")) { - final Input discard = new Input() { - private static final long serialVersionUID = -1319202902385425204L; - - @Override - public void showMessage() { - AllZone.Display.showMessage("Discard a land card (or select Mox Diamond to sacrifice it)"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Hand) && c.isLand()) { - AllZone.HumanPlayer.discard(c, null); - stop(); - } else if(c.equals(card)) { - AllZone.GameAction.sacrifice(card); - stop(); - } - } - };//Input - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - if(card.getController().isHuman()) { - if(AllZone.Human_Hand.size() == 0) AllZone.GameAction.sacrifice(card); - else AllZone.InputControl.setInput(discard); - } else { - CardList list = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return (c.isLand()); - } - }); - AllZone.ComputerPlayer.discard(list.get(0), this); - }//else - }//resolve() - };//SpellAbility - Command intoPlay = new Command() { - private static final long serialVersionUID = -7679939432259603542L; - - public void execute() { - ability.setStackDescription("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."); - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -1818766848857998431L; - - //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.isLand()); - } - }); - return list.size() != 0 && super.canPlay(); - }//canPlay() - }; - card.addComesIntoPlayCommand(intoPlay); - card.clearSpellKeepManaAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Standstill")) { - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - - card.addSpellAbility(new Spell_Permanent(card) { - private static final long serialVersionUID = 6912683989507840172L; - - @Override - public boolean canPlayAI() { - CardList compCreats = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - CardList humCreats = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - - //only play standstill if comp controls more creatures than human - //this needs some additional rules, maybe add all power + toughness and compare - if(compCreats.size() > humCreats.size()) return true; - else return false; - } - }); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Goblin Charbelcher")) { - Cost abCost = new Cost("3 T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, new Target(card,"TgtCP")) { - private static final long serialVersionUID = -840041589720758423L; - - @Override - public void resolve() { - CardList topOfLibrary = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - CardList revealed = new CardList(); - - if(topOfLibrary.size() == 0) return; - - int damage = 0; - int count = 0; - Card c = null; - Card crd; - while(c == null) { - revealed.add(topOfLibrary.get(count)); - crd = topOfLibrary.get(count++); - if(crd.isLand() || count == topOfLibrary.size()) { - c = crd; - damage = count; - if (crd.isLand()) - damage--; - - if(crd.getName().equals("Mountain")) - damage *= 2; - } - }//while - GuiUtils.getChoiceOptional("Revealed cards:", revealed.toArray()); - - if(getTargetCard() != null) { - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - getTargetCard().addDamage(damage, card); - } - } else getTargetPlayer().addDamage(damage, card); - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(abCost); - sb.append("Reveal cards from the top of your library until you reveal a land card. Goblin Charbelcher deals damage equal "); - sb.append("to the number of nonland cards revealed this way to target creature or player. If the revealed land card was a Mountain, "); - sb.append("Goblin Charbelcher deals double that damage instead. Put the revealed cards on the bottom of your library in any order."); - ability.setDescription(sb.toString()); - - ability.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Isochron Scepter")) - { - Cost abCost = new Cost("2 T", cardName, true); - final Ability_Activated freeCast = new Ability_Activated(card, abCost, null) - { - - private static final long serialVersionUID = 4455819149429678456L; - - @Override - public void resolve() { - if(getSourceCard().getAttachedCards().length == 0) - { - //AllZone.Display.showMessage("You have not exiled a card."); - return; - } - Card c = copyCard(getSourceCard().getAttachedCards()[0]); - if(getSourceCard().getController().isComputer()) - { - for(SpellAbility sa:getSourceCard().getAttachedCards()[0].getSpellAbility()) - if(sa.canPlayAI()) - { - ComputerUtil.playStackFree(sa); - return; - } - } - else AllZone.GameAction.playCardNoCost(c); - } - - public boolean canPlay() - { - if (!super.canPlay()) - return false; - - if (getSourceCard().getAttachedCards().length > 0) - { - // Isochron Scepter might be broken? - Card c = copyCard(getSourceCard().getAttachedCards()[0]); - SpellAbility sa = c.getSpellAbility()[0]; - return sa.canPlay(); - } - else - return false; - } - - public boolean canPlayAI() - { - if (getSourceCard().getAttachedCards().length == 0) - return false; - for(SpellAbility sa:getSourceCard().getAttachedCards()[0].getSpellAbility()) - if(sa.canPlayAI()) - return true; - return false; - } - }; - freeCast.setDescription(abCost+"You may copy the exiled card. If you do, you may cast the copy without paying its mana cost"); - freeCast.setStackDescription("Copy the exiled card and cast the copy without paying its mana cost."); - - final Input exile = new Input() { - private static final long serialVersionUID = -6392468000100283596L; - - @Override - public void showMessage() { - AllZone.Display.showMessage("You may exile an Instant with converted mana cost two or less from your hand"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Hand) && c.isInstant() && CardUtil.getConvertedManaCost(c) <= 2) - { - AllZone.GameAction.moveTo(AllZone.Human_Exile, c); - card.attachCard(c); - stop(); - } - } - - @Override - public void selectButtonCancel() { - stop(); - } - };//Input - - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - if(card.getController().isHuman()) { - if(AllZone.Human_Hand.size() > 0) - AllZone.InputControl.setInput(exile); - } else { - CardList list = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - list = list.filter( new CardListFilter(){ - public boolean addCard(Card c) - { - return c.isInstant() && CardUtil.getConvertedManaCost(c) <=2 ; - } - }); - CardListUtil.sortCMC(list); - list.reverse(); - Card c = list.get(0); - AllZone.GameAction.moveTo(AllZone.Computer_Exile, c); - card.attachCard(c); - }//else - }//resolve() - };//SpellAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 9202753910259054021L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append("Imprint - ").append(card.getController()); - sb.append(" may exile an instant card with converted mana cost 2 or less from their hand."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.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() { - for(Card c : AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)) - if(c.isInstant() && CardUtil.getConvertedManaCost(c) <=2) - return true; - return false; - } - }; - - card.addComesIntoPlayCommand(intoPlay); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - card.addSpellAbility(freeCast); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Lodestone Bauble")) { - /* 1, Tap, 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. - */ - - Cost abCost = new Cost("1 T Sac<1/CARDNAME>", cardName, true); - Target target = new Target(card, "Select target player", new String[]{"Player"}); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -6711849408085138636L; - - @Override - public boolean canPlayAI() { - return getComputerLands().size() >= 4; - } - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.ComputerPlayer); - }//chooseTargetAI() - - @Override - public void resolve() { - final int limit = 4; //at most, this can target 4 cards - final Player player = getTargetPlayer(); - - CardList lands = AllZoneUtil.getPlayerGraveyard(player); - lands = lands.filter(AllZoneUtil.basicLands); - if(card.getController().isHuman()){ - //now, select up to four lands - int end = -1; - end = Math.min(lands.size(), limit); - //TODO - maybe pop a message box here that no basic lands found (if necessary) - for(int i = 1; i <= end; i++) { - String Title = "Put on top of library: "; - if(i == 2) Title = "Put second from top of library: "; - if(i == 3) Title = "Put third from top of library: "; - if(i == 4) Title = "Put fourth from top of library: "; - Object o = GuiUtils.getChoiceOptional(Title, lands.toArray()); - if(o == null) break; - Card c_1 = (Card) o; - lands.remove(c_1); //remove from the display list - AllZone.GameAction.moveToLibrary(c_1, i-1); - } - } - else { //Computer - //based on current AI, computer should always target himself. - CardList list = getComputerLands(); - int max = list.size(); - if (max > limit) max = limit; - - for(int i=0;i 0;// && list.size() > 0; - } - - @Override - public void resolve() { - Player target = getTargetPlayer(); - CardList library = AllZoneUtil.getPlayerCardsInLibrary(getTargetPlayer()); - - boolean loop = true; - CardList grinding = new CardList(); - do{ - grinding.clear(); - - for(int i = 0; i < 2; i++){ - // Move current grinding to a different list - if (library.size() > 0){ - Card c = library.get(0); - grinding.add(c); - library.remove(c); - } - else{ - loop = false; - break; - } - } - - // if current grinding dont share a color, stop grinding - if (loop){ - loop = grinding.get(0).sharesColorWith(grinding.get(1)); - } - target.mill(grinding.size()); - }while(loop); - } - }; - ab1.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - ab1.setDescription(abCost+"Put the top two cards of target player's library into that player's graveyard. If both cards share a color, repeat this process."); - card.addSpellAbility(ab1); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Keening Stone")) { - /* - * 5, Tap: 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. - */ - Target target = new Target(card,"Select target player", new String[] {"Player"}); - Cost abCost = new Cost("5 T", cardName, true); - Ability_Activated ab1 = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -6282104343089446216L; - - @Override - public boolean canPlayAI() { - Player player = AllZone.HumanPlayer; - if (!player.canTarget(card)) - return false; - - setTargetPlayer(AllZone.HumanPlayer); - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - return libList.size() > 0; - } - - @Override - public void resolve() { - Player player = getTargetPlayer(); - player.mill(AllZone.getZone(Constant.Zone.Graveyard, player).size()); - } - }; - - ab1.setDescription(abCost+"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."); - card.addSpellAbility(ab1); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Everflowing Chalice")) { - final Command comesIntoPlay = new Command() { - private static final long serialVersionUID = 4245563898487609274L; - - public void execute() { - card.addCounter(Counters.CHARGE, card.getMultiKickerMagnitude()); - card.setMultiKickerMagnitude(0); - } - }; - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Curse of Wizardry")) { - final Ability ability = new Ability(card, "0") { - @Override - public void resolve() { - 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 = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - - if(list.size() > 0) { - String color = CardFactoryUtil.getMostProminentColor(list); - if(!color.equals("")) card.setChosenColor(color); - else card.setChosenColor("black"); - } else { - card.setChosenColor("black"); - } - } - } - }; - Command comesIntoPlay = new Command() { - private static final long serialVersionUID = -6417019967914398902L; - - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - };//Command - - StringBuilder sb = new StringBuilder(); - sb.append("As ").append(cardName).append(" enters the battlefield, choose a color."); - ability.setStackDescription(sb.toString()); - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Mirror Universe")) { - /* - * Tap, Sacrifice Mirror Universe: Exchange life totals with - * target opponent. Activate this ability only during your upkeep. - */ - Cost abCost = new Cost("T Sac<1/CARDNAME>", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = -1409850598108909739L; - - @Override - public void resolve() { - Player player = card.getController(); - Player opponent = player.getOpponent(); - int tmp = player.getLife(); - player.setLife(opponent.getLife(), card); - opponent.setLife(tmp, card); - } - - @Override - public boolean canPlay() { - return super.canPlay() && AllZone.Phase.getPhase().equals(Constant.Phase.Upkeep) - && AllZone.Phase.getPlayerTurn().equals(card.getController()); - } - - @Override - public boolean canPlayAI() { - if(AllZone.ComputerPlayer.getLife() < 5 && AllZone.HumanPlayer.getLife() > 5) { - return true; - } - else if(AllZone.ComputerPlayer.getLife() == 1) { - return true; - } - else if((AllZone.HumanPlayer.getLife() - AllZone.ComputerPlayer.getLife()) > 10) { - return true; - } - else return false; - } - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - Exchange life totals with target opponent."); - ability.setStackDescription(sb.toString()); - - ability.setDescription(abCost+"Exchange life totals with target opponent. Activate this ability only during your upkeep."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("An-Zerrin Ruins")) { - - final Ability_Static comesIntoPlayAbility = new Ability_Static(card, "0") { - @Override - public void resolve() { - String chosenType = ""; - if(card.getController().isHuman()) { - chosenType = JOptionPane.showInputDialog(null, "Enter a creature type:", card.getName(), - JOptionPane.QUESTION_MESSAGE); - } - else { - //not implemented for AI - } - if (!CardUtil.isACreatureType(chosenType)) chosenType = ""; - card.setChosenType(chosenType); - }//resolve() - }; //comesIntoPlayAbility - - Command intoPlay = new Command() { - private static final long serialVersionUID = 2985015252466920757L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - choose a creature type. Creatures of that type do not untap during their controller's untap step."); - comesIntoPlayAbility.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(comesIntoPlayAbility); - - } - }; - - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Barl's Cage")) { - final String Tgts[] = {"Creature"}; - Target target= new Target(card,"Select target creature.", Tgts, "1", "1"); - - final Cost cost = new Cost("3", card.getName(), true); - - final SpellAbility ability = new Ability_Activated(card, cost, target) { - private static final long serialVersionUID = 8941566961041310961L; - - @Override - public boolean canPlayAI() { - Card c = getCreature(); - if(c == null) return false; - else { - setTargetCard(c); - return true; - } - }//canPlayAI() - - //may return null - public Card getCreature() { - CardList tappedCreatures = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - tappedCreatures = tappedCreatures.filter(AllZoneUtil.tapped); - tappedCreatures = tappedCreatures.filter(AllZoneUtil.getCanTargetFilter(card)); - if(tappedCreatures.isEmpty()) return null; - - return CardFactoryUtil.AI_getBestCreature(tappedCreatures); - } - - @Override - public void resolve() { - Card target = getTargetCard(); - if(AllZoneUtil.isCardInPlay(target) - && CardFactoryUtil.canTarget(card, target)) { - target.addExtrinsicKeyword("This card doesn't untap during your next untap step."); - }//is card in play? - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START ************ START ************************** - else if(cardName.equals("Black Mana Battery") || cardName.equals("Blue Mana Battery") - || cardName.equals("Green Mana Battery") || cardName.equals("Red Mana Battery") - || cardName.equals("White Mana Battery")) { - - final int[] num = new int[1]; - String name[] = cardName.split(" "); - final String shortString = Input_PayManaCostUtil.getShortColorString(name[0].trim().toLowerCase()); - StringBuilder desc = new StringBuilder(); - desc.append("tap, Remove any number of charge counters from ").append(cardName); - desc.append(": Add ").append(shortString).append(" to your mana pool, then add an additional "); - desc.append(shortString).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 = -5356224416791741957L; - - //@Override - public String mana() { - StringBuilder mana = new StringBuilder(); - mana.append(shortString); - for(int i = 0; i < num[0]; i++) { - mana.append(" ").append(shortString); - } - return mana.toString(); - } - - @Override - public void resolve() { - abMana.produceMana(mana(), card.getController()); - } - - @Override - public boolean canPlayAI(){ - return false; - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = -8808673510875540608L; - - @Override - public void showMessage() { - num[0] = card.getCounters(Counters.CHARGE); - String[] choices = new String[num[0]+1]; - for(int j=0;j<=num[0];j++) { - choices[j] = ""+j; - } - String answer = (String)(GuiUtils.getChoiceOptional( - "Charge counters to remove", choices)); - if(null != answer && !answer.equals("")) { - num[0] = Integer.parseInt(answer); - card.tap(); - card.subtractCounter(Counters.CHARGE, num[0]); - stop(); - AllZone.Stack.add(addMana); - return; - } - stop(); - } - }; - - addMana.setDescription(desc.toString()); - addMana.setBeforePayMana(runtime); - card.addSpellAbility(addMana); - } - //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Time Bomb")){ - /* - * 1, Tap, Sacrifice Time Bomb: Time Bomb deals damage equal - * to the number of time counters on it to each creature and - * each player. - */ - Cost abCost = new Cost("1 T Sac<1/CARDNAME>", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 7550743617522146304L; - - @Override - public void resolve() { - int damage = card.getCounters(Counters.TIME); - CardList all = AllZoneUtil.getCreaturesInPlay(); - - for(Card c:all) c.addDamage(damage, card); - - AllZone.HumanPlayer.addDamage(damage, card); - AllZone.ComputerPlayer.addDamage(damage, card); - } - - @Override - public boolean canPlayAI() { - final int damage = card.getCounters(Counters.TIME); - - if (AllZone.HumanPlayer.getLife() <= damage) return true; - - CardListFilter filter = new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && damage >= (c.getNetDefense() + c.getDamage()); - } - }; - - CardList human = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - human = human.filter(filter); - - CardList comp = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - comp = comp.filter(filter); - - return human.size() > (comp.size() + 2) && AllZone.ComputerPlayer.getLife() > damage + 3; - } - }; - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(card).append(" - deals X damage to each creature and each player."); - ability.setStackDescription(sbStack.toString()); - - ability.setDescription(abCost+cardName+" deals damage equal to the number of time counters on it to each creature and each player."); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Pithing Needle")) { - final CardFactory factory = this; - final SpellAbility ability = new Ability_Static(card, "0") { - @Override - public void resolve() { - final String[] input = new String[1]; - CardList allCards = factory.getAllCards(); - input[0] = ""; - if(card.getController().isHuman()) { - while(input[0] == "") - { - input[0] = JOptionPane.showInputDialog(null, "Which source?", "Pick a card",JOptionPane.QUESTION_MESSAGE); - - - CardList cards = allCards.filter(new CardListFilter() { - public boolean addCard(Card c) { - //System.out.print("Comparing \"" + c.getName().toLowerCase() + "\" to \"" + input[0] + "\": "); - //System.out.println((c.getName().toLowerCase().equals(input[0].toLowerCase()))); - return c.getName().toLowerCase().equals(input[0].toLowerCase()); - } - }); - - if(cards.size() == 0) { - input[0] = ""; - } - else { - input[0] = cards.get(0).getName(); - } - } - //TODO: some more input validation, case-sensitivity, etc. - - } else { - //AI CODE WILL EVENTUALLY GO HERE! - } - card.setSVar("PithingTarget", input[0]); - card.setChosenType(input[0]); - } - };//ability - ability.setStackDescription("As Pithing Needle enters the battlefield, name a card."); - Command intoPlay = new Command() { - - private static final long serialVersionUID = 2266471224097876143L; - - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - - Command leavesPlay = new Command() { - - private static final long serialVersionUID = 7079781778752377760L; - - public void execute() { - card.setSVar("Pithing Target", ""); - } - }; - - card.addComesIntoPlayCommand(intoPlay); - card.addLeavesPlayCommand(leavesPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Bazaar of Wonders")) { - /* - * When Bazaar of Wonders enters the battlefield, exile all cards from all graveyards. - */ - Command intoPlay = new Command() { - private static final long serialVersionUID = 9209706681167017765L; - - public void execute() { - CardList hGrave = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - CardList cGrave = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - - for(Card c:hGrave) AllZone.GameAction.exile(c); - for(Card c:cGrave) AllZone.GameAction.exile(c); - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Phyrexian Processor")) { - final SpellAbility ability = new Ability_Static(card, "0") { - @Override - public void resolve() { - Player player = card.getController(); - int lifeToPay = 0; - if(player.isHuman()) { - int num = card.getController().getLife(); - String[] choices = new String[num+1]; - for(int j = 0; j <= num; j++) { - choices[j] = ""+j; - } - String answer = (String)(GuiUtils.getChoiceOptional( - "Life to pay:", choices)); - lifeToPay = Integer.parseInt(answer); - } else { - //not implemented for Compy - } - - if(player.payLife(lifeToPay, card)) card.setXLifePaid(lifeToPay); - } - };//ability - Command intoPlay = new Command() { - private static final long serialVersionUID = 5634360316643996274L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append("As ").append(card.getName()).append(" enters the battlefield, pay any amount of life."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addComesIntoPlayCommand(intoPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Scroll Rack")) { - Cost abCost = new Cost("1 T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = -5588587187720068547L; - - @Override - public void resolve() { - //not implemented for compy - if(card.getController().isHuman()) { - AllZone.InputControl.setInput(new Input() { - private static final long serialVersionUID = -2305549394512889450L; - CardList exiled = new CardList(); - - @Override - public void showMessage() { - AllZone.Display.showMessage(card.getName()+" - Exile cards from hand. Currently, "+exiled.size()+" selected. (Press OK when done.)"); - ButtonUtil.enableOnlyOK(); - } - - @Override - public void selectButtonOK() { done(); } - - @Override - public void selectCard(final Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Hand, AllZone.HumanPlayer) - && !exiled.contains(c)) { - exiled.add(c); - showMessage(); - } - } - - public void done() { - //exile those cards - for(Card c:exiled) AllZone.GameAction.exile(c); - - //Put that many cards from the top of your library into your hand. - //Ruling: This is not a draw... - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, AllZone.HumanPlayer); - int numCards = 0; - while(lib.size() > 0 && numCards < exiled.size()) { - AllZone.GameAction.moveToHand(lib.get(0)); - numCards++; - } - - AllZone.Display.showMessage(card.getName()+" - Returning cards to top of library."); - - //Then look at the exiled cards and put them on top of your library in any order. - while(exiled.size() > 0) { - Object o = GuiUtils.getChoice("Put a card on top of your library.", exiled.toArray()); - Card c1 = (Card)o; - AllZone.GameAction.moveToLibrary(c1); - exiled.remove(c1); - } - - stop(); - } - }); - } - } - - @Override - public boolean canPlayAI() { - return false; - } - };//ability - ability.setDescription(abCost+"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."); - ability.setStackDescription(cardName+" - exile any number of cards from your hand."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Cursed Scroll")){ - /* - * 3, Tap: 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. - */ - Cost abCost = new Cost("3 T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, new Target(card,"TgtCP")) { - private static final long serialVersionUID = 7550743617522146304L; - - @Override - public void resolve() { - Player player = card.getController(); - String input = ""; - if(player.isHuman()) { - input = JOptionPane.showInputDialog(null, "Name a card.", card.getName(), JOptionPane.QUESTION_MESSAGE); - } else { - CardList hand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - if(!hand.isEmpty()) { - hand.shuffle(); - input = hand.get(0).getName(); - } - } - - //reveal a card at random, and damage if it matches - CardList hand = AllZoneUtil.getPlayerHand(card.getController()); - if(!hand.isEmpty()) { - hand.shuffle(); - Card c = hand.get(0); - JOptionPane.showMessageDialog(null, "Revealed card:\n"+c.getName(), card.getName(), JOptionPane.PLAIN_MESSAGE); - if(input.equals(c.getName())) { - if(null != getTargetCard()) { - getTargetCard().addDamage(2, card); - } - else if(null != getTargetPlayer()) { - getTargetPlayer().addDamage(2, card); - } - } - } - else { - JOptionPane.showMessageDialog(null, "No cards to reveal. Damage fail.", card.getName(), JOptionPane.PLAIN_MESSAGE); - } - } - - @Override - public boolean canPlayAI() { - return !AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer).isEmpty(); - } - }; - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(card).append(" - Name a card."); - ability.setStackDescription(sbStack.toString()); - - ability.setDescription(abCost+"Name a card. Reveal a card at random from your hand. If it's the named card, CARDNAME deals 2 damage to target creature or player."); - - ability.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Temporal Aperture")){ - /* - * 5, Tap: 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.) - */ - final Card[] topCard = new Card[1]; - - final Ability freeCast = new Ability(card, "0") { - - @Override - public boolean canPlay() { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, card.getController()); - return super.canPlay() && (lib.size() > 0 && lib.get(0).equals(topCard[0])); - } - - @Override - public void resolve() { - Card freeCard = topCard[0]; - Player player = card.getController(); - if(freeCard != null) { - if(freeCard.isLand()) { - if(player.canPlayLand()) { - player.playLand(freeCard); - } - else { - JOptionPane.showMessageDialog(null, "You can't play any more lands this turn.", "", JOptionPane.INFORMATION_MESSAGE); - } - } - else{ - AllZone.GameAction.playCardNoCost(freeCard); - } - } - else JOptionPane.showMessageDialog(null, "Error in "+cardName+". freeCard is null", "", JOptionPane.INFORMATION_MESSAGE); - - } - - @Override - public boolean canPlayAI() { - return false; - } - - }; - freeCast.setDescription("Play the previously revealed top card of your library for free."); - freeCast.setStackDescription(cardName+" - play card without paying its mana cost."); - - Cost abCost = new Cost("5 T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = -7328518969488588777L; - - @Override - public void resolve() { - PlayerZone lib = AllZone.getZone(Constant.Zone.Library, card.getController()); - if(lib.size() > 0) { - - //shuffle your library - card.getController().shuffle(); - - //reveal the top card - topCard[0] = lib.get(0); - JOptionPane.showMessageDialog(null, "Revealed card:\n"+topCard[0].getName(), card.getName(), JOptionPane.PLAIN_MESSAGE); - - card.addSpellAbility(freeCast); - card.addExtrinsicKeyword("Play with the top card of your library revealed."); - AllZone.EndOfTurn.addUntil(new Command() { - private static final long serialVersionUID = -2860753262177388046L; - - public void execute() { - card.removeSpellAbility(freeCast); - card.removeExtrinsicKeyword("Play with the top card of your library revealed."); - } - }); - } - }//resolve - - @Override - public boolean canPlayAI() { - return false; - } - }; - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(card).append(" - Shuffle your library, then reveal the top card."); - ability.setStackDescription(sbStack.toString()); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Shuffle your library, then reveal the top card. "); - sbDesc.append("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 "); - sbDesc.append("and you may play that card without paying its mana cost. "); - sbDesc.append("(If it has X in its mana cost, X is 0.)"); - ability.setDescription(abCost+sbDesc.toString()); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Day of the Dragons")) { - final CardList exiled = new CardList(); - final SpellAbility exileAll = new Ability(card, "0") { - @Override - public void resolve() { - CardList myCreatures = AllZoneUtil.getCreaturesInPlay(card.getController()); - for(Card c:myCreatures) { - exiled.add(c); - AllZone.GameAction.exile(c); - } - for(int i = 0; i < exiled.size(); i++) { - CardFactoryUtil.makeToken("Dragon", "R 5 5 Dragon", card.getController(), - "R", new String[] {"Creature", "Dragon"}, 5, 5, - new String[] {"Flying"}); - } - } - }; - - Command intoPlay = new Command() { - private static final long serialVersionUID = 7181675096954076868L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - "); - sb.append("exile all creatures you control. "); - sb.append("Then put that many 5/5 red Dragon creature tokens with flying onto the battlefield."); - exileAll.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(exileAll); - - } - }; - - final SpellAbility returnAll = new Ability(card, "0") { - @Override - public void resolve() { - CardList dragons = AllZoneUtil.getPlayerTypeInPlay(card.getController(), "Dragon"); - for(Card c:dragons) { - AllZone.GameAction.sacrifice(c); - } - for(Card c:exiled) { - AllZone.GameAction.moveToPlay(c); - } - exiled.clear(); - } - }; - - Command leavesPlay = new Command() { - private static final long serialVersionUID = -5553218901524553718L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - "); - sb.append("sacrifice all Dragons you control. "); - sb.append("Then return the exiled cards to the battlefield under your control."); - returnAll.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(returnAll); - - } - }; - - card.addComesIntoPlayCommand(intoPlay); - card.addLeavesPlayCommand(leavesPlay); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Lich")) { - final SpellAbility loseAllLife = new Ability(card, "0") { - @Override - public void resolve() { - int life = card.getController().getLife(); - card.getController().loseLife(life, card); - } - }; - - Command intoPlay = new Command() { - private static final long serialVersionUID = 1337794055075168785L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - ").append(card.getController()); - sb.append(" loses life equal to his or her life total."); - loseAllLife.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(loseAllLife); - - } - }; - - final SpellAbility loseGame = new Ability(card, "0") { - @Override - public void resolve() { - card.getController().altLoseConditionMet(card.getName()); - } - }; - - Command toGrave = new Command() { - private static final long serialVersionUID = 5863295714122376047L; - - public void execute() { - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - ").append(card.getController()); - sb.append("loses the game."); - loseGame.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(loseGame); - - } - }; - - card.addComesIntoPlayCommand(intoPlay); - card.addDestroyCommand(toGrave); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Triangle of War")) { - - Target t2 = new Target(card, "Select target creature an opponent controls", "Creature.YouDontCtrl".split(",")); - final Ability_Sub sub = new Ability_Sub(card, t2) { - private static final long serialVersionUID = -572849470457911366L; - - @Override - public boolean chkAI_Drawback() { - return false; - } - - @Override - public void resolve() { - Card myc = this.getParent().getTargetCard(); - Card oppc = getTargetCard(); - if(AllZoneUtil.isCardInPlay(myc) && AllZoneUtil.isCardInPlay(oppc)) { - if(CardFactoryUtil.canTarget(card, myc) && CardFactoryUtil.canTarget(card, oppc)) { - int myPower = myc.getNetAttack(); - int oppPower = oppc.getNetAttack(); - myc.addDamage(oppPower, oppc); - oppc.addDamage(myPower, myc); - } - } - } - - @Override - public boolean doTrigger(boolean b) { - return false; - } - }; - - Cost abCost = new Cost("2 Sac<1/CARDNAME>", cardName, true); - Target t1 = new Target(card, "Select target creature you control", "Creature.YouCtrl".split(",")); - final Ability_Activated ability = new Ability_Activated(card, abCost, t1) { - private static final long serialVersionUID = 2312243293988795896L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - sub.resolve(); - } - }; - ability.setSubAbility(sub); - ability.setDescription(abCost+"Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its power to the other."); - ability.setStackDescription(card+" - Each creature deals damage equal to its power to the other."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Copy Artifact") || cardName.equals("Sculpting Steel")) { - final CardFactory cfact = this; - final Card[] copyTarget = new Card[1]; - final Card[] cloned = new Card[1]; - - final Command leaves = new Command() { - private static final long serialVersionUID = 6212378498863558380L; - - public void execute() { - //Slight hack if the cloner copies a card with triggers - AllZone.TriggerHandler.removeAllFromCard(cloned[0]); - - Card orig = cfact.getCard(card.getName(), card.getController()); - PlayerZone dest = AllZone.getZone(card.getCurrentlyCloningCard()); - AllZone.GameAction.moveTo(dest, orig); - dest.remove(card.getCurrentlyCloningCard()); - - } - }; - - final SpellAbility copy = new Spell(card) { - private static final long serialVersionUID = 4236580139968159802L; - - @Override - public boolean canPlayAI() { - CardList arts = AllZoneUtil.getTypeInPlay("Artifact"); - return !arts.isEmpty(); - } - - @Override - public void resolve() { - if (card.getController().isComputer()) { - CardList arts = AllZoneUtil.getTypeInPlay("Artifact"); - if(!arts.isEmpty()) { - copyTarget[0] = CardFactoryUtil.AI_getBestArtifact(arts); - } - } - - if (copyTarget[0] != null) { - cloned[0] = CardFactory.copyStats(copyTarget[0]); - cloned[0].setOwner(card.getController()); - cloned[0].setController(card.getController()); - if(cardName.equals("Copy Artifact")) cloned[0].addType("Enchantment"); - cloned[0].setCloneOrigin(card); - cloned[0].addLeavesPlayCommand(leaves); - cloned[0].setCloneLeavesPlayCommand(leaves); - cloned[0].setCurSetCode(copyTarget[0].getCurSetCode()); - cloned[0].setImageFilename(copyTarget[0].getImageFilename()); - - for(SpellAbility sa : copyTarget[0].getSpellAbilities()) { - cloned[0].addSpellAbility(sa); - } - - //Slight hack in case the cloner copies a card with triggers - for(Trigger t : cloned[0].getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(t); - } - - AllZone.GameAction.moveToPlay(cloned[0]); - card.setCurrentlyCloningCard(cloned[0]); - } - } - };//SpellAbility - - Input runtime = new Input() { - private static final long serialVersionUID = 8117808324791871452L; - - @Override - public void showMessage() { - AllZone.Display.showMessage(cardName+" - Select an artifact on the battlefield"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { stop(); } - - @Override - public void selectCard(Card c, PlayerZone z) { - if( z.is(Constant.Zone.Battlefield) && c.isArtifact()) { - copyTarget[0] = c; - stopSetNext(new Input_PayManaCost(copy)); - } - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(copy); - copy.setStackDescription(cardName+" - enters the battlefield as a copy of selected card."); - copy.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - - return postFactoryKeywords(card); - }//getCard2 - - public 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 = 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.GameAction.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 (hasKeyword(card, "Replicate") != -1) { - int n = 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 = 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.GameAction.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(hasKeyword(card, "Cycling") != -1) { - int n = 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(CardFactoryUtil.ability_cycle(card, manacost)); - } - }//Cycling - - while(hasKeyword(card, "TypeCycling") != -1) { - int n = 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(CardFactoryUtil.ability_typecycle(card, manacost, type)); - } - }//TypeCycling - - if (hasKeyword(card, "Flashback") != -1) { - int n = 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(CardFactoryUtil.ability_Flashback(card, k[1])); - } - }//flashback - - if(hasKeyword(card, "Transmute") != -1) { - int n = 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(CardFactoryUtil.ability_transmute(card, manacost)); - } - }//transmute - - // Sol's Soulshift fix - int shiftPos = 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(CardFactoryUtil.ability_Soulshift(card, manacost)); - shiftPos = hasKeyword(card, "Soulshift", n+1); - }//Soulshift - - if(hasKeyword(card, "Echo") != -1) { - int n = 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(hasKeyword(card,"HandSize") != -1) { - String toParse = card.getKeyword().get(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.HumanPlayer.removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - AllZone.ComputerPlayer.addHandSizeOperation(new HandSizeOp(Mode,Amount,Integer.parseInt(card.getSVar("HSStamp")))); - - AllZone.ComputerPlayer.sortHandSizeOperations(); - } - else if(card.getController().isComputer()) { - AllZone.ComputerPlayer.removeHandSizeOperation(Integer.parseInt(card.getSVar("HSStamp"))); - AllZone.HumanPlayer.addHandSizeOperation(new HandSizeOp(Mode,Amount,Integer.parseInt(card.getSVar("HSStamp")))); - - AllZone.HumanPlayer.sortHandSizeOperations(); - } - } - }; - - card.addComesIntoPlayCommand(entersPlay); - card.addLeavesPlayCommand(leavesPlay); - card.addChangeControllerCommand(controllerChanges); - } //HandSize - - if(hasKeyword(card, "Suspend") != -1) { - // Suspend:: - int n = 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(CardFactoryUtil.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 - - card.addColor(card.getManaCost()); - int cardnameSpot = 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 = hasKeyword(card, "CARDNAME is "); - } - } - card.addColor(color); - } - - if(hasKeyword(card, "Fading") != -1) { - int n = 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(CardFactoryUtil.fading(card, power)); - } - }//Fading - - if(hasKeyword(card, "Vanishing") != -1) { - int n = 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(CardFactoryUtil.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; - } - - // copies stats like attack, defense, etc.. - 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()); - - return c; - }// copyStats() - - public static void main(String[] args) { - CardFactory f = new CardFactory(ForgeProps.getFile(CARDSFOLDER)); - Card c = f.getCard("Arc-Slogger", null); - System.out.println(c.getOwner()); - } -} diff --git a/src/forge/card/cardFactory/CardFactoryUtil.java b/src/forge/card/cardFactory/CardFactoryUtil.java index 1b70e961b8d..23dc0335fa1 100644 --- a/src/forge/card/cardFactory/CardFactoryUtil.java +++ b/src/forge/card/cardFactory/CardFactoryUtil.java @@ -1,3649 +1,4338 @@ -package forge.card.cardFactory; - - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; -import java.util.Map.Entry; - -import com.esotericsoftware.minlog.Log; - -import forge.*; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Static; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_Restriction; -import forge.card.spellability.Spell_Permanent; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; - - -public class CardFactoryUtil { - private static Random random = MyRandom.random; - - 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); - } - }); - } - if(all.size() == 0) return null; - - //get biggest Permanent - Card biggest = null; - biggest = all.get(0); - - int bigCMC = 0; - for (int i=0; i= bigCMC) - { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - - } - - //for Sarkhan the Mad - 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); - } - - 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; - - } - - 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. - 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 bigCMC) - { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - } - - - //The AI doesn't really pick the best artifact, just the most expensive. - 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 bigCMC) - { - bigCMC = curCMC; - biggest = all.get(i); - } - } - - return biggest; - } - - public static CardList AI_getHumanArtifact(final Card spell, boolean targeted) { - CardList artifact = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - artifact = artifact.getType("Artifact"); - if(targeted) { - artifact = artifact.filter(new CardListFilter() { - public boolean addCard(Card c) { - return canTarget(spell, c); - } - }); - } - return artifact; - } - - 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; - } - - public static int evaluateCreatureList(CardList list) { - int value = 0; - for(int i = 0; i < list.size(); i++) value += evaluateCreature(list.get(i)); - - return value; - } - - 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; - } - - 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("CARDNAME can't be the target of spells or abilities your opponents control.")) 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 - 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 - 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 - 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; - } - - 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); - } - - 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.Display.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.Stack.add(spell); - stop(); - } - else stopSetNext(new Input_PayManaCost(spell)); - } - }; - return target; - }//input_targetSpell() - - 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.Display.showMessage(message); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(choices.contains(card)) { - AllZone.GameAction.destroyNoRegeneration(card); - stop(); - } - } - }; - return target; - }//input_destroyNoRegeneration() - - public static Input input_sacrificePermanent(final CardList choices, final String message) { - return input_sacrificePermanentsFromList(1, choices, message); - }//input_sacrifice() - - public static Input input_sacrificePermanents(final int nCards) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - list.remove("Mana Pool"); // is this needed? - return input_sacrificePermanentsFromList(nCards, list, "Select a permanent to sacrifice"); - }//input_sacrificePermanents() - - public static Input input_sacrificePermanents(final int nCards, final String type) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - list.remove("Mana Pool"); // is this needed? - - list = list.getType(type); - return input_sacrificePermanentsFromList(nCards, list, "Select a " +type +" to sacrifice"); - }//input_sacrificePermanents() - - 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.Display.showMessage(message + " (" +(nCards-n) +" left)"); - ButtonUtil.disableAll(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(zone.equals(AllZone.Human_Battlefield) && list.contains(card)) { - AllZone.GameAction.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() - - - 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.Display.showMessage("Select a card to put on the " + TopOrBottom + " of your library."); - ButtonUtil.disableAll(); - - if(n == num || AllZone.Human_Hand.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.GameAction.moveToLibrary(card, position); - - n++; - if(n == num) stop(); - - showMessage(); - } - } - }; - return target; - } - - 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.Human_Hand.size() == 0) stop(); - AllZone.Display.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.Human_Hand.size() == 0) stop(); - else - showMessage(); - } - } - } - }; - - return target; - }//input_discardNumUnless - - 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.GameAction.moveToStack(sourceCard); - SpellAbility flash = sa[0]; - flash.setFlashBackAbility(true); - AllZone.Stack.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() - - 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.GameAction.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.Phase.isAfter(Constant.Phase.Main1) || AllZone.Phase.isPlayerTurn(AllZone.HumanPlayer)) - 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() - - 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.GameAction.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; - } - - 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() { - //PlayerZone hand = AllZone.getZone(Constant.Zone.Hand ,player); - //PlayerZone play = AllZone.getZone(Constant.Zone.Play ,player); - - //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; - } - - public static SpellAbility ability_Rebel_Search(final Card sourceCard, String cost) { - final int converted = Integer.parseInt(cost) - 1; - - final Cost abCost = new Cost("T", sourceCard.getName(), true); - abCost.setMana(cost); - final SpellAbility ability = new Ability_Activated(sourceCard, abCost, null){ - private static final long serialVersionUID = 7219065355049285681L; - - @Override - public boolean canPlay() { - for(int i = 0; i < AllZone.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(sourceCard)) return false; - } - - if (AllZoneUtil.isCardInPlay(sourceCard) - && !sourceCard.hasSickness() - && !sourceCard.isTapped() - && super.canPlay()) return true; - else return false; - } - - @Override - public boolean canPlayAI() { - CardList rebels = new CardList(); - CardList list = AllZoneUtil.getPlayerCardsInLibrary(sourceCard.getController()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return ((c.isType("Rebel") || c.hasKeyword("Changeling"))) - && c.isPermanent(); - } - }); - - if (list.size() == 0) return false; - - for (int i = 0; i < list.size(); i++) { - if (CardUtil.getConvertedManaCost(list.get(i).getManaCost()) <= converted) { - rebels.add(list.get(i)); - } - } - - if (AllZone.Phase.getPhase().equals(Constant.Phase.Main2) - && rebels.size() > 0) return true; - else return false; - - } - - - @Override - public void resolve() { - - CardList rebels = new CardList(); - CardList list = AllZoneUtil.getPlayerCardsInLibrary(sourceCard.getController()); - list = list.getType("Rebel"); - list = list.getPermanents(); - - if(list.size() == 0) return; - - for(int i = 0; i < list.size(); i++) { - if(CardUtil.getConvertedManaCost(list.get(i).getManaCost()) <= converted) { - rebels.add(list.get(i)); - } - } - if(rebels.size() == 0) return; - - if(sourceCard.getController().isComputer()) { - Card rebel = AI_getBestCreature(rebels); - AllZone.GameAction.moveToPlay(rebel); - } else //human - { - Object o = GuiUtils.getChoiceOptional("Select target Rebel", rebels.toArray()); - if(o != null) { - Card rebel = (Card) o; - AllZone.GameAction.moveToPlay(rebel); - if(rebel.isAura()) { - Object obj = null; - if(rebel.hasKeyword("Enchant creature")) { - CardList creats = AllZoneUtil.getCreaturesInPlay(); - obj = GuiUtils.getChoiceOptional("Pick a creature to attach " - + rebel.getName() + " to", creats.toArray()); - } - if(obj != null) { - Card target = (Card) obj; - if(AllZoneUtil.isCardInPlay(target)) { - rebel.enchantCard(target); - } - } - } - } - } - sourceCard.getController().shuffle(); - } - }; - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append(cost).append(", tap: Search your library for a Rebel permanent card with converted mana cost "); - sbDesc.append(converted).append(" or less and put it onto the battlefield. Then shuffle your library."); - ability.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(sourceCard.getName()).append(" - search for a Rebel and put it onto the battlefield."); - ability.setStackDescription(sbStack.toString()); - - return ability; - } - - 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() { - //TODO: When 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() - - 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.GameAction.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() - - - 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.GameAction.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() - - 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) { - 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.GameAction.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() - - 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.ComputerPlayer); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() - && (CombatUtil.canAttack(c) || (CombatUtil.canAttackNextTurn(c) && AllZone.Phase.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() ) - - 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() ) - - 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() ) - - public static SpellAbility enPump_Enchant(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, - final String[] spellDescription, final String[] stackDescription) { - - Cost cost = new Cost(sourceCard.getManaCost(), sourceCard.getName(), true); - Target tgt = new Target(sourceCard, "C"); - final SpellAbility enchant = new Spell_Permanent(sourceCard, cost, tgt) { - private static final long serialVersionUID = -8259560434384053776L; - - - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - if (list.isEmpty()) return false; - - //else (is there a Rabid Wombat or a Uril, the Miststalker to target?) - - if (Tough >= -1) { // we want Rabid Wombat or a Uril, the Miststalker to gain at least +1 toughness - CardList auraMagnetList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - auraMagnetList = auraMagnetList.getEnchantMagnets(); - - if (! auraMagnetList.isEmpty()) { // AI has a special target creature(s) to enchant - auraMagnetList.shuffle(); - for (int i = 0; i < auraMagnetList.size(); i++) { - if (CardFactoryUtil.canTarget(sourceCard, auraMagnetList.get(i))) { - setTargetCard(auraMagnetList.get(i)); // Target only Rabid Wombat or Uril, the Miststalker - return true; - } - } - } - } - - /* - * else (if aura is keyword only) - * Do not duplicate keyword or enchant card with Defender or enchant card already enchanted - */ - 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) { - if (!c.hasKeyword(s) - && !c.hasKeyword("Defender") - && !c.isEnchanted()) - return true; - } - // no new keywords: - return false; - } - }); - } - - /* - * else aura is power/toughness boost and may have keyword(s) - * Do not reduce power to <= zero or kill by reducing toughness to <= zero - * Do not enchant card with Defender or enchant card already enchanted - */ - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(sourceCard, list.get(i)) - && list.get(i).getNetAttack() + Power > 0 - && list.get(i).getNetDefense() + Tough > 0 - && !list.get(i).hasKeyword("Defender") - && !list.get(i).isEnchanted()) { - setTargetCard(list.get(i)); - return true; - } - } - return false; - }//canPlayAI() - - @Override - public void resolve() { - Card aura = AllZone.GameAction.moveToPlay(sourceCard); - - Card c = getTargetCard(); - - // i think this is checked for already in fizzle? - if(AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(sourceCard, c)) { - aura.enchantCard(c); - } - }//resolve() - };//enchant ability - - if (! spellDescription[0].replaceAll("[\\+\\-]", "").equals("Enchanted creature gets 0/0.")) { - enchant.setDescription(spellDescription[0]); - } - enchant.setStackDescription(stackDescription[0]); - - return enchant; - }//enPump_Enchant() - - public static Command enPump_onEnchant(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, - final String[] spellDescription, final String[] stackDescription) { - - Command onEnchant = new Command() { - - private static final long serialVersionUID = -357890638647936585L; - - public void execute() { - if (sourceCard.isEnchanting()) { - Card crd = sourceCard.getEnchanting().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 onEnchant; - }//enPump_onEnchant - - public static Command enPump_unEnchant(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, - final String[] spellDescription, final String[] stackDescription) { - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = -7121856650546173401L; - - public void execute() { - if (sourceCard.isEnchanting()) { - Card crd = sourceCard.getEnchanting().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 onUnEnchant; - }//enPump_unEnchant - - public static Command enPump_LeavesPlay(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, - final String[] spellDescription, final String[] stackDescription) { - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -924212760053167271L; - - public void execute() { - if(sourceCard.isEnchanting()) { - Card crd = sourceCard.getEnchanting().get(0); - sourceCard.unEnchantCard(crd); - } - }//execute() - };//Command - - return onLeavesPlay; - }//enPump_LeavesPlay - - public static SpellAbility enPumpCurse_Enchant(final Card sourceCard, final int Power, final int Tough, final String[] extrinsicKeywords, - final String[] spellDescription, final String[] stackDescription) { - - Cost cost = new Cost(sourceCard.getManaCost(), sourceCard.getName(), true); - Target tgt = new Target(sourceCard, "C"); - final SpellAbility enchant = new Spell_Permanent(sourceCard, cost, tgt) { - private static final long serialVersionUID = -4021229901439299033L; - - - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - - if (list.isEmpty()) return false; - - //else we may need to filter the list and remove inappropriate targets - - final ArrayList extKeywords = new ArrayList(Arrays.asList(extrinsicKeywords)); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - for (String s : extKeywords) { - - /* If extrinsicKeywords contains "CARDNAME attacks each turn if able." then remove creatures - * with Defender and creatures with the keyword "CARDNAME attacks each turn if able." - * and creatures with a keyword that starts with "CARDNAME can't attack" - */ - if (s.contains("CARDNAME attacks each turn if able.")) { - if (c.hasKeyword("Defender") - || c.hasKeyword("CARDNAME attacks each turn if able.") - || c.hasStartOfKeyword("CARDNAME can't attack")) - return false; - } - - /* If extrinsicKeywords contains "CARDNAME can't attack." or "CARDNAME can't attack or block." - * then remove creatures with Defender and remove creatures that have one or more of these - * keywords to start with - */ - if (s.contains("CARDNAME can't attack.") || s.contains("CARDNAME can't attack or block.")) { - if (c.hasKeyword("Defender") - || c.hasKeyword("CARDNAME can't attack.") - || c.hasKeyword("CARDNAME can't attack or block.")) - return false; - } - - /* If extrinsicKeywords contains "CARDNAME doesn't untap during your untap step." - * then remove creatures with Vigilance that are untapped and remove creatures that have the keyword - * "CARDNAME doesn't untap during your untap step." and remove creatures that are untapped - */ - if (s.contains("CARDNAME doesn't untap during your untap step.")) { - if ((c.hasKeyword("Vigilance") && c.isUntapped()) - || c.hasKeyword("CARDNAME doesn't untap during your untap step.") - || c.isUntapped()) - return false; - } - } - - // Card c is a potential target if we reach this point. - return true; - } - }); - - /* - // If extrinsicKeywords contains "CARDNAME can't attack." or "CARDNAME can't attack or block." - // then remove creatures with Defender from the list and remove creatures that have one - // or more of these keywords to start with - // - final ArrayList extKeywords = new ArrayList(Arrays.asList(extrinsicKeywords)); - - if (extKeywords.contains("CARDNAME can't attack.") || extKeywords.contains("CARDNAME can't attack or block.")) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() - && !c.hasKeyword("Defender") - && !c.hasKeyword("CARDNAME can't attack.") - && !c.hasKeyword("CARDNAME can't attack or block."); - } - }); - } - - // If extrinsicKeywords contains "CARDNAME doesn't untap during your untap step." - // then remove creatures with Vigilance from the list - // - if (extKeywords.contains("HIDDEN CARDNAME doesn't untap during your untap step.")) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - if (c.hasKeyword("CARDNAME doesn't untap during your untap step.")) - return false; - - if (c.hasKeyword("Vigilance") && c.isUntapped()) - return false; - - return c.isCreature() && (c.isTapped() || Power < 1); - } - }); - } - - //else (if aura is keyword only or is Cagemail) - - if (Power >= 0 && Tough >= 0) { // This aura is keyword only or is Cagemail - list = list.filter(new CardListFilter() { - public boolean addCard(Card c){ - ArrayList extKeywords = new ArrayList(Arrays.asList(extrinsicKeywords)); - for (String s:extKeywords) { - if (!c.hasKeyword(s)) - return true; - } - //no new keywords: - return false; - } - }); - - } - - //else aura is power/toughness decrease and may have keyword(s) - */ - - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(sourceCard, list.get(i))) { - setTargetCard(list.get(i)); - return true; - } - } - return false; - }//canPlayAI() - - public void resolve() { - Card aura = AllZone.GameAction.moveToPlay(sourceCard); - - Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(sourceCard, c)) { - aura.enchantCard(c); - } - }//resolve() - };//enchant ability - - if (! spellDescription[0].replaceAll("[\\+\\-]", "").equals("Enchanted creature gets 0/0.")) { - enchant.setDescription(spellDescription[0]); - } - enchant.setStackDescription(stackDescription[0]); - - return enchant; - }//enPumpCurse_Enchant() - - 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; - } - - - 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; - } - - 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 - - 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 - - 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.Stack.add(soulshiftTrigger(sourceCard, Manacost)); - } - - }; - - return Soulshift; - }//ability_Soulshift() - - public static SpellAbility soulshiftTrigger(final Card sourceCard, final String Manacost) { - final SpellAbility desc = new Ability(sourceCard, "0") { - 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.GameAction.moveToHand(c1); - } - } - } else { - //Wiser choice should be here - Card choice = null; - sameCost.shuffle(); - choice = sameCost.getCard(0); - - if (!(choice == null)) { - AllZone.GameAction.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 - 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 - 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.Display.showMessage(message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(targeted && !canTarget(spell, card)) { - AllZone.Display.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.Stack.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 - 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.Display.showMessage(message); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(crd); - stop(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(targeted && !canTarget(spell, card)) { - AllZone.Display.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.Stack.add(spell); - stop(); - } else stopSetNext(new Input_PayManaCost(spell)); - //TODO - needs to be targeted - if(crd.getName().equals("Mistbind Clique")) { - CardList list = AllZoneUtil.getPlayerLandsInPlay(AllZone.ComputerPlayer); - for(Card c:list) c.tap(); - } - } - }//selectCard() - }; - return target; - }//input_targetSpecific() - - 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.HumanPlayer); - - stopSetNext(input_targetSpecific(equip, list, - "Select target creature to equip", true, false)); - } - };//Input - return runtime; - } - - 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.Human_Hand.size() == 0) stop(); - if( nCards == 0) stop(); - - AllZone.Display.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.Human_Hand.size() == 0) stop(); - else - showMessage(); - } - } - }; - return target; - }//input_discard() - - /** - * custom input method only for use in Recall - * - * @param numCards - * @param recall - * @return - */ - 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.Human_Hand.size() == 0) stop(); - - AllZone.Display.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.Human_Hand.size() == 0) done(); - else - showMessage(); - } - } - - void done() { - AllZone.Display.showMessage("Returning cards to hand."); - AllZone.GameAction.exile(recall); - CardList grave = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - 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.GameAction.moveToHand(toHand); - } - stop(); - } - }; - return target; - }//input_discardRecall() - - 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.Display.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() - - 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.Display.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.Stack.add(ability); - stop(); - } - } - }; - return modularInput; - } - - public static CardList AI_getHumanCreature(final Card spell, boolean targeted) { - CardList creature = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - if(targeted) { - creature = creature.filter(AllZoneUtil.getCanTargetFilter(spell)); - } - return creature; - } - - public static CardList AI_getHumanCreature(final String keyword, final Card spell, final boolean targeted) { - CardList creature = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - 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() - - public static CardList AI_getHumanCreature(final int toughness, final Card spell, final boolean targeted) { - CardList creature = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - 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() - - 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.HumanPlayer); - } - }; - }//targetHuman() - - 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(); - } - - public static boolean multipleControlled(Card c) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController()); - list.remove(c); - - return list.containsName(c.getName()); - } - - 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; - } - - public static int getNumberOfManaSymbolsControlledByColor(String colorAbb, Player player) { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(player); - return getNumberOfManaSymbolsByColor(colorAbb, cards); - } - - 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; - } - - 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; - } - - 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); - } - - public static boolean canTarget(SpellAbility ability, Card target) { - return canTarget(ability.getSourceCard(), target); - } - - public static boolean isColored(Card c) - { - return c.isWhite() || c.isBlue() || c.isBlack() || c.isRed() || c.isGreen(); - } - - 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("Leonin Abunas", target.getController()) && target.isArtifact() - && !spell.getController().equals(target.getController())) return false; - - 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("CARDNAME can't be the target of spells or abilities your opponents control.")) { - 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"? - 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; - } - - 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 - 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(); - - } - - public static CardList getGraveyardActivationCards(final Player player) { - CardList cl = AllZoneUtil.getPlayerGraveyard(player); - cl = cl.filter(new CardListFilter() { - public boolean addCard(Card c) { - return activateFromGrave(c, player); - } - }); - return cl; - } - - public static boolean activateFromGrave(Card c, Player player){ - if (c.hasFlashback() || c.hasUnearth()) - return true; - - final CardList crucible = AllZoneUtil.getPlayerCardsInPlay(player, "Crucible of Worlds"); - if (c.isLand() && crucible.size() > 0) - return true; - - for(SpellAbility sa : c.getSpellAbility()){ - if (sa.getRestrictions().getZone().equals(Constant.Zone.Graveyard)) - return true; - } - - return false; - } - - 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; - } - - 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 - 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("LifeTotal")) { - if(players.size() > 0) { - return doXMath(players.get(0).getLife(), m, source); - } - } - - if(sq[0].contains("TopOfLibraryCMC")) { - if(players.size() > 0) { - CardList topcard = AllZoneUtil.getPlayerCardsInLibrary(players.get(0), 1); - return doXMath(topcard.getTotalConvertedManaCost(), m, source); - } - } - - return doXMath(n, m, source); - } - - //parser for non-mana X variables - 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 Integer.parseInt(number); - } - - //Manapool - if(l[0].contains("ManaPool")) { - String color = l[0].split(":")[1]; - return AllZone.ManaPool.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); - } - - 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.ComputerPlayer.getLife(), m, c); - else if(cardController.isHuman()) return doXMath(AllZone.HumanPlayer.getLife(), m, c); - - return 0; - } - - // Count$OppLifeTotal - if(sq[0].contains("OppLifeTotal")) { - if(oppController.isComputer()) return doXMath(AllZone.ComputerPlayer.getLife(), m, c); - else if(oppController.isHuman()) return doXMath(AllZone.HumanPlayer.getLife(), m, c); - - return 0; - } - - // Count$YourPoisonCounters - if(sq[0].contains("YourPoisonCounters")) { - if(cardController.isComputer()) return doXMath(AllZone.ComputerPlayer.getPoisonCounters(), m, c); - else if(cardController.isHuman()) return doXMath(AllZone.HumanPlayer.getPoisonCounters(), m, c); - - return 0; - } - - // Count$OppPoisonCounters - if(sq[0].contains("OppPoisonCounters")) { - if(oppController.isComputer()) return doXMath(AllZone.ComputerPlayer.getPoisonCounters(), m, c); - else if(oppController.isHuman()) return doXMath(AllZone.HumanPlayer.getPoisonCounters(), m, c); - - return 0; - } - - // Count$HighestLifeTotal - if(sq[0].contains("HighestLifeTotal")) { - return Math.max(AllZone.HumanPlayer.getLife(), AllZone.ComputerPlayer.getLife()); - } - - // Count$LowestLifeTotal - if(sq[0].contains("LowestLifeTotal")) { - return Math.min(AllZone.HumanPlayer.getLife(), AllZone.ComputerPlayer.getLife()); - } - - // Count$TopOfLibraryCMC - if(sq[0].contains("TopOfLibraryCMC")) { - CardList topcard = AllZoneUtil.getPlayerCardsInLibrary(cardController, 1); - return doXMath(topcard.getTotalConvertedManaCost(), m, c); - } - - - // 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 - } - - // 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$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.Combat.getBlockers(c).size(), m, c); - - //Count$IfMainPhase.. // 7/10 - if (sq[0].contains("IfMainPhase")) - { - String cPhase = AllZone.Phase.getPhase(); - if ((cPhase.equals(Constant.Phase.Main1) || - cPhase.equals(Constant.Phase.Main2)) && - AllZone.Phase.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 = sq[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.HumanPlayer)).getCardsAddedThisTurn(origin); - res.addAll(((DefaultPlayerZone)AllZone.getZone(destination, AllZone.ComputerPlayer)).getCardsAddedThisTurn(origin)); - - 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; - } - - public static int doXMath(int num, String[] m, Card c) { - if (m.length == 0) - return num; - - return doXMath(num, m[0],c); - } - - 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; - } - - /* - public static void doDrawBack(String DB, int nDB, Player cardController, Player Opp, Player TgtP, Card Src, Card TgtC, SpellAbility sa) { - // Drawbacks may be any simple additional effect a spell or ability may have - // not just the negative ones - - String d[] = DB.split("/"); - int X = 0; - if(d.length > 1) - { - if(d[1].contains("dX")) // 2/10 - { - String dX = Src.getSVar(d[1]); - if(dX.startsWith("Count$")) - { - String dd[] = dX.split("\\$"); - if (dd[1].contains("Tgt")) - X = xCount(TgtC, dd[1]); - else - X = xCount(Src, dd[1]); - } - } - else if(d[1].contains("X")) { - X = nDB; - if(d[1].contains(".")) { - String dd[] = d[1].split("\\.", 2); - String m[] = {"none"}; - m[0] = dd[1]; - //ArrayList ddd = new ArrayList(); - //for(int i = 1; i < dd.length; i++) - // ddd.add(dd[i]); - - X = doXMath(X, m, Src); - } - } - else if(d[1].matches("[0-9][0-9]?")) - X = Integer.parseInt(d[1]); - } - - Player dbPlayer = null; - if(d[0].contains("You")) - dbPlayer = cardController; - else if (d[0].contains("Opp")) - dbPlayer = Opp; - else if (d[0].contains("TgtCtrlr")) - dbPlayer = TgtC.getController(); - else if (d[0].contains("TgtOwner")) - dbPlayer = TgtC.getOwner(); - else if (d[0].contains("Tgt")) - dbPlayer = TgtP; - - - // 1/10 - if (d[0].contains("DamageTgtCard")) - TgtC.addDamage(X, Src); - else if (d[0].contains("DamageSelf")) - Src.addDamage(X, Src); // 2/10 - else if(d[0].contains("Damage")) - dbPlayer.addDamage(X, Src); - - - if(d[0].contains("GainLife")) { - dbPlayer.gainLife(X, Src); - } - if(d[0].contains("LoseLife")) { - dbPlayer.loseLife(X, Src); - } - - if(d[0].contains("HandToLibrary")) dbPlayer.handToLibrary(X, d[2]); - - if(d[0].contains("Draw")) for(int i = 0; i < X; i++) - dbPlayer.drawCard(); - - if(d[0].contains("UntapTgt")) TgtC.untap(); - - if(d[0].contains("UntapAll")) // 6/10 - { - CardList ut = new CardList(); - if (d[0].contains("YouCtrl")) - ut.addAll(AllZoneUtil.getPlayerCardsInPlay(dbPlayer)); - else if (d[0].contains("OppCtrl")) - ut.addAll(AllZoneUtil.getPlayerCardsInPlay(Opp)); - else - { - ut.addAll(AllZoneUtil.getPlayerCardsInPlay(dbPlayer)); - ut.addAll(AllZoneUtil.getPlayerCardsInPlay(Opp)); - } - if (d[0].contains("Type")) - { - String dd[] = d[0].split("\\."); - ut = ut.getValidCards(dd,cardController,Src); - } - - for (int i=0; i"); - final String numString = k[1].equals("X") ? Src.getSVar("X") : k[1]; - //final String numString = k[1]; - final boolean xString = k[1].equals("X") ? true : false; - final String name = k[2]; - final String imageName = k[3]; - final String controllerString = k[4]; - final String manaCost = k[5]; - final String[] types = k[6].split(";"); - final int attack = Integer.valueOf(k[7]); - final int defense = Integer.valueOf(k[8]); - final String[] keywords = k[9].split(";"); - - Player controller = null; - if(controllerString.equals("Controller")) controller = cardController; - else if(controllerString.equals("Opponent")) controller = Opp; - else if(controllerString.equals("TargetController"))controller = TgtC.getController(); - - if(keywords[0].equals("None")) keywords[0] = ""; - - int num = xString ? CardFactoryUtil.xCount(TgtC, numString) : Integer.valueOf(numString); - for(int i = 0; i < num; i ++ ){ - CardFactoryUtil.makeToken(name, imageName, controller, manaCost, types, attack, defense, keywords); - } - }//end MakeToken drawback - - }*/ - - public static int getNumberOfMostProminentCreatureType(CardList list, String type) { - list = list.getType(type); - return list.size(); - } - - 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.Display.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; - } - - 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; - } - - 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; - } - - - public static String chooseCreatureTypeAI(Card c) { - String s = ""; - //TODO, take into account what human has - - CardList humanPlay = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - CardList humanLib = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); - - CardList compPlay = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - CardList compLib = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer); - 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") || c.getName().equals("Cover of Darkness") - || c.getName().equals("Belbe's Portal") || c.getName().equals("Steely Resolve") - || c.getName().equals("Shared Triumph")) { - - String type = ""; - int number = 0; - - type = getMostProminentCreatureType(compAll); - number = getNumberOfMostProminentCreatureType(compAll, type); - if(number >= 5) s = type; - - if((c.getName().equals("Shared Triumph") || c.getName().equals("Cover of Darkness") - || c.getName().equals("Steely Resolve")) && compPlay.size() > 7) { - type = getMostProminentCreatureType(compPlay); - number = getNumberOfMostProminentCreatureType(compPlay, type); - if(number >= 3) s = type; - } - else if((c.getName().equals("Belbe's Portal")) && compHand.size() > 1) { - type = getMostProminentCreatureType(compHand); - number = getNumberOfMostProminentCreatureType(compHand, type); - if(number >= 2) s = type; - } - else 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"; - } - - } - //Debuffs - else if(c.getName().equals("Engineered Plague")) { - String type = ""; - int number = 0; - if(c.getName().equals("Engineered Plague") && humanPlay.size() > 6) { - type = getMostProminentCreatureType(humanPlay); - number = getNumberOfMostProminentCreatureType(humanPlay, type); - if(number >= 3) s = type; - else if(humanLib.size() > 0) { - type = getMostProminentCreatureType(humanLib); - number = getNumberOfMostProminentCreatureType(humanLib, type); - if(number >= 5) s = type; - } - } - } - return s; - } - - 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, ... - public static String getPropagandaCost(Card c) { - String s = ""; - - CardList list = AllZoneUtil.getPlayerCardsInPlay(c.getController().getOpponent()); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.getName().equals("Propaganda") || c.getName().equals("Windborn Muse") - || c.getName().equals("Ghostly Prison"); - } - }); - int cost = list.size() * 2; - - list = AllZoneUtil.getPlayerCardsInPlay(c.getController().getOpponent(), "Collective Restraint"); - - int domain = countBasicLandTypes(c.getController().getOpponent()); - - cost += domain * list.size(); - - s = Integer.toString(cost); - - return s; - } - - 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(); - } - - 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; - } - - public static CardList makeTokenSaproling(Player controller) { - return makeToken("Saproling", "G 1 1 Saproling", controller, "G", new String[] {"Creature", "Saproling"}, 1, 1, new String[] {""}); - } - - 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 = CardFactory.copyStats(c); - temp.setController(controller); - temp.setOwner(controller); - temp.setToken(true); - AllZone.GameAction.moveToPlay(temp); - list.add(temp); - } - return list; - } - - 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); - - list.addAll(makeToken(thisToken.getName(), thisToken.getImageName(), thisToken.getController(), thisToken.getManaCost(), tokenTypes, thisToken.getBaseAttack(), thisToken.getBaseDefense(), tokenKeywords)); - } - - return list; - } - - 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.EndOfTurn.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; - } - - 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; - } - /* - public static void checkEquipmentOnControllerChange(PlayerZone from, PlayerZone to, Card c) - { - if (c.isEquipped() && !from.equals(to)) - c.unEquipAllCards(); - } - */ - - - /** - * 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.HumanPlayer or AllZone.ComputerPlayer - * @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 - - 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 - static public Card getRandomCard(CardList list) { - if(list.size() == 0) return null; - - int index = random.nextInt(list.size()); - return list.get(index); - } - - 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(); - } - - 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; - } - - public static void playLandEffects(Card c){ - final Player player = c.getController(); - CardList cityOfTraitors = AllZoneUtil.getPlayerCardsInPlay(player, "City of Traitors"); - cityOfTraitors.remove(c); - // > 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.Stack.addSimultaneousStackEntry(ability); - - } - } - - if(cityOfTraitors.size() > 0) { - for(final Card city : cityOfTraitors){ - SpellAbility ability = new Ability(city, "0") { - @Override - public void resolve() { - AllZone.GameAction.sacrifice(city); - } - }; - ability.setStackDescription(city.getName()+" - sacrifice "+city.getName()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - } - } - - - 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; - } - - 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.GameAction.moveToHand(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - return CARDNAME to its owner's hand."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.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.GameAction.destroy(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - destroy CARDNAME."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.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.GameAction.sacrifice(c); - } - }; - StringBuilder sb = new StringBuilder(); - sb.append(c).append(" - sacrifice CARDNAME."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.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;iCardFactoryUtil 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 index 735a6934060..c92786aa842 100644 --- a/src/forge/card/cardFactory/CardFactory_Auras.java +++ b/src/forge/card/cardFactory/CardFactory_Auras.java @@ -1,13 +1,7 @@ - package forge.card.cardFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.StringTokenizer; - import com.esotericsoftware.minlog.Log; - import forge.AllZone; import forge.AllZoneUtil; import forge.Card; @@ -28,265 +22,248 @@ 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 { - - 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; - } - - public static int shouldEnchant(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("enPump")) return i; - - return -1; - } - - public static int shouldControl(Card c) { - ArrayList a = c.getKeyword(); - for (int i = 0; i < a.size(); i++) - if (a.get(i).toString().startsWith("enControlCreature")) return i; - - return -1; - } - - private static int shouldControlArtifact(Card c) { + + /** + *

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("enControlArtifact")) return i; - //if(a.get(i).toString().startsWith("enControlLand")) return i; + if (a.get(i).toString().startsWith("Cycling")) { + return i; + } } - return -1; } - - public static Card getCard(final Card card, final String cardName, Player owner) { - - Command standardUnenchant = new Command() { - private static final long serialVersionUID = 3938247133551483568L; - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - }; - - - // ***************************************************************** - // Enchant Lands: ************************************* - // Enchant land you control: ************************************* - // ***************************************************************** - + /** + *

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]; + 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.HumanPlayer); - - for(int i=0;i 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.GameAction.moveToPlay(card); - + 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); - + + if (AllZoneUtil.isCardInPlay(c) + && CardFactoryUtil.canTarget(card, c)) { + card.enchantCard(c); + } + }//resolve() };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + + 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 (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]); + 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]); - } + 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()) { + 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; + 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]); + 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]); + for (int i = 0; i < Card_Abilities.length; i++) { + if (Card_Abilities[i].isIntrinsic()) { + crd.removeSpellAbility(Card_Abilities[i]); + } } - Card c = AllZone.CardFactory.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]); + 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()) { + 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(); @@ -296,71 +273,64 @@ class CardFactory_Auras { }; spell.setBeforePayMana(runtime); }//*************** END ************ END ************************** - - - // ***************************************************************** - // Enchant artifacts: ******************************************** - // ***************************************************************** - - - // ***************************************************************** - // Enchant creatures: ******************************************** - // ***************************************************************** - + //*************** 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) { - + 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.HumanPlayer); + CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); list = list.getKeyword("Flying"); - if(list.isEmpty()) return false; - + if (list.isEmpty()) { + return false; + } + CardListFilter f = new CardListFilter() { - public boolean addCard(Card c) { + public final boolean addCard(Card c) { return c.getNetDefense() - c.getDamage() <= 2; } }; - if(!list.filter(f).isEmpty()) list = list.filter(f); + 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))) { + + 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.GameAction.moveToPlay(card); - + AllZone.getGameAction().moveToPlay(card); + Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { + + if (AllZoneUtil.isCardInPlay(c) + && CardFactoryUtil.canTarget(card, c)) { card.enchantCard(c); Log.debug("Enchanted: " + getTargetCard()); } }//resolve() };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + 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); @@ -369,156 +339,73 @@ class CardFactory_Auras { crd.addDamage(2, card); crd.removeIntrinsicKeyword("Flying"); crd.removeExtrinsicKeyword("Flying"); - } else badTarget[0] = true; + } else { + badTarget[0] = true; + } } }//execute() };//Command - + Command onUnEnchant = new Command() { - + private static final long serialVersionUID = -6908757692588823391L; - + public void execute() { - if(card.isEnchanting() - && !badTarget[0]) { + 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("Pillory of the Sleepless")) { - 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 = 4504925036782582195L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - - 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).hasKeyword("Defender")) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - //System.out.println("Enchanted: " +getTargetCard()); - } - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - Command onEnchant = new Command() { - - private static final long serialVersionUID = -6104532173397759007L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - crd.addExtrinsicKeyword("CARDNAME can't attack or block."); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = -2563098134722661731L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - crd.removeExtrinsicKeyword("CARDNAME can't attack or block."); - } - }//execute() - };//Command - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -1621250313053538491L; - + + private static final long serialVersionUID = -7833240882415702940L; + public void execute() { - if(card.isEnchanting()) { + 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) { - + 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.ComputerPlayer, "Stuffy Doll"); - - if(stuffy.size() > 0) { + + CardList stuffy = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer(), "Stuffy Doll"); + + if (stuffy.size() > 0) { setTargetCard(stuffy.get(0)); return true; } else { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - - if(list.isEmpty()) return false; - + 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)) + + 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)); @@ -527,1334 +414,185 @@ class CardFactory_Auras { } } return false; - + }//canPlayAI() - + @Override public void resolve() { - AllZone.GameAction.moveToPlay(card); - + Card aura = AllZone.getGameAction().moveToPlay(card); + Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) card.enchantCard(c); + + if (AllZoneUtil.isCardInPlay(c) + && CardFactoryUtil.canTarget(aura, c)) { + aura.enchantCard(c); + } }//resolve() };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + card.addSpellAbility(spell); }//*************** END ************ END ************************** - - //****************************************************************** - // This card can't be converted to keyword, problem with CARDNME * + + //*************** START *********** START ************************** - else if(cardName.equals("Vigilance")) { - 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 = 3659751920022901998L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - if (list.isEmpty()) return false; - - //else (is there a Rabid Wombat or a Uril, the Miststalker to target?) - - CardList auraMagnetList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - auraMagnetList = auraMagnetList.getEnchantMagnets(); - - if (! auraMagnetList.isEmpty()) { // AI has a special target creature(s) to enchant - auraMagnetList.shuffle(); - for (int i = 0; i < auraMagnetList.size(); i++) { - if (CardFactoryUtil.canTarget(card, auraMagnetList.get(i))) { - setTargetCard(auraMagnetList.get(i)); // Target only Rabid Wombat or Uril, the Miststalker - return super.canPlayAI(); - } - } - } - //else target another creature - - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i)) - && !list.get(i).hasKeyword("Vigilance")) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - Log.debug("Enchanted: " + getTargetCard()); - } - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - Command onEnchant = new Command() { - - private static final long serialVersionUID = -2060758415927004190L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - crd.addExtrinsicKeyword("Vigilance"); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = -5220074511756932255L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - - crd.removeExtrinsicKeyword("Vigilance"); - } - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -549155960320946886L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } + 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; } - }; - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - }//*************** END ************ END ************************** - - - //****************************************************************** - // This card can't be converted to keyword, problem with Lifelink * - //*************** START *********** START ************************** - else if(cardName.equals("Lifelink")) { - 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 = 8493277543267009695L; - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - if (list.isEmpty()) return false; - - //else (is there a Rabid Wombat or a Uril, the Miststalker to target?) - - CardList auraMagnetList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - auraMagnetList = auraMagnetList.getEnchantMagnets(); - - if (! auraMagnetList.isEmpty()) { // AI has a special target creature(s) to enchant - auraMagnetList.shuffle(); - for (int i = 0; i < auraMagnetList.size(); i++) { - if (CardFactoryUtil.canTarget(card, auraMagnetList.get(i))) { - setTargetCard(auraMagnetList.get(i)); // Target only Rabid Wombat or Uril, the Miststalker - return super.canPlayAI(); - } - } - } - - /* - * else target another creature - * Do not enchant card with Defender or Lifelink or enchant card already enchanted - */ - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i)) - && !list.get(i).hasKeyword("Lifelink") - && !list.get(i).hasKeyword("Defender") - && !list.get(i).isEnchanted()) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if(AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - Log.debug("Lifelink", "Enchanted: " + getTargetCard()); - } - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - Command onEnchant = new Command() { - - private static final long serialVersionUID = -9156474672737153867L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - crd.addExtrinsicKeyword("Lifelink"); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = 3855541943505550043L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - - crd.removeExtrinsicKeyword("Lifelink"); - } - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = 927099787099002012L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - }//execute() - };//Command - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - }//*************** 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 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() { + @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; - + 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.GameAction.sacrifice(card); - return; + 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.GameAction.moveToPlay(animated, card.getController()); - card.enchantCard(animated); // Attach before Targeting so detach Command will trigger - - if(CardFactoryUtil.hasProtectionFrom(card, animated)) { - // Animated a creature with protection - AllZone.GameAction.sacrifice(card); - return; + 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 + } + };//Ability - final Command attachCmd = new Command() { - private static final long serialVersionUID = 3595188622377350327L; + final Command attachCmd = new Command() { + private static final long serialVersionUID = 3595188622377350327L; - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(attach); + public void execute() { + AllZone.getStack().addSimultaneousStackEntry(attach); - } - }; - - final Ability detach = new Ability(card, "0") { + } + }; - @Override - public void resolve() { + 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.GameAction.sacrifice(c); + + if (AllZoneUtil.isCardInZone(play, c)) { + AllZone.getGameAction().sacrifice(c); } - } - };//Detach + } + };//Detach - final Command detachCmd = new Command() { - private static final long serialVersionUID = 2425333033834543422L; + final Command detachCmd = new Command() { + private static final long serialVersionUID = 2425333033834543422L; - public void execute() { + public void execute() { Card c = targetC[0]; - - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - - if(AllZoneUtil.isCardInZone(play, c)) - AllZone.Stack.addSimultaneousStackEntry(detach); - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); // clear out base abilities since we're overriding - + 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); + + 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(cardName.equals("Take Possession") || cardName.equals("Volition Reins") || cardName.equals("Confiscate")) { - final Player[] prevController = new Player[1]; - prevController[0] = null; - String costString = "0"; - if(cardName.equals("Volition Reins")) - costString = "3 U U U"; - else if(cardName.equals("Take Possession")) - costString = "5 U U"; - else if(cardName.equals("Confiscate")) - costString = "4 U U"; - - Cost cost = new Cost(costString, cardName, false); - Target tgt = new Target(card,"Select target Permanent", "Permanent".split(",")); - - final SpellAbility spell = new Spell_Permanent(card, cost, tgt) { - private static final long serialVersionUID = -7359291736123492910L; - - @Override - public boolean canPlayAI() { - Card best = CardFactoryUtil.AI_getBestCreature(CardFactoryUtil.AI_getHumanCreature(card, true)); - setTargetCard(best); - return best != null; - } + 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(":"); - @Override - public void resolve() { - Card c = getTargetCard(); - if(!AllZoneUtil.isCardInPlay(c)) - return; - - prevController[0] = c.getController(); - AllZone.GameAction.moveToPlay(card); - card.enchantCard(c); - //c.attachCard(card); - AllZone.GameAction.changeController(new CardList(c), c.getController(), card.getController()); - if(cardName.equals("Volition Reins")) { - if(c.isTapped()) c.untap(); - } - }//resolve() - }; - - Command onUnEnchant = new Command() { - private static final long serialVersionUID = 3426441132121179288L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (AllZoneUtil.isCardInPlay(crd)) { - if (crd.hasKeyword("Haste")) { - crd.setSickness(false); - } else { - crd.setSickness(true); - } - - AllZone.GameAction.changeController(new CardList(crd), crd.getController(), prevController[0]); - } - } - - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - private static final long serialVersionUID = -639204333673364477L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - };//Command - - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - //************************************************************** - // This card can't be converted to keyword, problem with Fear * - //*************** START *********** START ********************** - else if (cardName.equals("Fear")) { - 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 = -6430665444443363057L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - if (list.isEmpty()) return false; - - //else (is there a Rabid Wombat or a Uril, the Miststalker to target?) - - CardList auraMagnetList = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - auraMagnetList = auraMagnetList.getEnchantMagnets(); - - if (! auraMagnetList.isEmpty()) { // AI has a special target creature(s) to enchant - auraMagnetList.shuffle(); - for (int i = 0; i < auraMagnetList.size(); i++) { - if (CardFactoryUtil.canTarget(card, auraMagnetList.get(i))) { - setTargetCard(auraMagnetList.get(i)); // Target only Rabid Wombat or Uril, the Miststalker - return super.canPlayAI(); - } - } - } - - /* - * else target another creature - * Do not enchant card with Defender or Fear or enchant card already enchanted - */ - CardListUtil.sortAttack(list); - CardListUtil.sortFlying(list); - - for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i)) - && !list.get(i).hasKeyword("Fear") - && !list.get(i).hasKeyword("Defender") - && !list.get(i).isEnchanted()) { - setTargetCard(list.get(i)); - return super.canPlayAI(); - } - } - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - Log.debug("Fear", "Enchanted: " + getTargetCard()); - } - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - Command onEnchant = new Command() { - - private static final long serialVersionUID = 2754287307356877714L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (!crd.getIntrinsicKeyword().contains("Fear")) { - crd.addExtrinsicKeyword("Fear"); - } - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - - private static final long serialVersionUID = 2007362030422979630L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - - crd.removeExtrinsicKeyword("Fear"); - } - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - - private static final long serialVersionUID = -8020540432500093584L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - }//execute() - };//Command - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - }//*************** END ************ END ************************** - - //*************** START *********** START ************************** - else if (cardName.equals("Entangling Vines") || cardName.equals("Glimmerdust Nap") || - cardName.equals("Melancholy") || cardName.equals("Mystic Restraints") || - cardName.equals("Roots") || cardName.equals("Thirst")) { - - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 843412563175285562L; - - @Override - public boolean canPlayAI() { - - if(!super.canPlayAI()) return false; - - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); // Target human creature - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(card, c) && - ! c.hasKeyword("CARDNAME doesn't untap during your untap step."); - } - }); - - if (card.hasKeyword("Enchant tapped creature")) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isTapped(); - } - }); - } - - if (card.hasKeyword("Enchant creature without flying")) { - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return ! c.hasKeyword("Flying"); - } - }); - } - - if (list.isEmpty()) { - return false; - } else { - CardListUtil.sortAttack(list); - if (! card.hasKeyword("Enchant creature without flying")) { - CardListUtil.sortFlying(list); - } - setTargetCard(list.get(0)); - } - return true; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - if (card.hasKeyword("When CARDNAME enters the battlefield, tap enchanted creature.")) { - c.tap(); - } - card.enchantCard(c); - } - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - spell.setDescription(""); - card.addSpellAbility(spell); - - Command onEnchant = new Command() { - private static final long serialVersionUID = -8694692627290877222L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (! crd.hasKeyword("CARDNAME doesn't untap during your untap step.")) - crd.addExtrinsicKeyword("CARDNAME doesn't untap during your untap step."); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - private static final long serialVersionUID = -8271629765371049921L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - crd.removeExtrinsicKeyword("CARDNAME doesn't untap during your untap step."); - } - - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - private static final long serialVersionUID = -8694692627290877222L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - }; - - Input runtime = new Input() { - private static final long serialVersionUID = 5974269912215230241L; - - @Override - public void showMessage() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - creatures = creatures.filter(AllZoneUtil.getCanTargetFilter(card)); - - String instruction = "Select target creature"; - - if (card.hasKeyword("Enchant tapped creature")) { - instruction = "Select target tapped creature"; - creatures = creatures.filter(AllZoneUtil.tapped); - } - - if (card.hasKeyword("Enchant creature without flying")) { - instruction = "Select target creature without flying"; - creatures = creatures.filter(new CardListFilter() { - public boolean addCard(Card c) { - return ! c.hasKeyword("Flying"); - } - }); - } - - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, creatures, instruction, true, false)); - } - }; - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - - spell.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(CardFactory.hasKeyword(card, "enchant") != -1) { - int n = CardFactory.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]); - } + SpellAbility sa = card.getSpellAbility()[0]; + sa.setIsMultiKicker(true); + sa.setMultiKickerManaCost(k[1]); + } } - - - /////////////////////////////////////////////////////////////////// - //// - //// CAUTION: Keep this last in the if else if block for cardnames - //// - /////////////////////////////////////////////////////////////////// - - ////////////////////DRF test generic aura - //*************** START *********** START ************************** - else if (isAuraType(card, "Land") || isAuraType(card, "Creature") || - isAuraType(card, "Artifact") || isAuraType(card, "Enchantment") || - isAuraType(card, "Wall")) { - - final String type = getAuraType(card); - final boolean curse = isCurseAura(card); - final boolean youControl = isTypeYouControl(card); - final boolean oppControl = isTypeOppControl(card); - if ("" == type) { - Log.error("Problem in generic Aura code - type is null"); - } - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 4191777361540717307L; - @Override - public boolean canPlayAI() { - Player player; - if (curse || oppControl) { - player = AllZone.HumanPlayer; - } - else { - player = AllZone.ComputerPlayer; - } - CardList list = AllZoneUtil.getPlayerTypeInPlay(player, type); - list = list.filter(AllZoneUtil.getCanTargetFilter(card)); - - if (list.isEmpty()) return false; - - // Enchant a random Aura magnet if one is in play. - // Else enchant a random unenchanted card if one exists. - // Enchant a previously enchanted card if no unenchanted cards exist. - - if (! curse) { - CardList magnets = list.getEnchantMagnets(); - - if (! magnets.isEmpty()) { - list = magnets; - - } else { - CardList notEnchanted = list.filter(AllZoneUtil.unenchanted); - if (! notEnchanted.isEmpty()) { - list = notEnchanted; - } - } - } else { - CardList notEnchanted = list.filter(AllZoneUtil.unenchanted); - if (! notEnchanted.isEmpty()) { - list = notEnchanted; - } - } - // We do not want the AI to always enchant the same card. - - list.shuffle(); - setTargetCard(list.get(0)); - return super.canPlayAI(); - - }//canPlayAI() - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) { - card.enchantCard(c); - } - }//resolve() - };//SpellAbility - card.clearFirstSpellAbility(); - spell.setDescription(""); - card.addSpellAbility(spell); - card.addLeavesPlayCommand(standardUnenchant); - - Input runtime = new Input() { - private static final long serialVersionUID = -7100800261954421849L; - - @Override - public void showMessage() { - // We will now use a list name other than "land", ugh! - // CardList land = AllZoneUtil.getTypeInPlay(type); - - StringBuilder sbTitle = new StringBuilder(); - sbTitle.append("Select target ").append(type.toLowerCase()); - if (youControl) { - sbTitle.append(" you control"); - } else if (oppControl) { - sbTitle.append(" an opponent controls"); - } - CardList auraCandidates = new CardList(); - if (youControl) { - auraCandidates = AllZoneUtil.getPlayerTypeInPlay(card.getController(), type); - } else if (oppControl) { - auraCandidates = AllZoneUtil.getPlayerTypeInPlay(card.getController().getOpponent(), type); - } else { - auraCandidates = AllZoneUtil.getTypeInPlay(type); - } - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, auraCandidates, - sbTitle.toString(), true, false)); - } - }; - spell.setBeforePayMana(runtime); - }//*************** END ************ END ************************** - - /////////////////////////////////////////////////////////////////// - //// - //// CAUTION: Keep the above code block last in the if else if block - //// - /////////////////////////////////////////////////////////////////// - ////////////////////DRF test generic aura - - - - /* - * This section is for cards which add a P/T boost - * and/or keywords to the enchanted creature - */ - if (shouldEnchant(card) != -1) { - int n = shouldEnchant(card); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - String k[] = parse.split(":"); - String keywordsUnsplit = ""; - String extrinsicKeywords[] = {"none"}; // for enchantments with no keywords to add - - final String spDesc[] = {"none"}; - final String stDesc[] = {"none"}; - StringBuilder sbD = new StringBuilder(); - StringBuilder sbSD = new StringBuilder(); - final boolean curse[] = {false}; - - curse[0] = k[0].contains("Curse"); - - int Power = 0; - int Tough = 0; - - sbD.append("Enchanted creature "); - - 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 - { - sbD.append("gets "); - sbD.append(ptk[0].trim()); - sbD.append("/"); - sbD.append(ptk[1].trim()); - - 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]; - sbD.append(" and "); - } - } - - if (keywordsUnsplit.length() > 0) // then there is at least one extrinsic keyword to assign - { - sbD.append("has "); - - String tempKwds[] = keywordsUnsplit.split("&"); - extrinsicKeywords = new String[tempKwds.length]; - - for (int i = 0; i < tempKwds.length; i ++) - { - extrinsicKeywords[i] = tempKwds[i].trim(); - - sbD.append(extrinsicKeywords[i].toLowerCase()); - if (i < tempKwds.length - 2) { sbD.append(", "); } - if (i == tempKwds.length - 2) { sbD.append(" and "); } - } - } - sbD.append("."); - spDesc[0] = sbD.toString(); - - sbSD.append(cardName); - sbSD.append(" - "); - sbSD.append("enchants target creature."); - stDesc[0] = sbSD.toString(); - - if (k.length > 2) { spDesc[0] = k[2].trim(); } // Use the spell and stack descriptions included - if (k.length > 3) { stDesc[0] = k[3].trim(); } // with the keyword if they are present. - - card.clearFirstSpellAbility(); - - if (! curse[0]) { - card.addFirstSpellAbility(CardFactoryUtil.enPump_Enchant(card, Power, Tough, extrinsicKeywords, spDesc, stDesc)); - } - else { - card.addFirstSpellAbility(CardFactoryUtil.enPumpCurse_Enchant(card, Power, Tough, extrinsicKeywords, spDesc, stDesc)); - } - card.addEnchantCommand(CardFactoryUtil.enPump_onEnchant(card, Power, Tough, extrinsicKeywords, spDesc, stDesc)); - card.addUnEnchantCommand(CardFactoryUtil.enPump_unEnchant(card, Power, Tough, extrinsicKeywords, spDesc, stDesc)); - card.addLeavesPlayCommand(CardFactoryUtil.enPump_LeavesPlay(card, Power, Tough, extrinsicKeywords, spDesc, stDesc)); - - card.setSVar("PlayMain1", "TRUE"); - } - }// enPump[Curse] - - /* - * For Control Magic type of auras - */ - if (shouldControl(card) != -1) { - int n = shouldControl(card); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - String k[] = parse.split(":"); - - String option = "none"; - final boolean optionCmcTwoOrLess[] = {false}; - final boolean optionRedOrGreen[] = {false}; - - /* - * Check to see if these are options and/or descriptions - * Descriptions can be added later if needed - */ - if (k.length > 1) { - if (k[1].startsWith("Option=")) { - option = k[1].substring(7); - } - } - - /* - * This is for the Threads of Disloyalty aura - * no need to parse the CMC number at this time - */ - if (option.contains("CMC 2 or less") || - card.hasKeyword("Enchant creature with converted mana cost 2 or less")) { - optionCmcTwoOrLess[0] = true; - } - - /* - * This is for the Mind Harness aura - * no need to parse the colors at this time - */ - if (option.contains("red or green") || - card.hasKeyword("Enchant red or green creature")) { - optionRedOrGreen[0] = true; - } - - /* - * I borrowed this code from Control Magic - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 5211276723523636356L; - - @Override - public boolean canPlayAI() { - - if(!super.canPlayAI()) return false; - - CardList tgts = CardFactoryUtil.AI_getHumanCreature(card, true); - - /* - * This is a new addition and is used - * by the Threads of Disloyalty aura - */ - if (optionCmcTwoOrLess[0]) { - tgts = tgts.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardUtil.getConvertedManaCost(c.getManaCost()) <= 2; - } - }); - } - - /* - * This is a new addition and is - * used by the Mind Harness aura - */ - if (optionRedOrGreen[0]) { - tgts = tgts.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isGreen() || c.isRed(); - } - }); - } - - if (tgts.isEmpty()) return false; - - Card target = CardFactoryUtil.AI_getBestCreature(tgts); - - if (CardFactoryUtil.evaluateCreature(target) >= 160) { - setTargetCard(target); - return true; - } - - /* - * This is new and we may want to add more tests - * Do we want the AI to hold these auras when - * losing game and at a creature disadvatange - */ - if (CardFactoryUtil.evaluateCreature(target) >= 130 && 5 > AllZone.ComputerPlayer.getLife()) { - setTargetCard(target); - return true; - } - - return false; - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) card.enchantCard(c); - - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - spell.setDescription(""); - card.addSpellAbility(spell); - - final Player[] prevController = new Player[1]; - prevController[0] = null; - - Command onEnchant = new Command() { - private static final long serialVersionUID = -6323085271405286813L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - //set summoning sickness - if (crd.hasKeyword("Haste")) { - crd.setSickness(false); - } else { - crd.setSickness(true); - } - - prevController[0] = crd.getController(); - AllZone.GameAction.changeController(new CardList(crd), crd.getController(), card.getController()); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - private static final long serialVersionUID = -3086710987052359078L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (AllZoneUtil.isCardInPlay(crd)) { - if (crd.hasKeyword("Haste")) { - crd.setSickness(false); - } else { - crd.setSickness(true); - } - - AllZone.GameAction.changeController(new CardList(crd), crd.getController(), prevController[0]); - } - } - - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - private static final long serialVersionUID = 7464815269438815827L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - };//Command - - /* - * We now need an improved input method so we can filter out the inappropriate - * choices for the auras Threads of Disloyalty and Mind Harness - * - * NOTE: can we target a creature in our zone ? - */ - Input runtime = new Input() { - private static final long serialVersionUID = -7462101446917907106L; - - @Override - public void showMessage() { - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - creatures = creatures.filter(new CardListFilter() { - public boolean addCard(Card c) { - return CardFactoryUtil.canTarget(card, c) - && ((!optionCmcTwoOrLess[0]) || (optionCmcTwoOrLess[0] - && CardUtil.getConvertedManaCost(c.getManaCost()) <= 2)) - && ((!optionRedOrGreen[0]) || (optionRedOrGreen[0] - && c.isGreen() || c.isRed())); - } - }); - - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, creatures, "Select target creature", true, false)); - } - }; - - card.setSVar("PlayMain1", "TRUE"); - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - - spell.setBeforePayMana(runtime); - }// SpellAbility spell - }// enControlCreature - - /* - * For Control Magic type of auras (targeting Land, Artifact, Enchantment) - */ - if (shouldControlArtifact(card) != -1) { - int n = shouldControlArtifact(card); - if (n != -1) { - String parse = card.getKeyword().get(n).toString(); - card.removeIntrinsicKeyword(parse); - - /* - * I borrowed this code from Control Magic aura code - */ - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 8833656440594179515L; - - @Override - public boolean canPlayAI() { - - if(!super.canPlayAI()) return false; - - CardList tgts = CardFactoryUtil.AI_getHumanArtifact(card, true); - CardListUtil.sortAttack(tgts); - CardListUtil.sortFlying(tgts); - - if (tgts.isEmpty()) return false; - - else { - setTargetCard(tgts.get(0)); - return true; - } - }//canPlayAI() - - @Override - public void resolve() { - AllZone.GameAction.moveToPlay(card); - - Card c = getTargetCard(); - - if (AllZoneUtil.isCardInPlay(c) - && CardFactoryUtil.canTarget(card, c)) card.enchantCard(c); - - }//resolve() - };//SpellAbility - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - spell.setDescription(""); - card.addSpellAbility(spell); - - final Player[] prevController = new Player[1]; - prevController[0] = null; - - Command onEnchant = new Command() { - private static final long serialVersionUID = -2519887209491512000L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - //set summoning sickness - if (crd.hasKeyword("Haste")) { - crd.setSickness(false); - } else { - crd.setSickness(true); - } - prevController[0] = crd.getController(); - - AllZone.GameAction.changeController(new CardList(crd), prevController[0], card.getController()); - } - }//execute() - };//Command - - Command onUnEnchant = new Command() { - private static final long serialVersionUID = 3426441132121179288L; - - public void execute() { - if (card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - if (AllZoneUtil.isCardInPlay(crd)) { - if (crd.hasKeyword("Haste")) { - crd.setSickness(false); - } else { - crd.setSickness(true); - } - - AllZone.GameAction.changeController(new CardList(crd), crd.getController(), prevController[0]); - } - } - - }//execute() - };//Command - - Command onLeavesPlay = new Command() { - private static final long serialVersionUID = -639204333673364477L; - - public void execute() { - if(card.isEnchanting()) { - Card crd = card.getEnchanting().get(0); - card.unEnchantCard(crd); - } - } - };//Command - - Input runtime = new Input() { - private static final long serialVersionUID = -5692242772569986155L; - - @Override - public void showMessage() { - CardList perms = AllZoneUtil.getCardsInPlay(); - perms = perms.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isArtifact() && CardFactoryUtil.canTarget(card, c); - } - }); - - stopSetNext(CardFactoryUtil.input_targetSpecific(spell, perms, "Select target artifact", true, false)); - } - }; - - card.setSVar("PlayMain1", "TRUE"); - - card.addEnchantCommand(onEnchant); - card.addUnEnchantCommand(onUnEnchant); - card.addLeavesPlayCommand(onLeavesPlay); - - spell.setBeforePayMana(runtime); - }// SpellAbility spell - }// enControlCreature - return card; } - - //checks if an aura is a given type based on: Enchant in cards.txt - private static boolean isAuraType(final Card aura, final String type) { - ArrayList keywords = aura.getKeyword(); - for(String keyword:keywords) { - if(keyword.startsWith("Enchant "+type)) { - return true; - } - } - return false; - } - - //gets the type of aura based on Enchant in cards.txt - private static String getAuraType(final Card aura) { - ArrayList keywords = aura.getKeyword(); - for(String keyword:keywords) { - if(keyword.startsWith("Enchant ")) { - StringTokenizer st = new StringTokenizer(keyword); - st.nextToken(); //this should be "Enchant" - return st.nextToken(); //should be "land", "artifact", etc - } - } - return ""; - } - - //checks if an aura is a curse based on Enchant [Curse] in cards.txt - //Curse just means computer will target human's stuff with this - private static boolean isCurseAura(final Card aura) { - ArrayList keywords = aura.getKeyword(); - for(String keyword:keywords) { - if(keyword.startsWith("Enchant ")) { - if(keyword.endsWith("Curse")) return true; - } - } - return false; - } - - //checks if the aura can only target the controller's cards - private static boolean isTypeYouControl(final Card aura) { - ArrayList keywords = aura.getKeyword(); - for (String keyword:keywords) { - if (keyword.startsWith("Enchant ")) { - if (keyword.endsWith("you control")) return true; - } - } - return false; - } - - //checks if the aura can only target the opponent's cards - private static boolean isTypeOppControl(final Card aura) { - ArrayList keywords = aura.getKeyword(); - for (String keyword:keywords) { - if (keyword.startsWith("Enchant ")) { - if (keyword.contains("an opponent controls")) return true; - } - } - return false; - } - + } diff --git a/src/forge/card/cardFactory/CardFactory_Creatures.java b/src/forge/card/cardFactory/CardFactory_Creatures.java index ebf1ac84825..dd50415312e 100644 --- a/src/forge/card/cardFactory/CardFactory_Creatures.java +++ b/src/forge/card/cardFactory/CardFactory_Creatures.java @@ -1,138 +1,153 @@ - package forge.card.cardFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Stack; - -import javax.swing.JOptionPane; - import com.esotericsoftware.minlog.Log; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Combat; -import forge.Command; -import forge.CommandReturn; -import forge.ComputerUtil; -import forge.Constant; -import forge.Counters; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Player; -import forge.PlayerZone; -import forge.Phase; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Static; -import forge.card.spellability.Ability_Sub; -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.*; +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 forge.gui.input.Input_PayManaCost_Ability; +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; - + 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; - + 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; - + 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; - + 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; - + for (int i = 0; i < a.size(); i++) + if (a.get(i).toString().startsWith("Soulshift")) return i; + return -1; } - - public static Card getCard(final Card card, final String cardName, Player owner, CardFactory cf) { - + + /** + *

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")) { + 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.ComputerPlayer); - + 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.clearFirstSpellAbility(); + 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 + //*************** 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)) { + + 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)); + 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.ComputerPlayer); + CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); perms = perms.filter(new CardListFilter() { public boolean addCard(Card c) { return c.sumAllCounters() > 0 && CardFactoryUtil.canTarget(card, c); @@ -141,10 +156,10 @@ public class CardFactory_Creatures { perms.shuffle(); setTargetCard(perms.get(0)); //TODO: improve this. } - + @Override public boolean canPlayAI() { - CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); + CardList perms = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); perms = perms.filter(new CardListFilter() { public boolean addCard(Card c) { return c.sumAllCounters() > 0 && CardFactoryUtil.canTarget(card, c); @@ -153,349 +168,126 @@ public class CardFactory_Creatures { 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."); + 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); + 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()) { + + if (card.getController().isHuman()) { choice = GuiUtils.getChoice("Choose one", choices); } else choice = choices[MyRandom.random.nextInt(3)]; - - if(choice.equals("2/2 with flying")) { + + if (choice.equals("2/2 with flying")) { card.setBaseAttack(2); card.setBaseDefense(2); card.addIntrinsicKeyword("Flying"); } - if(choice.equals("1/6 with defender")) { + 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.Stack.addSimultaneousStackEntry(ability); + 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("Brawn")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() {} - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -3009968608543593584L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getOwner()).append(" creatures have Trample."); - ability.setStackDescription(sb.toString()); - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Filth")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() {} - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -3009968608543593584L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getOwner()); - sb.append(" creatures have Swampwalk."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Glory")) { - final Ability ability = new Ability(card, "2 W") { - private static final long serialVersionUID = -79984345642451L; - - @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; - - Object o = GuiUtils.getChoice("Choose color", colors); - color = (String)o; - } - else { - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - - 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()); - - for (int i = 0; i < list.size(); i++) { - final Card target = list.get(i); - - final Command untilEOT = new Command() { - private static final long serialVersionUID = 6308754740309909072L; - - public void execute() { - if (AllZoneUtil.isCardInPlay(target)) { - target.removeExtrinsicKeyword(kboost); - } - } - };//Command - - if (AllZoneUtil.isCardInPlay(target) && - !target.hasKeyword(kboost)) { - target.addExtrinsicKeyword(kboost); - - AllZone.EndOfTurn.addUntil(untilEOT); - }//if - }//for - }//resolve - - @Override - public boolean canPlay() { - return AllZoneUtil.isCardInPlayerGraveyard(card.getController(), card); - } - };//Ability - - card.addSpellAbility(ability); - ability.setFlashBackAbility(true); - card.setUnearth(true); - - StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("2 W: Creatures you control gain protection from the color of your choice "); - sbDesc.append("until end of turn. Activate this ability only if Glory is in your graveyard."); - ability.setDescription(sbDesc.toString()); - - StringBuilder sbStack = new StringBuilder(); - sbStack.append(card.getName()).append(" - Creatures ").append(card.getController()); - sbStack.append(" controls gain protection from the color of his/her choice until end of turn"); - ability.setStackDescription(sbStack.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Anger")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() {} - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = 1707519783018941582L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getOwner()); - sb.append(" creatures have Haste."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - //*************** START *********** START ************************** - else if(cardName.equals("Valor")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() {} - };//SpellAbility - - Command destroy = new Command() { - private static final long serialVersionUID = -3009968608543593584L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getOwner()); - sb.append(" creatures have First Strike."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Wonder")) { - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() {} - }; - - Command destroy = new Command() { - private static final long serialVersionUID = 340877499423908818L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getOwner()); - sb.append(" creatures have Flying."); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - card.addDestroyCommand(destroy); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Oracle of Mul Daya")) { + 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() { + // TODO: change to static ability? CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); - if(library.size() == 0) return false; - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, 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); + card.addSpellAbility(ability); }//*************** END ************ END ************************** //*************** START *********** START ************************** - else if(cardName.equals("Drekavac")) { + else if (cardName.equals("Drekavac")) { final Input discard = new Input() { private static final long serialVersionUID = -6392468000100283596L; - + @Override public void showMessage() { - AllZone.Display.showMessage("Select a noncreature card to discard"); + 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()) { + if (zone.is(Constant.Zone.Hand) && !c.isCreature()) { c.getController().discard(c, null); stop(); } } - + @Override public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); + 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.HumanPlayer).size() == 0) AllZone.GameAction.sacrifice(card); - else AllZone.InputControl.setInput(discard); + 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.ComputerPlayer); + CardList list = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); list = list.filter(new CardListFilter() { public boolean addCard(Card c) { return (!c.isCreature()); @@ -505,30 +297,30 @@ public class CardFactory_Creatures { }//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.Stack.addSimultaneousStackEntry(ability); + 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()); @@ -543,94 +335,94 @@ public class CardFactory_Creatures { }; card.addComesIntoPlayCommand(intoPlay); // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - + //*************** START *********** START ************************** - else if(cardName.equals("Minotaur Explorer") || cardName.equals("Balduvian Horde") || - cardName.equals("Pillaging Horde")) { + 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; + 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); - @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.ComputerPlayer).size() > reqHand; - } - }; - card.clearFirstSpellAbility(); - 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.GameAction.sacrifice(card); - else - card.getController().discardRandom(this); + 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.Stack.addSimultaneousStackEntry(ability); + 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")) { + else if (cardName.equals("Sleeper Agent")) { final SpellAbility ability = new Ability(card, "0") { @Override public void resolve() { - // TODO: this need to be targeted - AllZone.GameAction.changeController(new CardList(card), card.getController(), card.getController().getOpponent()); + // 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.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); }//execute() }; card.addComesIntoPlayCommand(intoPlay); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Phylactery Lich") ) { + 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.ComputerPlayer); + 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) { @@ -639,147 +431,109 @@ public class CardFactory_Creatures { }); Card target = null; - if(!list.isEmpty()) - target = list.get(0); + if (!list.isEmpty()) + target = list.get(0); else if (!art.isEmpty()) - target = art.get(0); + 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); + + 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; + private static final long serialVersionUID = -1601957445498569156L; - public void execute() { + public void execute() { Input target = new Input() { - private static final long serialVersionUID = -806140334868210520L; + private static final long serialVersionUID = -806140334868210520L; - @Override + @Override public void showMessage() { - AllZone.Display.showMessage("Select target artifact you control"); + 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()) { + if (card.isArtifact() && zone.is(Constant.Zone.Battlefield) && card.getController().isHuman()) { ability.setTargetCard(card); - AllZone.Stack.add(ability); + AllZone.getStack().add(ability); stop(); } } };//Input target - - if(card.getController().isHuman()) { - CardList artifacts = AllZoneUtil.getPlayerTypeInPlay(AllZone.HumanPlayer, "Artifact"); - - if(artifacts.size() != 0) AllZone.InputControl.setInput(target); - } - else{ //computer + 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 + if (o != null)//should never happen, but just in case { ability.setTargetCard((Card) o); - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }//else }//execute() }; // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(new Spell_Permanent(card) { - - private static final long serialVersionUID = -1506199222879057809L; - @Override + 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("Whirlpool Rider") || cardName.equals("Whirlpool Drake")) { + else if (cardName.equals("Sky Swallower")) { final SpellAbility ability = new Ability(card, "0") { - + @Override public void resolve() { - //shuffle hand into library, then shuffle library - PlayerZone library = AllZone.getZone(Constant.Zone.Library, card.getController()); - CardList hand = AllZoneUtil.getPlayerHand(card.getController()); - for(int i = 0; i < hand.size(); i++) { - AllZone.GameAction.moveTo(library, hand.get(i)); - } - card.getController().shuffle(); - - //draw same number of cards as before - for(int i = 0; i < hand.size(); i++) - card.getController().drawCard(); - } - };//SpellAbility - - Command shuffle = new Command() { - private static final long serialVersionUID = 6290392806910817877L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getController()); - sb.append(" shuffles the cards from his hand into his library, then draws that many cards."); - ability.setStackDescription(sb.toString()); + //TODO - this needs to be targeted + Player opp = card.getController().getOpponent(); - AllZone.Stack.addSimultaneousStackEntry(ability ); - - } - }; - card.addComesIntoPlayCommand(shuffle); - if(cardName.equals("Whirlpool Drake")) card.addDestroyCommand(shuffle); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Sky Swallower")) { - final SpellAbility ability = new Ability(card, "0") { - - @Override - public void resolve() { - Player opp = card.getController().getOpponent(); - CardList list = AllZoneUtil.getCardsInPlay(); - list = list.getValidCards("Card.Other+YouCtrl".split(","),card.getController(), card); + list = list.getValidCards("Card.Other+YouCtrl".split(","), card.getController(), card); - AllZone.GameAction.changeController(list, card.getController(), opp); + 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.Stack.addSimultaneousStackEntry(ability); + 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); } }; @@ -788,144 +542,22 @@ public class CardFactory_Creatures { //*************** START *********** START ************************** - else if(cardName.equals("Lightning Crafter")) { - final CommandReturn getCreature = new CommandReturn() { - public Object execute() { - //get all creatures - CardList list = AllZoneUtil.getPlayerCardsInPlay(card.getController()); - - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isType("Goblin") - || c.isType("Shaman") - || c.hasKeyword("Changeling"); - } - }); - - return list; - } - };//CommandReturn - - final SpellAbility abilityComes = new Ability(card, "0") { - @Override - public void resolve() { - if(getTargetCard() == null || getTargetCard() == card) AllZone.GameAction.sacrifice(card); - - else if(AllZoneUtil.isCardInPlay(getTargetCard())) { - AllZone.GameAction.exile(getTargetCard()); - } - }//resolve() - }; - - final Input inputComes = new Input() { - private static final long serialVersionUID = -6066115143834426784L; - - @Override - public void showMessage() { - CardList choice = (CardList) getCreature.execute(); - - stopSetNext(CardFactoryUtil.input_targetChampionSac(card, abilityComes, choice, - "Select Goblin or Shaman to exile", false, false)); - ButtonUtil.disableAll(); - } - - }; - Command commandComes = new Command() { - private static final long serialVersionUID = -3498068347359658023L; - - public void execute() { - CardList creature = (CardList) getCreature.execute(); - Player s = card.getController(); - if(creature.size() == 0) { - AllZone.GameAction.sacrifice(card); - return; - } else if(s.isHuman()) AllZone.InputControl.setInput(inputComes); - else //computer - { - Card target; - //must target computer creature - CardList computer = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - computer = computer.getType("Goblin"); - computer.remove(card); - - computer.shuffle(); - if(computer.size() != 0) { - target = computer.get(0); - abilityComes.setTargetCard(target); - AllZone.Stack.addSimultaneousStackEntry(abilityComes); - - } - else - AllZone.GameAction.sacrifice(card); - }//else - }//execute() - };//CommandComes - Command commandLeavesPlay = new Command() { - private static final long serialVersionUID = 4236503599117025393L; - - public void execute() { - //System.out.println(abilityComes.getTargetCard().getName()); - Object o = abilityComes.getTargetCard(); - - if(o == null || ((Card) o).isToken() || !AllZoneUtil.isCardExiled((Card) o)) return; - - SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - //copy card to reset card attributes like attack and defense - Card c = abilityComes.getTargetCard(); - if(!c.isToken()) { - c = AllZone.CardFactory.copyCard(c); - c.setController(c.getOwner()); - - AllZone.GameAction.moveToPlay(c); - } - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - returning creature to the battlefield"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//execute() - };//Command - - card.addComesIntoPlayCommand(commandComes); - card.addLeavesPlayCommand(commandLeavesPlay); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(new Spell_Permanent(card) { - private static final long serialVersionUID = -62128538115338896L; - - @Override - public boolean canPlayAI() { - Object o = getCreature.execute(); - if(o == null) return false; - - CardList cl = (CardList) getCreature.execute(); - return (o != null) && cl.size() > 0 && AllZone.getZone(getSourceCard()).is(Constant.Zone.Hand); - } - }); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Jhoira of the Ghitu")) { - final Stack chosen= new Stack(); + 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; } - + + public boolean canPlayAI() { + return false; + } + @Override public void resolve() { Card c = chosen.pop(); @@ -933,489 +565,282 @@ public class CardFactory_Creatures { c.setSuspend(true); } }; - + ability.setAfterPayMana(new Input() { private static final long serialVersionUID = -1647181037510967127L; - - @Override - public void showMessage() - { - ButtonUtil.disableAll(); - AllZone.Display.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.GameAction.exile(c); - chosen.push(c); - ability.setStackDescription(card.toString() + " - Suspending " + c.toString()); - AllZone.Stack.add(ability); - stop(); - } - } - }); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if (cardName.equals("Disciple of Kangee")) { - Cost abCost = new Cost("U T", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, new Target(card,"TgtC")) { - private static final long serialVersionUID = -5169389637917649036L; - - @Override - public boolean canPlayAI() { - if (CardFactoryUtil.AI_doesCreatureAttack(card)) return false; - - return CardFactoryUtil.AI_getHumanCreature("Flying", card, false).isEmpty() - && (getCreature().size() != 0); - } - - @Override - public void chooseTargetAI() { - card.tap(); - Card target = CardFactoryUtil.AI_getBestCreature(getCreature()); - setTargetCard(target); - } - - CardList getCreature() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() - && (!CardFactoryUtil.AI_doesCreatureAttack(c)) - && (!c.hasKeyword("Flying")) - && CardFactoryUtil.canTarget(card, c); - } - }); - list.remove(card); - return list; - }//getCreature() - - @Override - public void resolve() { - if (AllZoneUtil.isCardInPlay(getTargetCard()) && - CardFactoryUtil.canTarget(card, getTargetCard())) { - final Card[] creature = new Card[1]; - final long timestamp; - - creature[0] = getTargetCard(); - creature[0].addExtrinsicKeyword("Flying"); - timestamp = creature[0].addColor("U", card, false, true); - - final Command EOT = new Command() { - private static final long serialVersionUID = -1899153704584793548L; - long stamp = timestamp; - public void execute() { - if (AllZoneUtil.isCardInPlay(creature[0])) { - creature[0].removeExtrinsicKeyword("Flying"); - creature[0].removeColor("U", card, false, stamp); - } - } - }; - AllZone.EndOfTurn.addUntil(EOT); - }//if (card is in play) - }//resolve() - };//SpellAbility - card.addSpellAbility(ability); - ability.setDescription(abCost+"Target creature gains flying and becomes blue until end of turn."); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Gigantomancer")) { - final Ability ability = new Ability(card, "1") { - private static final long serialVersionUID = -68531201448677L; - - @Override - public boolean canPlayAI() { - Card c = getCreature(); - if(c == null) return false; - else { - setTargetCard(c); - return true; - } - }//canPlayAI() - - //may return null - public Card getCreature() { - CardList untapped = AllZoneUtil.getCreaturesInPlay(card.getController()); - untapped = untapped.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped() && 6 > c.getNetAttack(); - } - }); - if(untapped.isEmpty()) return null; - Card worst = untapped.get(0); - for(int i = 0; i < untapped.size(); i++) - if(worst.getNetAttack() > untapped.get(i).getNetAttack()) worst = untapped.get(i); - return worst; - } - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - final Card[] creature = new Card[1]; - - creature[0] = getTargetCard(); - final int[] originalAttack = {creature[0].getBaseAttack()}; - final int[] originalDefense = {creature[0].getBaseDefense()}; - - creature[0].setBaseAttack(7); - creature[0].setBaseDefense(7); - - final Command EOT = new Command() { - private static final long serialVersionUID = 6437463765161964445L; - - public void execute() { - if(AllZoneUtil.isCardInPlay(creature[0])) { - creature[0].setBaseAttack(originalAttack[0]); - creature[0].setBaseDefense(originalDefense[0]); - } - } - }; - AllZone.EndOfTurn.addUntil(EOT); - }//is card in play? - }//resolve() - };//SpellAbility - card.addSpellAbility(ability); - ability.setDescription("1: Target creature you control becomes 7/7 until end of turn."); - //this ability can target "this card" when it shouldn't be able to - ability.setBeforePayMana(new Input() { - private static final long serialVersionUID = -7903295056497483023L; - @Override public void showMessage() { - CardList targets = AllZoneUtil.getCreaturesInPlay(card.getController()); - stopSetNext(CardFactoryUtil.input_targetSpecific(ability, targets, - "Select a creature you control", true, false)); + 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(); + } } }); - }//*************** 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 + 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(); - } - + //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(); + CardList library = AllZoneUtil.getPlayerCardsInLibrary(card.getController()); + if (library.size() == 0) return; // maybe provide some notification that library is empty? - Card basicGrab = null; + CardList revealed = new CardList(); - 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); + Card basicGrab = null; - if (top.isBasicLand()) - basicGrab = top; + 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(count == library.size()) - break; - }//while - GuiUtils.getChoiceOptional("Revealed cards:", revealed.toArray()); - - if (basicGrab != null){ - // put basic in hand - AllZone.GameAction.moveToHand(basicGrab); - revealed.remove(basicGrab); - } - // place revealed cards in graveyard (TODO: player should choose order) - for(Card c : revealed){ - AllZone.GameAction.moveToGraveyard(c); - } + 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."); + 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("Sorceress Queen") || cardName.equals("Serendib Sorcerer")) { - Cost abCost = new Cost("T", cardName, true); - Target target = new Target(card,"Select target creature other than "+cardName, new String[] {"Creature.Other"}); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = -6853184726011448677L; - - @Override - public boolean canPlayAI() { - Card c = getCreature(); - if(c == null) return false; - else { - setTargetCard(c); - return true; - } - }//canPlayAI() - - //may return null - public Card getCreature() { - CardList untapped = CardFactoryUtil.AI_getHumanCreature(card, true); - untapped = untapped.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped() && 2 < c.getNetDefense() && c != card; - } - }); - if(untapped.isEmpty()) return null; - - Card big = CardFactoryUtil.AI_getBestCreature(untapped); - return big; - } - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - final Card[] creature = new Card[1]; - - creature[0] = getTargetCard(); - final int[] originalAttack = {creature[0].getBaseAttack()}; - final int[] originalDefense = {creature[0].getBaseDefense()}; - - creature[0].setBaseAttack(0); - creature[0].setBaseDefense(2); - - final Command EOT = new Command() { - private static final long serialVersionUID = 6437463765161964445L; - - public void execute() { - if(AllZoneUtil.isCardInPlay(creature[0])) { - creature[0].setBaseAttack(originalAttack[0]); - creature[0].setBaseDefense(originalDefense[0]); - } - } - }; - AllZone.EndOfTurn.addUntil(EOT); - }//is card in play? - }//resolve() - };//SpellAbility - card.addSpellAbility(ability); - - StringBuilder sb = new StringBuilder(); - sb.append(abCost).append("Target creature other than ").append(cardName).append(" becomes 0/2 until end of turn."); - ability.setDescription(sb.toString()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Vedalken Plotter")) { + 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.GameAction.changeController(new CardList(crd0), p0, p1); - AllZone.GameAction.changeController(new CardList(crd1), p1, p0); + + 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.Display.showMessage("Select target land you control."); - else AllZone.Display.showMessage("Select target land opponent controls."); - + 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 (index[0] == 0 && !c.getController().equals(card.getController())) return; - if(c.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { + //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.Stack.add(ability); + + 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.InputControl.setInput(input); + 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"); + 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.Phase.getPhase().equals(Constant.Phase.Main2)); + && (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()) + 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); + 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)) { + 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)); - + + 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."); - + 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.Stack.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.GameAction.moveTo(play, target[0]); - } - } - }); - }//execute() + //*************** 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){ + 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())) { + if (AllZoneUtil.isCardInPlay(getTargetCard())) { target[0] = getTargetCard(); - - if (!target[0].isToken()){ // not necessary, but will help speed up stack resolution - AllZone.EndOfTurn.addUntil(untilEOT); - target[0].addDestroyCommand(destroy); + + 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; @@ -1423,565 +848,183 @@ public class CardFactory_Creatures { };//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("Helldozer")) { - Cost abCost = new Cost("B B B T", cardName, true); - Target target = new Target(card,"Select target land.", new String[]{"Land"}); - final Ability_Activated ability = new Ability_Activated(card, abCost, target) { - private static final long serialVersionUID = 6426884086364885861L; - - @Override - public boolean canPlayAI() { - if(CardFactoryUtil.AI_doesCreatureAttack(card)) return false; - - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - return land.size() != 0; - } - - @Override - public void chooseTargetAI() { - //target basic land that Human only has 1 or 2 in play - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - - Card target = null; - - String[] name = {"Forest", "Swamp", "Plains", "Mountain", "Island"}; - for(int i = 0; i < name.length; i++) - if(land.getName(name[i]).size() == 1) { - target = land.getName(name[i]).get(0); - break; - } - - //see if there are only 2 lands of the same type - if(target == null) { - for(int i = 0; i < name.length; i++) - if(land.getName(name[i]).size() == 2) { - target = land.getName(name[i]).get(0); - break; - } - }//if - if(target == null) { - land.shuffle(); - target = land.get(0); - } - setTargetCard(target); - }//chooseTargetAI() - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - AllZone.GameAction.destroy(getTargetCard()); - - //if non-basic, untap Helldozer - if(!getTargetCard().isBasicLand()) card.untap(); - } - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability); - ability.setDescription(abCost+"Destroy target land. If that land was nonbasic, untap Helldozer."); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Wild Mongrel")) { - - final String[] color = new String[1]; - final long[] timeStamp = new long[1]; - - final Cost abCost = new Cost("Discard<1/Card>", cardName, true); - - //mana tap ability - final SpellAbility ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 5443609178720006665L; - @Override - public boolean canPlayAI() { - CardList hand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - return CardFactoryUtil.AI_doesCreatureAttack(card) && (hand.size() > 3); - } - - @Override - public void chooseTargetAI() { - AllZone.ComputerPlayer.discardRandom(this); - } - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(card)) { - card.addTempAttackBoost(1); - card.addTempDefenseBoost(1); - 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 { - // wild mongrel will choose a color that appears the most, but that might not be right way to choose - CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer)); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - list.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - - 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] = card.addColor(s, card, false, true); - - //sacrifice ability - targets itself - until EOT - final Command untilEOT = new Command() { - private static final long serialVersionUID = -5563743272875711445L; - long stamp = timeStamp[0]; - String s = CardUtil.getShortColor(color[0]); - - public void execute() { - card.addTempAttackBoost(-1); - card.addTempDefenseBoost(-1); - card.removeColor(s, card, false, stamp); - card.setChosenColor(""); - } - }; - - AllZone.EndOfTurn.addUntil(untilEOT); - } - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" gets +1/+1 and becomes the color of your choice until end of turn."); - ability.setStackDescription(sb.toString()); - - ability.setDescription("Discard a card: Wild Mongrel gets +1/+1 and becomes the color of your choice until end of turn."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - //*************** START *********** START ************************** - else if(cardName.equals("Spiritmonger")) { - - final String[] color = new String[1]; - final long[] timeStamp = new long[1]; - - //color change ability - Cost abCost = new Cost("G", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = -5362934962417382279L; - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(card)) { - if(card.getController().isHuman()) { - String[] colors = Constant.Color.onlyColors; - - Object o = GuiUtils.getChoice("Choose color", colors); - color[0] = (String) o; - card.setChosenColor(color[0]); - String s = CardUtil.getShortColor(color[0]); - timeStamp[0] = card.addColor(s, card, false, true); - - //until EOT - final Command untilEOT = new Command() { - private static final long serialVersionUID = -7093762180313802891L; - long stamp = timeStamp[0]; - String s = CardUtil.getShortColor(color[0]); - public void execute() { - card.removeColor(s, card, false, stamp); - card.setChosenColor(""); - } - }; - - AllZone.EndOfTurn.addUntil(untilEOT); - } - } - }//resolve() - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card).append(" becomes the color of your choice until end of turn."); - ability.setStackDescription(sb.toString()); - - ability.setDescription(abCost+cardName+" becomes the color of your choice until end of turn."); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Painter's Servant")) { - final long[] timeStamp = new long[1]; - final String[] color = new String[1]; + 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()) { + 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.ComputerPlayer)); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer)); - list.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); + // 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(); + 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; - } + 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.GameInfo.addColorChanges(s, card, true, true); + timeStamp[0] = AllZone.getGameInfo().addColorChanges(s, card, true, true); } };//Command Command leavesBattlefield = new Command() { - private static final long serialVersionUID = 2559212590399132459L; + private static final long serialVersionUID = 2559212590399132459L; - public void execute(){ - String s = CardUtil.getShortColor(color[0]); - AllZone.GameInfo.removeColorChanges(s, card, true, timeStamp[0]); - } + 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("Transluminant")) { - final Command atEOT = new Command() { - private static final long serialVersionUID = -5126793112740563180L; - - public void execute() { - CardFactoryUtil.makeToken("Spirit", "W 1 1 Spirit", card.getController(), "W", new String[] { - "Creature", "Spirit"}, 1, 1, new String[] {"Flying"}); - }//execute() - };//Command - - final Ability ability = new Ability(card, "W") { - @Override - public boolean canPlayAI() { - /* - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - String phase = AllZone.Phase.getPhase(); - return phase.equals(Constant.Phase.Main2) && list.size() != 0; - */ - return false; - } - - @Override - public void chooseTargetAI() { - AllZone.GameAction.sacrifice(card); - } - - @Override - public void resolve() { - AllZone.EndOfTurn.addAt(atEOT); - }//resolve() - };//SpellAbility - - card.addSpellAbility(ability); - ability.setDescription("W, Sacrifice Transluminant: Put a 1/1 white Spirit creature token with flying onto the battlefield at the beginning of the next end step."); - ability.setStackDescription("Put a 1/1 white Spirit creature token with flying onto the battlefield at end of turn."); - ability.setBeforePayMana(new Input_PayManaCost_Ability(ability.getManaCost(), new Command() { - private static final long serialVersionUID = -6553009833190713980L; - - public void execute() { - AllZone.GameAction.sacrifice(card); - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - })); - }//*************** END ************ END ************************** - //*************** START *********** START ************************** - else if(cardName.equals("Memnarch")) { - //has 2 non-tap abilities that affect itself - Cost cost = new Cost("1 U U", cardName, true); - final Target target = new Target(card, "Select a permanent", "Permanent".split(",")); + else if (cardName.equals("Stangg")) { - final SpellAbility ability1 = new Ability_Activated(card, cost, target) { - private static final long serialVersionUID = -887237000483591242L; - - @Override - public void resolve(){ - Card crd = target.getTargetCards().get(0); - - ArrayList types = crd.getType(); - crd.setType(new ArrayList()); //clear - getTargetCard().addType("Artifact"); //make sure artifact is at the beginning - for(String type:types) - crd.addType(type); - - }//resolve() - - @Override - public boolean canPlayAI() { - CardList list = getCreature(); - - if (list.size() == 0) - return false; - - target.resetTargets(); - target.addTarget(CardFactoryUtil.AI_getBestCreature(getCreature())); - return true; - } - - CardList getCreature() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - list = list.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() && (!c.isArtifact()) && CardFactoryUtil.canTarget(card, c); - } - }); - return list; - }//getCreature() - };//SpellAbility - - card.addSpellAbility(ability1); - ability1.setDescription("1 U U: Target permanent becomes an artifact in addition to its other types. (This effect doesn't end at end of turn.)"); - }//*************** 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[] {""}); - + 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.GameAction.sacrifice(card); + 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.Stack.addSimultaneousStackEntry(ability); + 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.GameAction.exile(list.get(0)); + + if (list.size() == 1) AllZone.getGameAction().exile(list.get(0)); } - }); + }); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Goldmeadow Lookout")) { - final Cost lookCost = new Cost("W T Discard<1/Card>", card.getName(), true); - final SpellAbility ability = new Ability_Activated(card, lookCost, null){ - private static final long serialVersionUID = -8413409735529340094L; - - @Override - public void resolve() { - makeToken(); - } - - void makeToken() { - CardList cl = CardFactoryUtil.makeToken("Goldmeadow Harrier", "W 1 1 Goldmeadow Harrier", - card.getController(), "W", new String[] {"Creature", "Kithkin", "Soldier"}, 1, 1, new String[] {""}); - - for(final Card c:cl) { - final Cost abCost = new Cost("W T", c.getName(), true); - final Target tgt = new Target(card,"TgtC"); - final SpellAbility tokenAbility = new Ability_Activated(card, abCost, tgt){ - private static final long serialVersionUID = -7327585136675896817L; - - @Override - public void resolve() { - Card c = getTargetCard(); - c.tap(); - } - - @Override - public boolean canPlayAI() { - CardList human = CardFactoryUtil.AI_getHumanCreature(card, true); - human = human.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isUntapped() && CardFactoryUtil.canTarget(card, c); - } - }); - - if (human.size() > 0) { - CardListUtil.sortAttack(human); - CardListUtil.sortFlying(human); - setTargetCard(human.get(0)); - } - - CardList assassins = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - assassins = assassins.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isCreature() - && (!c.hasSickness() || c.hasKeyword("Haste")) - && c.isUntapped() - && (c.getName().equals("Rathi Assassin") || c.getName().equals("Royal Assassin") - || c.getName().equals("Tetsuo Umezawa") || c.getName().equals("Stalking Assassin")); - } - }); - - Combat attackers = ComputerUtil.getAttackers(); - CardList list = new CardList(attackers.getAttackers()); - - return (AllZone.Phase.getPhase().equals(Constant.Phase.Main1) && AllZone.Phase.getPlayerTurn().equals(card.getController()) && - human.size() > 0 && (assassins.size() > 0 || !list.contains(card))); - - }//canPlayAI - };//SpellAbility - c.addSpellAbility(new Spell_Permanent(c)); - c.addSpellAbility(tokenAbility); - tokenAbility.setDescription("W, tap: Tap target creature."); - } - - }//makeToken() - - @Override - public boolean canPlayAI() { - return super.canPlayAI() && AllZone.Phase.getPhase().equals(Constant.Phase.Main2); - } - };//SpellAbility - - card.addSpellAbility(ability); - - StringBuilder sb = new StringBuilder(); - sb.append("W, tap, Discard a card: Put a 1/1 white Kithkin Soldier creature token named "); - sb.append("Goldmeadow Harrier onto the battlefield. It has \"W, tap : Tap target creature.\""); - ability.setDescription(sb.toString()); - - ability.setStackDescription(cardName+" - Put a 1/1 token onto the battlefield"); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Horde of Notions")) { + 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()) { + if (card.getController().isHuman()) { Object o = GuiUtils.getChoiceOptional("Select Elemental", getCreatures()); c = (Card) o; - + } else { c = getAIElemental(); } - - if(AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { + + if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, c.getController()); - AllZone.GameAction.moveTo(play, c); + 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); - + 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); + 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++) { + + for (int i = 0; i < allTokens.size(); i++) { Card c = allTokens.get(i); - for(int j = 0; j < multiplier; j++) + 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()); @@ -1990,51 +1033,50 @@ public class CardFactory_Creatures { copy.setType(token.getType()); copy.setBaseAttack(token.getBaseAttack()); copy.setBaseDefense(token.getBaseDefense()); - - AllZone.GameAction.moveToPlay(copy); + + AllZone.getGameAction().moveToPlay(copy); } - + @Override public boolean canPlayAI() { - CardList allTokens = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); + 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."); + 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")) { + 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()) { + 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 @@ -2043,23 +1085,23 @@ public class CardFactory_Creatures { };// 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")) { + 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()) { + if (card.getController().isHuman()) { String choices[] = {"white", "blue", "black", "red", "green"}; Object o = GuiUtils.getChoiceOptional("Select Color: ", choices); //System.out.println("Color:" + o); @@ -2069,12 +1111,12 @@ public class CardFactory_Creatures { String color = CardFactoryUtil.getMostProminentColor(list); numberTokens = CardFactoryUtil.getNumberOfPermanentsByColor(color); } - - for(int i = 0; i < numberTokens; i++) { + + 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 @@ -2083,341 +1125,279 @@ public class CardFactory_Creatures { };// 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")) { + else if (cardName.equals("Sphinx of Jwar Isle")) { final SpellAbility ability1 = new Ability(card, "0") { @Override public void resolve() { - Player player = card.getController(); + Player player = card.getController(); PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); - - if(lib.size() < 1) return; - + + 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) { + 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.ComputerPlayer); + 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; - + 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.HumanPlayer); - + + 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; - + return false; + getTarget().resetTargets(); setTargetCard(CardFactoryUtil.AI_getBestCreature(targetables)); - - return true; + + 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(); - + final Card target = getTargetCard(); + if (wolves.size() == 0) - return; - + return; + if (!(CardFactoryUtil.canTarget(card, target) && AllZoneUtil.isCardInPlay(target))) - return; - - for(Card c : wolves){ - c.tap(); - target.addDamage(c.getNetAttack(),c); + 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.InputControl.setInput(CardFactoryUtil.MasteroftheWildHunt_input_targetCreature(this, wolves, new Command() { - private static final long serialVersionUID = -328305150127775L; - - public void execute() { - getTargetCard().addDamage(1,target); - AllZone.GameAction.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); - } - } + 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; - 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); - } - } - } - } + 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("Gilt-Leaf Archdruid")) { - Cost abCost = new Cost("tapXType<7/Druid>", cardName, true); - Target tgt = new Target(card,"Select a player to gain lands from", "Player".split(",")); - final SpellAbility stealLands = new Ability_Activated(card, abCost, tgt){ - private static final long serialVersionUID = 636594487143500891L; - - @Override - public boolean canPlayAI(){ - Player p = AllZone.HumanPlayer; - - if (!p.canTarget(card)) - return false; - - setTargetPlayer(p); - - CardList lands = AllZoneUtil.getPlayerCardsInPlay(p); - lands = lands.getType("Land"); - - // Don't steal lands if Human has less than 2 - return lands.size() >= 2; - } - - @Override - public void resolve() { - Player activator = this.getActivatingPlayer(); - - CardList lands = AllZoneUtil.getPlayerCardsInPlay(getTargetPlayer()); - lands = lands.getType("Land"); - - for(int i = 0; i < lands.size(); i++) { - Card land = lands.get(i); - if(AllZoneUtil.isCardInPlay(land)) { // this really shouldn't fail in the middle of resolution - land.setController(activator); - - // i don't know how the code handles Sum Sickness so I'm leaving this - // but a card changing controllers should always gain this no matter if it has haste or not - if(land.hasKeyword("Haste")) { - land.setSickness(false); - } else { - land.setSickness(true); - } - - AllZone.GameAction.changeController(new CardList(land), land.getController(), card.getController()); - }//if - } - } - }; - - card.addSpellAbility(stealLands); - - StringBuilder sb = new StringBuilder(); - sb.append(card.toString()).append(" - Gain control of all lands target player controls."); - stealLands.setStackDescription(sb.toString()); - - stealLands.setDescription("Tap seven untapped Druids you control: Gain control of all lands target player controls."); - }//*************** END ************ END ************************** - +/* //*************** START *********** START ************************** - else if(cardName.equals("Figure of Destiny")) { + 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; - + + if (card.isArtifact()) artifact = true; + card.setType(new ArrayList()); - if(artifact) card.addType("Artifact"); + if (artifact) card.addType("Artifact"); card.addType("Creature"); card.addType("Kithkin"); card.addType("Spirit"); } - + @Override public boolean canPlayAI() { - return !card.isType("Spirit") - && super.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")) { + 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; - + + if (card.isArtifact()) artifact = true; + card.setType(new ArrayList()); - if(artifact) card.addType("Artifact"); + 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(); + return card.isType("Spirit") + && super.canPlay(); } - + @Override public boolean canPlayAI() { - return !card.isType("Warrior") - && super.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")) { + 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; - + + if (card.isArtifact()) artifact = true; + card.setType(new ArrayList()); - if(artifact) card.addType("Artifact"); + if (artifact) card.addType("Artifact"); card.addType("Creature"); card.addType("Kithkin"); card.addType("Spirit"); @@ -2425,274 +1405,238 @@ public class CardFactory_Creatures { card.addType("Avatar"); } } - + @Override public boolean canPlay() { - return card.isType("Warrior") - && super.canPlay(); + return card.isType("Warrior") + && super.canPlay(); } - + @Override public boolean canPlayAI() { - return !card.isType("Avatar") - && super.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); + card.addSpellAbility(ability3); }//*************** END ************ END ************************** - - + +*/ //*************** START *********** START ************************** - else if(cardName.equals("Covetous Dragon")) { - SpellAbility spell = new Spell_Permanent(card) { - - private static final long serialVersionUID = -1446713295855849195L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.getType("Artifact"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Tethered Griffin")) { - SpellAbility spell = new Spell_Permanent(card) { - private static final long serialVersionUID = -7872917651421012893L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.getType("Enchantment"); - return super.canPlayAI() && list.size() > 0; - } - }; - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Cantivore")) { + 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.ComputerPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer)); + 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.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Terravore")) { + 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.ComputerPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer)); + 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.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Mortivore")) { + 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.ComputerPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer)); + 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.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Cognivore")) { + 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.ComputerPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer)); + 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.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Magnivore")) { + 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.ComputerPlayer); - list.addAll(AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer)); + 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.clearFirstSpellAbility(); + 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 + + //*************** 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.clearFirstSpellAbility(); + card.clearFirstSpell(); card.addFirstSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Apocalypse Hydra")) { + 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.GameAction.moveToPlay(getSourceCard()); - - if(XCounters >= 5) XCounters = 2 * XCounters; - c.addCounter(Counters.P1P1, XCounters); + 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.clearFirstSpellAbility(); + 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); + 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.HumanPlayer.getLife() < card.getCounters(Counters.P1P1)) setTargetPlayer(AllZone.HumanPlayer); + 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); + 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()) + 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); + 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(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")) { + 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")) { @@ -2701,35 +1645,35 @@ public class CardFactory_Creatures { 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.GameAction.exile(card); + AllZone.getGameAction().exile(card); } - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); + 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.GameAction.moveToPlay(c); - + 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") + + 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") + } 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"; @@ -2739,59 +1683,59 @@ public class CardFactory_Creatures { } else if (c.hasKeyword("Enchant tapped creature")) { enchantThisType[0] = "Creature.tapped"; message[0] = "Select a tapped creature"; - } else if (c.hasKeyword("Enchant 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") + } 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") + } 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") + } else if (c.hasKeyword("Enchant land") || c.hasKeyword("Enchant Land")) { enchantThisType[0] = "Land"; message[0] = "Select a land"; - } else if (c.hasKeyword("Enchant artifact") + } else if (c.hasKeyword("Enchant artifact") || c.hasKeyword("Enchant Artifact")) { enchantThisType[0] = "Artifact"; message[0] = "Select an artifact"; - } else if (c.hasKeyword("Enchant enchantment") + } 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.InputControl.setInput(new Input() { + + AllZone.getInputControl().setInput(new Input() { private static final long serialVersionUID = -6271957194091955059L; @Override public void showMessage() { - AllZone.Display.showMessage(msg); + 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(); @@ -2799,38 +1743,38 @@ public class CardFactory_Creatures { } }//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.ComputerPlayer); + 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.GameAction.moveToPlay(c); + AllZone.getGameAction().moveToPlay(c); if (card.getName().equals("Academy Rector")) { - AllZone.GameAction.exile(card); + 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()); @@ -2840,126 +1784,66 @@ public class CardFactory_Creatures { 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") + + if (card.getName().equals("Lost Auramancers") && card.getCounters(Counters.TIME) <= 0) { - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } else if (card.getName().equals("Academy Rector")) { - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } - + }// execute() };// Command destroy - + card.addDestroyCommand(destroy); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Deadly Grub")) { + 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"}); + 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("Sygg, River Guide")) { - final HashMap creatureMap = new HashMap(); - - final Ability ability = new Ability(card, "1 W") { - @Override - public void resolve() { - Card c = getTargetCard(); - String color = ""; - if(AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - - Object o = GuiUtils.getChoice("Choose mana color", Constant.Color.onlyColors); - color = (String) o; - c.addExtrinsicKeyword("Protection from " + color); - if(creatureMap.containsKey(c)) { - int size = creatureMap.get(c).length; - String[] newString = new String[size + 1]; - - for(int i = 0; i < size; i++) { - newString[i] = creatureMap.get(c)[i]; - } - newString[size] = color; - creatureMap.put(c, newString); - } else creatureMap.put(c, new String[] {color}); - - final Card crd = c; - final Command atEOT = new Command() { - private static final long serialVersionUID = 8630868536866681014L; - - public void execute() { - //if(AllZoneUtil.isCardInPlay(c)) - // c.removeExtrinsicKeyword("Protection from "+color); - if(AllZoneUtil.isCardInPlay(crd)) { - String[] colors = creatureMap.get(crd); - for(String col:colors) { - crd.removeExtrinsicKeyword("Protection from " + col); - } - } - } - };//Command - AllZone.EndOfTurn.addUntil(atEOT); - } - } - }; - Input runtime = new Input() { - private static final long serialVersionUID = -2171146532836387392L; - - @Override - public void showMessage() { - CardList creats = AllZoneUtil.getPlayerTypeInPlay(card.getController(), "Merfolk"); - - stopSetNext(CardFactoryUtil.input_targetSpecific(ability, creats, "Select a target Merfolk", - true, false)); - } - }; - ability.setDescription("1 W: Target Merfolk you control gains protection from the color of your choice until end of turn."); - ability.setBeforePayMana(runtime); - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Meddling Mage")) { + 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()) { + 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.HumanPlayer)); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer)); + 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) { + + if (list.size() > 0) { CardList rare; rare = list; rare = rare.filter(new CardListFilter() { @@ -2967,8 +1851,8 @@ public class CardFactory_Creatures { return c.getRarity().equals("Rare"); } }); - - if(rare.size() > 0) { + + if (rare.size() > 0) { s = rare.get(CardUtil.getRandomIndex(rare)).getName(); } else { Card c = list.get(CardUtil.getRandomIndex(list)); @@ -2976,33 +1860,33 @@ public class CardFactory_Creatures { s = c.getName(); } } - + card.setNamedCard(s); - + } - + } }; Command comesIntoPlay = new Command() { private static final long serialVersionUID = 8485080996453793968L; - + public void execute() { - AllZone.Stack.addSimultaneousStackEntry(ability); + 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")) { + 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()) { + if (card.getController().isHuman()) { String color = ""; String[] colors = Constant.Color.Colors; @@ -3013,12 +1897,12 @@ public class CardFactory_Creatures { card.setChosenColor(color); } else { CardList list = new CardList(); - list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer)); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); + list.addAll(AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer())); + list.addAll(AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer())); - if(list.size() > 0) { + if (list.size() > 0) { String color = CardFactoryUtil.getMostProminentColor(list); - if(!color.equals("")) card.setChosenColor(color); + if (!color.equals("")) card.setChosenColor(color); else card.setChosenColor("black"); } else { card.setChosenColor("black"); @@ -3028,150 +1912,102 @@ public class CardFactory_Creatures { };//Command card.addComesIntoPlayCommand(comesIntoPlay); }//*************** END ************ END ************************** - + //*************** START *********** START ************************** - else if(cardName.equals("Singe-Mind Ogre")) { + 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); + 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.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }; card.addComesIntoPlayCommand(intoPlay); }//*************** END ************ END ************************** - + //*************** START *********** START ************************** - else if(cardName.equals("Chronatog")) { - - final Command untilEOT = new Command() { - private static final long serialVersionUID = 6926430725410883578L; - - public void execute() { - if(AllZoneUtil.isCardInPlay(card)) { - card.addTempAttackBoost(-3); - card.addTempDefenseBoost(-3); - } - } - }; - - Cost abCost = new Cost("0", cardName, true); - final Ability_Activated ability = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = -8345060615720565828L; - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(card)) { - card.addTempAttackBoost(3); - card.addTempDefenseBoost(3); - AllZone.EndOfTurn.addUntil(untilEOT); - - AllZone.Phase.skipTurn(card.getController()); - } - } - - @Override - public boolean canPlayAI() { - return false; - } - }; - ability.getRestrictions().setActivationLimit(1); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" gets +3/+3 until end of turn, "); - sb.append(card.getController()).append(" skips his/her next turn."); - ability.setStackDescription(sb.toString()); - - ability.setDescription("0: Chronatog gets +3/+3 until end of turn. You skip your next turn. Activate this ability only once each turn."); - - card.addSpellAbility(ability); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Kinsbaile Borderguard")) { + 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); + && !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.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }; - + final SpellAbility ability2 = new Ability(card, "0") { @Override public void resolve() { - for(int i = 0; i < card.sumAllCounters(); i++) { + 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[] {""}); + 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.Stack.addSimultaneousStackEntry(ability2); + "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")) { + else if (cardName.equals("Arctic Nishoba")) { final Ability ability = new Ability(card, "0") { @Override public void resolve() { @@ -3179,86 +2015,85 @@ public class CardFactory_Creatures { 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.Stack.addSimultaneousStackEntry(ability); + 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")) { + 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.GameAction.moveToPlay(card); + AllZone.getGameAction().moveToPlay(card); } - + @Override public boolean canPlay() { - return super.canPlay() && AllZone.Phase.getPlayerTurn().equals(card.getController()) - && !AllZone.Phase.getPhase().equals("End of Turn") + 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); + 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.Stack.addSimultaneousStackEntry(ability); + 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") || + 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") { + cardName.equals("Joraga Warcaller")) { + final Ability_Static ability = new Ability_Static(card, "0") { @Override public void resolve() { card.addCounter(Counters.P1P1, card.getMultiKickerMagnitude()); @@ -3269,680 +2104,577 @@ public class CardFactory_Creatures { 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.Stack.addSimultaneousStackEntry(ability); + 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("Tribal Forcemage")) { - /* - * Morph: 1G - * 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. - */ - final Command turnsFaceUp = new Command() { - private static final long serialVersionUID = 2826741404979610245L; - - public void execute() { - final int pump = 2; - final Command eot = new Command() { - private static final long serialVersionUID = -3638246921594162776L; - - public void execute() { - CardList type = AllZoneUtil.getCardsInPlay(); - type = type.getType(card.getChosenType()); - - for(int i = 0; i < type.size(); i++) { - Card c = type.get(i); - c.addTempAttackBoost(-pump); - c.addTempDefenseBoost(-pump); - c.removeExtrinsicKeyword("Trample"); - } - card.setChosenType(null); - } - }; - final SpellAbility ability = new Ability(card, "0") { - @Override - public void resolve() { - String chosenType = ""; - if(card.getController().isHuman()) { - chosenType = JOptionPane.showInputDialog(null, "Select a card type:", card.getName(), - JOptionPane.QUESTION_MESSAGE); - } - else { - //TODO - this could probably be updated to get the most prominent type in play - //wait until creature types are defined somewhere in Forge - chosenType = "Elf"; - } - card.setChosenType(chosenType); - CardList type = AllZoneUtil.getCardsInPlay(); - type = type.getType(chosenType); - for(int i = 0; i < type.size(); i++) { - Card c = type.get(i); - c.addTempAttackBoost(pump); - c.addTempDefenseBoost(pump); - c.addExtrinsicKeyword("Trample"); - } - AllZone.EndOfTurn.addUntil(eot); - } - };//SpellAbility - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - chosen type gets +2/+2 and Trample until EOT"); - ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); - - }//execute - };//command - - card.addTurnFaceUpCommand(turnsFaceUp); - }//*************** 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.HumanPlayer); - 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++) { + 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; + } + } + };//SpellAbility - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(intoPlay); + Command comesIntoPlay = new Command() { + private static final long serialVersionUID = -3734151854295L; - } - }; - - 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("Dawnglare Invoker")) { - /* - * 8: Tap all creatures target player controls. - */ - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("8", cardName, true); + public void execute() { + AllZone.getStack().addSimultaneousStackEntry(intoPlay); - final SpellAbility ability = new Ability_Activated(card, cost, t) { - private static final long serialVersionUID = 3822525186243879729L; + } + }; - @Override - public boolean canPlayAI() { - CardList human = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - human = human.filter(AllZoneUtil.tapped); - return human.size() > 0 && AllZone.Phase.getPhase().equals("Main1"); - } - @Override - public void resolve() { - final Player player = getTargetPlayer(); - CardList creatures = AllZoneUtil.getCreaturesInPlay(player); - for(Card c:creatures) { - //no need to check if they're already tapped, c.tap() already does that - c.tap(); - } - } - }; - card.addSpellAbility(ability); - ability.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Vampire Hexmage")) { - /* - * Sacrifice Vampire Hexmage: Remove all counters from target permanent. - */ + 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()); - 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.ComputerPlayer, "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.HumanPlayer); - 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); + card.addComesIntoPlayCommand(comesIntoPlay); }//*************** 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]; + else if (cardName.equals("Vampire Hexmage")) { + /* + * Sacrifice Vampire Hexmage: Remove all counters from target permanent. + */ - Command intoPlay = new Command() { - private static final long serialVersionUID = -75234586897814L; + 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; - 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); - } - }); + @Override + public boolean canPlayAI() { - if(card.getController().isHuman()) { - if (creats.size() > 0) - { - List selection = GuiUtils.getChoicesOptional("Select creatures to sacrifice", creats.toArray()); + //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; + } + }); - numCreatures[0] = selection.size(); - for(int m = 0; m < selection.size(); m++) { - intermSumPower += selection.get(m).getBaseAttack(); - intermSumToughness += selection.get(m).getBaseDefense(); - AllZone.GameAction.exile(selection.get(m)); - } - } + if (list.size() > 0) { + tgt.addTarget(list.get(0)); + return true; + } - }//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.GameAction.exile(c); - count++; - } - //is this needed? - AllZone.Computer_Battlefield.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.clearFirstSpellAbility(); - card.addComesIntoPlayCommand(intoPlay); - card.addSpellAbility(new Spell_Permanent(card) { - private static final long serialVersionUID = 304885517082977723L; + //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; + } + }); - @Override - public boolean canPlayAI() { - //get all creatures - CardList list = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - list = list.filter(AllZoneUtil.creatures); - return 0 < list.size(); - } - }); - }//*************** END ************ END ************************** + if (list.size() > 0) { + tgt.addTarget(list.get(0)); + return true; + } - - //*************** 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; + return false; + } - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(ability); - - } - }; - - StringBuilder sb = new StringBuilder(); - sb.append(cardName).append(" - pay any amount of life."); - ability.setStackDescription(sb.toString()); - - card.addComesIntoPlayCommand(intoPlay); + @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("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); + + //*************** 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("Shapeshifter")) { - Command intoPlay = new Command() { - private static final long serialVersionUID = 5447692676152380940L; + 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(); - 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); - } - } - }; + CardList grave = AllZoneUtil.getPlayerGraveyard(opp); + grave = grave.filter(AllZoneUtil.white); + max += grave.size(); - card.addComesIntoPlayCommand(intoPlay); + 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("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.InputControl.setInput(new Input() { - private static final long serialVersionUID = 6150236529653275947L; - CardList revealed = new CardList(); + 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. + */ - @Override - public void showMessage() { - //in case hand is empty, don't do anything - if (AllZoneUtil.getPlayerHand(card.getController()).size() == 0) stop(); + Cost abCost = new Cost("X T", cardName, true); + Target tgt = new Target(card, "TgtCP"); - AllZone.Display.showMessage(card.getName()+" - Reveal an artifact. Revealed "+revealed.size()+" so far. Click OK when done."); - ButtonUtil.enableOnlyOK(); - } + final Ability_Activated ability = new Ability_Activated(card, abCost, tgt) { + private static final long serialVersionUID = 2755743211116192949L; - @Override - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Hand) && c.isArtifact() && !revealed.contains(c)) { - revealed.add(c); + @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() - //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(); - } + @Override + public boolean canPlayAI() { + return false; + } - 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(); + };//SpellAbility - 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); + 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("Necratog")) { + 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; + private static final long serialVersionUID = 6743592637334556854L; - public void execute() { - if(AllZoneUtil.isCardInPlay(card)) { + 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 + + @Override public boolean canPlay() { - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - grave = grave.filter(AllZoneUtil.creatures); - return super.canPlay() && grave.size() > 0; + 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)) { + if (AllZoneUtil.isCardInPlay(card)) { card.addTempAttackBoost(2); card.addTempDefenseBoost(2); - AllZone.EndOfTurn.addUntil(untilEOT); + 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.Display.showMessage(card.getName()+" - Select OK to exile "+topCreature+"."); - ButtonUtil.enableAll(); - } - - public void selectButtonOK() { - AllZone.GameAction.exile(topCreature); - AllZone.Stack.add(ability); - stop(); - } - - public void selectButtonCancel() { - stop(); - } + 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 + + //*************** 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.GameAction.moveToPlay(card); + 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(); + 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(card)) { - p.setSkipNextUntap(true); - for(Card c:targetPerms) { - if(AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { - c.tap(); - } - } - } - targetPerms.clear(); + 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.Display.showMessage("Select up to 5 target permanents. Selected ("+targetPerms.size()+") so far. Click OK when done."); + 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(); + 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.Stack.add(ability); - stop(); + //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); - } - } + 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.Display.showMessage(card.getName()+" - Select target player"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectPlayer(Player p) { - if(p.canTarget(card)) { - ability.setTargetPlayer(p); - stopSetNext(targetInput); - } - } - - @Override - public void selectButtonCancel() { stop(); } + 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(); + Player player = card.getController(); CardList list = CardFactoryUtil.AI_getHumanCreature(card, true); - - if(player.isHuman()) AllZone.InputControl.setInput(playerInput); - else if(list.size() != 0) { + + if (player.isHuman()) AllZone.getInputControl().setInput(playerInput); + else if (list.size() != 0) { Card target = CardFactoryUtil.AI_getBestCreature(list); ability.setTargetCard(target); - AllZone.Stack.addSimultaneousStackEntry(ability); + AllZone.getStack().addSimultaneousStackEntry(ability); } }//execute() @@ -3950,524 +2682,424 @@ public class CardFactory_Creatures { 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.Display.showMessage(toDisplay); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonOK() { - done(); - } - - @Override - public void selectButtonCancel() { - toSac.clear(); - AllZone.GameAction.sacrifice(card); - stop(); - } - - @Override - public void selectCard(Card c, PlayerZone zone) { - if(c.isCreature() && zone.is(Constant.Zone.Battlefield, AllZone.HumanPlayer) - && !toSac.contains(c)) { - toSac.add(c); - } - showMessage(); - }//selectCard() - - private void done() { - if(getTotalPower() >= 12) { - for(Card sac:toSac) AllZone.GameAction.sacrifice(sac); - } - else { - AllZone.GameAction.sacrifice(card); - } - toSac.clear(); - stop(); - } - };//Input - AllZone.InputControl.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.Stack.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 CardFactory cfact = cf; - final Card[] copyTarget = new Card[1]; - final Card[] cloned = new Card[1]; - - final SpellAbility copyBack = new Ability(card, "0") { + 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.GameAction.moveTo(dest, orig); + AllZone.getGameAction().moveTo(dest, orig); dest.remove(card.getCurrentlyCloningCard()); - } - };//SpellAbility - - final Command leaves = new Command() { - private static final long serialVersionUID = 8590474793502538215L; - - public void execute() { - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - reverting self to "+card.getName()+"."); - copyBack.setStackDescription(sb.toString()); - - //Slight hack if the cloner copies a card with triggers - AllZone.TriggerHandler.removeAllFromCard(cloned[0]); - - AllZone.Stack.addSimultaneousStackEntry(copyBack); } }; - - 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) { - cloned[0] = CardFactory.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); - } - - for(SpellAbility sa : copyTarget[0].getSpellAbilities()) { - cloned[0].addSpellAbility(sa); - } - - //Slight hack in case the cloner copies a card with triggers - for(Trigger t : cloned[0].getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(t); - } - - AllZone.GameAction.moveToPlay(cloned[0]); - card.setCurrentlyCloningCard(cloned[0]); - } - } - };//SpellAbility - - Input runtime = new Input() { - private static final long serialVersionUID = 7615038074569687330L; + final SpellAbility copy = new Spell(card) { + private static final long serialVersionUID = 4496978456522751302L; - @Override - public void showMessage() { - String message = "Select a creature "; - if(cardName.equals("Phyrexian Metamorph")) message += "or artifact "; - message += "on the battlefield"; - AllZone.Display.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.clearFirstSpellAbility(); - 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("Anurid Brushhopper")) { - - final SpellAbility toPlay = new Ability(card, "0") { @Override public void resolve() { - AllZone.GameAction.moveToPlay(card); + 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]); + } } - }; //ability - StringBuilder sb = new StringBuilder(); - sb.append("Return "+card+" to the battlefield."); - toPlay.setStackDescription(sb.toString()); - - final Command eot = new Command() { - private static final long serialVersionUID = 911163814565333484L; + };//SpellAbility - public void execute() { - AllZone.Stack.addSimultaneousStackEntry(toPlay); + 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)); + } + } }; - - final Cost abCost = new Cost("Discard<2/Card>", cardName, true); - final Ability_Activated toExile = new Ability_Activated(card, abCost, null) { - private static final long serialVersionUID = 7850843970664800204L; - - public void resolve() { - AllZone.GameAction.exile(card); - AllZone.EndOfTurn.addAt(eot); - } - }; - toExile.setDescription(abCost+"Exile CARDNAME. Return it to the battlefield under its owner's control at the beginning of the next end step."); - toExile.setStackDescription(card+" - exile "+card+"."); - card.addSpellAbility(toExile); + // 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("Frost Titan")) { - final Trigger targetedTrigger = TriggerHandler.parseTrigger("FrostTitanCounter","Mode$ SpellAbilityCast | TargetsValid$ Card.Self | ValidControllingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigOverridden | TriggerDescription$ Whenever CARDNAME becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays 2.", card); - final Ability FrostTitanCounterAbility = new Ability(card,"0") - { - @Override - public void resolve() { - Trigger trig = card.getNamedTrigger("FrostTitanCounter"); - HashMap runParams = trig.getRunParams(); - final SpellAbility tgtSA = (SpellAbility)runParams.get("CastSA"); - - Ability ability = new Ability(card, "2") { - @Override - public void resolve() { - ; - } - }; - - final Command unpaidCommand = new Command() { - private static final long serialVersionUID = 8094833091127334678L; - - public void execute() { - AllZone.Stack.remove(tgtSA); - if(tgtSA.isSpell()) - AllZone.GameAction.moveToGraveyard(tgtSA.getSourceCard()); - } - }; - - if(tgtSA.getActivatingPlayer().isHuman()) - { - GameActionUtil.payManaDuringAbilityResolve(card + "\r\n", ability.getManaCost(), - Command.Blank, unpaidCommand); - } - else - { - if(ComputerUtil.canPayCost(ability)) ComputerUtil.playNoStack(ability); - else { - AllZone.Stack.remove(tgtSA); - if(tgtSA.isSpell()) - AllZone.GameAction.moveToGraveyard(tgtSA.getSourceCard()); - } - } - } - - }; - - targetedTrigger.setOverridingAbility(FrostTitanCounterAbility); - - card.addTrigger(targetedTrigger); - }//*************** 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; + //*************** 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 + @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() { - sub.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."); + 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; + 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 boolean canPlayAI() { + return false; + } - @Override - public void resolve() { - final Card target = getTargetCard(); + @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.EndOfTurn.addUntil(new Command() { - private static final long serialVersionUID = -3332692040606224591L; + 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 - 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."); - + 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(",")); + 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; + private static final long serialVersionUID = 6724781940648179318L; - @Override + @Override public boolean canPlayAI() { return false; } - + @Override public void resolve() { - final Card tgt = getTargetCard(); - final boolean[] win = new boolean[1]; + 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; + if (GameActionUtil.flipACoin(card.getController(), card)) { + tgt.addTempAttackBoost(2); + win[0] = true; + } else { + tgt.addTempDefenseBoost(-2); + win[0] = false; + } - public void execute() { + 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); + if (win[0]) { + tgt.addTempAttackBoost(-2); + } else { + tgt.addTempDefenseBoost(2); } } } }; - AllZone.EndOfTurn.addUntil(EOT); + 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."); + 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 +/* + //*************** 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)); + 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()); + GuiUtils.getChoice("Top three cards of " + player + "'s library", toDisplay.toArray()); } else { - StringBuilder sb = new StringBuilder(); + 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); } @@ -4480,35 +3112,35 @@ public class CardFactory_Creatures { };//SpellAbility - ability.setDescription(abCost+"Look at the top three cards of target player's library."); + 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")) - { + 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"); + 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) + if (!AllZone.getZone(card).is("Battlefield") || getTarget().getTargetCards().size() == 0) return; final Card c = getTarget().getTargetCards().get(0); - String[] types = { "Creature", "Treefolk" }; - String[] keywords = { }; + 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 = { "" }; + String[] types = {"Creature", "Treefolk"}; + String[] keywords = {""}; CardFactoryUtil.revertManland(tgt, types, keywords, "G", stamp); } }; @@ -4520,58 +3152,134 @@ public class CardFactory_Creatures { 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 ************************** - if(hasKeyword(card, "Level up") != -1 && hasKeyword(card, "maxLevel") != -1) - { - int n = hasKeyword(card, "Level up"); - int m = hasKeyword(card, "maxLevel"); - if(n != -1) { + //*************** 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; - } - + 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 index 8174c1d62c3..425d861e342 100644 --- a/src/forge/card/cardFactory/CardFactory_Equipment.java +++ b/src/forge/card/cardFactory/CardFactory_Equipment.java @@ -1,424 +1,429 @@ - -package forge.card.cardFactory; - - -import java.util.ArrayList; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardUtil; -import forge.Command; -import forge.Constant; -import forge.Counters; -import forge.Phase; -import forge.Player; -import forge.PlayerZone; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.card.trigger.Trigger; -import forge.card.trigger.TriggerHandler; -import forge.gui.input.Input; - - -class CardFactory_Equipment { - - 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; - } - - - 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.EndOfTurn.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.ComputerPlayer); - 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.Display.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.InputControl.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.Stack.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; - } -} +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 index e77e4502c60..1d0a12cc5a7 100644 --- a/src/forge/card/cardFactory/CardFactory_Instants.java +++ b/src/forge/card/cardFactory/CardFactory_Instants.java @@ -1,1688 +1,1573 @@ -package forge.card.cardFactory; - -import java.util.ArrayList; - -import javax.swing.JOptionPane; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Combat; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.MyRandom; -import forge.PhaseUtil; -import forge.Player; -import forge.PlayerZone; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input; -import forge.gui.input.Input_PayManaCost; - - -public class CardFactory_Instants { - - 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.HumanPlayer)); - list.addAll(AllZoneUtil.getPlayerHand(AllZone.HumanPlayer)); - - 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.EndOfTurn.addUntil(untilEOT); - }//if - }//for - }//resolve - };//SpellAbility - - card.setSVar("PlayMain1", "TRUE"); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - /* - //*************** START *********** START ************************** - else if(cardName.equals("Wings of Velis Vel")) { - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -5744842090293912606L; - - @Override - public boolean canPlayAI() { - CardList small = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - //try to make a good attacker - if(0 < small.size()) { - CardListUtil.sortAttackLowFirst(small); - setTargetCard(small.get(0)); - - return true && AllZone.Phase.getPhase().equals(Constant.Phase.Main1); - } - - return false; - }//canPlayAI() - - @Override - public void resolve() { - //in case ability is played twice - final int[] oldAttack = new int[1]; - final int[] oldDefense = new int[1]; - - final Card card[] = new Card[1]; - card[0] = getTargetCard(); - - oldAttack[0] = card[0].getBaseAttack(); - oldDefense[0] = card[0].getBaseDefense(); - - card[0].setBaseAttack(4); - card[0].setBaseDefense(4); - card[0].addExtrinsicKeyword("Flying"); - card[0].addExtrinsicKeyword("HIDDEN Changeling"); - - //EOT - final Command untilEOT = new Command() { - private static final long serialVersionUID = 7236360479349324099L; - - public void execute() { - card[0].setBaseAttack(oldAttack[0]); - card[0].setBaseDefense(oldDefense[0]); - - card[0].removeExtrinsicKeyword("Flying"); - card[0].removeExtrinsicKeyword("HIDDEN Changeling"); - } - }; - - AllZone.EndOfTurn.addUntil(untilEOT); - }//resolve() - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - - spell.setBeforePayMana(CardFactoryUtil.input_targetCreature(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.GameAction.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); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.moveTo(Hand, Pile1.get(i)); - for(int i = 0; i < Pile2.size(); i++) AllZone.GameAction.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.GameAction.moveTo(Hand, Pile2.get(i)); - for(int i = 0; i < Pile1.size(); i++) AllZone.GameAction.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.GameAction.moveTo(Hand, Pile1.get(i)); - for(int i = 0; i < Pile2.size(); i++) AllZone.GameAction.moveToGraveyard(Pile2.get(i)); - } else { - for(int i = 0; i < Pile2.size(); i++) AllZone.GameAction.moveTo(Hand, Pile2.get(i)); - for(int i = 0; i < Pile1.size(); i++) AllZone.GameAction.moveToGraveyard(Pile1.get(i)); - } - } - Pile1.clear(); - Pile2.clear(); - }//resolve() - - @Override - public boolean canPlayAI() { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - return cards.size() >= 10; - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.EndOfTurn.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.EndOfTurn.addUntil(new Command() { - private static final long serialVersionUID = 5151337777143949221L; - - public void execute() { - crd.addTempAttackBoost(2); - crd.addTempDefenseBoost(2); - } - }); - } - - }//in play? - }//resolve() - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.HumanPlayer.getLife() == 10; - } - - }; - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.Phase.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.GameAction.exile(sameName.get(i)); - else { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, sameName.get(i).getOwner()); - AllZone.GameAction.moveTo(hand, sameName.get(i)); - } - }//for - }//if (!isFaceDown()) - else { - PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, getTargetCard().getOwner()); - AllZone.GameAction.moveTo(hand, getTargetCard()); - } - }//resolve() - };//SpellAbility - Input target = new Input() { - private static final long serialVersionUID = -3978705328511825933L; - - @Override - public void showMessage() { - AllZone.Display.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.Stack.add(spell); - stop(); - } - else - stopSetNext(new Input_PayManaCost(spell)); - } - } - };//Input - - card.setSVar("PlayMain1", "TRUE"); - - spell.setBeforePayMana(target); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.moveToHand(target); - } - }//resolve() - };//tBanish; - tBanish.setDescription(abCost+"Return target nonland permanent to its owner's hand."); - creature.addSpellAbility(tBanish); - AllZone.EndOfTurn.addUntil(new Command() { - private static final long serialVersionUID = -7819140065166374666L; - - public void execute() { - creature.removeSpellAbility(tBanish); - } - }); - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - - 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.HumanPlayer); - 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.GameAction.moveToHand(choice); - - for(Card trash : selectedCards) - AllZone.GameAction.moveToGraveyard(trash); - } - - public void computerResolve() { - CardList list = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer); - 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.GameAction.moveToHand(choice); - - for(Card trash : selectedCards) - AllZone.GameAction.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.ComputerPlayer); - creature = creature.getType("Creature"); - return creature.size() >= 3; - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.ComputerPlayer); - 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.EndOfTurn.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.EndOfTurn.addUntil(new Command() - { - private static final long serialVersionUID = 5151337777143949221L; - - public void execute() - { - crd.addTempAttackBoost(-2); - crd.addTempDefenseBoost(-2); - } - }); - } - - }//in play? - }//resolve() - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.HumanPlayer); - humanArts = humanArts.getType("Artifact"); - return humanArts.size() > 0; - }//canPlayAI - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.HumanPlayer); - }//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.GameAction.moveToHand(thisArtifact); - } - } - }//resolve() - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.exile(c_1); - } - } - else { //Computer - //Random random = MyRandom.random; - for(int j = 0; j < X; j++) { - //int index = random.nextInt(X-j); - AllZone.GameAction.exile(graveList.get(j)); - } - } - - tPlayer.loseLife(X, card); - player.gainLife(X, card); - card.setXManaCostPaid(0); - } - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.HumanPlayer); - }//chooseTargetAI() - - @Override - public boolean canPlayAI() { - CardList graveList = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); - - final int maxX = ComputerUtil.getAvailableMana().size() - 1; - return (maxX >= 3) && (graveList.size() > 0); - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.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.GameAction.moveToHand(c); - stop = 1; - } - - } else if(stop == 0) { - AllZone.GameAction.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 - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - - 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.Phase.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()); - } - } - Command atEOT = new Command() { - private static final long serialVersionUID = 5369528776959445848L; - - public void execute() { - 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.GameAction.destroy(creature); - } - } - creature.setSirenAttackOrDestroy(false); - } - }//execute - };//Command - AllZone.EndOfTurn.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()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Mana Short")) { - /* - * Tap all lands target player controls and empty his or her mana pool. - */ - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("2 U", cardName, false); - - final SpellAbility spell = new Spell(card, cost, t) { - private static final long serialVersionUID = -2175586347805121896L; - - @Override - public boolean canPlayAI() { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - lands = lands.filter(AllZoneUtil.untapped); - return lands.size() > 0 || !AllZone.ManaPool.isEmpty(); - } - - @Override - public void resolve() { - CardList lands = AllZoneUtil.getPlayerLandsInPlay(getTargetPlayer()); - for(Card c:lands) c.tap(); - if(getTargetPlayer().isHuman()) AllZone.ManaPool.clearPool(); - }//resolve() - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - }//*************** 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.GameAction.moveToHand(c1); - else if(i == 1) AllZone.GameAction.moveToLibrary(c1); - else if(i == 2) AllZone.GameAction.moveToBottomOfLibrary(c1); - - choices.remove(c1); - } - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.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.HumanPlayer); - AllZone.GameAction.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.Display.showMessage(sb.toString()); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - targets.clear(); - AllZone.GameAction.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); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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(card)) { - ((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.HumanPlayer); - AllZone.GameAction.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.Display.showMessage(sb.toString()); - ButtonUtil.enableAll(); - } - - @Override - public void selectButtonCancel() { - targets.clear(); - AllZone.GameAction.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(card) && !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); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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 0) { - SpellAbility sa = AllZone.Stack.peekAbility(); - if(sa.isSpell()) { - AllZone.Stack.pop(); - AllZone.GameAction.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.GameAction.moveToHand(getTargetCard()); - } - } - - //"Tap all creatures your opponents control", - for(int i = 0; i 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.Display.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.Stack.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 - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.GameAction.moveToHand(c); - - for(Card c:ens) { - if(!toReturn.contains(c)) AllZone.GameAction.destroy(c); - } - } - }; - - spell.setStackDescription(card+" - destroy/return enchantments."); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.HumanPlayer); - 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.HumanPlayer); - 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()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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 - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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."); - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - return card; - }//getCard -} +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 index dac99728c8e..a09cb383ffb 100644 --- a/src/forge/card/cardFactory/CardFactory_Lands.java +++ b/src/forge/card/cardFactory/CardFactory_Lands.java @@ -1,885 +1,988 @@ - -package forge.card.cardFactory; - -import java.util.HashMap; - -import javax.swing.JOptionPane; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardUtil; -import forge.Command; -import forge.Constant; -import forge.Counters; -import forge.GameActionUtil; -import forge.MyRandom; -import forge.Player; -import forge.PlayerZone; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -class CardFactory_Lands { - - public static Card getCard(final Card card, final String cardName, Player owner, CardFactory 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.ComputerPlayer.getLife() > 9) pay = MyRandom.random.nextBoolean(); - - if(pay) AllZone.ComputerPlayer.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.HumanPlayer.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.ComputerPlayer); - 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.HumanPlayer); - 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.EndOfTurn.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.InputControl.setInput(CardFactoryUtil.input_targetSpecific(a[0], creats, "Select target creature you control", false, false)); - } else { - AllZone.Stack.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.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).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.Phase.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.GameAction.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.GameAction.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.Phase.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.Phase.getPhase().equals(Constant.Phase.Main1) && AllZone.Phase.getPlayerTurn().isComputer())) - return false; - inPlay.clear(); - inPlay.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - 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.Display.showMessage(cardName+" - Select an untapped land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); - stop(); - } - public void selectCard(Card c, PlayerZone zone) { - if(c.isLand() && zone.is(Constant.Zone.Battlefield) && c.isUntapped()) { - AllZone.GameAction.sacrifice(c); - if(paid[0] < 1) { - paid[0]++; - AllZone.Display.showMessage(cardName+" - Select an untapped land to sacrifice"); - } - else stop(); - } - }//selectCard() - };//Input - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer).filter(AllZoneUtil.untapped).size() < 2)) { - AllZone.GameAction.sacrifice(card); - return; - } - else AllZone.InputControl.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.GameAction.sacrifice(tappedLand.get(0)); - } - else { - AllZone.GameAction.sacrifice(land.get(0)); - } - } - else { - AllZone.GameAction.sacrifice(card); - } - } - else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = 6653677835621129465L; - public void showMessage() { - AllZone.Display.showMessage(cardName+" - Select one "+type[0]+" to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); - stop(); - } - public void selectCard(Card c, PlayerZone zone) { - if(c.isLand() && zone.is(Constant.Zone.Battlefield) && land.contains(c)) { - AllZone.GameAction.sacrifice(c); - stop(); - } - }//selectCard() - };//Input - AllZone.InputControl.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.GameAction.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.GameAction.sacrifice(c); - for(int i = 0; i < tappedPlains.size(); i++){ - AllZone.GameAction.sacrifice(plains.get(i)); - } - //if any are tapped, sacrifice it - //else sacrifice random - } - else { - AllZone.GameAction.sacrifice(card); - } - } - else { //this is the human resolution - final int[] paid = {0}; - if ((AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer).filter(AllZoneUtil.untapped).size() < 2)) - { - AllZone.GameAction.sacrifice(card); - return; - } - Input target = new Input() { - private static final long serialVersionUID = 6653677835621129465L; - public void showMessage() { - AllZone.Display.showMessage("Scorched Ruins - Select an untapped land to sacrifice"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); - stop(); - } - public void selectCard(Card c, PlayerZone zone) { - if(c.isLand() && zone.is(Constant.Zone.Battlefield) && c.isUntapped()) { - AllZone.GameAction.sacrifice(c); - if(paid[0] < 1){ - paid[0]++; - AllZone.Display.showMessage("Scorched Ruins - Select an untapped land to sacrifice"); - } - else stop(); - } - }//selectCard() - };//Input - AllZone.InputControl.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.Stack.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.ComputerPlayer); - hand = hand.filter(AllZoneUtil.getTypeFilter(type)); - if(hand.size() > 0) revealCard(hand.get(0)); - else card.tap(); - } - - public void humanExecute() { - AllZone.InputControl.setInput(new Input() { - private static final long serialVersionUID = -2774066137824255680L; - - @Override - public void showMessage() { - AllZone.Display.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.Stack.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.GameAction.moveToHand(CardFactoryUtil.getWorstLand(tappedLand)); - } - else { - AllZone.GameAction.moveToHand(CardFactoryUtil.getWorstLand(land)); - } - } - else { - AllZone.GameAction.sacrifice(card); - } - } - else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = 7944127258985401036L; - public void showMessage() { - AllZone.Display.showMessage(cardName+" - Select one non-Lair land to return to your hand"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); - stop(); - } - public void selectCard(Card c, PlayerZone zone) { - if (c.isLand() - && zone.is(Constant.Zone.Battlefield, AllZone.HumanPlayer) - && !c.isType("Lair")) { - AllZone.GameAction.moveToHand(c); - stop(); - } - }//selectCard() - };//Input - AllZone.InputControl.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.GameAction.moveToHand(c); - } - else { - AllZone.GameAction.sacrifice(card); - } - } - else { //this is the human resolution - Input target = new Input() { - private static final long serialVersionUID = -7886610643693087790L; - - public void showMessage() { - AllZone.Display.showMessage(card+" - Select one untapped "+type[0]+" to return"); - ButtonUtil.enableOnlyCancel(); - } - public void selectButtonCancel() { - AllZone.GameAction.sacrifice(card); - stop(); - } - public void selectCard(Card c, PlayerZone zone) { - if(zone.is(Constant.Zone.Battlefield) && land.contains(c)) { - AllZone.GameAction.moveToHand(c); - stop(); - } - }//selectCard() - };//Input - AllZone.InputControl.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.Stack.addSimultaneousStackEntry(sacOrNo); - } - }; - - card.addComesIntoPlayCommand(comesIntoPlay); - }//*************** END ************ END ************************** - - return card; - } - -} +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 index a7e0962e54b..b25d328416f 100644 --- a/src/forge/card/cardFactory/CardFactory_Planeswalkers.java +++ b/src/forge/card/cardFactory/CardFactory_Planeswalkers.java @@ -1,1773 +1,1754 @@ - -package forge.card.cardFactory; - - -import java.util.HashMap; - -import com.esotericsoftware.minlog.Log; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.CombatUtil; -import forge.Command; -import forge.Constant; -import forge.Counters; -import forge.GameActionUtil; -import forge.Player; -import forge.PlayerZone; -import forge.Phase; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Activated; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - - -class CardFactory_Planeswalkers { - 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.Phase.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.EndOfTurn.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.Phase.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.Phase.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.getOwner()); - - AllZone.GameAction.moveToPlay(emblem); - - //AllZone.GameAction.checkStateEffects(); - AllZone.StaticEffects.rePopulateStateBasedList(); - for(String effect:AllZone.StaticEffects.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.Phase.getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.Phase.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.Phase.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.Phase.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.EndOfTurn.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.Phase.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.Phase.getTurn()) { - check = AllZone.Phase.getTurn(); - turn[0] = AllZone.Phase.getTurn(); - AllZone.Stack.add(ability2); - } - stop(); - }//showMessage() - }); - - //ability3 - final SpellAbility ability3 = new Ability(card, "0") { - @Override - public void resolve() { - card.subtractCounter(Counters.LOYALTY, 6); - turn[0] = AllZone.Phase.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.Phase.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.Phase.getTurn()) { - check = AllZone.Phase.getTurn(); - turn[0] = AllZone.Phase.getTurn(); - AllZone.Stack.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.Phase.getTurn(); - - - card.getController().gainLife(2, card); - Log.debug("Ajani Goldmane", "current phase: " + AllZone.Phase.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.Phase.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.Phase.getTurn()) { - check = AllZone.Phase.getTurn(); - turn[0] = AllZone.Phase.getTurn(); - AllZone.Stack.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.Phase.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.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.getTurn() - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.HumanPlayer); - setStackDescription("Chandra Nalaar - deals 1 damage to " + AllZone.HumanPlayer); - return card.getCounters(Counters.LOYALTY) < 8; - } - };//SpellAbility ability1 - - Input target1 = new Input() { - private static final long serialVersionUID = 5263705146686766284L; - - @Override - public void showMessage() { - AllZone.Display.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.Stack.add(ability1); - stop(); - } - }//selectCard() - - @Override - public void selectPlayer(Player player) { - ability1.setTargetPlayer(player); - //stopSetNext(new Input_PayManaCost(ability1)); - AllZone.Stack.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.Phase.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.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Display.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.Display.showMessage("Cannot target this card (Shroud? Protection?)."); - } else if(c.isCreature()) { - turn[0] = AllZone.Phase.getTurn(); - - - damage2[0] = getDamage(); - - ability2.setTargetCard(c); - ability2.setStackDescription("Chandra Nalaar - deals damage to " + c); - - AllZone.Stack.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.Phase.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.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.getTurn() - && 7 < card.getCounters(Counters.LOYALTY) - && Phase.canCastSorcery(card.getController()); - } - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.HumanPlayer); - StringBuilder sb = new StringBuilder(); - sb.append("Chandra Nalaar - deals 10 damage to ").append(AllZone.HumanPlayer); - sb.append(" and each creature he or she controls."); - setStackDescription(sb.toString()); - //setStackDescription("Chandra Nalaar - deals 10 damage to " + AllZone.HumanPlayer - // + " 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.Display.showMessage("Select target player"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectPlayer(Player player) { - turn[0] = AllZone.Phase.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.Stack.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.GameAction.destroy(c); - } - }//resolve() - - @Override - public boolean canPlayAI() { - Player player = AllZone.HumanPlayer; - 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.Phase.getTurn(); - - //only computer uses the stack - CardList tapped = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.Phase.getPhase().equals(Constant.Phase.Main2); - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Display.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.Phase.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.Phase.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.GameAction.moveToPlay(c); - } - } - } - }//resolve() - - @Override - public boolean canPlay() { - for(int i = 0; i < AllZone.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(card)) return false; - } - - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Phase.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.EndOfTurn.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.EndOfTurn.addUntil(nonCreatureUntilEOT); - }//noncreature artifact - - } - }//for - }//resolve - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.getTurn() - && card.getCounters(Counters.LOYALTY) >= 5 - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.Phase.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.Phase.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.GameAction.moveToBottomOfLibrary(c); - } - - } - else //compy - { - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - - //TODO: improve this: - if(land.size() > 4 && c.isLand()) ; - else { - AllZone.GameAction.moveToBottomOfLibrary(c); - } - } - } - - @Override - public boolean canPlayAI() { - return card.getCounters(Counters.LOYALTY) < 12 && AllZone.Human_Library.size() > 2; - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Phase.getTurn(); - card.getController().drawCards(3); - - Player player = card.getController(); - if(player.isHuman()) humanResolve(); - //else - // computerResolve(); - } - - public void humanResolve() { - CardList putOnTop = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - - 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.GameAction.moveToLibrary(c1); - } - } - - putOnTop = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - - 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.GameAction.moveToLibrary(c2); - } - } - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Phase.getTurn(); - //card.subtractCounter(Counters.LOYALTY, 1); - - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - AllZone.GameAction.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.Phase.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.Phase.getTurn(); - //card.subtractCounter(Counters.LOYALTY, 12); - - Player player = getTargetPlayer(); - - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - CardList handList = AllZoneUtil.getPlayerHand(player); - - for(Card c:libList) - AllZone.GameAction.exile(c); - - for(Card c:handList) { - AllZone.GameAction.moveToLibrary(c); - } - player.shuffle(); - } - - @Override - public boolean canPlayAI() { - int libSize = AllZone.Human_Library.size(); - int handSize = AllZone.Human_Hand.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.Phase.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.Phase.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.GameAction.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.Phase.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.Phase.getTurn(); - - Card target = getTargetCard(); - AllZone.GameAction.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.ComputerPlayer); - return creatures.size() >= 1; - } - - @Override - public void chooseTargetAI() { - CardList cards = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - //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).getName()); - } - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && card.getCounters(Counters.LOYALTY) >= 2 - && turn[0] != AllZone.Phase.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.Phase.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.HumanPlayer); - CardList dragons = AllZoneUtil.getPlayerTypeInPlay(AllZone.ComputerPlayer, "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.Phase.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.Phase.getTurn(); - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - 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.Phase.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.Phase.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.GameAction.moveToPlay(emblem); - - //AllZone.GameAction.checkStateEffects(); - AllZone.StaticEffects.rePopulateStateBasedList(); - for(String effect:AllZone.StaticEffects.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.Phase.getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.Phase.getTurn()) { - check = AllZone.Phase.getTurn(); - turn[0] = AllZone.Phase.getTurn(); - AllZone.Stack.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.Phase.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.EndOfTurn.addUntil(untilEOT); - } - } - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.ComputerPlayer); - 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.Phase.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.GameAction.moveTo(play, AllZoneUtil.getCardState(c)); - } - }//execute() - };//Command - - card.addCounterFromNonEffect(Counters.LOYALTY, 2); - turn[0] = AllZone.Phase.getTurn(); - - AllZone.GameAction.exile(c); - AllZone.EndOfTurn.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.hasKeyword("When CARDNAME enters the battlefield, draw a card.") - || 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.Phase.getPhase().equals("Main2"); - } - - @Override - public boolean canPlay() { - for(int i = 0; i < AllZone.Stack.size(); i++) { - if(AllZone.Stack.peekInstance(i).equals(card)) return false; - } - return 0 < card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.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.Phase.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.EndOfTurn.addUntil(untilEOT); - }//if - }//for - - }//resolve() - - @Override - public boolean canPlay() { - return AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.getTurn() - && card.getCounters(Counters.LOYALTY) >= 1 - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.ComputerPlayer); - 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.Phase.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.Phase.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.GameAction.moveToPlay(emblem); - } - - @Override - public boolean canPlay() { - return 8 <= card.getCounters(Counters.LOYALTY) - && AllZone.getZone(card).is(Constant.Zone.Battlefield) - && turn[0] != AllZone.Phase.getTurn() - && Phase.canCastSorcery(card.getController()); - }//canPlay() - - @Override - public boolean canPlayAI() { - //multiple venser emblems are NOT redundant - /* - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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.. - 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() -} +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 index 90ee8258b7a..87c71fc0c44 100644 --- a/src/forge/card/cardFactory/CardFactory_Sorceries.java +++ b/src/forge/card/cardFactory/CardFactory_Sorceries.java @@ -1,717 +1,599 @@ package forge.card.cardFactory; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Vector; -import java.util.Map.Entry; - -import javax.swing.JOptionPane; - import com.esotericsoftware.minlog.Log; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Command; -import forge.ComputerUtil; -import forge.Constant; -import forge.HandSizeOp; -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.*; +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 { - - public static Card getCard(final Card card, final String cardName, Player owner) - { - + + /** + *

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")) { + 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.GameAction.changeController(new CardList(crd0), p0, p1); - AllZone.GameAction.changeController(new CardList(crd1), p1, p0); + + 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.Display.showMessage("Select target land you control."); - else AllZone.Display.showMessage("Select target land opponent controls."); - + 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 (index[0] == 0 && !c.getController().equals(card.getController())) return; - if(c.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { + //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()) { + + if (index[0] == target.length) { + if (this.isFree()) { this.setFree(false); - AllZone.Stack.add(spell); + 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 + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); spell.setBeforePayMana(runtime); }//*************** END ************ END ************************** - -/* - - //*************** START *********** START ************************** - else if(cardName.equals("Identity Crisis")) { - Target t = new Target(card, "Select target player", "Player"); - Cost cost = new Cost("2 W W B B", cardName, false); - - final SpellAbility spell = new Spell(card, cost, t) { - private static final long serialVersionUID = 42470566751344693L; - - @Override - public boolean canPlayAI() { - Player player = AllZone.HumanPlayer; - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(player); - return libList.size() > 0; - } - - @Override - public void resolve() { - Player player = getTargetPlayer(); - - CardList handList = AllZoneUtil.getPlayerHand(player); - CardList graveList = AllZoneUtil.getPlayerGraveyard(player); - - int max = handList.size(); - for(int i = 0; i < max; i++) { - Card c = handList.get(i); - AllZone.GameAction.exile(c); - } - int grv = graveList.size(); - for(int i = 0; i < grv; i++) { - Card c = graveList.get(i); - AllZone.GameAction.exile(c); - } - } - };//SpellAbility - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** 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){ + 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.GameAction.destroyNoRegeneration(list.get(i)); + + 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"); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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. - */ + 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; + 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; + public void execute() { + int i = 0; + for (Card target : targets) { + //if card isn't in play, do nothing + if (!AllZoneUtil.isCardInPlay(target)) continue; - AllZone.GameAction.changeController(new CardList(target), card.getController(), controllerEOT.get(i)); + AllZone.getGameAction().changeController(new CardList(target), card.getController(), controllerEOT.get(i)); - target.removeExtrinsicKeyword("Haste"); + target.removeExtrinsicKeyword("Haste"); - i++; - } + i++; + } }//execute() };//Command - + final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -532862769235091780L; + private static final long serialVersionUID = -532862769235091780L; - @Override + @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); + 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.GameAction.changeController(new CardList(target), target.getController(), card.getController()); + AllZone.getGameAction().changeController(new CardList(target), target.getController(), card.getController()); - target.untap(); - target.addExtrinsicKeyword("Haste"); - }//is card in play? - }//end for - AllZone.EndOfTurn.addUntil(untilEOT); + 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.HumanPlayer); - return creatures.size() > 0 && AllZone.Phase.getPhase().equals(Constant.Phase.Main1); + CardList creatures = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); + return creatures.size() > 0 && AllZone.getPhase().getPhase().equals(Constant.Phase.Main1); }//canPlayAI() - + };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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); - + 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 + + @Override public boolean canPlayAI() { - return AllZone.Phase.getPhase().equals(Constant.Phase.Main2); + 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()); + 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()); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Roiling Terrain")) { - Cost cost = new Cost("2 R R", cardName, false); - final Target tgt = new Target(card, "Select a Land", "Land".split(",")); - - SpellAbility spell = new Spell(card, cost, tgt) { - private static final long serialVersionUID = -65124658746L; - - @Override - public void resolve() { - Card c = tgt.getTargetCards().get(0); - - Player controller = c.getController(); - AllZone.GameAction.destroy(c); - - int damage = AllZoneUtil.getPlayerTypeInGraveyard(controller, "Land").size(); - - controller.addDamage(damage, card); - } - - @Override - public boolean canPlayAI() { - CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - - if (land.size() != 0) - return false; - tgt.resetTargets(); - tgt.addTarget(CardFactoryUtil.AI_getBestLand(land)); - - return true; - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Mind's Desire")) - { + else if (cardName.equals("Mind's Desire")) { final Spell PlayCreature = new Spell(card) { - private static final long serialVersionUID = 53838791023456795L; + 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]); + 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.Stack.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; + 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); } - 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.CardFactory.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.Stack.add(PlayCreature); - } else { - AllZone.GameAction.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; - } - + } + + 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; + private static final long serialVersionUID = 920148510259054021L; - public void execute() { - Player player = AllZone.Phase.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.GameAction.moveTo(RFG, c); - Minds_D.attachCard(c); - } - final Card Minds = card; - // AllZone.GameAction.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); + 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.Phase.getPlayerTurn(); - PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, player); - play.remove(Minds); - } - }; - AllZone.EndOfTurn.addUntil(untilEOT); - } + 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; + return false; } }; - + card.addComesIntoPlayCommand(intoPlay); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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; + 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.GameAction.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.GameAction.playCardNoCost(playing); - } - chosen.remove(playing); - } - - } - Pile1.clear(); - Pile2.clear(); - }//resolve() - - - @Override - public boolean canPlayAI() { - CardList cards = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer); - return cards.size() >= 8; - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Feudkiller's Verdict")) { - SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -5532477141899236266L; - @Override public void resolve() { - Player player = card.getController(); - player.gainLife(10, card); - - Player opponent = card.getController().getOpponent(); - - if(opponent.getLife() < player.getLife()) makeToken(); + + 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() - - void makeToken() { - CardFactoryUtil.makeToken("Giant Warrior", "W 5 5 Giant Warrior", card.getController(), "W", new String[] { - "Creature", "Giant", "Warrior"}, 5, 5, new String[] {""}); - }//makeToken() - + + + @Override + public boolean canPlayAI() { + CardList cards = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getComputerPlayer()); + return cards.size() >= 8; + } };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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){ + 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()) { + 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 @@ -720,190 +602,191 @@ public class CardFactory_Sorceries { //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; - + if (c.isLand()) return false; + return 3 < CardUtil.getConvertedManaCost(c.getManaCost()); } }); - if(!four.isEmpty()) choice = CardUtil.getRandom(four.toArray()).getName(); + 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.GameAction.exile(all.get(i)); + + 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.HumanPlayer); + CardList c = AllZoneUtil.getPlayerCardsInLibrary(AllZone.getHumanPlayer()); c = c.filter(AllZoneUtil.nonlands); return c.size() > 0; } };//SpellAbility spell - + spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Maelstrom Pulse")) { + 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; + 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)); - + + 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() + 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()) + if (AllZoneUtil.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { - - AllZone.GameAction.destroy(getTargetCard()); - - if(!getTargetCard().isFaceDown()) { + + 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.GameAction.destroy(list.get(i)); + + if (!getTargetCard().isFaceDown()) for (int i = 0; i < list.size(); i++) + AllZone.getGameAction().destroy(list.get(i)); }//is token? }//in play? }//resolve() };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); - + Input target = new Input() { private static final long serialVersionUID = -4947592326270275532L; - + @Override public void showMessage() { - AllZone.Display.showMessage("Select target nonland permanent for " + spell.getSourceCard()); + 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()) { + if (zone.is(Constant.Zone.Battlefield) && !card.isLand()) { spell.setTargetCard(card); - if(this.isFree()) { + if (this.isFree()) { this.setFree(false); - AllZone.Stack.add(spell); + 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) { + 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; - + + int damage = 3; + Card check; + @Override public boolean canPlayAI() { - if(AllZone.HumanPlayer.getLife() <= damage) return true; - + if (AllZone.getHumanPlayer().getLife() <= damage) return true; + check = getFlying(); return check != null; } - + @Override public void chooseTargetAI() { - if(AllZone.HumanPlayer.getLife() <= damage) { - setTargetPlayer(AllZone.HumanPlayer); + if (AllZone.getHumanPlayer().getLife() <= damage) { + setTargetPlayer(AllZone.getHumanPlayer()); return; } - + Card c = getFlying(); - if((c == null) || (!check.equals(c))) throw new RuntimeException(card + 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); - + 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()) + + 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); } @@ -913,410 +796,384 @@ public class CardFactory_Sorceries { 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; - + + if (notLand.isEmpty()) return 0; + Card card = notLand.get(0); return CardUtil.getConvertedManaCost(card.getSpellAbility()[0]); } };//SpellAbility + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + 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); + 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.GameAction.destroy(c); - } - } + 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.HumanPlayer); - CardList computer = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - + 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.ComputerPlayer.getLife() < 7 && !human.isEmpty())) && ComputerUtil.getAvailableMana().size() >= 7; + || (AllZone.getComputerPlayer().getLife() < 7 && !human.isEmpty())) && ComputerUtil.getAvailableMana().size() >= 7; } };// SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }// *************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Incendiary Command")) { + 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]); - + //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 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"); - + 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.Display.showMessage("Select target nonbasic land"); + 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); + 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(); + 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.Display.showMessage("Select target player"); + 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); + 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); + 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); + 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)); } - } - 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; - + 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; - + if (o == null) return null; + out.add((String) o); card.addSpellChoice((String) o); return out; }//chooseTwo() };//Input chooseTwoInput + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); - + card.setSpellWithChoices(true); spell.setBeforePayMana(chooseTwoInput); }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Pulse of the Tangle")) { - SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 523613120207836692L; - - @Override - public void resolve() { - CardFactoryUtil.makeToken("Beast", "G 3 3 Beast", card.getController(), "G", - new String[] {"Creature", "Beast"}, 3, 3, new String[] {""}); - - //return card to hand if necessary - Player player = card.getController(); - - CardList oppList = AllZoneUtil.getCreaturesInPlay(player.getOpponent()); - CardList myList = AllZoneUtil.getCreaturesInPlay(player); - - //if true, return card to hand - if(myList.size() < oppList.size()) - AllZone.GameAction.moveToHand(card); - }//resolve() - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - + //*************** START *********** START ************************** - else if(cardName.equals("Parallel Evolution")) { + 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.HumanPlayer); + CardList humTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); humTokenCreats = humTokenCreats.filter(AllZoneUtil.token); - - CardList compTokenCreats = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); + + 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); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); card.addSpellAbility(CardFactoryUtil.ability_Flashback(card, "4 G G G")); }//*************** END ************ END ************************** - + //*************** START *********** START ************************** - else if(cardName.equals("Global Ruin")) { + 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.ComputerPlayer); + CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getComputerPlayer()); String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - - for(int i = 0; i < basic.length; i++) { + + for (int i = 0; i < basic.length; i++) { CardList cl = land.getType(basic[i]); - if(!cl.isEmpty()) { + 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 @@ -1325,122 +1182,120 @@ public class CardFactory_Sorceries { target.addAll(cl); } } - + //need to sacrifice the other non-basic land types land = land.filter(new CardListFilter() { - public boolean addCard(Card c){ + 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") + 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.GameAction.sacrifice(target.get(i)); + 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; - + 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) { + 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.Display.showMessage("Select target " + humanBasic.get(count) + 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) + 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) */) { + && 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.HumanPlayer); + CardList land = AllZoneUtil.getPlayerLandsInPlay(AllZone.getHumanPlayer()); CardList cl = land.getType(humanBasic.get(count)); - cl = cl.filter(new CardListFilter() - { - public boolean addCard(Card crd) - { + 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)); - + + 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){ + 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") + 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.HumanPlayer); + CardList land = AllZoneUtil.getPlayerCardsInPlay(AllZone.getHumanPlayer()); String basic[] = {"Forest", "Plains", "Mountain", "Island", "Swamp"}; - - for(int i = 0; i < basic.length; i++) { + + for (int i = 0; i < basic.length; i++) { CardList c = land.getType(basic[i]); - if(!c.isEmpty()) { + if (!c.isEmpty()) { humanBasic.add(basic[i]); countBase[0]++; } } - if(countBase[0] == 0) { + if (countBase[0] == 0) { //human has no basic land, so don't prompt to select one. stop(); } else { @@ -1450,438 +1305,211 @@ public class CardFactory_Sorceries { } } };//Input + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); spell.setBeforePayMana(runtime); }//*************** END ************ END ************************** - + //*************** START *********** START ************************** - else if(cardName.equals("Gerrard's Verdict")) { + 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.HumanPlayer); - if(humanHand.size() >= 2) return true; + 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(); + if (player.isHuman()) humanResolve(); else computerResolve(); } - + public void humanResolve() { - CardList list = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); + 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.HumanPlayer.gainLife(3, card); + AllZone.getHumanPlayer().gainLife(3, card); } - + if (c2.isLand()) { - AllZone.HumanPlayer.gainLife(3, card); + AllZone.getHumanPlayer().gainLife(3, card); } - + }//resolve() - + public void computerResolve() { - CardList list = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - + 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.ComputerPlayer.gainLife(3, card); + 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.ComputerPlayer.gainLife(3, card); + AllZone.getComputerPlayer().gainLife(3, card); } } } } }; + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - - /* - //*************** START *********** START ************************** - else if(cardName.equals("Rite of Replication")) { - 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 = -2902112019334177L; - @Override - public boolean canPlayAI() { - Card biggest = null; - CardList creature = AllZoneUtil.getCreaturesInPlay(card.getController()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card card) { - return (!card.isType("Legendary")); - } - }); - if(creature.size() == 0) return false; - 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); - - return biggest.getNetAttack() > 4; - } - - @Override - public void chooseTargetAI() { - CardList creature = AllZoneUtil.getCreaturesInPlay(); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card card) { - return (!card.isType("Legendary")); - } - }); - if(creature.size() > 0) { - Card 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); - } - } - - @Override - public void resolve() { - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - PlayerZone_ComesIntoPlay.setSimultaneousEntry(true); - double Count = AllZoneUtil.getDoublingSeasonMagnitude(card.getController()); - for(int i = 0; i < Count; i++) { - if(i + 1 == Count) PlayerZone_ComesIntoPlay.setSimultaneousEntry(false); - final Card Copy = AllZone.CardFactory.copyCardintoNew(getTargetCard()); - - //Slight hack for copying stuff that has triggered abilities - for(Trigger t : Copy.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(t); - } - Copy.addLeavesPlayCommand(new Command() { - private static final long serialVersionUID = 1988240749380718859L; - - public void execute() { - AllZone.TriggerHandler.removeAllFromCard(Copy); - } - - }); - - Copy.setToken(true); - Copy.setController(card.getController()); - AllZone.GameAction.moveToPlay(Copy, card.getController()); - } - } - }//resolve() - }; - - spell.setDescription("Put a token onto the battlefield that's a copy of target creature."); - - StringBuilder sb = new StringBuilder(); - sb.append(card.getName()).append(" - ").append(card.getController()); - sb.append(" puts a token onto the battlefield that's a copy of target creature."); - spell.setStackDescription(sb.toString()); - - Cost kickCost = new Cost("7 U U", cardName, false); - Target kickTgt = new Target(card, "C"); - SpellAbility kicker = new Spell(card, kickCost, kickTgt) { - private static final long serialVersionUID = 13762512058673590L; - - @Override - public boolean canPlayAI() { - Card biggest = null; - CardList creature = AllZoneUtil.getCreaturesInPlay(card.getController()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card card) { - return (!card.isType("Legendary")); - } - }); - if(creature.size() == 0) return false; - 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); - - return biggest.getNetAttack() > 3; - } - - @Override - public void chooseTargetAI() { - CardList creature = AllZoneUtil.getCreaturesInPlay(card.getController()); - creature = creature.filter(new CardListFilter() { - public boolean addCard(Card card) { - return (!card.isType("Legendary")); - } - }); - if (creature.size() > 0) { - Card 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); - } - } - - @Override - public void resolve() { - card.setKicked(true); - if(AllZoneUtil.isCardInPlay(getTargetCard()) - && CardFactoryUtil.canTarget(card, getTargetCard())) { - PlayerZone_ComesIntoPlay.setSimultaneousEntry(true); - int Count = 5 * AllZoneUtil.getDoublingSeasonMagnitude(card.getController()); - for(int i = 0; i < Count; i++) { - if(i + 1 == Count) PlayerZone_ComesIntoPlay.setSimultaneousEntry(false); - final Card Copy = AllZone.CardFactory.copyCardintoNew(getTargetCard()); - - //Slight hack for copying stuff that has triggered abilities - for(Trigger t : Copy.getTriggers()) - { - AllZone.TriggerHandler.registerTrigger(t); - } - Copy.addLeavesPlayCommand(new Command() { - private static final long serialVersionUID = -3703289691606291059L; - - public void execute() { - AllZone.TriggerHandler.removeAllFromCard(Copy); - } - - }); - - Copy.setToken(true); - Copy.setController(card.getController()); - AllZone.GameAction.moveToPlay(Copy, card.getController()); - } - } - }//resolve() - }; - kicker.setKickerAbility(true); - kicker.setAdditionalManaCost("5"); - kicker.setDescription("Kicker 5: If Rite of Replication was kicked, put five of those tokens onto the battlefield instead."); - - StringBuilder sbKick = new StringBuilder(); - sbKick.append(card.getName()).append(" - ").append(card.getController()); - sbKick.append(" puts five tokens onto the battlefield that's a copy of target creature."); - kicker.setStackDescription(sbKick.toString()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - card.addSpellAbility(kicker); - }//*************** 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){ + 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.HumanPlayer); - CardList libList = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); + 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(); + 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 - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + + + 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){ + 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.HumanPlayer); - CardList library = AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer); - int graveCount = graveyard.size(); - graveyard = graveyard.filter(new CardListFilter() { - public boolean addCard(Card c) { - return c.isBasicLand(); - } - }); - - setTargetPlayer(AllZone.HumanPlayer); - + // 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.GameAction.exile(rem); - lib.remove(rem); - } - AllZone.GameAction.exile(c); + 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 - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + + card.addSpellAbility(spell); }//*************** END ************ END ************************** - + + //*************** START *********** START ************************** - else if(cardName.equals("Lobotomy")) { - Cost cost = new Cost("2 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 = 5338238621454661783L; - - @Override - public void resolve() { - Card choice = null; - Player player = getTargetPlayer(); - - //check for no cards in hand on resolve - CardList handList = AllZoneUtil.getPlayerHand(player); - - if (handList.size() == 0) - return; - - if(card.getController().isHuman()) - GuiUtils.getChoice("Revealing hand", handList.toArray()); - - CardList choices = handList.getNotType("Basic"); - - if (choices.size() == 0) - return; - - if(card.getController().isHuman()) - choice = GuiUtils.getChoice("Choose", choices.toArray()); - else //computer chooses - choice = CardUtil.getRandom(choices.toArray()); - - String name = choice.getName(); - - CardList remove = AllZoneUtil.getPlayerCardsInLibrary(player); - remove.addAll(AllZoneUtil.getPlayerHand(player)); - remove.addAll(AllZoneUtil.getPlayerGraveyard(player)); - remove = remove.getName(name); - - for(Card c : remove) - AllZone.GameAction.exile(c); - }//resolve() - - @Override - public boolean canPlayAI() { - setTargetPlayer(AllZone.HumanPlayer); - CardList handList = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - return 0 < handList.size(); - } - };//SpellAbility spell - - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Donate")) { + 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.GameAction.changeController(new CardList(c), c.getController(), c.getController().getOpponent()); + + 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 { @@ -1889,48 +1517,48 @@ public class CardFactory_Sorceries { } } } - + @Override public boolean canPlayAI() { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer, "Illusions of Grandeur"); - - if(list.size() > 0) { + 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.HumanPlayer); + 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; - + if (this.isFree()) free = true; + stopSetNext(CardFactoryUtil.input_targetSpecific(spell, perms, "Select a permanent you control", true, free)); - + }//showMessage() };//Input - + spell.setBeforePayMana(runtime); + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + /* //********************Start********Start*********************** else if(cardName.equals("Living Death")) { @@ -1940,14 +1568,14 @@ public class CardFactory_Sorceries { public void resolve() { //grab make 4 creature lists: human_play, human_graveyard, computer_play, computer_graveyard - CardList human_play = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); + CardList human_play = AllZoneUtil.getCreaturesInPlay(AllZone.getHumanPlayer()); - CardList human_graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.HumanPlayer); + CardList human_graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.getHumanPlayer()); human_graveyard = human_graveyard.filter(AllZoneUtil.creatures); - CardList computer_play = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); + CardList computer_play = AllZoneUtil.getCreaturesInPlay(AllZone.getComputerPlayer()); - CardList computer_graveyard = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); + 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... @@ -1956,444 +1584,281 @@ public class CardFactory_Sorceries { while(it.hasNext()) { c = it.next(); - AllZone.GameAction.moveTo(AllZone.Human_Battlefield,c); - AllZone.GameAction.moveTo(AllZone.Human_Graveyard,c); + AllZone.getGameAction().moveTo(AllZone.getHumanBattlefield(),c); + AllZone.getGameAction().moveTo(AllZone.getHumanGraveyard(),c); } it = human_graveyard.iterator(); while(it.hasNext()) { c = it.next(); - AllZone.GameAction.moveTo(AllZone.Human_Graveyard,c); - AllZone.GameAction.moveTo(AllZone.Human_Battlefield,c); + AllZone.getGameAction().moveTo(AllZone.getHumanGraveyard(),c); + AllZone.getGameAction().moveTo(AllZone.getHumanBattlefield(),c); } it = computer_play.iterator(); while(it.hasNext()) { c = it.next(); - AllZone.GameAction.moveTo(AllZone.Computer_Battlefield,c); - AllZone.GameAction.moveTo(AllZone.Computer_Graveyard,c); + AllZone.getGameAction().moveTo(AllZone.getComputerBattlefield(),c); + AllZone.getGameAction().moveTo(AllZone.getComputerGraveyard(),c); } it = computer_graveyard.iterator(); while(it.hasNext()) { c = it.next(); - AllZone.GameAction.moveTo(AllZone.Computer_Graveyard,c); - AllZone.GameAction.moveTo(AllZone.Computer_Battlefield,c); + AllZone.getGameAction().moveTo(AllZone.getComputerGraveyard(),c); + AllZone.getGameAction().moveTo(AllZone.getComputerBattlefield(),c); } }//resolve };//spellability - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); + + card.addSpellAbility(spell); }//*********************END**********END*********************** - - + */ //*************** START *********** START ************************** - else if (cardName.equals("Lavalanche")) - { - Cost cost = new Cost("X B R G", cardName, false); - Target tgt = new Target(card, "Select a Player", "Player"); - final SpellAbility spell = new Spell(card, cost, tgt) - { - private static final long serialVersionUID = 3571646571415945308L; - public void resolve() - { - int damage = card.getXManaCostPaid(); - - Player player = getTargetPlayer(); - CardList list = AllZoneUtil.getPlayerCardsInPlay(player); - - list = list.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return c.isCreature(); - } - }); - - for(int i = 0; i < list.size(); i++) { - list.get(i).addDamage(card.getXManaCostPaid(), card); - } - - player.addDamage(damage, card); - card.setXManaCostPaid(0); - } - public boolean canPlayAI() - { - final int maxX = ComputerUtil.getAvailableMana().size() - 3; - - if (AllZone.HumanPlayer.getLife() <= maxX) - return true; - - CardListFilter filter = new CardListFilter(){ - public boolean addCard(Card c) - { - return c.isCreature() && maxX >= (c.getNetDefense() + c.getDamage()); - } - }; - - CardList killableCreatures = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - killableCreatures = killableCreatures.filter(filter); - - return (killableCreatures.size() >= 2); // kill at least two of the human's creatures - } - }; - spell.setDescription("Lavalanche deals X damage to target player and each creature he or she controls."); - spell.setStackDescription("Lavalanche - deals X damage to target player and each creature he or she controls."); - spell.setChooseTargetAI(CardFactoryUtil.AI_targetHuman()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.HumanPlayer); - CardList compLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.ComputerPlayer); - - if (compLand.size() > humLand.size()) - { - compLand.shuffle(); - for (int i=0; i < compLand.size()-humLand.size();i++) - AllZone.GameAction.sacrifice(compLand.get(i)); - } - else if (humLand.size() > compLand.size()) - { - int diff = humLand.size() - compLand.size(); - AllZone.InputControl.setInput(CardFactoryUtil.input_sacrificePermanents(diff, "Land")); - } - - //Hand - CardList humHand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - int handDiff = Math.abs(humHand.size() - compHand.size()); - - if (compHand.size() > humHand.size()) - { - AllZone.ComputerPlayer.discard(handDiff, this, false); - } - else if (humHand.size() > compHand.size()) - { - AllZone.HumanPlayer.discard(handDiff, this, false); - } - - //Creatures: - CardList humCreats = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - CardList compCreats = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - - if (compCreats.size() > humCreats.size()) - { - CardListUtil.sortAttackLowFirst(compCreats); - CardListUtil.sortCMC(compCreats); - compCreats.reverse(); - for (int i=0; i < compCreats.size()-humCreats.size();i++) - AllZone.GameAction.sacrifice(compCreats.get(i)); - } - else if (humCreats.size() > compCreats.size()) - { - int diff = humCreats.size() - compCreats.size(); - AllZone.InputControl.setInput(CardFactoryUtil.input_sacrificePermanents(diff, "Creature")); - } - } - - public boolean canPlayAI() - { - int diff = 0; - CardList humLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - CardList compLand = AllZoneUtil.getPlayerLandsInPlay(AllZone.ComputerPlayer); - diff += humLand.size() - compLand.size(); - - CardList humCreats = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - CardList compCreats = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - compCreats = compCreats.getType("Creature"); - diff += 1.5 * (humCreats.size() - compCreats.size()); - - CardList humHand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - CardList compHand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - diff += 0.5 * (humHand.size() - compHand.size()); - - return diff > 2; - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.ComputerPlayer); - 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.EndOfTurn.addUntil(untilEOT); - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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.ComputerPlayer); - - 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.EndOfTurn.addUntil(untilEOT); - - thePlayer.drawCard(); - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - - card.setSVar("PlayMain1", "TRUE"); - } //*************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Hellion Eruption")) { + else if (cardName.equals("Balance")) { final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 5820870438419741058L; + private static final long serialVersionUID = -5941893280103164961L; - @Override - public boolean canPlayAI() { - return AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer).size() > 0; - } - - @Override public void resolve() { - CardList cards = AllZoneUtil.getCreaturesInPlay(card.getController()); - for(Card creature:cards) { - AllZone.GameAction.sacrifice(creature); - CardFactoryUtil.makeToken("Hellion", "R 4 4 hellion", creature.getController(), "R", new String[] { - "Creature", "Hellion"}, 4, 4, new String[] {""}); + //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")); } } - - };//SpellAbility + + 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); + } + }; + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** 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; + else if (cardName.equals("Brood Birthing")) { + final SpellAbility spell = new Spell(card) { + private static final long serialVersionUID = -8303724057068847270L; - @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.GameAction.exile(c_1); - } - } - else { //Computer - // it would be nice if the computer chose vanilla creatures over - for(int j = 0; j < size; j++) { - AllZone.GameAction.exile(graveList.get(j)); - } - } - tPlayer.addDamage(damage, card); - } - - @Override - public void chooseTargetAI() { - setTargetPlayer(AllZone.HumanPlayer); - }//chooseTargetAI() - - @Override - public boolean canPlayAI() { - CardList graveList = AllZoneUtil.getPlayerTypeInGraveyard(AllZone.HumanPlayer, "Creature"); - int humanLife = AllZone.HumanPlayer.getLife(); + 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()); - return (graveList.size() > 5 || graveList.size() > humanLife); - } - }; - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - 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 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.GameAction.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.GameAction.moveToBottomOfLibrary(revealed.get(j)); - } - //return the damage - - //System.out.println("Explosive Revelation does "+CardUtil.getConvertedManaCost(top)+" from: "+top); - return CardUtil.getConvertedManaCost(top); + 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 + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Fireball")) { + 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 CardList targets = new CardList(); + final ArrayList targetPlayers = new ArrayList(); - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -6293612568525319357L; + 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.HumanPlayer.getLife(); - if(maxX >= humanLife) { - targetPlayers.add(AllZone.HumanPlayer); - return true; - } - return false; - } + @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(card) ) { - 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(card) ) { - //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 + @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() - final Input input = new Input() { - private static final long serialVersionUID = 1099272655273322957L; + //DEBUG + private void printCardTargets() { + StringBuilder sb = new StringBuilder("["); + for (Card target : targets) { + sb.append(target).append(","); + } + sb.append("]"); + Log.debug("Fireball", sb.toString()); + } - @Override - public void showMessage() { - AllZone.Display.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; - } + //DEBUG + private void printPlayerTargets() { + StringBuilder sb = new StringBuilder("["); + for (Player p : targetPlayers) { + sb.append(p).append(","); + } + sb.append("]"); + Log.debug("Fireball", sb.toString()); + } - @Override - public void selectButtonCancel() { - targets.clear(); - targetPlayers.clear(); - stop(); - } + private int getNumTargets() { + int numTargets = 0; + numTargets += targets.size(); + numTargets += targetPlayers.size(); + return numTargets; + } - @Override - public void selectButtonOK() { - spell.setStackDescription(cardName+" deals X damage to "+getNumTargets()+" target(s)."); - stopSetNext(new Input_PayManaCost(spell)); - } + };//SpellAbility - @Override - public void selectCard(Card c, PlayerZone zone) { - if( !CardFactoryUtil.canTarget(card, c)) { - AllZone.Display.showMessage("Cannot target this card."); - return; //cannot target - } - if(targets.contains(c)) { - AllZone.Display.showMessage("You have already selected this target."); - return; //cannot target the same creature twice. - } + final Input input = new Input() { + private static final long serialVersionUID = 1099272655273322957L; - if(c.isCreature() && zone.is(Constant.Zone.Battlefield)) { - targets.add(c); - showMessage(); - } - }//selectCard() - - @Override + @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(card) ) { - AllZone.Display.showMessage("Cannot target this card."); - return; //cannot target - } - if( targetPlayers.contains(player) ) { - AllZone.Display.showMessage("You have already selected this player."); - return; //cannot target the same player twice. - } + 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 + };//Input - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - spell.setBeforePayMana(input); + + + card.addSpellAbility(spell); + spell.setBeforePayMana(input); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Recall")) { + 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; + 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 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.InputControl.setInput(CardFactoryUtil.input_discardRecall(numCards, card, this)); - } - } - /*else { //computer - card.getControler().discardRandom(numCards); - AllZone.GameAction.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.GameAction.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()); - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); + @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.HumanPlayer); - CardList Chand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - return Chand.size() < Hhand.size(); - } - - @Override - public void resolve() { - CardList Hhand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - CardList Chand = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); - - int num = Math.max(Hhand.size(), Chand.size()); - - discardDraw(AllZone.HumanPlayer, num); - discardDraw(AllZone.ComputerPlayer, num); - }//resolve() - - void discardDraw(Player player, int num) { - player.discardHand(this); - player.drawCards(num); - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }//*************** END ************ END ************************** - //*************** START *********** START ************************** - else if(cardName.equals("Stitch Together")) { + 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; @@ -2769,18 +2235,16 @@ public class CardFactory_Sorceries { public void resolve() { CardList threshold = AllZoneUtil.getPlayerGraveyard(card.getController()); Card c = getTargetCard(); - - if(threshold.size() >= 7) { - if(AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { + + if (threshold.size() >= 7) { + if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { PlayerZone play = AllZone.getZone(Constant.Zone.Battlefield, card.getController()); - AllZone.GameAction.moveTo(play, c); + AllZone.getGameAction().moveTo(play, c); } - } - - else { - if(AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { + } else { + if (AllZoneUtil.isCardInPlayerGraveyard(card.getController(), c)) { PlayerZone hand = AllZone.getZone(Constant.Zone.Hand, card.getController()); - AllZone.GameAction.moveTo(hand, c); + AllZone.getGameAction().moveTo(hand, c); } } }//resolve() @@ -2789,17 +2253,17 @@ public class CardFactory_Sorceries { 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() { @@ -2809,20 +2273,20 @@ public class CardFactory_Sorceries { }); 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]; + for (int i = 0; i < c.length; i++) + if (biggest.getNetAttack() < c[i].getNetAttack()) biggest = c[i]; setTargetCard(biggest); } };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); Input target = new Input() { @@ -2830,9 +2294,9 @@ public class CardFactory_Sorceries { @Override public void showMessage() { - CardList creature = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Creature"); + CardList creature = AllZoneUtil.getPlayerTypeInGraveyard(card.getController(), "Creature"); Object check = GuiUtils.getChoiceOptional("Select creature", creature); - if(check != null) { + if (check != null) { spell.setTargetCard((Card) check); stopSetNext(new Input_PayManaCost(spell)); } else stop(); @@ -2843,126 +2307,118 @@ public class CardFactory_Sorceries { //*************** START *********** START ************************** - else if(cardName.equals("Patriarch's Bidding")) { + 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", + 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] = ""; + if (input[0] == null) break; + if (!CardUtil.isACreatureType(input[0])) input[0] = ""; + //TODO: some more input validation, case-sensitivity, etc. - HashMap countInGraveyard = new HashMap(); - CardList allGrave = AllZoneUtil.getPlayerGraveyard(AllZone.ComputerPlayer); - 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); - } + 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(); - } + } + 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"; + } + 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.GameAction.moveToPlay(c); - } + //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 + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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")) { + 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; + 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 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.HumanPlayer.getPoisonCounters(); - int compPoison = AllZone.ComputerPlayer.getPoisonCounters(); - - if(AllZone.HumanPlayer.getLife() <= humanPoison ) { - tgt.addTarget(AllZone.HumanPlayer); - return true; - } - - if( (2*(11 - compPoison) < AllZone.ComputerPlayer.getLife() || compPoison > 7) && compPoison < AllZone.ComputerPlayer.getLife() - 2) { - tgt.addTarget(AllZone.ComputerPlayer); - return true; - } - - return false; - } - };// SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); + @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")) { + 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 @@ -2970,57 +2426,56 @@ public class CardFactory_Sorceries { * 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; + 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}); + @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); - //deal damage to player - opponent.addDamage(damage, card); + GuiUtils.getChoiceOptional(card + " - Revealed card", new Card[]{topCard}); - //deal damage to all opponent's creatures - CardList creatures = AllZoneUtil.getCreaturesInPlay(opponent); - for(Card creature:creatures) { - creature.addDamage(damage, card); - } + //deal damage to player + opponent.addDamage(damage, card); - card.addReplaceMoveToGraveyardCommand(new Command() { - private static final long serialVersionUID = -5912663572746146726L; + //deal damage to all opponent's creatures + CardList creatures = AllZoneUtil.getCreaturesInPlay(opponent); + for (Card creature : creatures) { + creature.addDamage(damage, card); + } - public void execute() { - if(null != topCard && topCard.isLand()) { - AllZone.GameAction.moveToHand(card); - } - else AllZone.GameAction.moveToGraveyard(card); - } - }); - } - }// resolve() - - @Override - public boolean canPlayAI() { - return AllZoneUtil.getPlayerCardsInLibrary(AllZone.HumanPlayer).size() > 0; - } - - };// SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); + 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")) { + 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 @@ -3028,157 +2483,92 @@ public class CardFactory_Sorceries { * 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; + 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.GameAction.moveToBottomOfLibrary(c); - } - }// resolve() - - @Override - public boolean canPlayAI() { - return AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer).size() > 0; - } - - };// SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); - }// *************** END ************ END ************************** - - - //*************** START *********** START ************************** - else if(cardName.equals("Overwhelming Stampede")) { - /* - * Until end of turn, creatures you control gain trample and get - * +X/+X, where X is the greatest power among creatures you control. - */ - final int[] x = new int[1]; - final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -3676506382832498840L; - - @Override - public boolean canPlayAI() { - CardList list = AllZoneUtil.getCreaturesInPlay(AllZone.ComputerPlayer); - return list.size() > 2; - }//canPlayAI() - @Override public void resolve() { - Player player = card.getController(); - CardList list = AllZoneUtil.getCreaturesInPlay(player); - - x[0] = findHighestPower(list); - - for(Card creature:list) { - final Card c = creature; - - final Command untilEOT = new Command() { - private static final long serialVersionUID = -2712661762676783458L; + 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()); - public void execute() { - if(AllZoneUtil.isCardInPlay(c)) { - c.addTempAttackBoost(-x[0]); - c.addTempDefenseBoost(-x[0]); - c.removeExtrinsicKeyword("Trample"); - } - } - };//Command - - if(AllZoneUtil.isCardInPlay(c)) { - c.addTempAttackBoost(x[0]); - c.addTempDefenseBoost(x[0]); - c.addExtrinsicKeyword("Trample"); - - AllZone.EndOfTurn.addUntil(untilEOT); - }//if - }//for - }//resolve() - - private int findHighestPower(CardList list) { - int highest = 0; - for(Card c:list) { - if( c.getNetAttack() > highest ) highest = c.getNetAttack(); - } - return highest; + //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 + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); - card.setSVar("PlayMain1", "TRUE"); - }//*************** END ************ END ************************** - - + }// *************** END ************ END ************************** + + //*************** START *********** START ************************** - else if(cardName.equals("Winds of Change")) { + 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; + private static final long serialVersionUID = 1137557863607126794L; - @Override + @Override public void resolve() { - discardDrawX(AllZone.HumanPlayer); - discardDrawX(AllZone.ComputerPlayer); + discardDrawX(AllZone.getHumanPlayer()); + discardDrawX(AllZone.getComputerPlayer()); }//resolve() - - void discardDrawX(Player player) { - CardList hand = AllZoneUtil.getPlayerHand(player); - for(Card c : hand) - AllZone.GameAction.moveToLibrary(c); - + 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.ComputerPlayer); - c = c.filter(AllZoneUtil.nonlands); + CardList c = AllZoneUtil.getPlayerCardsInPlay(AllZone.getComputerPlayer()); + c = c.filter(AllZoneUtil.nonlands); return 2 >= c.size(); } - + };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - - + + //*************** START *********** START ************************** - else if(cardName.equals("Molten Psyche")) { + 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. @@ -3187,618 +2577,627 @@ public class CardFactory_Sorceries { * cards that player has drawn this turn. */ final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = -1276674329039279896L; + private static final long serialVersionUID = -1276674329039279896L; - @Override + @Override public void resolve() { - Player player = card.getController(); - Player opp = player.getOpponent(); - discardDraw(AllZone.HumanPlayer); - discardDraw(AllZone.ComputerPlayer); - - if(player.hasMetalcraft()) { - opp.addDamage(opp.getNumDrawnThisTurn(), card); + 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.GameAction.moveToLibrary(c); + 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.ComputerPlayer); + CardList c = AllZoneUtil.getPlayerHand(AllZone.getComputerPlayer()); c = c.filter(AllZoneUtil.nonlands); - return 2 >= c.size() || - (AllZone.ComputerPlayer.hasMetalcraft() && AllZone.HumanPlayer.getLife() <= 3); + return 2 >= c.size() || + (AllZone.getComputerPlayer().hasMetalcraft() && AllZone.getHumanPlayer().getLife() <= 3); } - + };//SpellAbility + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - + + //*************** START *********** START ************************** - else if(cardName.equals("Austere Command")) { + 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 + 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.GameAction.destroy(c); - } + + //"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.GameAction.destroy(c); + 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.GameAction.destroy(c); + 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.GameAction.destroy(c); + 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() { + 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"); - + 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; + private static final long serialVersionUID = 2352497236500922820L; - @Override + @Override public void showMessage() { - if(card.isCopiedSpell()) { - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } - else { - //reset variables - userChoice.clear(); + if (card.isCopiedSpell()) { + setStackDescription.execute(); + stopSetNext(new Input_PayManaCost(spell)); + } else { + //reset variables + userChoice.clear(); - ArrayList display = new ArrayList(Arrays.asList(cardChoices)); + ArrayList display = new ArrayList(Arrays.asList(cardChoices)); - ArrayList a = chooseTwo(display); - //everything stops here if user cancelled - if(a == null) { - stop(); - return; - } + ArrayList a = chooseTwo(display); + //everything stops here if user cancelled + if (a == null) { + stop(); + return; + } - userChoice.addAll(a); + userChoice.addAll(a); - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); - } + 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; - + 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; - + if (o == null) return null; + out.add((String) o); - + return out; }//chooseTwo() };//Input chooseTwoInput + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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; + 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 boolean canPlayAI() { + return false; + } - @Override - public void resolve() { - Player player = card.getController(); - CardList grave = AllZoneUtil.getPlayerGraveyard(player); - for(Card c:grave) AllZone.GameAction.moveToHand(c); + @Override + public void resolve() { + Player player = card.getController(); + CardList grave = AllZoneUtil.getPlayerGraveyard(player); + for (Card c : grave) AllZone.getGameAction().moveToHand(c); - AllZone.GameAction.exile(card); + AllZone.getGameAction().exile(card); - card.setSVar("HSStamp","" + Player.getHandSizeStamp()); - player.addHandSizeOperation(new HandSizeOp("=", -1, Integer.parseInt(card.getSVar("HSStamp")))); - } - };//SpellAbility - - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); - card.addSpellAbility(spell); + 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")) { + + + //*************** 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 + 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(card)) { - getTargetPlayer().addDamage(x[0], card); - } - } - } - } + //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.GameAction.moveToPlay(c); - } - } + 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 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; + 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.EndOfTurn.addUntil(untilEOT); - } + 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() { + 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"); - + 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; + private static final long serialVersionUID = 2584765431286321048L; + + int stop = 0; int count = 0; - + @Override public void showMessage() { - if(count == 0) stop = x[0]; - AllZone.Display.showMessage(cardName+" - Select a target creature to gain Fear (up to " + (stop-count) + " more)"); + 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)) { + if (c.isCreature() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c) && + !ab3cards.contains(c)) { ab3cards.add(c); count++; - if(count == stop) done(); + if (count == stop) done(); else showMessage(); } }//selectCard() - + private void done() { - setStackDescription.execute(); - stopSetNext(new Input_PayManaCost(spell)); + 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; + private static final long serialVersionUID = -6879692803780014943L; - @Override + @Override public void showMessage() { - AllZone.Display.showMessage(cardName+" - Select target creature to get -X/-X"); + AllZone.getDisplay().showMessage(cardName + " - Select target creature to get -X/-X"); ButtonUtil.enableOnlyCancel(); } - + @Override - public void selectButtonCancel() { stop(); } - + 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); + 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)); - } + 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; + 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.Display.showMessage(cardName+" - Select target player to lose life"); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - stop(); - } - - @Override - public void selectPlayer(Player player) { - if(player.canTarget(card)) { - 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; - } + 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]; + } + }); - String answer = (String)o; - - x[0] = Integer.parseInt(answer); - spell.setManaCost(x[0]+" B B"); - spell.setIsXCost(false); + 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(); - 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."); - } - } + 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(); + 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(); + ArrayList display = new ArrayList(); - //get all - CardList creatures = AllZoneUtil.getCreaturesInPlay(); - CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); - grave = grave.filter(AllZoneUtil.creatures); + //get all + CardList creatures = AllZoneUtil.getCreaturesInPlay(); + CardList grave = AllZoneUtil.getPlayerGraveyard(card.getController()); + grave = grave.filter(AllZoneUtil.creatures); - if(AllZone.HumanPlayer.canTarget(card) || AllZone.ComputerPlayer.canTarget(card)) - 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"); + 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); - } + 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; + 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); + 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; + out.add((String) o); + card.addSpellChoice((String) o); + return out; }//chooseTwo() };//Input chooseTwoInput + + - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); 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 + + //*************** 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; + 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.GameAction.destroy(eq); + 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."); + - spell.setDescription(cardName+" deals 5 damage to target creature. Destroy all Equipment attached to that creature."); - // Do not remove SpellAbilities created by AbilityFactory or Keywords. - card.clearFirstSpellAbility(); card.addSpellAbility(spell); }//*************** END ************ END ************************** - - return card; + + return card; }//getCard } diff --git a/src/forge/card/mana/Mana.java b/src/forge/card/mana/Mana.java index c65f09e7408..535e093ca64 100644 --- a/src/forge/card/mana/Mana.java +++ b/src/forge/card/mana/Mana.java @@ -1,93 +1,187 @@ -package forge.card.mana; - -import forge.Card; -import forge.Constant; -import forge.gui.input.Input_PayManaCostUtil; - -public class Mana { - private String color; - private int amount = 0; - private Card sourceCard = null; - - public Mana(String col, int amt, Card source){ - color = col; - amount = amt; - if (source == null) - return; - - sourceCard = source; - } - - 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(); - } - - 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(); - } - - 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; - } - - public boolean isSnow() { return sourceCard.isSnow(); } - - public boolean fromBasicLand() { return sourceCard.isBasicLand(); } // for Imperiosaur - - public int getColorlessAmount(){ return color.equals(Constant.Color.Colorless) ? amount : 0; } - - public int getAmount() { return amount; } - - public boolean isColor(String col) { return color.equals(col); } - - public boolean isColor(String[] colors) - { - for(String col : colors) - if (color.equals(col)) - return true; - - return false; - } - - public String getColor(){ return color; } - - public Card getSourceCard(){ return sourceCard; } - - public boolean fromSourceCard(Card c){ return sourceCard.equals(c); } - - public void decrementAmount(){ amount--; } -} +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 index ca51616c7ef..a874d368b91 100644 --- a/src/forge/card/mana/ManaCost.java +++ b/src/forge/card/mana/ManaCost.java @@ -1,351 +1,485 @@ -package forge.card.mana; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.StringTokenizer; - -import forge.Constant; -import forge.gui.input.Input_PayManaCostUtil; - -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 - - public ManaCost(String manaCost) { - if (manaCost.equals("")) - manaCost = "0"; - - while (manaCost.startsWith("X")){ - if (manaCost.length() < 2) - manaCost = "0"; - else - manaCost = manaCost.substring(2); - setXcounter(getXcounter() + 1); - } - manaPart = split(manaCost); - } - - public int getSunburst() - { - int ret = sunburstMap.size(); - sunburstMap.clear(); - return ret; - } - - 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; - } - - public boolean containsPhyrexianMana() - { - for(Object o : manaPart) - { - if(o instanceof Mana_PartPhyrexian) - { - return true; - } - } - - return false; - } - - 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 - 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 - 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; - } - - 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; - } - - 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() - - public boolean payMana(Mana mana) { - return addMana(mana); - } - - public boolean payMana(String color) { - color = Input_PayManaCostUtil.getShortColorString(color); - return addMana(color); - } - - 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)); - } - - 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; - } - - 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; - } - - 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); - } - - @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(); - } - - 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; - } - - 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() - - 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); - } - } - - public void setXcounter(int xcounter) { - this.xcounter = xcounter; - } - - public int getXcounter() { - return xcounter; - } -} +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 index 6bdc43584f6..55b2101c63d 100644 --- a/src/forge/card/mana/ManaPool.java +++ b/src/forge/card/mana/ManaPool.java @@ -1,33 +1,41 @@ - package forge.card.mana; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardUtil; -import forge.Constant; -import forge.Player; +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 - private final static Map map = new HashMap(); + // current paying moved to SpellAbility - public final static String colors = "WUBRG"; + 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(); @@ -46,392 +54,482 @@ public class ManaPool extends Card { 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(); + 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 0) - for (int j=0; j 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(); + 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(") "); - } - } + 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(); } - - public int getAmountOfColor(String color){ - return floatingTotals[map.get(color)]; + + /** + *

getAmountOfColor.

+ * + * @param color a {@link java.lang.String} object. + * @return a int. + */ + public int getAmountOfColor(String color) { + return floatingTotals[map.get(color)]; } - - public int getAmountOfColor(char color){ - return getAmountOfColor(Character.toString(color)); - } - - public boolean isEmpty() { return floatingMana.size() == 0; } - + + /** + *

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? + 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(); } - 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(); - } - } - - public void addManaToFloating(String manaStr, Card card) { - ArrayList manaList = convertStringToMana(manaStr, card); - for(Mana m : manaList){ - addManaToPool(floatingMana, m); - } - AllZone.GameAction.checkStateEffects(); - } - - 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; - } - - 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(); + /** + *

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(); + } } - 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; + /** + *

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(); } - - public void removeManaFromFloating(ManaCost mc, Card c){ - removeManaFrom(floatingMana, mc, c); + + /** + *

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; } - - 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); + + /** + *

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(); } - - 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); + + /** + *

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; } - - 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(); - } - } + + /** + *

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 - - 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. + + /** + *

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); + if (Mana.trim().equals("")) return null; + if (!parsed) + Mana = oraclize(Mana); try { - String[] Colorless = { Integer.toString(Integer.parseInt(Mana)) }; + String[] Colorless = {Integer.toString(Integer.parseInt(Mana))}; return Colorless; - } catch(NumberFormatException ex) {} - + } 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++) { + + for (int i = 0; i < Mana.length(); i++) { char c = Mana.charAt(i); - if(c == '(') { + if (c == '(') { parentheses = true; continue; }//Split cost handling ("(" + + "/" + + ")") - else if(parentheses) { - if(c != ')') { + else if (parentheses) { + if (c != ')') { current += c; continue; } else { @@ -442,12 +540,12 @@ public class ManaPool extends Card { } } String s = c + ""; - if(colors.contains(s)) { + if (colors.contains(s)) { res.add(s); - if(clessString.trim().equals("")) continue; + if (clessString.trim().equals("")) continue; try { Colorless += Integer.parseInt(clessString.trim()); - } catch(NumberFormatException ex) { + } catch (NumberFormatException ex) { throw new RuntimeException( "Mana_Pool.getManaParts : Error, sum of noncolor mana parts is not a number - " + clessString); @@ -455,243 +553,300 @@ public class ManaPool extends Card { clessString = ""; } else clessString += s; } - for(int i = 0; i < Colorless; i++) - res.add("1"); + for (int i = 0; i < Colorless; i++) + res.add("1"); return res.toArray(new String[0]); } - - 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); - } + + /** + *

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; + 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; + 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); + 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; - } - } - - 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; - } - - public int totalMana() { - int total = 0; - for(Mana c:floatingMana) - total += c.getAmount(); - return total; - } - - 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); + 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; } - - payMana.clear(); - } - - 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; } - + /** + *

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(); - } + // 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 + + // move leftover pay back to floating clearPay(sa, true); } - + + /** + *

updateKeywords.

+ */ private void updateKeywords() { extrinsicKeyword.clear(); - for(Mana m:floatingMana) + 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:")) { + if (s.startsWith("ManaPool:")) { extrinsicKeyword.add(s); addManaToFloating(s.split(":")[1], this); } } - + + /** {@inheritDoc} */ @Override public void removeExtrinsicKeyword(String s) { - if(s.startsWith("ManaPool:")) { + if (s.startsWith("ManaPool:")) { updateKeywords(); extrinsicKeyword.remove(s); subtractOne(s.split(":")[1]); this.updateObservers(); } } - + + /** {@inheritDoc} */ @Override public int getExtrinsicKeywordSize() { updateKeywords(); diff --git a/src/forge/card/mana/Mana_Part.java b/src/forge/card/mana/Mana_Part.java index 92f8c7e6be1..2632b2b9647 100644 --- a/src/forge/card/mana/Mana_Part.java +++ b/src/forge/card/mana/Mana_Part.java @@ -1,34 +1,96 @@ - 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( + 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); + + 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 index 4317c64106f..4f8f49845c8 100644 --- a/src/forge/card/mana/Mana_PartColor.java +++ b/src/forge/card/mana/Mana_PartColor.java @@ -1,92 +1,111 @@ - 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] == ' ') ; + 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)); - } - + 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; - } - - @Override - public boolean isEasierToPay(Mana_Part mp) - { - if (mp instanceof Mana_PartColorless) return false; - return toString().length() >= mp.toString().length(); + 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( + 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( + 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; } - @Override - public int getConvertedManaCost() { - return 1; - } + /** {@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 index 11f6afc7750..a6cc5fb26ed 100644 --- a/src/forge/card/mana/Mana_PartColorless.java +++ b/src/forge/card/mana/Mana_PartColorless.java @@ -1,93 +1,135 @@ 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; - public void addToManaNeeded(int additional) { manaNeeded += additional; } - public int getManaNeeded() { return 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) { + } 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; + manaNeeded = manaCostToPay; } - + + /** {@inheritDoc} */ @Override public String toString() { - if(isPaid()) return ""; - + 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"); - + 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; + return false; } - + + /** {@inheritDoc} */ @Override - public boolean isColor(Mana mana) { - return false; - } - - @Override - public boolean isEasierToPay(Mana_Part mp) - { - // Colorless is always easier to Pay for - return true; + 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( + 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( + 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; } - @Override - public int getConvertedManaCost() { - return manaNeeded; - } + /** {@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 index fc08245d513..c233c1f0ae7 100644 --- a/src/forge/card/mana/Mana_PartPhyrexian.java +++ b/src/forge/card/mana/Mana_PartPhyrexian.java @@ -1,67 +1,109 @@ -package forge.card.mana; - -public class Mana_PartPhyrexian extends Mana_Part { - private Mana_PartColor wrappedColor; - private String color; - - public Mana_PartPhyrexian(String manaCostToPay) - { - wrappedColor = new Mana_PartColor(manaCostToPay.substring(1)); - color = manaCostToPay.substring(1); - } - - public boolean isEasierToPay(Mana_Part part) - { - return true; - } - - public String toString() - { - return wrappedColor.toString().equals("") ? "" : "P" + wrappedColor.toString(); - } - - public boolean isPaid() - { - return wrappedColor.isPaid(); - } - - public boolean isColor(String mana) - { - return wrappedColor.isColor(mana); - } - - public boolean isColor(Mana mana) - { - return wrappedColor.isColor(mana); - } - - public boolean isNeeded(String mana) - { - return wrappedColor.isNeeded(mana); - } - - public boolean isNeeded(Mana mana) - { - return wrappedColor.isNeeded(mana); - } - - public void reduce(String mana) - { - wrappedColor.reduce(mana); - } - - public void reduce(Mana mana) - { - wrappedColor.reduce(mana); - } - - public int getConvertedManaCost() - { - return wrappedColor.getConvertedManaCost(); - } - - public void payLife() - { - wrappedColor.reduce(color); - } -} \ No newline at end of file +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 index 756efad5c21..e955c097d3e 100644 --- a/src/forge/card/mana/Mana_PartSnow.java +++ b/src/forge/card/mana/Mana_PartSnow.java @@ -1,63 +1,80 @@ package forge.card.mana; + +/** + *

Mana_PartSnow class.

+ * + * @author Forge + * @version $Id: $ + */ public class Mana_PartSnow extends Mana_Part { - private boolean isPaid = false; - @Override - public boolean isNeeded(String mana) { - return !isPaid && mana.equals("S"); - } - - public boolean isNeeded(Mana mana) { - return !isPaid && mana.isSnow(); - } + 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(); - } - - @Override - public boolean isPaid() { - return isPaid; - } - - @Override - public boolean isEasierToPay(Mana_Part mp) - { - if (mp instanceof Mana_PartColorless) return false; - return toString().length() >= mp.toString().length(); + public boolean isColor(Mana mana) { + return mana.isSnow(); } - @Override - public void reduce(String mana) { - if (!mana.equals("S")) - throw new RuntimeException("Mana_PartSnow: reduce() error, " - + mana + " is not snow mana"); - isPaid = true; - } - - @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 boolean isPaid() { + return isPaid; + } - @Override - public String toString() { - return (isPaid ? "" : "S"); - } + /** {@inheritDoc} */ + @Override + public boolean isEasierToPay(Mana_Part mp) { + if (mp instanceof Mana_PartColorless) return false; + return toString().length() >= mp.toString().length(); + } - @Override - public int getConvertedManaCost() { - return 1; - } + /** {@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 index dc1256c587b..0f8b38c6276 100644 --- a/src/forge/card/mana/Mana_PartSplit.java +++ b/src/forge/card/mana/Mana_PartSplit.java @@ -1,4 +1,3 @@ - package forge.card.mana; import forge.gui.input.Input_PayManaCostUtil; @@ -6,111 +5,141 @@ 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 = ""; - + 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( + 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)) { + 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); - + if (isFirstTime()) setup(mana); + manaPart.reduce(mana); } - + + /** {@inheritDoc} */ @Override public void reduce(Mana mana) { - if(isFirstTime()) setup(Input_PayManaCostUtil.getShortColorString(mana.getColor())); - + if (isFirstTime()) setup(Input_PayManaCostUtil.getShortColorString(mana.getColor())); + manaPart.reduce(mana); } - + + /** {@inheritDoc} */ @Override public boolean isNeeded(String mana) { - if(isFirstTime()) { + if (isFirstTime()) { //always true because any mana can pay the colorless part of 2/G return true; } - + return manaPart.isNeeded(mana); }//isNeeded() - - public boolean isNeeded(Mana mana) { - if(isFirstTime()) { + + /** {@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(); + 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; - } - - @Override - public boolean isEasierToPay(Mana_Part mp) - { - if (mp instanceof Mana_PartColorless) return false; - if (!isFirstTime()) return true; - return toString().length() >= mp.toString().length(); + 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; - + if (isFirstTime()) return originalCost; + return manaPart.toString(); } - + + /** {@inheritDoc} */ @Override public boolean isPaid() { - if(isFirstTime()) return false; - + if (isFirstTime()) return false; + return manaPart.isPaid(); } - @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)); - } + /** {@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/mana/Mana_PartTest.java b/src/forge/card/mana/Mana_PartTest.java deleted file mode 100644 index 410cdd45cae..00000000000 --- a/src/forge/card/mana/Mana_PartTest.java +++ /dev/null @@ -1,520 +0,0 @@ -package forge.card.mana; - -import forge.Card; -import forge.Constant; - -public class Mana_PartTest -{ - static void testPayManaCost() - { - { - //test constructor - @SuppressWarnings("unused") - ManaCost p = new ManaCost("G"); - p = new ManaCost("U"); - p = new ManaCost("W"); - p = new ManaCost("R"); - p = new ManaCost("B"); - p = new ManaCost("0"); - p = new ManaCost("1"); - p = new ManaCost("2"); - p = new ManaCost("3"); - p = new ManaCost("4"); - p = new ManaCost("5"); - p = new ManaCost("6"); - p = new ManaCost("7"); - p = new ManaCost("8"); - p = new ManaCost("9"); - p = new ManaCost("10"); - - p = new ManaCost("GW"); - p = new ManaCost("1 G"); - p = new ManaCost("1 GW"); - p = new ManaCost("GW GW"); - p = new ManaCost("GW GW GW"); - p = new ManaCost("GW GW GW GW"); - - p = new ManaCost("G G"); - p = new ManaCost("G G G"); - p = new ManaCost("G G G"); - p = new ManaCost("G G G G"); - - p = new ManaCost("2 GW GW GW"); - p = new ManaCost("3 G G G"); - p = new ManaCost("12 GW GW GW"); - p = new ManaCost("11 G G G"); - - p = new ManaCost("2/U"); - p = new ManaCost("2/B 2/B"); - p = new ManaCost("2/G 2/G 2/G"); - p = new ManaCost("2/R 2/R 2/R 2/R"); - p = new ManaCost("2/W 2/B 2/U 2/R 2/G"); - } - - { - ManaCost p = new ManaCost("2/U"); - - check(0.3, p.isNeeded("G")); - check(0.4, p.isNeeded("U")); - check(0.5, p.isNeeded("B")); - check(0.6, p.isNeeded("W")); - check(0.7, p.isNeeded("R")); - check(0.8, p.isNeeded("1")); - - p.addMana("U"); - check(0.9, p.isPaid()); - - check(0.91, !p.isNeeded("R")); - } - - - { - ManaCost p = new ManaCost("G"); - check(1, p.isNeeded("G")); - - check(1.1, !p.isNeeded("U")); - check(1.2, !p.isNeeded("B")); - check(1.3, !p.isNeeded("W")); - check(1.4, !p.isNeeded("R")); - check(1.5, !p.isNeeded("1")); - - p.addMana("G"); - check(2, p.isPaid()); - - check(2.1, !p.isNeeded("G")); - - } - - { - ManaCost p = new ManaCost("1"); - - check(3, p.isNeeded("G")); - check(4, p.isNeeded("U")); - check(5, p.isNeeded("B")); - check(6, p.isNeeded("W")); - check(7, p.isNeeded("R")); - check(8, p.isNeeded("1")); - - p.addMana("B"); - check(9, p.isPaid()); - - check(9.1, !p.isNeeded("R")); - } - - { - ManaCost p = new ManaCost("GW"); - - check(10, p.isNeeded("G")); - check(13, p.isNeeded("W")); - - check(11, !p.isNeeded("U")); - check(12, !p.isNeeded("B")); - check(14, !p.isNeeded("R")); - check(15, !p.isNeeded("1")); - - p.addMana("W"); - check(16, p.isPaid()); - - check(17, !p.isNeeded("W")); - } - - - { - ManaCost p = new ManaCost("BR"); - - check(17.1, p.isNeeded("B")); - check(17.2, p.isNeeded("R")); - - check(17.3, !p.isNeeded("U")); - check(17.4, !p.isNeeded("W")); - check(17.5, !p.isNeeded("G")); - check(17.6, !p.isNeeded("1")); - - p.addMana("R"); - check(17.7, p.isPaid()); - - check(17.8, !p.isNeeded("R")); - } - - - { - ManaCost p = new ManaCost("1 G G"); - - p.addMana("G"); - - check(18.1, p.isNeeded("G")); - check(18.2, p.isNeeded("W")); - check(18.3, p.isNeeded("U")); - check(18.4, p.isNeeded("B")); - check(18.5, p.isNeeded("R")); - check(18.6, p.isNeeded("1")); - - p.addMana("1"); - p.addMana("G"); - - check(18.7, p.isPaid()); - - check(18.8, !p.isNeeded("W")); - } - - { - ManaCost p = new ManaCost("0"); - - check(19.1, !p.isNeeded("1")); - check(19.2, !p.isNeeded("G")); - check(19.3, !p.isNeeded("U")); - - check(19.4, p.isPaid()); - - check(19.5, !p.isNeeded("R")); - } - - { - ManaCost p = new ManaCost("G G"); - - check(20.1, !p.isNeeded("1")); - check(20.2, p.isNeeded("G")); - - check(20.3, !p.isNeeded("U")); - - p.addMana("G"); - p.addMana("G"); - - check(20.4, p.isPaid()); - - check(20.5, !p.isNeeded("B")); - } - - { - ManaCost p = new ManaCost("G G G"); - - check(21.1, !p.isNeeded("W")); - check(21.2, p.isNeeded("G")); - - check(21.3, !p.isNeeded("R")); - - p.addMana("G"); - p.addMana("G"); - p.addMana("G"); - - check(21.4, p.isPaid()); - - check(21.5, !p.isNeeded("U")); - } - - { - ManaCost p = new ManaCost("G G G G"); - - check(22.1, !p.isNeeded("W")); - check(22.2, p.isNeeded("G")); - - check(22.3, !p.isNeeded("R")); - - p.addMana("G"); - p.addMana("G"); - p.addMana("G"); - p.addMana("G"); - - check(22.4, p.isPaid()); - - check(22.5, !p.isNeeded("G")); - } - - { - ManaCost p = new ManaCost("GW"); - - check(23.1, p.isNeeded("W")); - check(23.2, p.isNeeded("G")); - check(23.3, !p.isNeeded("R")); - - p.addMana("G"); - - check(23.4, p.isPaid()); - - check(23.5, !p.isNeeded("G")); - } - - { - ManaCost p = new ManaCost("GW"); - - check(24.1, p.isNeeded("W")); - check(24.2, p.isNeeded("G")); - check(24.3, !p.isNeeded("U")); - - p.addMana("W"); - - check(24.4, p.isPaid()); - - check(24.5, !p.isNeeded("W")); - } - - { - ManaCost p = new ManaCost("3 GW GW"); - - check(25.1, p.isNeeded("W")); - check(25.2, p.isNeeded("G")); - check(25.3, p.isNeeded("U")); - - p.addMana("1"); - p.addMana("1"); - p.addMana("1"); - - check(25.4, p.isNeeded("W")); - check(25.5, p.isNeeded("G")); - check(25.6, !p.isNeeded("U")); - - p.addMana("G"); - p.addMana("W"); - - check(25.7, p.isPaid()); - - check(25.8, !p.isNeeded("W")); - check(25.9, !p.isNeeded("G")); - check(25.10, !p.isNeeded("1")); - check(25.11, !p.isNeeded("R")); - } - - { - ManaCost p = new ManaCost("4"); - - check(26.1, p.isNeeded("W")); - check(26.2, p.isNeeded("G")); - check(26.3, p.isNeeded("U")); - - p.addMana("1"); - p.addMana("1"); - p.addMana("1"); - p.addMana("1"); - - check(26.4, p.isPaid()); - } - - { - ManaCost p = new ManaCost("10"); - - p.addMana("G"); - p.addMana("W"); - p.addMana("R"); - p.addMana("U"); - p.addMana("B"); - - p.addMana("1"); - - p.addMana("W"); - p.addMana("R"); - p.addMana("U"); - p.addMana("B"); - - check(27, p.isPaid()); - } - - { - ManaCost p = new ManaCost("12 G GW"); - - for (int i = 0; i < 12; i++) - p.addMana("R"); - - p.addMana("G"); - p.addMana("W"); - - check(28, p.isPaid()); - } - - { - ManaCost p = new ManaCost("2 W B U R G"); - - for (int i = 0; i < 1; i++) - p.addMana("R"); - - for (int i = 0; i < 2; i++) - p.addMana("1"); - - for (int i = 0; i < 1; i++) - { - p.addMana("G"); - p.addMana("W"); - p.addMana("B"); - p.addMana("U"); - - } - check(29, p.isPaid()); - } - - { - ManaCost p = new ManaCost("W B U R G W"); - - p.addMana("R"); - p.addMana("G"); - p.addMana("B"); - p.addMana("U"); - - p.addMana("W"); - p.addMana("W"); - - check(30, p.isPaid()); - } - - { - ManaCost p = new ManaCost("W B U R G W B U R G"); - - for (int i = 0; i < 2; i++) - { - p.addMana("W"); - p.addMana("R"); - p.addMana("G"); - p.addMana("B"); - p.addMana("U"); - } - - check(31, p.isPaid()); - } - - { - ManaCost p = new ManaCost("2 W B U R G W B U R G G"); - - for (int i = 0; i < 2; i++) - { - p.addMana("W"); - p.addMana("R"); - p.addMana("G"); - p.addMana("B"); - p.addMana("U"); - } - - p.addMana("1"); - p.addMana("1"); - p.addMana("G"); - - check(32, p.isPaid()); - } - - { - ManaCost p = new ManaCost("1 B R"); - - p.addMana("B"); - p.addMana("1"); - p.addMana("R"); - - check(33, p.isPaid()); - } - - { - ManaCost p = new ManaCost("B R"); - - p.addMana("B"); - p.addMana("R"); - - check(34, p.isPaid()); - } - - - { - ManaCost p = new ManaCost("2/B 2/B 2/B"); - - check(35, p.isNeeded("G")); - - p.addMana("B"); - check(36, p.toString().equals("2/B 2/B")); - - p.addMana("B"); - check(37, p.toString().equals("2/B")); - - p.addMana("B"); - check(38, p.isPaid()); - } - - - { - ManaCost p = new ManaCost("2/G"); - - p.addMana("1"); - check(39, p.toString().equals("1")); - - p.addMana("W"); - check(40, p.isPaid()); - } - - { - ManaCost p = new ManaCost("2/R 2/R"); - - p.addMana("1"); - check(41, p.toString().equals("2/R 1")); - - p.addMana("W"); - check(42, p.toString().equals("2/R")); - } - - { - ManaCost p = new ManaCost("2/W 2/W"); - - for(int i = 0; i < 4; i++) - { - check(43, p.isPaid() == false); - p.addMana("1"); - } - - check(44, p.isPaid()); - } - - { - ManaCost p = new ManaCost("2/W 2/B 2/U 2/R 2/G"); - check(45, p.isPaid() == false); - - p.addMana("B"); - p.addMana("R"); - p.addMana("G"); - p.addMana("W"); - p.addMana("U"); - - check(45.1, p.isPaid(), p); - } - - { - ManaCost p = new ManaCost("2/W 2/B 2/U 2/R 2/G"); - check(46, p.isPaid() == false); - - Card c = new Card(); - - p.addMana(new Mana(Constant.Color.Black, 1, c)); - p.addMana(new Mana(Constant.Color.Red, 1, c)); - p.addMana(new Mana(Constant.Color.Green, 1, c)); - p.addMana(new Mana(Constant.Color.White, 1, c)); - p.addMana(new Mana(Constant.Color.Blue, 1, c)); - - check(46.1, p.isPaid(), p); - } - - } //testPayManaCost() - - - static void check(double n, boolean b) - { - if (!b) - System.out.println("failed : " + n); - } - - static void check(double n, boolean b, ManaCost p) - { - if (!b){ - System.out.println("failed : " + n); - System.out.println(p.toString()); - } - } - - public static void main(String[] args) - { - try - { - -// magic.core.ErrorReport.setThrowException(true); - - testPayManaCost(); - System.out.println("all tests passed"); - } - catch (Exception ex) - { - System.out.println("failed : exception " + ex); - ex.printStackTrace(); - } - } -} diff --git a/src/forge/card/spellability/Ability.java b/src/forge/card/spellability/Ability.java index 05708e791ea..2bab39ea658 100644 --- a/src/forge/card/spellability/Ability.java +++ b/src/forge/card/spellability/Ability.java @@ -1,44 +1,58 @@ - package forge.card.spellability; import com.esotericsoftware.minlog.Log; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; +import forge.*; +/** + *

Abstract Ability class.

+ * + * @author Forge + * @version $Id: $ + */ abstract public class Ability extends SpellAbility { - //Slight hack for Pithing Needle - private String sourceCardName; - + //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.Stack.isSplitSecondOnStack()) return false; - - CardList pithing = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); - pithing.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - 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; + 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 index 6883213d910..193c8d7e2e6 100644 --- a/src/forge/card/spellability/Ability_Activated.java +++ b/src/forge/card/spellability/Ability_Activated.java @@ -1,51 +1,67 @@ - package forge.card.spellability; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; +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); - } - + 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); + setTarget(tgt); } - @Override + /** {@inheritDoc} */ + @Override public boolean canPlay() { - if(AllZone.Stack.isSplitSecondOnStack()) return false; - + 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.HumanPlayer); - pithing.addAll(AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer)); - 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; - + 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 index e85fdbcc12b..e0c12efd5b8 100644 --- a/src/forge/card/spellability/Ability_Mana.java +++ b/src/forge/card/spellability/Ability_Mana.java @@ -1,145 +1,284 @@ -package forge.card.spellability; - -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.Player; -import forge.card.mana.ManaPool; - -abstract public class Ability_Mana extends Ability_Activated implements java.io.Serializable { - 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; - - public Ability_Mana(Card sourceCard, String parse, String produced) { - this(sourceCard, parse, produced, 1); - } - - public Ability_Mana(Card sourceCard, String parse, String produced, int num) { - this(sourceCard, new Cost(parse, sourceCard.getName(), true), produced, num); - } - - public Ability_Mana(Card sourceCard, Cost cost, String produced) { - this(sourceCard, cost, produced, 1); - } - - public Ability_Mana(Card sourceCard, Cost cost, String produced, int num) { - super(sourceCard, cost, null); - - origProduced = produced; - amount = num; - } - - @Override - public boolean canPlayAI() { - return false; - } - - @Override - public void resolve() { - 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()); - } - - public void produceMana(String produced, Player player){ - final Card source = this.getSourceCard(); - ManaPool manaPool; - if (player.isHuman()) - manaPool = AllZone.ManaPool; - else manaPool = AllZone.Computer_ManaPool; - // 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", AllZone.HumanPlayer); - runParams.put("Ability_Mana", this); - runParams.put("Produced", produced); - AllZone.TriggerHandler.runTrigger("TapsForMana", runParams); - - }//end produceMana(String) - - public String mana() { return origProduced; } - public void setMana(String s) { origProduced = s; } - public void setReflectedMana(boolean bReflect) { reflected = bReflect; } - - public boolean isSnow() { return this.getSourceCard().isSnow(); } - public boolean isSacrifice() { return this.getPayCosts().getSacCost(); } - public boolean isReflectedMana() { return reflected; } - - public boolean canProduce(String s) { return origProduced.contains(s); } - - public boolean isBasic(){ - if (origProduced.length() != 1) - return false; - - if (amount > 1) - return false; - - return true; - } - - public boolean isUndoable() { return undoable && getPayCosts().isUndoable() && AllZoneUtil.isCardInPlay(getSourceCard()); } - public void setUndoable(boolean bUndo) { undoable = bUndo; } - - public void setCanceled(boolean bCancel) { canceled = bCancel; } - public boolean getCanceled() { return canceled; } - - public void undo(){ - if (isUndoable()){ - getPayCosts().refundPaidCost(getSourceCard()); - } - } - - @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 - +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 index 18126d67be1..61e71658e14 100644 --- a/src/forge/card/spellability/Ability_Static.java +++ b/src/forge/card/spellability/Ability_Static.java @@ -1,11 +1,22 @@ - -package forge.card.spellability; - - -import forge.Card; - -abstract public class Ability_Static extends Ability { - public Ability_Static(Card sourceCard, String manaCost) { - super(sourceCard, manaCost); - } -} +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 index bb10ec885e7..6f8326185ad 100644 --- a/src/forge/card/spellability/Ability_Sub.java +++ b/src/forge/card/spellability/Ability_Sub.java @@ -1,32 +1,62 @@ -package forge.card.spellability; - -import forge.Card; - -abstract public class Ability_Sub extends SpellAbility implements java.io.Serializable { - private static final long serialVersionUID = 4650634415821733134L; - - private SpellAbility parent = null; - - public Ability_Sub(Card sourceCard, Target tgt) { - super(SpellAbility.Ability, sourceCard); - setTarget(tgt); - } - - @Override - public boolean canPlay() { - // this should never be on the Stack by itself - return false; - } - - abstract public boolean chkAI_Drawback(); - - abstract public boolean doTrigger(boolean mandatory); - - public void setParent(SpellAbility parent) { - this.parent = parent; - } - - public SpellAbility getParent() { - return parent; - } -} +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 index 85e6eb5574c..e0e17043fcb 100644 --- a/src/forge/card/spellability/Ability_Triggered.java +++ b/src/forge/card/spellability/Ability_Triggered.java @@ -1,72 +1,114 @@ - package forge.card.spellability; -import java.util.Arrays; - 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; - + + 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) { + 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()}; + restrictions = new String[]{"named " + sourceCard.getName()}; } } - + + /** {@inheritDoc} */ @Override public boolean canPlay() { return false; - }//this is a triggerred ability: it cannot be "played" + }//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(); + 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; + 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 index 473c2aa2934..70aab90799c 100644 --- a/src/forge/card/spellability/Cost.java +++ b/src/forge/card/spellability/Cost.java @@ -1,768 +1,1285 @@ -package forge.card.spellability; - -import java.util.regex.Pattern; - -import forge.AllZone; -import forge.Card; -import forge.Counters; -import forge.card.mana.ManaCost; - -public class Cost { - private boolean isAbility = true; - - private boolean sacCost = false; - public boolean getSacCost() { return sacCost; } - private String sacType = ""; // or CARDNAME - public String getSacType() { return sacType; } - private boolean sacThis = false; - public boolean getSacThis() { return sacThis; } - private int sacAmount = 0; - public int getSacAmount() { return sacAmount; } - private boolean sacX = false; - public boolean isSacX() { return sacX; } - private boolean sacAll = false; - public boolean isSacAll() { return sacAll; } - - private boolean exileCost = false; - public boolean getExileCost() { return exileCost; } - private String exileType = ""; // or CARDNAME - public String getExileType() { return exileType; } - private boolean exileThis = false; - public boolean getExileThis() { return exileThis; } - private int exileAmount = 0; - public int getExileAmount() { return exileAmount; } - - private boolean exileFromHandCost = false; - public boolean getExileFromHandCost() { return exileFromHandCost; } - private String exileFromHandType = ""; // or CARDNAME - public String getExileFromHandType() { return exileFromHandType; } - private boolean exileFromHandThis = false; - public boolean getExileFromHandThis() { return exileFromHandThis; } - private int exileFromHandAmount = 0; - public int getExileFromHandAmount() { return exileFromHandAmount; } - - private boolean exileFromGraveCost = false; - public boolean getExileFromGraveCost() { return exileFromGraveCost; } - private String exileFromGraveType = ""; // or CARDNAME - public String getExileFromGraveType() { return exileFromGraveType; } - private boolean exileFromGraveThis = false; - public boolean getExileFromGraveThis() { return exileFromGraveThis; } - private int exileFromGraveAmount = 0; - public int getExileFromGraveAmount() { return exileFromGraveAmount; } - - private boolean exileFromTopCost = false; - public boolean getExileFromTopCost() { return exileFromTopCost; } - private String exileFromTopType = ""; // or CARDNAME - public String getExileFromTopType() { return exileFromTopType; } - private boolean exileFromTopThis = false; - public boolean getExileFromTopThis() { return exileFromTopThis; } - private int exileFromTopAmount = 0; - public int getExileFromTopAmount() { return exileFromTopAmount; } - - private boolean tapCost = false; - public boolean getTap() { return tapCost; } - - // future expansion of Ability_Cost class: tap untapped type - private boolean tapXTypeCost = false; - public boolean getTapXTypeCost() { return tapXTypeCost;} - private int tapXTypeAmount = 0; - public int getTapXTypeAmount() { return tapXTypeAmount; } - private String tapXType = ""; - public String getTapXType() { return tapXType;} - - private boolean untapCost = false; - public boolean getUntap() { return untapCost; } - - private boolean subtractCounterCost = false; - public boolean getSubCounter() { return subtractCounterCost; } - - private boolean addCounterCost = false; - public boolean getAddCounter() { return addCounterCost; } - - private int counterAmount = 0; - public int getCounterNum() { return counterAmount; } - private Counters counterType; - public Counters getCounterType() { return counterType; } - - private boolean lifeCost = false; - public boolean getLifeCost() { return lifeCost; } - private int lifeAmount = 0; - public int getLifeAmount() { return lifeAmount; } - - private boolean discardCost = false; - public boolean getDiscardCost() { return discardCost; } - private int discardAmount = 0; - public int getDiscardAmount() { return discardAmount; } - private String discardType = ""; - public String getDiscardType() { return discardType; } - private boolean discardThis = false; - public boolean getDiscardThis() { return discardThis;} - - private boolean returnCost = false; // Return something to owner's hand - public boolean getReturnCost() { return returnCost; } - private String returnType = ""; // or CARDNAME - public String getReturnType() { return returnType; } - private boolean returnThis = false; - public boolean getReturnThis() { return returnThis; } - private int returnAmount = 0; - public int getReturnAmount() { return returnAmount; } - - public boolean hasNoManaCost() { return manaCost.equals("") || manaCost.equals("0"); } - private String manaCost = ""; - public String getMana() { return manaCost; } // Only used for Human to pay for non-X cost first - public void setMana(String sCost) { manaCost = sCost; } - - public boolean hasNoXManaCost() { return manaXCost == 0; } - private int manaXCost = 0; - public int getXMana() { return manaXCost; } - public void setXMana(int xCost) { manaXCost = xCost; } - - public boolean isOnlyManaCost() { - return !sacCost && !exileCost && !exileFromHandCost && !exileFromGraveCost && !exileFromTopCost && !tapCost && - !tapXTypeCost && !untapCost && !subtractCounterCost && !addCounterCost && !lifeCost && !discardCost && !returnCost; - } - - 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; - - 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"; - } - - 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; - } - - 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(); - } - - public void changeCost(SpellAbility sa){ - if (getTotalMana() != "0"){ // 11/15/10 use getTotalMana() to account for X reduction - String mana = getTotalMana(); - manaCost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana)).toString(); - } - } - - 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? - } - - public boolean isUndoable() { - return !(sacCost || exileCost || exileFromHandCost || exileFromGraveCost || tapXTypeCost || discardCost || - returnCost || lifeCost || exileFromTopCost) && hasNoXManaCost() && hasNoManaCost(); - } - - - 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 - } - - 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. - - public String toStringAlt(){ - return spellToString(false); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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(); - } - - 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 - private static final String[] numNames = { "zero", "a", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" }; - private static final Pattern vowelPattern = Pattern.compile("^[aeiou]", Pattern.CASE_INSENSITIVE); - - - 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(); - } -} \ No newline at end of file +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 index 723e830297d..49aaf6d8898 100644 --- a/src/forge/card/spellability/Cost_Payment.java +++ b/src/forge/card/spellability/Cost_Payment.java @@ -1,1596 +1,1877 @@ -package forge.card.spellability; - -import javax.swing.JOptionPane; - -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; - -public class Cost_Payment { - private Cost cost = null; - private SpellAbility ability = null; - private Card card = null; - private SpellAbility_Requirements req = null; - - public Cost getCost() { return cost; } - public SpellAbility getAbility() { return ability; } - public Card getCard() { return card; } - - public void setRequirements(SpellAbility_Requirements reqs) { req = reqs; } - public void setCancel(boolean cancel) { bCancel = cancel; } - 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(); - private void addPayTapXTypeTappedList(Card c){ - payTapXTypeTappedList.add(c); - } - - public void setPayMana(boolean bPay){ payMana = bPay; } - public void setPayXMana(boolean bPay){ payXMana = bPay; } - public void setPayDiscard(boolean bSac){ payDiscard = bSac; } - public void setPaySac(boolean bSac){ paySac = bSac; } - public void setPayExile(boolean bExile) { payExile = bExile; } - public void setPayExileFromHand(boolean bExileFromHand) { payExileFromHand = bExileFromHand; } - public void setPayExileFromGrave(boolean bExileFromGrave) { payExileFromGrave = bExileFromGrave; } - public void setPayExileFromTop(boolean bExileFromTop) { payExileFromTop = bExileFromTop; } - public void setPayTapXType(boolean bTapX) { payTapXType = bTapX; } - public void setPayReturn(boolean bReturn){ payReturn = bReturn; } - - 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(); - } - - 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; - } - - public void setInput(Input in){ - AllZone.InputControl.setInput(in, true); - } - - 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.HumanPlayer.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; - } - - 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); - } - - public void resetUndoList(){ - // TODO: clear other undoLists here? - payTapXTypeTappedList.clear(); - } - - 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.ManaPool.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 - } - - public void 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.ComputerPlayer); - - // 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.ComputerPlayer); - 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; - } - } - - // 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; - } - } - - // 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; - } - } - - 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; - } - } - - if (cost.getExileFromTopCost()){ - if (cost.getExileFromTopThis()) - exileFromTopCard.add(card); - else - exileFromTopCard = AllZoneUtil.getPlayerCardsInLibrary(AllZone.ComputerPlayer, cost.getExileFromTopAmount()); - - if (exileFromTopCard.size() != cost.getExileFromTopAmount()){ - System.out.println("Couldn't find a valid card to exile for: "+card.getName()); - return; - } - } - - 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; - } - } - - if (cost.getDiscardThis()){ - if(!AllZoneUtil.getPlayerHand(card.getController()).contains(card.getController().getLastDrawnCard())) { - return; - } - if (!AllZone.getZone(card).getZoneName().equals(Constant.Zone.Hand)) - return; - } - - 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; - } - } - - // 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; - } - - 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.ComputerPlayer.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.GameAction.AI_discardNumType(discAmount, validType, ability); - } - else{ - AllZone.ComputerPlayer.discard(discAmount, ability, false); - } - } - } - } - - if (cost.getSacCost()){ - for(Card c : sacCard) - AllZone.GameAction.sacrifice(c); - } - - if (cost.getExileCost()){ - for(Card c : exileCard) - AllZone.GameAction.exile(c); - } - - if (cost.getExileFromHandCost()){ - for(Card c : exileFromHandCard) - AllZone.GameAction.exile(c); - } - - if (cost.getExileFromGraveCost()){ - for(Card c : exileFromGraveCard) - AllZone.GameAction.exile(c); - } - - if(cost.getExileFromTopCost()) { - for(Card c : exileFromTopCard) - AllZone.GameAction.exile(c); - } - - if (cost.getReturnCost()){ - for(Card c : returnCard) - AllZone.GameAction.moveToHand(c); - } - - AllZone.Stack.addAndUnfreeze(ability); - } - - public void changeCost(){ - cost.changeCost(ability); - } - - - // ****************************************************************************** - // *********** Inputs used by Cost_Payment below here *************************** - // ****************************************************************************** - - 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.InputControl.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.HumanPlayer.payLife(phyLifeToLose,sa.getSourceCard()); - sa.getSourceCard().setSunburstValue(mana.getSunburst()); - resetManaCost(); - payment.setPayMana(true); - stop(); - payment.payCost(); - } - - @Override - public void selectButtonCancel() { - resetManaCost(); - payment.setCancel(true); - payment.payCost(); - AllZone.Human_Battlefield.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.Display.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.Display.showMessage(msg.toString()); - if(mana.isPaid()) - done(); - } - }; - return payMana; - } - - 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.Display.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.InputControl.getInput() == this) - showMessage(); - } - - @Override - public void selectButtonCancel() { - payment.setCancel(true); - payment.payCost(); - AllZone.Human_Battlefield.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; - } - - - 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.Human_Hand.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.Display.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.Human_Hand.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() - - 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.GameAction.sacrifice(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_sacrifice() - - 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.Display.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.GameAction.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() - - 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.GameAction.sacrifice(card); - } - - payment.setPaySac(true); - payment.payCost(); - } - - 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.Display.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.GameAction.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() - - 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.GameAction.exile(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_exile() - - 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.GameAction.exile(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - 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.GameAction.exile(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - 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.GameAction.exile(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - return target; - }//input_exile() - - 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.Display.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.GameAction.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() - - 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.Display.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.GameAction.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() - - 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.GameAction.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() - - 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.GameAction.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() - - 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.Display.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() - - 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.GameAction.moveToHand(card); - stop(); - payment.payCost(); - } - else{ - payment.setCancel(true); - stop(); - payment.payCost(); - } - } - } - }; - - return target; - }//input_sacrifice() - - 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.Display.showMessage(msg.toString()); - ButtonUtil.enableOnlyCancel(); - } - - @Override - public void selectButtonCancel() { - cancel(); - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if(typeList.contains(card)) { - nReturns++; - AllZone.GameAction.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() -} +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 index 28b2d8eb4b8..834210b2a86 100644 --- a/src/forge/card/spellability/Spell.java +++ b/src/forge/card/spellability/Spell.java @@ -1,28 +1,43 @@ package forge.card.spellability; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Constant; -import forge.Phase; + +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); @@ -30,50 +45,54 @@ abstract public class Spell extends SpellAbility implements java.io.Serializable setStackDescription(sourceCard.getSpellText()); getRestrictions().setZone(Constant.Zone.Hand); } - + + /** {@inheritDoc} */ @Override public boolean canPlay() { - if(AllZone.Stack.isSplitSecondOnStack()) return false; - - Card card = getSourceCard(); - + if (AllZone.getStack().isSplitSecondOnStack()) return false; + + Card card = getSourceCard(); + if (card.isUnCastable()) - return false; - + return false; + if (payCosts != null) - if (!Cost_Payment.canPayAdditionalCosts(payCosts, this)) - return false; - - if (!this.getRestrictions().canPlay(card, this)) - return false; - + 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; - } + Card card = getSourceCard(); + if (card.getSVar("NeedsToPlay").length() > 0) { + String needsToPlay = card.getSVar("NeedsToPlay"); + CardList list = AllZoneUtil.getCardsInPlay(); - return super.canPlayAI(); + 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) { + } 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 index 16c3a4bdbd2..0d9a9bbd979 100644 --- a/src/forge/card/spellability/SpellAbility.java +++ b/src/forge/card/spellability/SpellAbility.java @@ -1,609 +1,1205 @@ - -package forge.card.spellability; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.CommandArgs; -import forge.Player; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.mana.Mana; -import forge.gui.input.Input; - - -//only SpellAbility can go on the stack -//override any methods as needed -public abstract class SpellAbility { - public Object[] choices_made; //open ended Casting choice storage - //choices for constructor isPermanent argument - public static final int Spell = 0; - 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 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) {} - }; - - 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 - abstract public boolean canPlay(); - - //all Spell's and Abilities must override this method - abstract public void resolve(); - - public boolean canPlayAI() { - return true; - } - - // This should be overridden by ALL AFs - public boolean doTrigger(boolean mandatory){ - return false; - } - - public void chooseTargetAI() { - randomTarget.execute(this); - } - - public void setChooseTargetAI(CommandArgs c) { - randomTarget = c; - } - - public CommandArgs getChooseTargetAI() { - return randomTarget; - } - - public String getManaCost() { - return manaCost; - } - - public void setManaCost(String cost) { - manaCost = cost; - } - - public String getAdditionalManaCost() { - return additionalManaCost; - } - - public void setAdditionalManaCost(String cost) { - additionalManaCost = cost; - } - - public String getMultiKickerManaCost() { - return multiKickerManaCost; - } - - public void setMultiKickerManaCost(String cost) { - multiKickerManaCost = cost; - } - - public String getReplicateManaCost() { - return replicateManaCost; - } - - public void setReplicateManaCost(String cost) { - replicateManaCost = cost; - } - - public String getXManaCost() - { - return xManaCost; - } - - public void setXManaCost(String cost) - { - xManaCost = cost; - } - - public Player getActivatingPlayer(){ - return activatingPlayer; - } - - public void setActivatingPlayer(Player player){ - // trickle down activating player - activatingPlayer = player; - if (subAbility != null) - subAbility.setActivatingPlayer(player); - } - - public boolean isSpell() { - return spell; - } - - public boolean isAbility() { - return !isSpell(); - } - - public boolean isTapAbility() { - return tapAbility; - } - - public boolean isUntapAbility() { - return untapAbility; - } - - public void makeUntapAbility() - { - untapAbility = true; - tapAbility = false; - } - - public void setIsBuyBackAbility(boolean b) { - buyBackAbility = b; - } - - public boolean isBuyBackAbility() { - return buyBackAbility; - } - - public void setIsMultiKicker(boolean b){ - multiKicker = b; - } - - public boolean isMultiKicker() { - return multiKicker; - } - - public void setIsReplicate(boolean b){ - replicate = b; - } - - public boolean isReplicate() { - return replicate; - } - - public void setIsXCost(boolean b) { - xCost = b; - } - - public boolean isXCost(){ - return xCost; - } - - public void setIsCycling(boolean b) { - cycling = b; - } - - public boolean isCycling(){ - return cycling; - } - - public void setSourceCard(Card c) { - sourceCard = c; - } - - public Card getSourceCard() { - return sourceCard; - } - - public Command getBeforePayManaAI() { - return beforePayManaAI; - } - - public void setBeforePayManaAI(Command c) { - beforePayManaAI = c; - } - - //begin - Input methods - public Input getBeforePayMana() { - return beforePayMana; - } - - public void setBeforePayMana(Input in) { - beforePayMana = in; - } - - public Input getAfterPayMana() { - return afterPayMana; - } - - public void setAfterPayMana(Input in) { - afterPayMana = in; - } - - public Cost getPayCosts() { - return payCosts; - } - - public void setPayCosts(Cost abCost) { - payCosts = abCost; - } - - public Target getTarget() { - return chosenTarget; - } - - public void setTarget(Target tgt) { - chosenTarget = tgt; - } - - public void setRestrictions(SpellAbility_Restriction restrict){ - restrictions = restrict; - } - - public SpellAbility_Restriction getRestrictions(){ - return restrictions; - } - - public void setConditions(SpellAbility_Condition condition) { - conditions = condition; - } - - public SpellAbility_Condition getConditions() { - return conditions; - } - - public void setAbilityFactory(AbilityFactory af){ - abilityFactory = af; - } - - public AbilityFactory getAbilityFactory(){ - return abilityFactory; - } - - public ArrayList getPayingMana(){ - return payingMana; - } - - public ArrayList getPayingManaAbilities(){ - return paidAbilities; - } - - // Combined PaidLists - public void setPaidHash(HashMap hash){ - paidLists = hash; - } - - public HashMap getPaidHash(){ - return paidLists; - } - - // Paid List are for things ca - public void setPaidList(CardList list, String str){ - paidLists.put(str, list); - } - - public CardList getPaidList(String str){ - return paidLists.get(str); - } - - public void addCostToHashList(Card c, String str){ - if (!paidLists.containsKey(str)) - paidLists.put(str, new CardList()); - - paidLists.get(str).add(c); - } - - public void resetPaidHash(){ - paidLists = new HashMap(); - } - - public HashMap getTriggeringObjects() { - return triggeringObjects; - } - - public void setAllTriggeringObjects(HashMap triggeredObjects) { - this.triggeringObjects = triggeredObjects; - } - - public void setTriggeringObject(String type,Object o) { - this.triggeringObjects.put(type, o); - } - - public Object getTriggeringObject(String type) - { - return triggeringObjects.get(type); - } - - public boolean hasTriggeringObject(String type) - { - return triggeringObjects.containsKey(type); - } - - public void resetTriggeringObjects(){ - triggeringObjects = new HashMap(); - } - - public void resetOnceResolved(){ - resetPaidHash(); - - if (chosenTarget != null) - chosenTarget.resetTargets(); - - resetTriggeringObjects(); - } - - public Input getAfterResolve() { - return afterResolve; - } - - public void setAfterResolve(Input in) { - afterResolve = in; - } - - public void setStackDescription(String s) { - stackDescription = s; - if(description == "" && sourceCard.getText().equals("")) - description = s; - } - - public String getStackDescription() { - if(stackDescription.equals(getSourceCard().getText().trim())) return getSourceCard().getName() + " - " - + getSourceCard().getText(); - - return stackDescription.replaceAll("CARDNAME", this.getSourceCard().getName()); - } - - public boolean isIntrinsic() { - return type.equals("Intrinsic"); - } - - public boolean isExtrinsic() { - return type.equals("Extrinsic"); - } - - public void setType(String s) //Extrinsic or Intrinsic: - { - type = s; - } - - 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" - public void setDescription(String s) { - description = s; - } - - public String getDescription() { - return description; - } - - @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(); - } - - public void setSubAbility(Ability_Sub subAbility) { - this.subAbility = subAbility; - if (subAbility != null) - subAbility.setParent(this); - } - - public Ability_Sub getSubAbility() { - return this.subAbility; - } - - 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; - } - - 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); - } - } - - public CardList getTargetList() { - return targetList; - } - - 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()); - } - - 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); - } - - 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; - } - - public Command getCancelCommand() { - return cancelCommand; - } - - public void setCancelCommand(Command cancelCommand) { - this.cancelCommand = cancelCommand; - } - - public void setFlashBackAbility(boolean flashBackAbility) { - this.flashBackAbility = flashBackAbility; - } - - public boolean isFlashBackAbility() { - return flashBackAbility; - } - public void setKickerAbility(boolean kab) { - this.kickerAbility=kab; - } - 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. - public boolean wasCancelled() { - return false; - } - public SpellAbility copy() - { - SpellAbility clone = null; - try { - clone = (SpellAbility)this.clone(); - } catch (CloneNotSupportedException e) { - System.err.println(e); - } - return clone; - } - - public void setKothThirdAbility(boolean kothThirdAbility) { - this.kothThirdAbility = kothThirdAbility; - } - - public boolean isKothThirdAbility() { - return kothThirdAbility; - } - - public void setTrigger(boolean trigger) { - this.trigger = trigger; - } - - public boolean isTrigger() { - return trigger; - } - - public void setMandatory(boolean mand) { - this.mandatory = mand; - } - - public boolean isMandatory() { - return mandatory; - } -} +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 index 2408082b0f0..0f0b690c5c1 100644 --- a/src/forge/card/spellability/SpellAbilityList.java +++ b/src/forge/card/spellability/SpellAbilityList.java @@ -1,62 +1,111 @@ - package forge.card.spellability; -import java.util.ArrayList; - import forge.ComputerUtil; +import java.util.ArrayList; + +/** + *

SpellAbilityList class.

+ * + * @author Forge + * @version $Id: $ + */ public class SpellAbilityList { private ArrayList list = new ArrayList(); - - public SpellAbilityList() {} - + + /** + *

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++) + 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++) + 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.canPlay(get(i))) throw new RuntimeException( + 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++) { + for (int i = 0; i < size(); i++) { sb.append(get(i).getSourceCard().toString()); sb.append(" - "); sb.append(get(i).getStackDescription()); @@ -64,10 +113,11 @@ public class SpellAbilityList { } return sb.toString(); }//toString() - + + /** {@inheritDoc} */ @Override public boolean equals(Object o) { - if(o == null) return false; + 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 index 7d0bb951e9c..06e88459cb1 100644 --- a/src/forge/card/spellability/SpellAbility_Condition.java +++ b/src/forge/card/spellability/SpellAbility_Condition.java @@ -1,234 +1,245 @@ - -package forge.card.spellability; - - -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Phase; -import forge.Player; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; - -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 - - public SpellAbility_Condition() { } - - 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("ConditionAnyPlayer")) - setAnyPlayer(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.Phase.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"); - } - } - }//setConditions - - 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.Phase.isPlayerTurn(activator)) - return false; - - if (bOpponentTurn && AllZone.Phase.isPlayerTurn(activator)) - return false; - - if (activationLimit != -1 && numberTurnActivations >= activationLimit) - return false; - - if (phases.size() > 0){ - boolean isPhase = false; - String currPhase = AllZone.Phase.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 (!Card.compare(left, presentCompare, right)) - return false; - } - - if(presentDefined != null) { - CardList list; - if (presentDefined == null) - list = AllZoneUtil.getCardsInPlay(); - else{ - 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 Card.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 (!Card.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(!Card.compare(life, lifeAmount, right)) { - return false; - } - } - - return true; - } - -}//end class SpellAbility_Condition +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 index 763ff531806..4d77dba4828 100644 --- a/src/forge/card/spellability/SpellAbility_Requirements.java +++ b/src/forge/card/spellability/SpellAbility_Requirements.java @@ -1,131 +1,180 @@ -package forge.card.spellability; - -import java.util.ArrayList; - -import forge.AllZone; -import forge.Card; -import forge.PlayerZone; - -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; - public void setSkipStack(boolean bSkip) { skipStack = bSkip; } - public void setFree(boolean bFree) { isFree = bFree; } - - private PlayerZone fromZone = null; - private boolean bCasting = false; - - public SpellAbility_Requirements(SpellAbility sa, Target_Selection ts, Cost_Payment cp){ - ability = sa; - select = ts; - payment = cp; - } - - public void fillRequirements(){ - fillRequirements(false); - } - - 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.GameAction.moveToStack(c); - } - } - - // freeze Stack. No abilities should go onto the stack while I'm filling requirements. - AllZone.Stack.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(); - } - - 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.GameAction.moveTo(fromZone, c); - } - - select.resetTargets(); - AllZone.Stack.clearFrozen(); - return; - } - else - needPayment(); - } - - public void needPayment(){ - if (!isFree) - startPaying(); - else - finishPaying(); - } - - public void startPaying(){ - payment.setRequirements(this); - payment.payCost(); - } - - public void finishPaying(){ - if (isFree || payment.isAllPaid()){ - if(skipStack) - ability.resolve(); - - else - addAbilityToStack(); - - select.resetTargets(); - AllZone.GameAction.checkStateEffects(); - } - else if (payment.isCanceled()){ - Card c = ability.getSourceCard(); - if (bCasting && !c.isCopiedSpell()){ // and not a copy - // add back to Previous Zone - AllZone.GameAction.moveTo(fromZone, c); - } - - if (select != null) - select.resetTargets(); - - payment.cancelPayment(); - AllZone.Stack.clearFrozen(); - } - } - - 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.ManaPool.clearPay(ability, false); - AllZone.Stack.addAndUnfreeze(ability); - } -} +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 index 047e48b91ad..77cb3ff8747 100644 --- a/src/forge/card/spellability/SpellAbility_Restriction.java +++ b/src/forge/card/spellability/SpellAbility_Restriction.java @@ -1,214 +1,249 @@ - package forge.card.spellability; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Phase; -import forge.Player; +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 - - - public SpellAbility_Restriction(){ } - - 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"); + // 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); - + setSorcerySpeed(true); + if (params.containsKey("PlayerTurn")) - setPlayerTurn(true); - + setPlayerTurn(true); + if (params.containsKey("OpponentTurn")) - setOpponentTurn(true); - + setOpponentTurn(true); + if (params.containsKey("AnyPlayer")) - setAnyPlayer(true); - + setAnyPlayer(true); + if (params.containsKey("ActivationLimit")) - setActivationLimit(Integer.parseInt(params.get("ActivationLimit"))); - + setActivationLimit(Integer.parseInt(params.get("ActivationLimit"))); + if (params.containsKey("ActivationNumberSacrifice")) - setActivationNumberSacrifice(Integer.parseInt(params.get("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.Phase.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("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"); - } - } - }//end setRestrictions() + 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() - public boolean canPlay(Card c, SpellAbility sa){ - if (!AllZone.getZone(c).getZoneName().equals(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.Phase.isPlayerTurn(activator)) - return false; - - if (bOpponentTurn && AllZone.Phase.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.Phase.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.getCardsInPlay(); - - 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 (!Card.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(!Card.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; - } - } - - 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 index 1a771b7b16b..a6cd3b0ca92 100644 --- a/src/forge/card/spellability/SpellAbility_StackInstance.java +++ b/src/forge/card/spellability/SpellAbility_StackInstance.java @@ -1,115 +1,171 @@ -package forge.card.spellability; - -import java.util.HashMap; - -import forge.Card; -import forge.CardList; -import forge.Player; - -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(); - - 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(); - - // Targeting info - Target target = sa.getTarget(); - if (target != null){ - tc = target.getTargetChoices(); - ability.getTarget().resetTargets(); - } - - // Triggering info - triggeringObjects = sa.getTriggeringObjects(); - - Ability_Sub subAb = ability.getSubAbility(); - if (subAb != null) - subInstace = new SpellAbility_StackInstance(subAb); - } - - 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 - public String getStackDescription() { - return stackDescription; - } - - public Card getSourceCard(){ - return ability.getSourceCard(); - } - - public Player getActivatingPlayer(){ - return activatingPlayer; - } - - public boolean isSpell(){ - return ability.isSpell(); - } - - public boolean isAbility(){ - return ability.isAbility(); - } - - public boolean isTrigger(){ - return ability.isTrigger(); - } -} +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 index e4a89a58c12..1c2299689df 100644 --- a/src/forge/card/spellability/SpellAbility_Variables.java +++ b/src/forge/card/spellability/SpellAbility_Variables.java @@ -1,155 +1,349 @@ - -package forge.card.spellability; - - -import java.util.ArrayList; - -import forge.Constant; - -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) - - 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 lifeTotal = null; - protected String lifeAmount = "GE1"; - - protected boolean pwAbility = false; - - public void setZone(String zone){ - this.zone = zone; - } - - public String getZone(){ - return zone; - } - - public void setSorcerySpeed(boolean bSpeed){ - bSorcerySpeed = bSpeed; - } - - public boolean getSorcerySpeed(){ - return bSorcerySpeed; - } - - public void setAnyPlayer(boolean anyPlayer){ - bAnyPlayer = anyPlayer; - } - - public boolean getAnyPlayer(){ - return bAnyPlayer; - } - - public void setPlayerTurn(boolean bTurn){ - bPlayerTurn = bTurn; - } - - public boolean getPlayerTurn(){ - return bPlayerTurn; - } - - public void setOpponentTurn(boolean bTurn){ - bOpponentTurn = bTurn; - } - - public boolean getOpponentTurn(){ - return bOpponentTurn; - } - - public void setActivationLimit(int limit){ - activationLimit = limit; - } - - public void abilityActivated(){ - numberTurnActivations++; - } - - public int getNumberTurnActivations() { - return numberTurnActivations; - } - - public void resetTurnActivations(){ - numberTurnActivations = 0; - } - - public void setActivationNumberSacrifice(int num) { - activationNumberSacrifice = num; - } - - public int getActivationNumberSacrifice() { - return activationNumberSacrifice; - } - - public void setPhases(String phasesString){ - for(String s : phasesString.split(",")) - phases.add(s); - } - - public void setActivateCardsInHand(int cards){ - nCardsInHand = cards; - } - - //specific named conditions - public void setHellbent(boolean bHellbent) { - hellbent = bHellbent; - } - - public void setThreshold(boolean bThreshold){ - threshold = bThreshold; - } - - public void setMetalcraft(boolean bMetalcraft) { - metalcraft = bMetalcraft; - } - - //IsPresent for Valid battlefield stuff - - public void setIsPresent(String present){ - sIsPresent = present; - } - - public void setPresentCompare(String compare){ - presentCompare = compare; - } - - public void setPresentDefined(String defined) { - presentDefined = defined; - } - - //used to define as a Planeswalker ability - public void setPlaneswalker(boolean bPlaneswalker) { pwAbility = bPlaneswalker; } - public boolean getPlaneswalker() { return pwAbility; } - - /* - * Restrictions of the future - * (can level Min level Max be done with isPresent?) - int levelMin = 0; - int levelMax = 0; - */ - - -}//end class SpellAbility_Variables +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 index 93e3335b1b4..5249e4d8c2b 100644 --- a/src/forge/card/spellability/Spell_Permanent.java +++ b/src/forge/card/spellability/Spell_Permanent.java @@ -1,288 +1,314 @@ - package forge.card.spellability; -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.CommandReturn; -import forge.Constant; -import forge.Player; +import forge.*; import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactory; 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 championType = null; - - ///////////////////// - /////// - private final CommandReturn championGetCreature = new CommandReturn() { - public Object execute() { - return AllZoneUtil.getPlayerTypeInPlay(getSourceCard().getController(), championType); - } - };//CommandReturn - - final SpellAbility championAbilityComes = new Ability(getSourceCard(), "0") { - @Override - public void resolve() { - if(getTargetCard() == null || getTargetCard() == getSourceCard()) AllZone.GameAction.sacrifice(getSourceCard()); - - else if(AllZoneUtil.isCardInPlay(getTargetCard())) { - AllZone.GameAction.exile(getTargetCard()); - } - }//resolve() - }; - - final Input championInputComes = new Input() { - private static final long serialVersionUID = -7503268232821397107L; - @Override + 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 "+championType+" you control to exile", false, false)); + "Select another " + championValidDesc + " you control to exile", false, false)); ButtonUtil.disableAll(); //target this card means: sacrifice this card } }; - Command championCommandComes = new Command() { - - private static final long serialVersionUID = -3580408066322945328L; - - public void execute() { + + 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(); - Player s = getSourceCard().getController(); - if(creature.size() == 0) { - AllZone.GameAction.sacrifice(getSourceCard()); + if (creature.size() == 0) { + AllZone.getGameAction().sacrifice(source); return; - } else if(s.isHuman()) { - AllZone.InputControl.setInput(championInputComes); - } - else { //Computer - Card target; - CardList computer = AllZoneUtil.getPlayerTypeInPlay(AllZone.ComputerPlayer, championType); - computer.remove(getSourceCard()); - + } 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) { - target = computer.get(0); - championAbilityComes.setTargetCard(target); - AllZone.Stack.addSimultaneousStackEntry(championAbilityComes); - if(getSourceCard().getName().equals("Mistbind Clique")) { - //TODO this needs to target - CardList list = AllZoneUtil.getPlayerLandsInPlay(AllZone.HumanPlayer); - for(Card c:list) c.tap(); + if (computer.size() != 0) { + Card c = computer.get(0); + source.setChampionedCard(c); + if (AllZoneUtil.isCardInPlay(c)) { + AllZone.getGameAction().exile(c); } - } - else - AllZone.GameAction.sacrifice(getSourceCard()); + + //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() { - //System.out.println(abilityComes.getTargetCard().getName()); - Object o = championAbilityComes.getTargetCard(); - - if(o == null || ((Card) o).isToken() || !AllZoneUtil.isCardExiled((Card) o)) return; - + SpellAbility ability = new Ability(getSourceCard(), "0") { @Override public void resolve() { - Card c = championAbilityComes.getTargetCard(); - if(!c.isToken()) { - AllZone.GameAction.moveToPlay(c); - + 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().getName()).append(" - returning card to battlefield."); + sb.append(getSourceCard()).append(" - When CARDNAME leaves the battlefield, exiled card returns to the battlefield."); ability.setStackDescription(sb.toString()); - - AllZone.Stack.addSimultaneousStackEntry(ability); + + AllZone.getStack().addSimultaneousStackEntry(ability); }//execute() };//championCommandLeavesPlay - + /////// //////////////////// - - public Spell_Permanent(Card sourceCard) { - // Add Costs for all SpellPermanents - this(sourceCard, new Cost(sourceCard.getManaCost(), sourceCard.getName(), false), null); - }//Spell_Permanent() - - public Spell_Permanent(Card sourceCard, Cost cost, Target tgt) { - super(sourceCard, cost, tgt); - - if(CardFactory.hasKeyword(sourceCard,"Champion") != -1) { - int n = CardFactory.hasKeyword(sourceCard, "Champion"); - - String parse = sourceCard.getKeyword().get(n).toString(); - willChampion = true; - championType = parse.split(":")[1]; - } - - 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()); - - setDescription(getStackDescription()); - if(willChampion) { - sourceCard.addComesIntoPlayCommand(championCommandComes); - sourceCard.addLeavesPlayCommand(championCommandLeavesPlay); - } - - }//Spell_Permanent() - - - @Override - public boolean canPlay() { - Card source = getSourceCard(); - if(AllZone.Stack.isSplitSecondOnStack() || source.isUnCastable()) return false; - - Player turn = AllZone.Phase.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; - } + /** + *

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() - // Flash handled by super.canPlay - return super.canPlay(); - } - - @Override - public boolean canPlayAI() { - - Card card = getSourceCard(); - - //check on legendary - if (card.isType("Legendary")) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - if (list.containsName(card.getName())) - return false; + 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 (card.isPlaneswalker()) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - list = list.getType("Planeswalker"); - - for (int i=0;i 0) { - return false; - } - } - } - if (card.isType("World")) { - CardList list = AllZoneUtil.getPlayerCardsInPlay(AllZone.ComputerPlayer); - 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 (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) { - 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; + 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 false; + return super.canPlayAI(); }//canPlayAI() - - public static boolean checkETBEffects(Card card, SpellAbility sa, String api){ + + /** + *

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()); + for (Trigger tr : triggers) { + // These triggers all care for ETB effects - // 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; + 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.GameAction.moveToPlay(c); + AllZone.getGameAction().moveToPlay(c); } } diff --git a/src/forge/card/spellability/Target.java b/src/forge/card/spellability/Target.java index 27544f7d527..ac664d149df 100644 --- a/src/forge/card/spellability/Target.java +++ b/src/forge/card/spellability/Target.java @@ -1,250 +1,494 @@ -package forge.card.spellability; - -import java.util.ArrayList; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.Constant; -import forge.Player; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.cardFactory.CardFactoryUtil; - -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; - public Target_Choices getTargetChoices() { return choice; } - public void setTargetChoices(Target_Choices tc) { choice = tc; } - - private boolean bMandatory = false; - public boolean getMandatory() { return bMandatory; } - public void setMandatory(boolean m) { bMandatory = m; } - - private boolean tgtValid = false; - private String ValidTgts[]; - private String vtSelection = ""; - - public boolean doesTarget() { return tgtValid; } - public String[] getValidTgts() { return ValidTgts; } - public String getVTSelection() { return vtSelection; } - - private String minTargets; - private String maxTargets; - public int getMinTargets(Card c, SpellAbility sa) { return AbilityFactory.calculateAmount(c, minTargets, sa); } - public int getMaxTargets(Card c, SpellAbility sa) { return AbilityFactory.calculateAmount(c, maxTargets, sa); } - - public boolean isMaxTargetsChosen(Card c, SpellAbility sa) { return choice != null && getMaxTargets(c, sa) == choice.getNumTargeted(); } - public boolean isMinTargetsChosen(Card c, SpellAbility sa) { return choice != null && getMinTargets(c, sa) <= choice.getNumTargeted(); } - - private String tgtZone = Constant.Zone.Battlefield; - public void setZone(String tZone) { tgtZone = tZone; } - public String getZone() { return tgtZone; } - - // Used for Counters. Currently, Spell,Activated,Triggered can be Comma-separated - private String targetSpellAbilityType = null; - public void setTargetSpellAbilityType(String tgtSAType) { targetSpellAbilityType = tgtSAType; } - public String getTargetSpellAbilityType() { return targetSpellAbilityType; } - - // Used for Counters. The target SA of this SA must be targeting a Valid X - private String saValidTargeting = null; - public void setSAValidTargeting(String saValidTgting) { saValidTargeting = saValidTgting; } - public String getSAValidTargeting() { return saValidTargeting; } - - // Leaving old structure behind for compatibility. - 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; - } - - public ArrayList getTargetCards(){ - if (choice == null) - return new ArrayList(); - - return choice.getTargetCards(); - } - - public ArrayList getTargetPlayers(){ - if (choice == null) - return new ArrayList(); - - return choice.getTargetPlayers(); - } - - public ArrayList getTargetSAs(){ - if (choice == null) - return new ArrayList(); - - return choice.getTargetSAs(); - } - - public ArrayList getTargets(){ - if (choice == null) - return new ArrayList(); - - return choice.getTargets(); - } - - public int getNumTargeted() { - if (choice == null) - return 0; - return choice.getNumTargeted(); - } - - public void resetTargets() { - choice = null; - } - - public Target(Card src,String parse){ - this(src,parse, "1", "1"); - } - - 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; - } - - public Target(Card src, String select, String[] valid){ - this(src, select, valid, "1", "1"); - } - - public Target(Card src, String select, String valid){ - this(src, select, valid.split(","), "1", "1"); - } - - public Target(Card src, String select, String[] valid, String min, String max){ - srcCard = src; - tgtValid = true; - vtSelection = select; - ValidTgts = valid; - - minTargets = min; - maxTargets = max; - } - - 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(); - } - - - 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; - } - - public boolean canTgtPlayer() { - for(String s: ValidTgts){ - if (s.equals("Player") || s.equals("Opponent")) - return true; - } - return false; - } - - public boolean canTgtCreature() { - for(String s: ValidTgts){ - if (s.contains("Creature") && !s.contains("nonCreature")) - return true; - } - return false; - } - - public boolean canTgtCreatureAndPlayer() { return canTgtPlayer() && canTgtCreature(); } - - public boolean hasCandidates() - { - if(canTgtPlayer()) - { - return true; - } - - for(Card c : AllZoneUtil.getCardsInZone(tgtZone, AllZone.HumanPlayer)) - { - if(c.isValidCard(ValidTgts, srcCard.getController(), srcCard) && CardFactoryUtil.canTarget(srcCard, c)) - { - return true; - } - } - - for(Card c : AllZoneUtil.getCardsInZone(tgtZone, AllZone.ComputerPlayer)) - { - if(c.isValidCard(ValidTgts, srcCard.getController(), srcCard) && CardFactoryUtil.canTarget(srcCard, c)) - { - return true; - } - } - - return false; - } -} +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 index 6bafc30addf..35f5b8d86f5 100644 --- a/src/forge/card/spellability/Target_Choices.java +++ b/src/forge/card/spellability/Target_Choices.java @@ -1,99 +1,162 @@ -package forge.card.spellability; - -import java.util.ArrayList; - -import forge.Card; -import forge.Player; - -public class Target_Choices { - private int numTargeted = 0; - 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(); - - 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; - } - - public boolean addTarget(Card c){ - if (!targetCards.contains(c)){ - targetCards.add(c); - numTargeted++; - return true; - } - return false; - } - - public boolean addTarget(Player p){ - if (!targetPlayers.contains(p)){ - targetPlayers.add(p); - numTargeted++; - return true; - } - return false; - } - - public boolean addTarget(SpellAbility sa){ - if (!targetSAs.contains(sa)){ - targetSAs.add(sa); - numTargeted++; - return true; - } - return false; - } - - public ArrayList getTargetCards(){ - return targetCards; - } - - public ArrayList getTargetPlayers(){ - return targetPlayers; - } - - public ArrayList getTargetSAs(){ - return targetSAs; - } - - public ArrayList getTargets(){ - ArrayList tgts = new ArrayList(); - tgts.addAll(targetPlayers); - tgts.addAll(targetCards); - tgts.addAll(targetSAs); - - return tgts; - } - - 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(); - } -} +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 index 0ca6d3aa390..2fb0c9ba1db 100644 --- a/src/forge/card/spellability/Target_Selection.java +++ b/src/forge/card/spellability/Target_Selection.java @@ -1,344 +1,460 @@ -package forge.card.spellability; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.Constant; -import forge.Player; -import forge.PlayerZone; -import forge.card.cardFactory.CardFactoryUtil; -import forge.gui.GuiUtils; -import forge.gui.input.Input; - -public class Target_Selection { - private Target target = null; - private SpellAbility ability = null; - private Card card = null; - - public Target getTgt() { return target; } - public SpellAbility getAbility() { return ability; } - public Card getCard() { return card; } - - private SpellAbility_Requirements req = null; - public void setRequirements(SpellAbility_Requirements reqs) { req = reqs; } - - private boolean bCancel = false; - public void setCancel(boolean done) { bCancel = done; } - public boolean isCanceled() { return bCancel; } - private boolean bDoneTarget = false; - public void setDoneTarget(boolean done) { bDoneTarget = done; } - - public Target_Selection(Target tgt, SpellAbility sa){ - target = tgt; - ability = sa; - card = sa.getSourceCard(); - } - - public boolean doesTarget(){ - if (target == null) - return false; - return target.doesTarget(); - } - - public void resetTargets(){ - if (target != null) - target.resetTargets(); - } - - 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 - Target_Selection ts = new Target_Selection(abSub.getTarget(), abSub); - ts.setRequirements(req); - ts.resetTargets(); - return ts.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 - - public void chooseValidInput(){ - Target tgt = this.getTgt(); - String zone = tgt.getZone(); - final boolean mandatory = target.getMandatory() ? target.hasCandidates() : 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.InputControl.setInput(input_targetSpecific(choices, true, mandatory)); - } - else - chooseCardFromList(choices, true, mandatory); - }//input_targetValid - - //CardList choices are the only cards the user can successful select - 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.Display.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.Display.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.getSourceCard())){ - tgt.addTarget(player); - done(); - } - } - - void done() { - stop(); - - select.chooseTargets(); - } - }; - - return target; - }//input_targetSpecific() - - - 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(); - } - - 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() - public static ArrayList getTargetableOnStack(SpellAbility sa, Target tgt){ - ArrayList choosables = new ArrayList(); - - for(int i = 0; i < AllZone.Stack.size(); i++) { - choosables.add(AllZone.Stack.peekAbility(i)); - } - - for(int i = 0; i < choosables.size(); i++) { - if (!matchSpellAbility(sa, choosables.get(i), tgt)){ - choosables.remove(i); - } - } - return choosables; - } - - 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; - } - - 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; - } -} +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 index a36b1d89e45..2ceab333caf 100644 --- a/src/forge/card/trigger/Trigger.java +++ b/src/forge/card/trigger/Trigger.java @@ -1,403 +1,517 @@ -package forge.card.trigger; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Player; -import forge.card.cardFactory.CardFactoryUtil; -import forge.card.spellability.SpellAbility; - -public abstract class Trigger { - - private static int nextID = 0; - - public static void resetIDs() - { - nextID = 50000; - } - - protected int ID = nextID++; - - protected String name; - public String getName() - { - return name; - } - public void setName(String n) - { - name = n; - } - - public void setID(int id) - { - ID = id; - } - - protected HashMap mapParams = new HashMap(); - public HashMap getMapParams() - { - return mapParams; - } - - protected HashMap runParams; - public void setRunParams(HashMap rp) - { - runParams = rp; - } - public HashMap getRunParams() - { - return runParams; - } - - protected SpellAbility overridingAbility = null; - public SpellAbility getOverridingAbility() - { - return overridingAbility; - } - public void setOverridingAbility(SpellAbility sa) - { - overridingAbility = sa; - } - - private HashMap storedTriggeredObjects = null; - public void setStoredTriggeredObjects(HashMap storedTriggeredObjects) { - this.storedTriggeredObjects = storedTriggeredObjects; - } - public HashMap getStoredTriggeredObjects() { - return storedTriggeredObjects; - } - - protected Card hostCard; - public Card getHostCard() - { - return hostCard; - } - public void setHostCard(Card c) - { - hostCard = c; - } - - 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; - } - - public Trigger(HashMap params, Card host) - { - mapParams = new HashMap(); - for(Map.Entry entry : params.entrySet()) - { - mapParams.put(entry.getKey(),entry.getValue()); - } - hostCard = host; - } - - public String toString() - { - if (mapParams.containsKey("TriggerDescription")) { - return mapParams.get("TriggerDescription").replace("CARDNAME", hostCard.getName()); - } - else return ""; - } - - 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; - } - - 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.Phase.buildActivateString(split[0], split[1]); - } - ArrayList triggerPhases = new ArrayList(); - for(String s : phases.split(",")) - { - triggerPhases.add(s); - } - if(!triggerPhases.contains(AllZone.Phase.getPhase())) - { - return false; - } - } - - if(mapParams.containsKey("PlayerTurn")) - if(!AllZone.Phase.isPlayerTurn(hostCard.getController())) - return false; - - if(mapParams.containsKey("OpponentTurn")) - if(AllZone.Phase.isPlayerTurn(hostCard.getController())) - return false; - - return true; - } - - 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(!Card.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 (!Card.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 (!Card.compare(left, presentCompare, right)) - { - return false; - } - - } - - return true; - } - - - 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; - } - - public boolean isSecondary() - { - if(mapParams.containsKey("Secondary")) - { - if(mapParams.get("Secondary").equals("True")) - return true; - } - return false; - } - - @Override - public boolean equals(Object o) - { - if(!(o instanceof Trigger)) - return false; - - return this.ID == ((Trigger)o).ID; - } - - public abstract boolean performTest(HashMap runParams); - - public abstract Trigger getCopy(); - - public abstract void setTriggeringObjects(SpellAbility sa); -} +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 index 3c61c8de8e2..bacbf82bdd0 100644 --- a/src/forge/card/trigger/TriggerHandler.java +++ b/src/forge/card/trigger/TriggerHandler.java @@ -1,1004 +1,954 @@ -package forge.card.trigger; - -import java.util.ArrayList; -import java.util.HashMap; - -import forge.AllZone; -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Command; -import forge.CommandArgs; -import forge.ComputerUtil; -import forge.GameActionUtil; -import forge.Player; -import forge.card.abilityFactory.AbilityFactory; -import forge.card.spellability.Ability; -import forge.card.spellability.Ability_Mana; -import forge.card.spellability.Ability_Sub; -import forge.card.spellability.Cost; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.SpellAbility_Restriction; -import forge.card.spellability.Target; -import forge.gui.input.Input; - -public class TriggerHandler { - - private ArrayList registeredModes = new ArrayList(); - private ArrayList registeredTriggers = new ArrayList(); - private ArrayList suppressedModes = new ArrayList(); - - private ArrayList delayedTriggers = new ArrayList(); - - public void suppressMode(String mode) - { - suppressedModes.add(mode); - } - - public void clearSuppression(String mode) - { - suppressedModes.remove(mode); - } - - public static Trigger parseTrigger(String name,String trigParse,Card host) - { - Trigger ret = TriggerHandler.parseTrigger(trigParse, host); - ret.setName(name); - return ret; - } - - public static Trigger parseTrigger(String trigParse,Card host) - { - HashMap mapParams = parseParams(trigParse); - return parseTrigger(mapParams,host); - } - - 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("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("Blocks")) - { - ret = new Trigger_Blocks(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; - } - - 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 getRegisteredTriggers() { - return registeredTriggers; - } - - public void removeAllFromCard(Card crd) - { - for(int i=0;i runParams) - { - if(suppressedModes.contains(mode) || !registeredModes.contains(mode)) - { - return; - } - //AP - for(Trigger regtrig : registeredTriggers) - { - if(regtrig.getHostCard().getController().equals(AllZone.Phase.getPlayerTurn())) - { - runSingleTrigger(regtrig,mode,runParams); - } - } - for(int i=0;i runParams) - { - if(!regtrig.zonesCheck()) - { - return false; - } - if(!regtrig.phasesCheck()) - { - return false; - } - if(!regtrig.requirementsCheck()) - { - return false; - } - - if(regtrig.getHostCard().isFaceDown()) - { - return false; - } - - 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.Phase.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); - regtrig.setTriggeringObjects(sa[0]); - if (regtrig.getStoredTriggeredObjects() != null) - sa[0].setAllTriggeringObjects(regtrig.getStoredTriggeredObjects()); - - sa[0].setActivatingPlayer(host.getController()); - if(sa[0].getStackDescription().equals("")) - { - 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; - if(sa[0].getTarget() != null) - { - sa[0].getTarget().setMandatory(true); - } - } - 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 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(); - } - - //////////////////////////////////////// - //THIS ONE IS ALL THAT MATTERS - //////////////////////////////////////// - @Override - public void resolve() - { - 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.GameAction.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.GameAction.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); - - AllZone.Stack.addSimultaneousStackEntry(wrapperAbility); - return true; - } - - return false; - } -} +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 index f64d05f1125..d57db3629e6 100644 --- a/src/forge/card/trigger/Trigger_AttackerBlocked.java +++ b/src/forge/card/trigger/Trigger_AttackerBlocked.java @@ -1,54 +1,64 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_AttackerBlocked extends Trigger { - - public Trigger_AttackerBlocked(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Attacker",runParams.get("Attacker")); - sa.setTriggeringObject("Blocker",runParams.get("Blocker")); - sa.setTriggeringObject("NumBlockers", runParams.get("NumBlockers")); - } -} +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 index e58b069e9e9..71d7590093f 100644 --- a/src/forge/card/trigger/Trigger_AttackerUnblocked.java +++ b/src/forge/card/trigger/Trigger_AttackerUnblocked.java @@ -1,45 +1,57 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_AttackerUnblocked extends Trigger { - - public Trigger_AttackerUnblocked(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) { - if(mapParams.containsKey("ValidCard")) - { - if(!matchesValid(runParams.get("Attacker"),mapParams.get("ValidCard").split(","),hostCard)) - { - return false; - } - } - - return true; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Attacker",runParams.get("Attacker")); - } -} +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 index 1e19c7df69e..27c43bec478 100644 --- a/src/forge/card/trigger/Trigger_Attacks.java +++ b/src/forge/card/trigger/Trigger_Attacks.java @@ -1,70 +1,74 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.CardList; -import forge.card.spellability.SpellAbility; - -public class Trigger_Attacks extends Trigger { - - public Trigger_Attacks(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Attacker",runParams.get("Attacker")); - } -} +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 index 612d1cec215..1c56b5b85fd 100644 --- a/src/forge/card/trigger/Trigger_Blocks.java +++ b/src/forge/card/trigger/Trigger_Blocks.java @@ -1,54 +1,64 @@ -package forge.card.trigger; -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - - - -public class Trigger_Blocks extends Trigger { - - public Trigger_Blocks(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Blocker",runParams.get("Blocker")); - sa.setTriggeringObject("Attacker",runParams.get("Attacker")); - } -} +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 index 5750d9c1cc9..12a4effdde1 100644 --- a/src/forge/card/trigger/Trigger_ChangesZone.java +++ b/src/forge/card/trigger/Trigger_ChangesZone.java @@ -1,73 +1,76 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_ChangesZone extends Trigger { - - public Trigger_ChangesZone(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index 5f7c2909af7..8f91163134d 100644 --- a/src/forge/card/trigger/Trigger_Clashed.java +++ b/src/forge/card/trigger/Trigger_Clashed.java @@ -1,59 +1,61 @@ -package forge.card.trigger; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -import java.util.HashMap; - -/** - * Created by IntelliJ IDEA. - * User: Administrator - * Date: 5/16/11 - * Time: 10:28 PM - * To change this template use File | Settings | File Templates. - */ -public class Trigger_Clashed extends Trigger { - - public Trigger_Clashed(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - //No triggered-variables for you :( - } -} +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 index 6704cc866c6..d9b3e012851 100644 --- a/src/forge/card/trigger/Trigger_CounterAdded.java +++ b/src/forge/card/trigger/Trigger_CounterAdded.java @@ -1,53 +1,67 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.Counters; -import forge.card.spellability.SpellAbility; - -public class Trigger_CounterAdded extends Trigger { - - public Trigger_CounterAdded(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index cadc7544559..441ff46f2b4 100644 --- a/src/forge/card/trigger/Trigger_Cycled.java +++ b/src/forge/card/trigger/Trigger_Cycled.java @@ -1,44 +1,56 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Cycled extends Trigger { - - public Trigger_Cycled(HashMap params, Card host) { - super(params, host); - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card",runParams.get("Card")); - } - - @Override - public boolean performTest(HashMap runParams) { - if(mapParams.containsKey("ValidCard")) - { - if(!matchesValid(runParams.get("Card"),mapParams.get("ValidCard").split(","), hostCard)) - { - return false; - } - } - return true; - } - -} +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 index 69ef0279a53..34de1df3bf2 100644 --- a/src/forge/card/trigger/Trigger_DamageDone.java +++ b/src/forge/card/trigger/Trigger_DamageDone.java @@ -1,113 +1,94 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_DamageDone extends Trigger { - - public Trigger_DamageDone(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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(operator.equals("LT")) - { - if(!(actualAmount < operand)) - return false; - } - else if (operator.equals("LE")) - { - if(!(actualAmount <= operand)) - return false; - } - else if (operator.equals("EQ")) - { - if(!(actualAmount == operand)) - return false; - } - else if (operator.equals("GE")) - { - if(!(actualAmount >= operand)) - return false; - } - else if (operator.equals("GT")) - { - if(!(actualAmount > 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Source",runParams.get("DamageSource")); - sa.setTriggeringObject("Target",runParams.get("DamageTarget")); - sa.setTriggeringObject("DamageAmount",runParams.get("DamageAmount")); - } -} +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 index 72122095b6c..85114abc923 100644 --- a/src/forge/card/trigger/Trigger_Discarded.java +++ b/src/forge/card/trigger/Trigger_Discarded.java @@ -1,64 +1,70 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Discarded extends Trigger { - - public Trigger_Discarded(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index 24fbc16d9ec..db2c7adf3a5 100644 --- a/src/forge/card/trigger/Trigger_Drawn.java +++ b/src/forge/card/trigger/Trigger_Drawn.java @@ -1,46 +1,57 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Drawn extends Trigger { - - public Trigger_Drawn(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index 81dac983410..fd98e7bbad6 100644 --- a/src/forge/card/trigger/Trigger_LandPlayed.java +++ b/src/forge/card/trigger/Trigger_LandPlayed.java @@ -1,48 +1,67 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_LandPlayed extends Trigger { - - public Trigger_LandPlayed(String n, HashMap params, Card host) { - super(n, params, host); - } - - public Trigger_LandPlayed(HashMap params, Card host) { - super(params, host); - } - - @Override - public Trigger getCopy() { - Trigger copy = new Trigger_LandPlayed(name,mapParams,hostCard); - copy.setID(ID); - - if(this.overridingAbility != null) - { - copy.setOverridingAbility(overridingAbility); - } - - return copy; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card",runParams.get("Card")); - } - - @Override - public boolean performTest(HashMap runParams) { - if(mapParams.containsKey("ValidCard")) - { - if(!matchesValid(runParams.get("Card"), mapParams.get("ValidCard").split(","), hostCard)) - { - return false; - } - } - return true; - } - -} +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 index 44fe5c5291f..5a132d99397 100644 --- a/src/forge/card/trigger/Trigger_LifeGained.java +++ b/src/forge/card/trigger/Trigger_LifeGained.java @@ -1,47 +1,57 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_LifeGained extends Trigger { - - public Trigger_LifeGained(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) - { - if(mapParams.containsKey("ValidPlayer")) - { - if(!matchesValid(runParams.get("Player"),mapParams.get("ValidPlayer").split(","),hostCard)) - { - return false; - } - } - - return true; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("LifeAmount",runParams.get("LifeAmount")); - sa.setTriggeringObject("Player",runParams.get("Player")); - } -} +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 index 0292fcb673f..ca0bff7d912 100644 --- a/src/forge/card/trigger/Trigger_LifeLost.java +++ b/src/forge/card/trigger/Trigger_LifeLost.java @@ -1,47 +1,57 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_LifeLost extends Trigger { - - public Trigger_LifeLost(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) - { - if(mapParams.containsKey("ValidPlayer")) - { - if(!matchesValid(runParams.get("Player"),mapParams.get("ValidPlayer").split(","),hostCard)) - { - return false; - } - } - - return true; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("LifeAmount",runParams.get("LifeAmount")); - sa.setTriggeringObject("Player",runParams.get("Player")); - } -} +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 index 782eefdbe1d..0b157fc665a 100644 --- a/src/forge/card/trigger/Trigger_Phase.java +++ b/src/forge/card/trigger/Trigger_Phase.java @@ -1,69 +1,73 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Phase extends Trigger { - - public Trigger_Phase(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Player",runParams.get("Player")); - } -} +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 index 8308c7f2916..ddefab83891 100644 --- a/src/forge/card/trigger/Trigger_Sacrificed.java +++ b/src/forge/card/trigger/Trigger_Sacrificed.java @@ -1,52 +1,61 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Sacrificed extends Trigger { - - public Trigger_Sacrificed(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index 6c0def9d893..20e2d35d28c 100644 --- a/src/forge/card/trigger/Trigger_Shuffled.java +++ b/src/forge/card/trigger/Trigger_Shuffled.java @@ -1,46 +1,56 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Shuffled extends Trigger{ - - public Trigger_Shuffled(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) - { - if(mapParams.containsKey("ValidPlayer")) - { - if(!matchesValid(runParams.get("Player"),mapParams.get("ValidPlayer").split(","),hostCard)) - { - return false; - } - } - - return true; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Player",runParams.get("Player")); - } -} +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 index 1f68956d38c..754b4266ffa 100644 --- a/src/forge/card/trigger/Trigger_SpellAbilityCast.java +++ b/src/forge/card/trigger/Trigger_SpellAbilityCast.java @@ -1,176 +1,151 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.Player; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Cost; - -public class Trigger_SpellAbilityCast extends Trigger { - - public Trigger_SpellAbilityCast(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) - { - SpellAbility SA = (SpellAbility)runParams.get("CastSA"); - Card cast = SA.getSourceCard(); - - 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(SA.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 = ((SpellAbility)runParams.get("CastSA")); - 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; - } - - @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; - } - - @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")); - } -} +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 index ec61315f80c..ed832812729 100644 --- a/src/forge/card/trigger/Trigger_Taps.java +++ b/src/forge/card/trigger/Trigger_Taps.java @@ -1,48 +1,58 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Taps extends Trigger { - - public Trigger_Taps(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index f4c95e6e202..5c14d94df61 100644 --- a/src/forge/card/trigger/Trigger_TapsForMana.java +++ b/src/forge/card/trigger/Trigger_TapsForMana.java @@ -1,45 +1,60 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_TapsForMana extends Trigger { - - public Trigger_TapsForMana(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - sa.setTriggeringObject("Player", runParams.get("Player")); - sa.setTriggeringObject("Produced", runParams.get("Produced")); - } -} +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 index 21b01b7f622..ad4db161367 100644 --- a/src/forge/card/trigger/Trigger_TurnFaceUp.java +++ b/src/forge/card/trigger/Trigger_TurnFaceUp.java @@ -1,45 +1,56 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_TurnFaceUp extends Trigger { - - public Trigger_TurnFaceUp(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap runParams) { - if(mapParams.containsKey("ValidCard")) - { - if(!matchesValid(runParams.get("Card"),mapParams.get("ValidCard").split(","),hostCard)) - { - return false; - } - } - - return true; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } -} +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 index 709a74daa52..fc24ddf221a 100644 --- a/src/forge/card/trigger/Trigger_Unequip.java +++ b/src/forge/card/trigger/Trigger_Unequip.java @@ -1,51 +1,66 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Unequip extends Trigger { - - public Trigger_Unequip(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) { - sa.setTriggeringObject("Card", runParams.get("Card")); - sa.setTriggeringObject("Equipment", runParams.get("Equipment")); - } -} +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 index ca07a5a38e7..dfd46659570 100644 --- a/src/forge/card/trigger/Trigger_Untaps.java +++ b/src/forge/card/trigger/Trigger_Untaps.java @@ -1,49 +1,59 @@ -package forge.card.trigger; - -import java.util.HashMap; - -import forge.Card; -import forge.card.spellability.SpellAbility; - -public class Trigger_Untaps extends Trigger { - - public Trigger_Untaps(HashMap params, Card host) { - super(params, host); - } - - @Override - public boolean performTest(HashMap 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; - } - - @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; - } - - @Override - public void setTriggeringObjects(SpellAbility sa) - { - sa.setTriggeringObject("Card",runParams.get("Card")); - } - -} +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 index f34f5b78f20..906b1dd0b1a 100644 --- a/src/forge/deck/Deck.java +++ b/src/forge/deck/Deck.java @@ -6,32 +6,54 @@ import forge.Constant; import java.io.Serializable; import java.util.*; -public class Deck implements Comparable, Serializable{ +/** + *

Deck class.

+ * + * @author Forge + * @version $Id: $ + */ +public class Deck implements Comparable, Serializable { /** - * - */ - private static final long serialVersionUID = -7478025567887481994L; + * + */ + private static final long serialVersionUID = -7478025567887481994L; - //gameType is from Constant.GameType, like Constant.GameType.Regular + //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); @@ -40,24 +62,49 @@ public class Deck implements Comparable, Serializable{ 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( @@ -72,39 +119,86 @@ public class Deck implements Comparable, Serializable{ 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()); @@ -112,38 +206,81 @@ public class Deck implements Comparable, Serializable{ } } + /** + *

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(); @@ -151,39 +288,91 @@ public class Deck implements Comparable, Serializable{ // 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()); - } - - public boolean equals(Object o) { - if(o instanceof Deck){ - Deck d = (Deck)o; - return getName().equals(d.getName()); - } - return false; + return getName().compareTo(d.getName()); } - public Set> getMetadata() { + /** {@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); } -} \ No newline at end of file +} diff --git a/src/forge/deck/DeckManager.java b/src/forge/deck/DeckManager.java index 5a8cba64c29..06d231909bf 100755 --- a/src/forge/deck/DeckManager.java +++ b/src/forge/deck/DeckManager.java @@ -16,13 +16,21 @@ 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"); @@ -34,6 +42,11 @@ public class DeckManager { 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"); @@ -43,8 +56,7 @@ public class DeckManager { if (deckDir.isFile()) { throw new IOException("Not a directory"); - } - else { + } else { deckDir.mkdirs(); if (!deckDir.isDirectory()) { throw new IOException("Directory can't be created"); @@ -60,19 +72,42 @@ public class DeckManager { } + /** + *

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( @@ -82,10 +117,21 @@ public class DeckManager { 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( @@ -95,12 +141,22 @@ public class DeckManager { 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( @@ -110,6 +166,11 @@ public class DeckManager { 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))) { @@ -118,19 +179,35 @@ public class DeckManager { } + /** + *

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(); @@ -155,6 +232,12 @@ public class DeckManager { } } + /** + *

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(); @@ -185,8 +268,8 @@ public class DeckManager { Deck d = new Deck(); //read metadata - while(!(line = lineIterator.next()).equals("[main]")){ - String[] linedata = line.split("=",2); + while (!(line = lineIterator.next()).equals("[main]")) { + String[] linedata = line.split("=", 2); d.addMetaData(linedata[0], linedata[1]); } @@ -196,6 +279,12 @@ public class DeckManager { } + /** + *

readDeckOld.

+ * + * @param iterator a {@link java.util.ListIterator} object. + * @return a {@link forge.deck.Deck} object. + */ private static Deck readDeckOld(ListIterator iterator) { String line; @@ -207,8 +296,7 @@ public class DeckManager { while ((line = iterator.next()) != null && !line.equals("[general]")) { if (comment == null) { comment = line; - } - else { + } else { comment += "\n" + line; } } @@ -231,6 +319,12 @@ public class DeckManager { 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; @@ -261,11 +355,20 @@ public class DeckManager { } } + /** + *

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 @@ -313,6 +416,13 @@ public class DeckManager { } } + /** + *

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"); @@ -331,21 +441,32 @@ public class DeckManager { } } + /** + *

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 { + } else { result.put(s, dstValue + 1); } } return result; } - public static void writeDeck(Deck d, File f){ + /** + *

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); diff --git a/src/forge/deck/DownloadDeck.java b/src/forge/deck/DownloadDeck.java index d63de44ac85..b3f80e70213 100644 --- a/src/forge/deck/DownloadDeck.java +++ b/src/forge/deck/DownloadDeck.java @@ -2,11 +2,22 @@ package forge.deck; import forge.AllZone; import forge.Card; -import forge.CardList; +/** + *

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; @@ -21,12 +32,17 @@ public class DownloadDeck { } if (rStr.codePointAt(i + 1) >= 48 && rStr.codePointAt(i + 1) <= 57) { return rStr.substring(i, i + 2); - } - else { + } 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; @@ -43,6 +59,12 @@ public class DownloadDeck { } + /** + *

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; @@ -58,6 +80,12 @@ public class DownloadDeck { 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; @@ -73,6 +101,13 @@ public class DownloadDeck { 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; @@ -80,13 +115,19 @@ public class DownloadDeck { temp = rStr.codePointAt(a + 1); if (temp >= 48 && temp <= 57) { return rStr.substring(a + 2); - } - else { + } 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(); @@ -94,12 +135,16 @@ public class DownloadDeck { } + /** + *

isCardSupport.

+ * + * @param CardName a {@link java.lang.String} object. + * @return a boolean. + */ public boolean isCardSupport(String CardName) { - CardList all = AllZone.CardFactory.getAllCards(); - - Card gCard; - for (int i = 0; i < all.size(); i++) { - gCard = all.getCard(i); + // TODO: using AllZone.getCardFactory().getCard() would probably be much faster. + + for (Card gCard : AllZone.getCardFactory()) { if (CardName.equalsIgnoreCase(gCard.getName())) { return true; } @@ -107,20 +152,23 @@ public class DownloadDeck { 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) { - CardList all = AllZone.CardFactory.getAllCards(); - - Card newCard = null; - - for (int i = 0; i < all.size(); i++) { - newCard = all.getCard(i); - + // TODO: using AllZone.getCardFactory().getCard() would probably be much faster. + + for (Card newCard : AllZone.getCardFactory()) { if (CardName.equalsIgnoreCase(newCard.getName())) { return newCard; } } - return newCard; + return null; } diff --git a/src/forge/deck/generate/Generate2ColorDeck.java b/src/forge/deck/generate/Generate2ColorDeck.java index eb990b83938..3ec83417302 100644 --- a/src/forge/deck/generate/Generate2ColorDeck.java +++ b/src/forge/deck/generate/Generate2ColorDeck.java @@ -1,413 +1,392 @@ -package forge.deck.generate; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.MyRandom; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; - -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; - - 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= 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 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - for (int i=0; i 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - 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 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.CardFactory.getCard(s, AllZone.HumanPlayer)); - 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 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.CardFactory.getCard(ClrCnts[i].Color, AllZone.ComputerPlayer)); - } - } - } - 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 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - 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; iGenerate2ColorDeck 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 index fec2f368119..62d114005c6 100644 --- a/src/forge/deck/generate/Generate3ColorDeck.java +++ b/src/forge/deck/generate/Generate3ColorDeck.java @@ -1,437 +1,417 @@ -package forge.deck.generate; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Random; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.MyRandom; -import forge.error.ErrorViewer; -import forge.properties.ForgeProps; - -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; - - 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= 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 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - int n = CardCounts.get(c.getName()); - CardCounts.put(c.getName(), n + 1); - tmpDeck += c.getName() + " " + c.getManaCost() + "\n"; - } - - for (int i=0; i 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - 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 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.CardFactory.getCard(s, AllZone.HumanPlayer)); - 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 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.CardFactory.getCard(ClrCnts[i].Color, AllZone.ComputerPlayer)); - } - } - } - 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 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.CardFactory.getCard(c.getName(), AllZone.ComputerPlayer)); - 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; iGenerate3ColorDeck 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 index 4e1032d3ab3..4cd43ee9131 100644 --- a/src/forge/deck/generate/GenerateConstructedDeck.java +++ b/src/forge/deck/generate/GenerateConstructedDeck.java @@ -1,173 +1,193 @@ -package forge.deck.generate; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Constant; -import forge.Gui_NewGame; - -public class GenerateConstructedDeck -{ - private String color1; - private String color2; - - private Map map = new HashMap(); - - public GenerateConstructedDeck() {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"); - } - - 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 - private void addLand(CardList list) - { - Card land; - for(int i = 0; i < 13; i++) - { - land = AllZone.CardFactory.getCard(map.get(color1).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color2).toString(), AllZone.ComputerPlayer); - list.add(land); - } - }//addLand() - - private CardList getCards() - { - return filterBadCards(AllZone.CardFactory.getAllCards()); - }//getCards() - - 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; - } - - 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; - } - - private CardList filterBadCards(CardList list) - { - - final ArrayList goodLand = new ArrayList(); - - CardList out = list.filter(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() - - public static void main(String[] args) - { - GenerateConstructedDeck g = new GenerateConstructedDeck(); - - for(int i = 0; i < 50; i++) - { - CardList c = g.generateDeck(); - System.out.println(c.getType("Creature").size() +" - " +c.size()); - } - System.exit(1); - - }//main -} \ No newline at end of file +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 index 16e91207082..28c7a4d53b7 100644 --- a/src/forge/deck/generate/GenerateConstructedMultiColorDeck.java +++ b/src/forge/deck/generate/GenerateConstructedMultiColorDeck.java @@ -1,430 +1,438 @@ -package forge.deck.generate; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Constant; -import forge.Gui_NewGame; - -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(); - - public GenerateConstructedMultiColorDeck() - { - setupBasicLandMap(); - setupMultiMap(); - } - - 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"); - } - - 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"}); - } - - - 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; - } - - 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; - } - - private void addLand(CardList list, int colors) - { - if (colors==3) - { - int numberBasic = 2; - Card land; - for(int i = 0; i < numberBasic; i++) - { - - land = AllZone.CardFactory.getCard(map.get(color1).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color2).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color3).toString(), AllZone.ComputerPlayer); - list.add(land); - } - - int numberDual = 4; - for (int i = 0; i < numberDual;i++) - { - land = AllZone.CardFactory.getCard(multiMap.get(color1+color2)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color1+color3)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color2+color3)[0], AllZone.ComputerPlayer); - list.add(land); - } - for (int i=0; i<2;i++) - { - land = AllZone.CardFactory.getCard(multiMap.get(color1+color2)[1], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color1+color3)[1], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color2+color3)[1], AllZone.ComputerPlayer); - list.add(land); - } - } - else if (colors == 5) - { - int numberBasic = 1; - Card land; - for(int i = 0; i < numberBasic; i++) - { - - land = AllZone.CardFactory.getCard(map.get(color1).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color2).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color3).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color4).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color5).toString(), AllZone.ComputerPlayer); - list.add(land); - } - - - int numberDual = 2; - for (int i = 0; i < numberDual;i++) - { - land = AllZone.CardFactory.getCard(multiMap.get(color1+color2)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color1+color3)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color1+color4)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color1+color5)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color2+color3)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color2+color4)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color2+color5)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color3+color4)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color3+color5)[0], AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(multiMap.get(color4+color5)[0], AllZone.ComputerPlayer); - list.add(land); - } - - } - }//addLand() - private CardList getCards(int colors) - { - return filterBadCards(AllZone.CardFactory.getAllCards(), colors); - }//getCards() - - 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; - } - - 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; - } - - 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; - } - - 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; - } - - - private CardList filterBadCards(CardList list, 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 = list.filter(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 = list.filter(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() - public static void main(String[] args) - { - GenerateConstructedMultiColorDeck g = new GenerateConstructedMultiColorDeck(); - - for(int i = 0; i < 10; i++) - { - System.out.println("***GENERATING DECK***"); - CardList c = g.generate3ColorDeck(); - System.out.println(c.getType("Creature").size() +" - " +c.size()); - for (int j=0; jGenerateConstructedMultiColorDeck 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/GenerateSealedDeck.java b/src/forge/deck/generate/GenerateSealedDeck.java deleted file mode 100644 index 3656ecf356d..00000000000 --- a/src/forge/deck/generate/GenerateSealedDeck.java +++ /dev/null @@ -1,164 +0,0 @@ -package forge.deck.generate; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.CardListFilter; -import forge.CardListUtil; -import forge.CardUtil; -import forge.Constant; -import forge.Gui_NewGame; -import forge.ReadBoosterPack; - -public class GenerateSealedDeck -{ - private String color1; - private String color2; - - private Map map = new HashMap(); - - public GenerateSealedDeck() {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"); - } - - public CardList generateDeck() - { - CardList deck; - do{ - deck = get2ColorDeck(); - }while(deck.getType("Creature").size() < 12 || 16 < deck.getType("Creature").size()); - - addLand(deck); - - if(deck.size() != 40) - throw new RuntimeException("GenerateSealedDeck() : generateDeck() error, deck size it not 40, deck size is " +deck.size()); - - return deck; - } - private void addLand(CardList list) - { - Card land; - for(int i = 0; i < 9; i++) - { - land = AllZone.CardFactory.getCard(map.get(color1).toString(), AllZone.ComputerPlayer); - list.add(land); - - land = AllZone.CardFactory.getCard(map.get(color2).toString(), AllZone.ComputerPlayer); - list.add(land); - } - }//addLand() - private CardList get2ColorDeck() - { - ReadBoosterPack booster = new ReadBoosterPack(); - CardList deck; - do{ - deck = get2Colors(booster.getBoosterPack5()); - }while(deck.size() < 22); - - CardList out = new CardList(); - deck.shuffle(); - - //trim deck size down to 22 cards, presumes 18 land - for(int i = 0; i < 22 && i < deck.size(); i++) - out.add(deck.get(i)); - - return out; - } - 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)); - - 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; - } - private CardList filterBadCards(CardList list) - { - //remove "bad" and multi-colored cards - final ArrayList remove = new ArrayList(); - remove.add("Force of Savagery"); - remove.add("Darksteel Colossus"); - remove.add("Jokulhaups"); - remove.add("Steel Wall"); - remove.add("Ornithopter"); - remove.add("Sarcomite Myr"); - - CardList out = list.filter(new CardListFilter() - { - public boolean addCard(Card c) - { - return CardUtil.getColors(c).size() == 1 && !remove.contains(c.getName()); - } - }); - - return out; - }//filterBadCards() - public static void main(String[] args) - { - GenerateSealedDeck g = new GenerateSealedDeck(); - - for(int i = 0; i < 100; i++) - { - System.out.println(i); - g.generateDeck(); - } - -/* - for(int i = 0; i < 10; i++) - { - CardList c = g.generateDeck(); - System.out.println(c.getType("Creature").size()); - } -*/ - } -} \ No newline at end of file diff --git a/src/forge/deck/generate/GenerateThemeDeck.java b/src/forge/deck/generate/GenerateThemeDeck.java index cfc499c334b..9a366278520 100644 --- a/src/forge/deck/generate/GenerateThemeDeck.java +++ b/src/forge/deck/generate/GenerateThemeDeck.java @@ -1,298 +1,297 @@ -package forge.deck.generate; - -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; - -import forge.AllZone; -import forge.Card; -import forge.CardList; -import forge.MyRandom; -import forge.error.ErrorViewer; - -public class GenerateThemeDeck -{ - private BufferedReader in = null; - - public GenerateThemeDeck() - { - - } - - 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 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= 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.CardFactory.getCard(s, AllZone.ComputerPlayer)); - 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 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= 4) - s = tDeck.get(r.nextInt(tDeck.size())).getName(); - - int n = CardCounts.get(s); - tDeck.add(AllZone.CardFactory.getCard(s, AllZone.ComputerPlayer)); - CardCounts.put(s, n + 1); - tmpDeck += "Added:" + s + "\n"; - } - } - else if (tDeck.size() > Size) - { - int diff = tDeck.size() - Size; - - for (int i=0; i Cardnames = new ArrayList(); - public int MaxCnt; - public int Percentage; - } -} - +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 index a95d9934be2..b0e11b743b5 100644 --- a/src/forge/error/ErrorViewer.java +++ b/src/forge/error/ErrorViewer.java @@ -1,11 +1,13 @@ - package forge.error; -import static forge.properties.ForgeProps.*; -import static java.awt.event.InputEvent.*; -import static java.awt.event.KeyEvent.*; -import static javax.swing.JOptionPane.*; +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; @@ -33,190 +35,259 @@ import forge.properties.NewConstants; /** * The class ErrorViewer. Enables showing and saving error messages that occurred in forge. - * - * @version V1.0 02.08.2009 + * * @author Clemens Koza + * @version V1.0 02.08.2009 */ public class ErrorViewer implements NewConstants, NewConstants.LANG.ErrorViewer { - private static final String nameOS = "os.name"; - private static final String versionOS = "os.version"; - private static final String architectureOS = "os.arch"; - private static final String versionJava = "java.version"; - private static final String vendorJava = "java.vendor"; - + /** 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(Throwable ex) { + 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(Throwable ex, String format, Object... args) { - if(ex == null) return; + 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, String message) { - if(ex == null) return; - + 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(String format, Object... args) { + 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(String message) { + 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(String format, Object... args) { + 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(String message) { + public static void showErrorAllThreads(final String message) { final StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); printError(pw, message); - + showDialog(sw.toString()); } - - private static void showDialog(String fullMessage) { + + /** + *

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 + + //Button is not modified, String gets the automatic listener to hide the dialog Object[] options = { - new JButton(new SaveAction(area)), getLocalized(BUTTON_CLOSE), new JButton(new ExitAction())}; + 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]); - JDialog dlg = pane.createDialog(null, getLocalized(TITLE)); + 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 + * 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(PrintWriter pw, Throwable ex, String message) { - if(message != null) System.err.println(message); + 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(FORUM), getProperty(MAIL), - message != null? message:ex.getMessage(), getProperty(VERSION), - System.getProperty(nameOS), System.getProperty(versionOS), System.getProperty(architectureOS), - System.getProperty(versionJava), System.getProperty(vendorJava)); + + 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(PrintWriter pw, String message) { + private static void printError(final PrintWriter pw, final String message) { System.err.println(message); - - pw.printf(getLocalized(MESSAGE), getProperty(FORUM), getProperty(MAIL), message, getProperty(VERSION), - System.getProperty(nameOS), System.getProperty(versionOS), System.getProperty(architectureOS), - System.getProperty(versionJava), System.getProperty(vendorJava)); + + 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()) { + for (Entry e : traces.entrySet()) { pw.println(); pw.printf("%s (%s):%n", e.getKey().getName(), e.getKey().getId()); - for(StackTraceElement el:e.getValue()) { + for (StackTraceElement el : e.getValue()) { pw.println(el); } } } - + private static class SaveAction extends AbstractAction { - - private static final long serialVersionUID = 9146834661273525959L; - + + private static final long serialVersionUID = 9146834661273525959L; + private static JFileChooser c; - - private JTextArea area; - - public SaveAction(JTextArea area) { + + private JTextArea area; + + public SaveAction(final JTextArea areaParam) { super(getLocalized(BUTTON_SAVE)); putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(VK_S, CTRL_DOWN_MASK)); - this.area = area; + this.area = areaParam; } - - public void actionPerformed(ActionEvent e) { - if(c == null) c = new JFileChooser(); - + + public void actionPerformed(final ActionEvent e) { + if (c == null) { + c = new JFileChooser(); + } + File f; - for(int i = 0;; i++) { + for (int i = 0;; i++) { String name = String.format("%TF-%02d.txt", System.currentTimeMillis(), i); f = new File(name); - if(!f.exists()) break; + 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) { + } 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(ActionEvent e) { + + + 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(ActionEvent e) { + + 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 index aac978cec5a..e46266b9a03 100644 --- a/src/forge/error/ExceptionHandler.java +++ b/src/forge/error/ExceptionHandler.java @@ -1,44 +1,50 @@ -/** -* ExceptionHandler.java -* -* Created on 27.09.2009 -*/ - -package forge.error; - - -import java.lang.Thread.UncaughtExceptionHandler; - -import com.esotericsoftware.minlog.Log; - - -/** -* This class handles all exceptions that weren't caught by showing the error to the user. -*/ -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!"); - } - - - 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. - */ - public void handle(Throwable ex) { - ErrorViewer.showError(ex); - } -} +/** + * 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 index 074bc8b310f..f11e5e4b433 100644 --- a/src/forge/gui/ForgeAction.java +++ b/src/forge/gui/ForgeAction.java @@ -1,34 +1,31 @@ package forge.gui; /** * ForgeAction.java - * + * * Created on 02.09.2009 */ - - -import javax.swing.AbstractAction; -import javax.swing.AbstractButton; -import javax.swing.JMenuItem; - import forge.properties.ForgeProps; - +import javax.swing.*; /** * The class ForgeAction. - * - * @version V0.0 02.09.2009 + * * @author Clemens Koza + * @version V0.0 02.09.2009 */ public abstract class ForgeAction extends AbstractAction { - - private static final long serialVersionUID = -1881183151063146955L; - private String property; - + + /** 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) { @@ -37,14 +34,26 @@ public abstract class ForgeAction extends AbstractAction { 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")); + button.setText((String) getValue(button instanceof JMenuItem ? "menuText" : "buttonText")); return button; } } diff --git a/src/forge/gui/ForgeFontConstants.java b/src/forge/gui/ForgeFontConstants.java deleted file mode 100644 index 1d65a4ff502..00000000000 --- a/src/forge/gui/ForgeFontConstants.java +++ /dev/null @@ -1,33 +0,0 @@ -package forge.gui; - -import java.awt.Font; - -/** - * A replacement FontConstants to allow backward-compatibility with JRE 1.5 - */ - -public class ForgeFontConstants { - public static final String DIALOG, DIALOG_INPUT, MONOSPACED, SANS_SERIF, SERIF; - - static { - String dialog = "Dialog"; - String dialogInput = "DialogInput"; - String monospaced = "Monospaced"; - String sansSerif = "SansSerif"; - String serif = "Serif"; - try { - dialog = Font.DIALOG; - dialogInput = Font.DIALOG_INPUT; - monospaced = Font.MONOSPACED; - sansSerif = Font.SANS_SERIF; - serif = Font.SERIF; - } catch (NoSuchFieldError ignored) { - } - - DIALOG = dialog; - DIALOG_INPUT = dialogInput; - MONOSPACED = monospaced; - SANS_SERIF = sansSerif; - SERIF = serif; - } -} diff --git a/src/forge/gui/GuiUtils.java b/src/forge/gui/GuiUtils.java index 103a6c173e2..1adf4f0614f 100644 --- a/src/forge/gui/GuiUtils.java +++ b/src/forge/gui/GuiUtils.java @@ -8,19 +8,30 @@ 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; @@ -41,6 +52,8 @@ public class GuiUtils { /** * Adds a Horizontal Glue to panel + * + * @param panel a {@link javax.swing.JPanel} object. */ public static void addExpandingHorizontalSpace(JPanel panel) { panel.add(Box.createHorizontalGlue()); @@ -48,6 +61,8 @@ public class GuiUtils { /** * Adds a Vertical Glue to panel + * + * @param panel a {@link javax.swing.JPanel} object. */ public static void addExpandingVerticalSpace(JPanel panel) { panel.add(Box.createHorizontalGlue()); @@ -55,6 +70,9 @@ public class GuiUtils { /** * 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))); @@ -62,6 +80,8 @@ public class GuiUtils { /** * 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))); @@ -69,63 +89,160 @@ public class GuiUtils { /** * 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 { + } 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)); } - - //returned Object could be null + + /** + * 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; + if (choices == null || choices.length == 0) return null; List choice = getChoices(message, 0, 1, choices); - return choice.isEmpty()? null:choice.get(0); - }//getChoiceOptional() - + 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.Display != null) { - AllZone.Display.setCard((Card) list.getSelectedValue()); + if (list.getSelectedValue() instanceof Card && AllZone.getDisplay() != null) { + AllZone.getDisplay().setCard((Card) list.getSelectedValue()); } } }); @@ -135,6 +252,7 @@ public class GuiUtils { /** * Centers a frame on the screen based on its current size + * * @param frame a fully laid-out frame */ public static void centerFrame(Frame frame) { diff --git a/src/forge/gui/ListChooser.java b/src/forge/gui/ListChooser.java index dbfb02aa26a..363b1fd6222 100644 --- a/src/forge/gui/ListChooser.java +++ b/src/forge/gui/ListChooser.java @@ -1,33 +1,25 @@ /** * ListChooser.java - * + * * Created on 31.08.2009 */ package forge.gui; -import static java.util.Arrays.*; -import static java.util.Collections.*; -import static javax.swing.JOptionPane.*; -import static javax.swing.WindowConstants.*; - +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 javax.swing.AbstractAction; -import javax.swing.AbstractListModel; -import javax.swing.Action; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JScrollPane; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; +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; /** @@ -43,76 +35,162 @@ import javax.swing.event.ListSelectionListener; *
  • If the dialog was canceled, the selection will be empty.
  • *
  • * + * + * @author Forge + * @version $Id: $ */ public class ListChooser { - public static void main(String[] args) { - ListChooser c = new ListChooser("test", "choose a or b", 0, 2, "a", "b"); - System.out.println(c.show()); - for(String s:c.getSelectedValues()) { - System.out.println(s); - } - } - + //Data and number of choices for the list - private List list; - private int minChoices, maxChoices; - + private List list; + private int minChoices, maxChoices; + //Decoration - private String title; - + private String title; + //Flag: was the dialog already shown? - private boolean called; + private boolean called; //initialized before; listeners may be added to it - private JList jList; + private JList jList; //Temporarily stored for event handlers during show - private JDialog d; + private JDialog d; private JOptionPane p; - private Action ok, cancel; - + 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; @@ -122,90 +200,105 @@ public class ListChooser { 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, + 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"); + 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); + 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(); + if (value == null || value != OK_OPTION) jList.clearSelection(); //can't stop closing by ESC, so repeat if cancelled - } while(minChoices != 0 && value != OK_OPTION); + } 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"); + 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"); + 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"); + 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) { @@ -213,70 +306,77 @@ public class ListChooser { } }; } - + /** * Returns the (minimum) selected index, or -1 + * + * @return a int. */ public int getSelectedIndex() { - if(!called) throw new IllegalStateException("not yet shown"); + 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"); + if (!called) throw new IllegalStateException("not yet shown"); return (T) jList.getSelectedValue(); } - + + /** + *

    commit.

    + */ private void commit() { - if(ok.isEnabled()) p.setValue(OK_OPTION); + 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; - + 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(); + if (e.getClickCount() == 2) commit(); } } } diff --git a/src/forge/gui/MultiLineLabel.java b/src/forge/gui/MultiLineLabel.java index 32736d01d40..e02a47129f8 100755 --- a/src/forge/gui/MultiLineLabel.java +++ b/src/forge/gui/MultiLineLabel.java @@ -24,7 +24,7 @@ package forge.gui; import javax.swing.*; -import java.awt.Rectangle; +import java.awt.*; /** @@ -33,22 +33,30 @@ import java.awt.Rectangle; * {@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. */ + /** + * Default serial version UID. + */ private static final long serialVersionUID = 1L; - /** Horizontal text alignment. */ + /** + * Horizontal text alignment. + */ private int halign = LEFT; - /** Vertical text alignment. */ + /** + * Vertical text alignment. + */ private int valign = CENTER; - /** Cache to save heap allocations. */ + /** + * Cache to save heap allocations. + */ private Rectangle bounds; /** @@ -61,16 +69,19 @@ public class MultiLineLabel extends JLabel { /** * Creates a new label with text value. - * - * @param text - * the value of the label + * + * @param text the value of the label */ public MultiLineLabel(String text) { this(); setText(text); } - /** {@inheritDoc} */ + /** + * {@inheritDoc} + * + * @return a {@link java.awt.Rectangle} object. + */ public Rectangle getBounds() { if (bounds == null) { bounds = new Rectangle(); @@ -80,9 +91,8 @@ public class MultiLineLabel extends JLabel { /** * Set the vertical text alignment. - * - * @param alignment - * vertical alignment + * + * @param alignment vertical alignment */ public void setVerticalTextAlignment(int alignment) { firePropertyChange("verticalTextAlignment", valign, alignment); @@ -91,9 +101,8 @@ public class MultiLineLabel extends JLabel { /** * Set the horizontal text alignment. - * - * @param alignment - * horizontal alignment + * + * @param alignment horizontal alignment */ public void setHorizontalTextAlignment(int alignment) { firePropertyChange("horizontalTextAlignment", halign, alignment); @@ -102,7 +111,7 @@ public class MultiLineLabel extends JLabel { /** * Get the vertical text alignment. - * + * * @return vertical text alignment */ public int getVerticalTextAlignment() { @@ -111,7 +120,7 @@ public class MultiLineLabel extends JLabel { /** * Get the horizontal text alignment. - * + * * @return horizontal text alignment */ public int getHorizontalTextAlignment() { diff --git a/src/forge/gui/MultiLineLabelUI.java b/src/forge/gui/MultiLineLabelUI.java index fb920374a74..56b0ec2c3c1 100755 --- a/src/forge/gui/MultiLineLabelUI.java +++ b/src/forge/gui/MultiLineLabelUI.java @@ -46,28 +46,30 @@ import java.util.List; * 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. */ + /** + * Shared instance of the UI delegate. + */ public static LabelUI labelUI = new MultiLineLabelUI(); /** @@ -77,23 +79,29 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener 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. */ + /** + * Font metrics of the JLabel being rendered. + */ protected FontMetrics metrics; - /** Default size of the lines list. */ + /** + * Default size of the lines list. + */ protected static int defaultSize = 4; /** * Get the shared UI instance. - * * @param c - * the component about to be installed - * @return the shared UI delegate instance + * @return a ComponentUI */ public static ComponentUI createUI(JComponent c) { return labelUI; @@ -119,9 +127,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * Clear the wrapped line cache. - * - * @param l - * the label containing a cached value + * + * @param l the label containing a cached value */ protected void clearCache(JLabel l) { l.putClientProperty(PROPERTY_KEY, null); @@ -139,16 +146,12 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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) { @@ -171,6 +174,11 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener layoutCL(l, fm, text, icon, paintViewR, paintIconR, paintTextR); } + /** + *

    prepareGraphics.

    + * + * @param g a {@link java.awt.Graphics} object. + */ protected void prepareGraphics(Graphics g) { } @@ -211,13 +219,10 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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); @@ -244,7 +249,7 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener if (it.hasNext() && !paintTextR.contains(textX, textY + fm.getHeight() - + getAscent(fm))) { + + getAscent(fm))) { // The last visible row, add a clip indication. text = clip(text, fm, paintTextR); } @@ -262,9 +267,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * Returns the available height to paint text on. This is the height of the * passed component with insets subtracted. - * - * @param l - * a component + * + * @param l a component * @return the available height */ protected int getAvailableHeight(JLabel l) { @@ -275,13 +279,10 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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) { @@ -298,13 +299,10 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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) { @@ -314,12 +312,12 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener 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: + case JLabel.TOP: + return getAscent(fm) + paintViewInsets.top; + case JLabel.BOTTOM: + return getAscent(fm) + height - paintViewInsets.top + + paintViewInsets.bottom - textHeight; + default: } } @@ -329,6 +327,12 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener 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(); } @@ -336,28 +340,24 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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) { + 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; + 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; @@ -367,9 +367,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener * 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 + * + * @param s the string * @return true if string is HTML, otherwise false */ private static boolean isHTMLString(String s) { @@ -419,9 +418,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * The preferred height of the label is the height of the lines with added * top and bottom insets. - * - * @param label - * the label + * + * @param label the label * @return the preferred height of the wrapped lines. */ protected int getPreferredHeight(JLabel label) { @@ -433,9 +431,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @param l the label * @return the text lines of the label. */ @SuppressWarnings("unchecked") @@ -471,9 +468,8 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @param l the label to render * @return a list of text lines to render */ protected List prepareLines(JLabel l) { @@ -497,16 +493,14 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * 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 + * + * @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;) { + for (int p0 = elem.getStartOffset(); p0 < p1; ) { int p = calculateBreakPosition(doc, p0, p1); try { lines.add(doc.getText(p0, p - p0)); @@ -519,13 +513,10 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener /** * Calculate the position on which to break (wrap) the line. - * - * @param doc - * the document - * @param p0 - * start position - * @param p1 - * end position + * + * @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. */ @@ -540,34 +531,39 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener int width = paintTextR.width; int p = p0 + Utilities.getBreakLocation(segment, metrics, 0, width, null, - p0); + p0); SegmentCache.releaseSegment(segment); return p; } /** * Static singleton {@link Segment} cache. - * - * @see javax.swing.text.SegmentCache - * + * * @author Samuel Sjoberg + * @see javax.swing.text.SegmentCache */ protected static final class SegmentCache { - /** Reused segments. */ + /** + * Reused segments. + */ private ArrayList segments = new ArrayList(2); - /** Singleton instance. */ + /** + * Singleton instance. + */ private static SegmentCache cache = new SegmentCache(); - /** Private constructor. */ + /** + * 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() { @@ -589,4 +585,4 @@ public class MultiLineLabelUI extends BasicLabelUI implements ComponentListener cache.segments.add(segment); } } -} \ No newline at end of file +} diff --git a/src/forge/gui/game/CardDetailPanel.java b/src/forge/gui/game/CardDetailPanel.java index 2be0db07b40..46538aa3402 100644 --- a/src/forge/gui/game/CardDetailPanel.java +++ b/src/forge/gui/game/CardDetailPanel.java @@ -1,357 +1,350 @@ /** * CardDetailPanel.java - * + * * Created on 17.02.2010 */ package forge.gui.game; -import java.awt.Color; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.GridLayout; -import java.util.Iterator; +import forge.*; -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextArea; -import javax.swing.SwingConstants; +import javax.swing.*; import javax.swing.border.EtchedBorder; - -import forge.AllZone; -import forge.Card; -import forge.CardContainer; -import forge.Counters; -import forge.GuiDisplayUtil; -import forge.Gui_NewGame; +import java.awt.Color; +import java.awt.*; +import java.util.Iterator; /** * The class CardDetailPanel. Shows the details of a card. - * - * @version V0.0 17.02.2010 + * * @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 cdLabel1; - private JLabel cdLabel2; - private JLabel cdLabel3; - private JLabel cdLabel4; - private JLabel cdLabel5; - private JLabel cdLabel6; - private JLabel cdLabel7; - private JTextArea cdArea; - + 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(cdLabel1 = new JLabel()); - cdLabels.add(cdLabel2 = new JLabel()); - cdLabels.add(cdLabel3 = new JLabel()); - cdLabels.add(cdLabel4 = new JLabel()); - cdLabels.add(cdLabel6 = new JLabel()); - + 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(cdLabel5 = new JLabel(), c); - + IDR.add(idLabel = new JLabel(), c); + c.gridwidth = 1; c.weightx = 0.3; - IDR.add(cdLabel7 = new JLabel(), c); - + IDR.add(setInfoLabel = new JLabel(), c); + cdLabels.add(IDR); - + add(cdLabels); - cdLabel1.setHorizontalAlignment(SwingConstants.CENTER); - cdLabel2.setHorizontalAlignment(SwingConstants.CENTER); - cdLabel3.setHorizontalAlignment(SwingConstants.CENTER); + nameCostLabel.setHorizontalAlignment(SwingConstants.CENTER); + typeLabel.setHorizontalAlignment(SwingConstants.CENTER); + powerToughnessLabel.setHorizontalAlignment(SwingConstants.CENTER); //cdLabel7.setSize(100, cdLabel7.getHeight()); - - cdLabel7.setHorizontalAlignment(SwingConstants.CENTER); - + + setInfoLabel.setHorizontalAlignment(SwingConstants.CENTER); + add(new JScrollPane(cdArea = new JTextArea(4, 12))); cdArea.setLineWrap(true); cdArea.setWrapStyleWord(true); - - if(!Gui_NewGame.useLAFFonts.isSelected()) { - cdLabel1.setFont(new java.awt.Font("Dialog", 0, 14)); - cdLabel2.setFont(new java.awt.Font("Dialog", 0, 14)); - cdLabel3.setFont(new java.awt.Font("Dialog", 0, 14)); - cdLabel4.setFont(new java.awt.Font("Dialog", 0, 14)); - cdLabel5.setFont(new java.awt.Font("Dialog", 0, 14)); - cdLabel6.setFont(new java.awt.Font("Dialog", 0, 14)); - + + 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); - cdLabel7.setFont(f); - - cdArea.setFont(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) { - cdLabel1.setText(""); - cdLabel2.setText(""); - cdLabel3.setText(""); - cdLabel4.setText(""); - cdLabel5.setText(""); - cdLabel6.setText(""); - cdLabel7.setText(""); - cdLabel7.setOpaque(false); - cdLabel7.setBorder(null); + 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.HumanPlayer; - if(!faceDown) { - if(card.isLand()) cdLabel1.setText(card.getName()); - else cdLabel1.setText(card.getName() + " - " + card.getManaCost()); - } else cdLabel1.setText("Morph"); - - if(!faceDown) cdLabel2.setText(GuiDisplayUtil.formatCardType(card)); - else cdLabel2.setText("Creature"); - - if(card.isCreature()) { - cdLabel3.setText(card.getNetAttack() + " / " + card.getNetDefense()); - cdLabel4.setText("Damage: " + card.getDamage() + " Assigned Damage: " + card.getTotalAssignedDamage()); + 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()) cdLabel4.setText("Assigned Damage: " + card.getTotalAssignedDamage()); - - cdLabel5.setText("Card ID " + card.getUniqueNumber()); - + 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()) cdLabel7.setText(card.getCurSetCode()); - - if (!cdLabel7.getText().equals("")) - { - cdLabel7.setOpaque(true); - String csr = card.getCurSetRarity(); - if (csr.equals("Common") || csr.equals("Land")) - { - cdLabel7.setBackground(Color.BLACK); - cdLabel7.setForeground(Color.WHITE); - cdLabel7.setBorder(BorderFactory.createLineBorder(Color.WHITE)); - } - else if (csr.equals("Uncommon")) - { - cdLabel7.setBackground(Color.LIGHT_GRAY); - cdLabel7.setForeground(Color.BLACK); - cdLabel7.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } - else if (csr.equals("Rare")) - { - cdLabel7.setBackground(Color.YELLOW); - cdLabel7.setForeground(Color.BLACK); - cdLabel7.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } - else if (csr.equals("Mythic")) - { - cdLabel7.setBackground(Color.RED); - cdLabel7.setForeground(Color.BLACK); - cdLabel7.setBorder(BorderFactory.createLineBorder(Color.BLACK)); - } - //cdLabel7.setText(card.getCurSetCode()); + 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) { + if (card.isToken()) area.append("Token"); + + if (!faceDown) { //card text - if(area.length() != 0) area.append("\n"); + 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"); - + text = text.replaceAll(regex, "$0\r\n"); + regex = "LEVEL [0-9]+\\+ "; - text = text.replaceAll(regex,"\r\n$0\r\n"); - + 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"); - + 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"); + 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"); + 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){ + 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.getTopCardName().equals("")) - { - area.append("\r\nTop card: "); - area.append(card.getTopCardName()); + 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"); + 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"); + 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"); + 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"); + 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"); + if (card.getEquippedBy().size() > 0) { + if (area.length() != 0) area.append("\n"); area.append("=Equipped by "); - for(Iterator it = card.getEquippedBy().iterator(); it.hasNext();) { + for (Iterator it = card.getEquippedBy().iterator(); it.hasNext(); ) { area.append(it.next()); - if(it.hasNext()) area.append(", "); + 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()) { + 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 { + } else { area.append(card.getEnchanting().get(0)); } area.append("*"); } - + //enchanted by - if(card.getEnchantedBy().size() > 0) { - if(area.length() != 0) area.append("\n"); + if (card.getEnchantedBy().size() > 0) { + if (area.length() != 0) area.append("\n"); area.append("*Enchanted by "); - for(Iterator it = card.getEnchantedBy().iterator(); it.hasNext();) { + for (Iterator it = card.getEnchantedBy().iterator(); it.hasNext(); ) { area.append(it.next()); - if(it.hasNext()) area.append(", "); + 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("+"); + 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("^"); + 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("^"); + 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"); + 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("="); + + 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 index 5dcd915707f..b2d48e14fdd 100644 --- a/src/forge/gui/game/CardPanel.java +++ b/src/forge/gui/game/CardPanel.java @@ -1,68 +1,80 @@ - package forge.gui.game; -import java.awt.Color; -import java.awt.GridLayout; -import java.awt.Image; - -import javax.swing.ImageIcon; -import javax.swing.JLabel; -import javax.swing.JPanel; - 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; - + 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) { + 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(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()) { + + if (c.isTapped()) { add(tapLabel); } - - if(c.isCreature()) add(new JLabel(c.getNetAttack() + " / " + c.getNetDefense())); + + 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 index 3540e64b302..521b7f35819 100644 --- a/src/forge/gui/game/CardPicturePanel.java +++ b/src/forge/gui/game/CardPicturePanel.java @@ -1,20 +1,12 @@ /** * CardPicturePanel.java - * + * * Created on 17.02.2010 */ package forge.gui.game; -import java.awt.BorderLayout; -import java.awt.Image; -import java.awt.Insets; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -import javax.swing.JPanel; - import arcane.ui.ScaledImagePanel; import arcane.ui.ScaledImagePanel.MultipassType; import arcane.ui.ScaledImagePanel.ScalingType; @@ -22,24 +14,35 @@ 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. - * - * @version V0.0 17.02.2010 + * * @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 Card card; + + // private JLabel label; // private ImageIcon icon; - private ScaledImagePanel panel; - private Image currentImange; - + 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())); @@ -47,34 +50,38 @@ public class CardPicturePanel extends JPanel implements CardContainer { 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; + if (!isShowing()) return; Insets i = getInsets(); - Image image = card == null? null:ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight() + Image image = card == null ? null : ImageCache.getImage(card, getWidth() - i.left - i.right, getHeight() - i.top - i.bottom); - - if(image != currentImange) { + + if (image != currentImange) { currentImange = image; panel.setImage(image, null); panel.repaint(); @@ -89,7 +96,12 @@ public class CardPicturePanel extends JPanel implements CardContainer { // 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 index 07afe8e6a39..50a7e9fe456 100644 --- a/src/forge/gui/input/Input.java +++ b/src/forge/gui/input/Input.java @@ -1,4 +1,3 @@ - package forge.gui.input; import forge.AllZone; @@ -7,53 +6,103 @@ 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; + + private boolean isFree = false; //showMessage() is always the first method called + /** + *

    showMessage.

    + */ public void showMessage() { - AllZone.Display.showMessage("Blank Input"); + AllZone.getDisplay().showMessage("Blank Input"); } - - public void selectCard(Card c, PlayerZone zone) {} - - public void selectPlayer(final Player player) { } - - public void selectButtonOK() {} - - public void selectButtonCancel() {} - + + /** + *

    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.InputControl.setInput(Input) + //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.InputControl.resetInput(); - - if(AllZone.Phase.isNeedToNextPhase()) { + AllZone.getInputControl().resetInput(); + + if (AllZone.getPhase().isNeedToNextPhase()) { // mulligan needs this to move onto next phase - AllZone.Phase.setNeedToNextPhase(false); - AllZone.Phase.nextPhase(); + 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.InputControl.setInput(in); + 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 index f673d633f77..c09140285d3 100644 --- a/src/forge/gui/input/InputControl.java +++ b/src/forge/gui/input/InputControl.java @@ -1,155 +1,187 @@ package forge.gui.input; +import forge.*; + import java.util.LinkedList; import java.util.Stack; -import forge.AllZone; -import forge.Constant; -import forge.MyObservable; -import forge.Phase; -import forge.Player; - +/** + *

    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; - static int n = 0; - private Stack inputStack = new Stack(); - private Stack resolvingStack = new Stack(); - private LinkedList resolvingQueue = new LinkedList(); + 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.Stack.getResolving() || !(input == null || input instanceof Input_PassPriority)) - inputStack.add(in); - else - input = in; + if (AllZone.getStack().getResolving() || !(input == null || input instanceof Input_PassPriority)) + inputStack.add(in); + else + input = in; updateObservers(); } - - public void setInput(final Input in, boolean bAddToResolving) { - // Make this - if (!bAddToResolving){ - setInput(in); - return; - } - Input old = input; - resolvingStack.add(old); - changeInput(in); + /** + *

    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); } - - private void changeInput(final Input in){ - input = in; + + /** + *

    changeInput.

    + * + * @param in a {@link forge.gui.input.Input} object. + */ + private void changeInput(final Input in) { + input = in; updateObservers(); } - - public Input getInput(){ - return input; + + /** + *

    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(); + updateObservers(); } + /** + *

    updateInput.

    + * + * @return a {@link forge.gui.input.Input} object. + */ public Input updateInput() { - final String phase = AllZone.Phase.getPhase(); - final Player playerTurn = AllZone.Phase.getPlayerTurn(); - final Player priority = AllZone.Phase.getPriorityPlayer(); + 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 (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.Stack.getResolving()) - return null; - - - if (input != null) - return input; - - else if(inputStack.size() > 0) { // incoming input to Control - changeInput(inputStack.pop()); + // if an SA is resolving, only change input for something that is part of the resolving SA + changeInput(resolvingStack.pop()); return input; } - - if (Phase.getGameBegins() != 0 && AllZone.Phase.doPhaseEffects()){ - // Handle begin phase stuff, then start back from the top - AllZone.Phase.handleBeginPhase(); - return updateInput(); + + 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 the Phase we're in doesn't allow for Priority, return null to move to next phase - if (AllZone.Phase.isNeedToNextPhase()) - return null; - + + 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.Stack.freezeStack(); - - if (playerTurn.isHuman()) - return new Input_Attack(); - } - - else if(phase.equals(Constant.Phase.Combat_Declare_Blockers)) { - AllZone.Stack.freezeStack(); - if (playerTurn.isHuman()){ - AllZone.Computer.getComputer().declare_blockers(); - return null; - } - else{ - if(AllZone.Combat.getAttackers().length == 0){ - // no active attackers, skip the Blocking phase - AllZone.Phase.setNeedToNextPhase(true); - return null; - } - else - return new Input_Block(); - } - } - - else if(phase.equals(Constant.Phase.Cleanup)) // Player needs to discard - if (AllZone.Stack.size() == 0) // fall through to resolve things like Madness - return new Input_Cleanup(); + 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.Phase.doSkipPhase(); - AllZone.Phase.setSkipPhase(false); - if(AllZone.Stack.size() == 0 && !AllZone.Display.stopAtPhase(playerTurn, phase) && skip) { - AllZone.Phase.passPriority(); - return null; - } - else - return new Input_PassPriority(); - } - - else if (playerTurn.isComputer()) - return AllZone.Computer; - else{ - AllZone.Computer.getComputer().stack_not_empty(); - return null; + + 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 index 02229d9e45e..6fd6107c748 100644 --- a/src/forge/gui/input/Input_Attack.java +++ b/src/forge/gui/input/Input_Attack.java @@ -1,92 +1,97 @@ - package forge.gui.input; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.CombatUtil; -import forge.Command; -import forge.Constant; -import forge.GameActionUtil; -import forge.PlayerZone; +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 - + // TODO: still seems to have some issues with multiple planeswalkers + ButtonUtil.enableOnlyOK(); - Object o = AllZone.Combat.nextDefender(); - if (o == null){ - return; + 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.Display.showMessage(sb.toString()); - - if (AllZone.Combat.getRemainingDefenders() == 0) { - // Nothing left to attack, has to attack this defender - CardList possibleAttackers = AllZoneUtil.getPlayerCardsInPlay(AllZone.HumanPlayer); + + 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.Combat) - && !c.isAttacking()) { - AllZone.Combat.addAttacker(c); + 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.Combat.getAttackers().length > 0) - AllZone.Phase.setCombat(true); - - if (AllZone.Combat.getRemainingDefenders() != 0) - AllZone.Phase.repeatPhase(); - - AllZone.Phase.setNeedToNextPhase(true); - AllZone.InputControl.resetInput(); + 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.HumanPlayer) && CombatUtil.canAttack(card,AllZone.Combat)) { - - // TODO add the propaganda code here and remove it in Phase.nextPhase() - // if (!CombatUtil.checkPropagandaEffects(card)) - // return; - - AllZone.Combat.addAttacker(card); - AllZone.Human_Battlefield.updateObservers(); // just to make sure the attack symbol is marked - + 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.StaticEffects.getStateBasedMap().keySet()) { + for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { Command com = GameActionUtil.commands.get(effect); com.execute(); } - GameActionUtil.executeCardStateEffects(); - + 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 index 5f3292ea44f..a31c02b4c67 100644 --- a/src/forge/gui/input/Input_Block.java +++ b/src/forge/gui/input/Input_Block.java @@ -1,90 +1,94 @@ - package forge.gui.input; +import forge.*; + import java.util.ArrayList; -import forge.AllZone; -import forge.ButtonUtil; -import forge.Card; -import forge.CardUtil; -import forge.CombatUtil; -import forge.Command; -import forge.Constant; -import forge.GameActionUtil; -import forge.PlayerZone; - +/** + *

    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(); - - public void removeFromAllBlocking(Card c){ - allBlocking.remove(c); + + 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.StaticEffects.getStateBasedMap().keySet()) { + for (String effect : AllZone.getStaticEffects().getStateBasedMap().keySet()) { Command com = GameActionUtil.commands.get(effect); com.execute(); } - GameActionUtil.executeCardStateEffects(); - + //could add "Reset Blockers" button ButtonUtil.enableOnlyOK(); - - - if(currentAttacker == null) { - /* - //Lure - CardList attackers = new CardList(AllZone.Combat.getAttackers()); - for(Card attacker:attackers) { - if(attacker.hasKeyword("All creatures able to block CARDNAME do so.")) { - CardList bls = AllZoneUtil.getCreaturesInPlay(AllZone.HumanPlayer); - for(Card bl:bls) { - if(CombatUtil.canBlock(attacker, bl, AllZone.Combat)) { - allBlocking.add(bl); - AllZone.Combat.addBlocker(attacker, bl); - } - } - } - }*/ - - AllZone.Display.showMessage("To Block, click on your Opponents attacker first, then your blocker(s)"); + + + 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() + ") "); } - else { - String attackerName = currentAttacker.isFaceDown() ? "Morph" : currentAttacker.getName(); - AllZone.Display.showMessage("Select a creature to block " + attackerName + " (" - + currentAttacker.getUniqueNumber() + ") "); - } - + CombatUtil.showCombat(); } - + + /** {@inheritDoc} */ @Override public void selectButtonOK() { - if(CombatUtil.finishedMandatotyBlocks(AllZone.Combat)) { - // Done blocking - ButtonUtil.reset(); - - AllZone.Phase.setNeedToNextPhase(true); - } + 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.Combat.getAttackers()).contains(card)) { + if (CardUtil.toList(AllZone.getCombat().getAttackers()).contains(card)) { currentAttacker = card; - } else if(zone.is(Constant.Zone.Battlefield, AllZone.HumanPlayer) && card.isCreature() - && CombatUtil.canBlock(currentAttacker, card, AllZone.Combat)) { - if(currentAttacker != null && (!allBlocking.contains(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.Combat.addBlocker(currentAttacker, card); + AllZone.getCombat().addBlocker(currentAttacker, card); } } showMessage(); diff --git a/src/forge/gui/input/Input_Cleanup.java b/src/forge/gui/input/Input_Cleanup.java index 79d3b4f9fc3..9671d9aa6e9 100644 --- a/src/forge/gui/input/Input_Cleanup.java +++ b/src/forge/gui/input/Input_Cleanup.java @@ -1,61 +1,66 @@ - package forge.gui.input; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CombatUtil; -import forge.Constant; -import forge.PlayerZone; +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.Phase.getPlayerTurn().isComputer()){ - AI_CleanupDiscard(); - return; - } - + if (AllZone.getPhase().getPlayerTurn().isComputer()) { + AI_CleanupDiscard(); + return; + } + ButtonUtil.disableAll(); - int n = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer).size(); - + 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.HumanPlayer.getMaxHandSize()); + 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.Display.showMessage(sb.toString()); - + AllZone.getDisplay().showMessage(sb.toString()); + //goes to the next phase - if(n <= AllZone.HumanPlayer.getMaxHandSize() || AllZone.HumanPlayer.getMaxHandSize() == -1) { + if (n <= AllZone.getHumanPlayer().getMaxHandSize() || AllZone.getHumanPlayer().getMaxHandSize() == -1) { CombatUtil.removeAllDamage(); - - AllZone.Phase.setNeedToNextPhase(true); - AllZone.Phase.nextPhase(); // TODO: keep an eye on this code, see if we can get rid of it. + + 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.HumanPlayer)) { + if (zone.is(Constant.Zone.Hand, AllZone.getHumanPlayer())) { card.getController().discard(card, null); - if (AllZone.Stack.size() == 0) - showMessage(); + if (AllZone.getStack().size() == 0) + showMessage(); } }//selectCard() - - - public void AI_CleanupDiscard(){ - int size = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer).size(); - - if (AllZone.ComputerPlayer.getMaxHandSize() != -1){ - int numDiscards = size - AllZone.ComputerPlayer.getMaxHandSize(); - AllZone.ComputerPlayer.discard(numDiscards, null, false); - } + + + /** + *

    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.Phase.setNeedToNextPhase(true); + + AllZone.getPhase().setNeedToNextPhase(true); } } diff --git a/src/forge/gui/input/Input_Mulligan.java b/src/forge/gui/input/Input_Mulligan.java index d8d708bf565..caf9ad5f634 100644 --- a/src/forge/gui/input/Input_Mulligan.java +++ b/src/forge/gui/input/Input_Mulligan.java @@ -1,108 +1,112 @@ - package forge.gui.input; -import forge.AllZone; -import forge.AllZoneUtil; -import forge.ButtonUtil; -import forge.Card; -import forge.CardList; -import forge.Constant; -import forge.GameActionUtil; -import forge.Phase; +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.Display.getButtonOK().setText("No"); - AllZone.Display.getButtonCancel().setText("Yes"); - AllZone.Display.showMessage("Do you want to Mulligan?"); + 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.GameInfo.setHumanMulliganedToZero(false); - - CardList hand = AllZoneUtil.getPlayerHand(AllZone.HumanPlayer); - for(Card c : hand) - AllZone.GameAction.moveToLibrary(c); + 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(); - for(int i = 0; i < 100; i++) - AllZone.HumanPlayer.shuffle(); - int newHand = hand.size() - 1; - - AllZone.GameInfo.addHumanNumberOfTimesMulliganed(1); - - if(AllZone.QuestData != null) - { - if (AllZone.QuestData.getInventory().hasItem("Sleight") && AllZone.GameInfo.getHumanNumberOfTimesMulliganed() == 1) - newHand++; + + 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.HumanPlayer.drawCard(); - - if(newHand == 0) { - AllZone.GameInfo.setHumanMulliganedToZero(true); - end(); + 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.ComputerPlayer); + //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.ComputerPlayer,dummy).size() < 2) { - for(Card c : CHandList) - AllZone.GameAction.moveToLibrary(c); - - for(int i = 0; i < 100; i++) - AllZone.ComputerPlayer.shuffle(); - - int newHand = CHandList.size() - 1; - for(int i = 0; i < newHand; i++) - AllZone.ComputerPlayer.drawCard(); - - CHandList = AllZoneUtil.getPlayerHand(AllZone.ComputerPlayer); + 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.HumanPlayer); + CardList HHandList = AllZoneUtil.getPlayerHand(AllZone.getHumanPlayer()); - for(Card c : HHandList){ - if(c.getName().startsWith("Leyline")) { - if (GameActionUtil.showYesNoDialog(c, "Put onto Battlefield?")) - AllZone.GameAction.moveToPlay(c); - } + 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.GameAction.moveToPlay(c); - AllZone.GameAction.checkStateEffects(); - } + 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.GameAction.isStartCut() && !(HHandList.contains(AllZone.GameAction.getHumanCut()) - || CHandList.contains(AllZone.GameAction.getComputerCut()))) { - AllZone.GameAction.moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.HumanPlayer),AllZone.GameAction.getHumanCut()); - AllZone.GameAction.moveTo(AllZone.getZone(Constant.Zone.Library, AllZone.ComputerPlayer),AllZone.GameAction.getComputerCut()); + 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.GameAction.checkStateEffects(); + AllZone.getGameAction().checkStateEffects(); Phase.setGameBegins(1); - AllZone.Phase.setNeedToNextPhase(false); + AllZone.getPhase().setNeedToNextPhase(false); stop(); } } diff --git a/src/forge/gui/input/Input_PassPriority.java b/src/forge/gui/input/Input_PassPriority.java index 8934c2414c0..818c043df6e 100644 --- a/src/forge/gui/input/Input_PassPriority.java +++ b/src/forge/gui/input/Input_PassPriority.java @@ -1,55 +1,60 @@ -package forge.gui.input; - -import forge.AllZone; -import forge.ButtonUtil; -import forge.Card; -import forge.GuiDisplayUtil; -import forge.Player; -import forge.PlayerZone; - -public class Input_PassPriority extends Input implements java.io.Serializable { - private static final long serialVersionUID = -581477682214137181L; - - @Override - public void showMessage() { - GuiDisplayUtil.updateGUI(); - ButtonUtil.enableOnlyOK(); - - String phase = AllZone.Phase.getPhase(); - Player player = AllZone.Phase.getPriorityPlayer(); - - if (player.isComputer()){ - System.out.println(phase + ": Computer in passpriority"); - } - - StringBuilder sb = new StringBuilder(); - - sb.append("Turn : ").append(AllZone.Phase.getPlayerTurn()).append("\n"); - sb.append("Phase: ").append(phase).append("\n"); - sb.append("Stack: "); - if (AllZone.Stack.size() != 0) - sb.append(AllZone.Stack.size()).append(" to Resolve."); - else - sb.append("Empty"); - sb.append("\n"); - sb.append("Priority: ").append(player); - - AllZone.Display.showMessage(sb.toString()); - } - - @Override - public void selectButtonOK() { - AllZone.Phase.passPriority(); - GuiDisplayUtil.updateGUI(); - Input in = AllZone.InputControl.getInput(); - if (in == this || in == null) - AllZone.InputControl.resetInput(); - // Clear out PassPriority after clicking button - } - - @Override - public void selectCard(Card card, PlayerZone zone) { - if (AllZone.GameAction.playCard(card)) - AllZone.Phase.setPriority(AllZone.HumanPlayer); - }//selectCard() -} +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 index 2b094547e8b..bf886cd5890 100644 --- a/src/forge/gui/input/Input_PayManaCost.java +++ b/src/forge/gui/input/Input_PayManaCost.java @@ -1,4 +1,3 @@ - package forge.gui.input; import forge.*; @@ -8,103 +7,119 @@ 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 - private static final long serialVersionUID = 3467312982164195091L; - - private final String originalManaCost; - - private final Card originalCard; - public ManaCost manaCost; - + // 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; - - public Input_PayManaCost(SpellAbility sa,boolean noStack) { - skipStack = noStack; - originalManaCost = sa.getManaCost(); // Change + + /** + *

    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()); + if (Phase.getGameBegins() == 1) { + if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { + if (spell.getAfterPayMana() != null) stopSetNext(spell.getAfterPayMana()); else { - manaCost = new ManaCost("0"); - AllZone.Stack.add(spell); + manaCost = new ManaCost("0"); + AllZone.getStack().add(spell); } - } else { - manaCost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(originalManaCost)); - } - } - else - { - manaCost = new ManaCost(sa.getManaCost()); + } 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()); + if (Phase.getGameBegins() == 1) { + if (sa.getSourceCard().isCopiedSpell() && sa.isSpell()) { + if (spell.getAfterPayMana() != null) stopSetNext(spell.getAfterPayMana()); else { - manaCost = new ManaCost("0"); - AllZone.Stack.add(spell); + manaCost = new ManaCost("0"); + AllZone.getStack().add(spell); } - } else { - manaCost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(originalManaCost)); - } - } - else - { - manaCost = new ManaCost(sa.getManaCost()); + } 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 + 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.InputControl.getInput() == this) - showMessage(); - - if(manaCost.isPaid()) { - originalCard.setSunburstValue(manaCost.getSunburst()); - done(); + if (AllZone.getInputControl().getInput() == this) + showMessage(); + + if (manaCost.isPaid()) { + originalCard.setSunburstValue(manaCost.getSunburst()); + done(); } } + /** {@inheritDoc} */ @Override - public void selectPlayer(Player player) - { + public void selectPlayer(Player player) { - if(player.isHuman()) - { - if(manaCost.payPhyrexian()) - { + if (player.isHuman()) { + if (manaCost.payPhyrexian()) { phyLifeToLose += 2; } @@ -112,76 +127,76 @@ public class Input_PayManaCost extends Input { } } - + + /** + *

    done.

    + */ private void done() { - if(phyLifeToLose > 0) - AllZone.HumanPlayer.payLife(phyLifeToLose,originalCard); - if (spell.getSourceCard().isCopiedSpell()) { - if (spell.getAfterPayMana() != null) { - stopSetNext(spell.getAfterPayMana()); - } else - AllZone.InputControl.resetInput(); - } else { - AllZone.ManaPool.clearPay(spell, false); - resetManaCost(); + 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 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 this is a spell, move it to the Stack ZOne - if (spell.isSpell()) // already checked for if its a copy - AllZone.GameAction.moveToStack(originalCard); + 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.Stack.add(spell); - } - AllZone.InputControl.resetInput(); - } - } + 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.ManaPool.unpaid(spell, true); - AllZone.Human_Battlefield.updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap - + 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) - { + if (phyLifeToLose > 0) { msg.append(" ("); msg.append(phyLifeToLose); msg.append(" life paid for phyrexian mana)"); } - if(manaCost.containsPhyrexianMana()) - { + if (manaCost.containsPhyrexianMana()) { msg.append("\n(Click on your life total to pay life for phyrexian mana.)"); } - AllZone.Display.showMessage(msg.toString()); - if(manaCost.isPaid() && !new ManaCost(originalManaCost).isPaid()) { - originalCard.setSunburstValue(manaCost.getSunburst()); - done(); + 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 index 7754f6941e2..6574f6a221d 100644 --- a/src/forge/gui/input/Input_PayManaCostUtil.java +++ b/src/forge/gui/input/Input_PayManaCostUtil.java @@ -1,8 +1,4 @@ package forge.gui.input; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; import forge.AllZone; import forge.Card; @@ -13,138 +9,176 @@ import forge.card.spellability.Ability_Mana; import forge.card.spellability.SpellAbility; import forge.gui.GuiUtils; -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 - 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); +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; - 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.HumanPlayer); - 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()); + /** + *

    getManaAbilities.

    + * + * @param card a {@link forge.Card} object. + * @return a {@link java.util.ArrayList} object. + */ + public static ArrayList getManaAbilities(Card card) { + return card.getManaAbility(); } - - AllZone.GameAction.playSpellAbility(chosen); - manaCost = AllZone.ManaPool.subtractMana(sa, manaCost, chosen); + //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; - AllZone.Human_Battlefield.updateObservers();//DO NOT REMOVE THIS, otherwise the cards don't always tap (copied) - return manaCost; - - } - public static ArrayList getManaAbilities(Card card) - { - return card.getManaAbility(); - } - //color is like "G", returns "Green" - 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; - } - - - 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; + for (String color : ManaPool.formatMana(am)) + if (mana.contains(color)) return true; + return false; + } - return o.toString(); - } - - 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(); - } - + /** + *

    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 index 3d35df4f396..a06ee1b8dd8 100644 --- a/src/forge/gui/input/Input_PayManaCost_Ability.java +++ b/src/forge/gui/input/Input_PayManaCost_Ability.java @@ -1,103 +1,147 @@ - package forge.gui.input; -import forge.AllZone; -import forge.ButtonUtil; -import forge.Card; -import forge.Command; -import forge.PlayerZone; +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; - + 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; + 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); + 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); + 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; + 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()) { + + if (manaCost.isPaid()) { resetManaCost(); - AllZone.ManaPool.clearPay(fakeAbility, false); - + AllZone.getManaPool().clearPay(fakeAbility, false); + paidCommand.execute(); - - AllZone.InputControl.resetInput(); + + AllZone.getInputControl().resetInput(); } } - + + /** {@inheritDoc} */ @Override public void selectButtonCancel() { resetManaCost(); - AllZone.ManaPool.unpaid(fakeAbility, true); + AllZone.getManaPool().unpaid(fakeAbility, true); unpaidCommand.execute(); - AllZone.InputControl.resetInput(); + AllZone.getInputControl().resetInput(); } - + + /** {@inheritDoc} */ @Override public void selectButtonOK() { - if (showOnlyOKButton) - { - unpaidCommand.execute(); - AllZone.InputControl.resetInput(); - } + if (showOnlyOKButton) { + unpaidCommand.execute(); + AllZone.getInputControl().resetInput(); + } } - + + /** {@inheritDoc} */ @Override public void showMessage() { - ButtonUtil.enableOnlyCancel(); + ButtonUtil.enableOnlyCancel(); if (showOnlyOKButton) - ButtonUtil.enableOnlyOK(); - AllZone.Display.showMessage(message + "Pay Mana Cost: \r\n" + manaCost.toString()); + 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 index d01b00bf6a3..de95abfc5fa 100644 --- a/src/forge/properties/ForgePreferences.java +++ b/src/forge/properties/ForgePreferences.java @@ -1,137 +1,170 @@ - package forge.properties; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.List; -import forge.properties.Preferences; - +/** + *

    ForgePreferences class.

    + * + * @author Forge + * @version $Id$ + */ public class ForgePreferences extends Preferences { - public boolean newGui; - public boolean stackAiLand; - public boolean millingLossCondition; - public boolean developerMode; - - public String laf; - public boolean lafFonts; - public StackOffsetType stackOffset; - public int maxStackSize; - public CardSizeType cardSize; - public boolean cardOverlay; - public boolean scaleLargerThanOriginal; - - // 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; + 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; - private List saveListeners = new ArrayList(); - private final String fileName; + // 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; - 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); - } + private List saveListeners = new ArrayList(); + private final String fileName; - newGui = getBoolean("gui.new", true); - stackAiLand = getBoolean("AI.stack.land", false); - millingLossCondition = getBoolean("loss.condition.milling", true); - developerMode = getBoolean("developer.mode", false); - - 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); - - // 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); - } + /** + *

    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); + } - public void save () throws Exception{ + 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); - set("gui.new", newGui); + laf = get("gui.laf", ""); + lafFonts = getBoolean("gui.laf.fonts", false); - set("AI.stack.land", stackAiLand); - set("loss.condition.milling", millingLossCondition); - set("developer.mode", developerMode); - - 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(); + 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", ""); - 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); - } - } + // 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); + } - public void addSaveListener (SavePreferencesListener listener) { - saveListeners.add(listener); - } + /** + *

    save.

    + * + * @throws java.lang.Exception if any. + */ + public void save() throws Exception { - static public enum CardSizeType { - tiny, smaller, small, medium, large, huge - } + set("gui.new", newGui); - static public enum StackOffsetType { - tiny, small, medium, large - } + 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 index bbeedaa5998..870f4c37e84 100644 --- a/src/forge/properties/ForgeProps.java +++ b/src/forge/properties/ForgeProps.java @@ -1,103 +1,130 @@ package forge.properties; /** * ForgeProps.java - * + * * Created on 30.08.2009 */ -import static java.lang.String.*; +import forge.error.ErrorViewer; +import treeProperties.TreeProperties; import java.io.File; import java.io.IOException; import java.util.Locale; -import treeProperties.TreeProperties; -import forge.error.ErrorViewer; +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) { + } 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) { + 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) { + 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 @@ -105,16 +132,17 @@ public class ForgeProps { //the second is the default locale's language code String[] languages = {getProperty(NewConstants.LANG.LANGUAGE), Locale.getDefault().getLanguage(), "en"}; try { - for(String lang:languages) { + for (String lang : languages) { //could be if a property does not exist //just skip it, and try the next - if(lang == null) continue; + if (lang == null) continue; String result = getProperty(format(key, lang)); - if(result != null) return result; + 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) {} + } 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 index f8fc95aac0e..6ef26025ba5 100644 --- a/src/forge/properties/NewConstants.java +++ b/src/forge/properties/NewConstants.java @@ -1,415 +1,509 @@ - package forge.properties; /** * NewConstants.java - * + * * Created on 22.08.2009 */ - /** - * property keys - * - * @version V0.0 22.08.2009 + * These are mostly property keys. + * * @author Clemens Koza + * @version V0.0 22.08.2009 */ public interface NewConstants { //General properties - public static final String MAIL = "program/mail"; - public static final String FORUM = "program/forum"; - public static final String VERSION = "program/version"; - - public static final String SHOW2CDECK = "showdeck/2color"; - - public static final String DECKS = "decks"; - public static final String BOOSTER_DECKS = "booster-decks"; - public static final String NEW_DECKS = "decks-dir"; - - public static final String TOKENS = "tokens"; - public static final String CARD_PICTURES = "card-pictures"; - public static final String CARD_PICTURES_TOKEN_LQ = "card-pictures_token_lq"; - public static final String CARD_PICTURES_A = "card-pictures_a"; - public static final String CARD_PICTURES_B = "card-pictures_b"; - public static final String CARD_PICTURES_C = "card-pictures_c"; - public static final String CARD_PICTURES_D = "card-pictures_d"; - public static final String CARD_PICTURES_E = "card-pictures_e"; - public static final String CARD_PICTURES_F = "card-pictures_f"; - public static final String CARD_PICTURES_G = "card-pictures_g"; - public static final String CARD_PICTURES_H = "card-pictures_h"; - public static final String CARD_PICTURES_I = "card-pictures_i"; - public static final String CARD_PICTURES_J = "card-pictures_j"; - public static final String CARD_PICTURES_K = "card-pictures_k"; - public static final String CARD_PICTURES_L = "card-pictures_l"; - public static final String CARD_PICTURES_M = "card-pictures_m"; - public static final String CARD_PICTURES_N = "card-pictures_n"; - public static final String CARD_PICTURES_O = "card-pictures_o"; - public static final String CARD_PICTURES_P = "card-pictures_p"; - public static final String CARD_PICTURES_Q = "card-pictures_q"; - public static final String CARD_PICTURES_R = "card-pictures_r"; - public static final String CARD_PICTURES_S = "card-pictures_s"; - public static final String CARD_PICTURES_T = "card-pictures_t"; - public static final String CARD_PICTURES_U = "card-pictures_u"; - public static final String CARD_PICTURES_V = "card-pictures_v"; - public static final String CARD_PICTURES_W = "card-pictures_w"; - public static final String CARD_PICTURES_X = "card-pictures_x"; - public static final String CARD_PICTURES_Y = "card-pictures_y"; - public static final String CARD_PICTURES_Z = "card-pictures_z"; - public static final String CARD_PICTURES_OTHER = "card-pictures_other"; - public static final String CARD_PICTURES_TOKEN_HQ = "card-pictures_token_hq"; - public static final String CARDS = "cards"; - public static final String CARDSFOLDER = "cardsfolder"; - public static final String REMOVED = "removed-cards"; - public static final String NAME_MUTATOR = "name-mutator"; - public static final String BOOSTERDATA = "boosterdata"; - - public static final String IMAGE_BASE = "image/base"; - public static final String IMAGE_TOKEN = "image/token"; - public static final String IMAGE_ICON = "image/icon"; - public static final String SOUND_BASE = "sound/base"; - + /** 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"; + /** - * properties for regular game + * These properties are for a regular game. */ public static interface REGULAR { - public static final String COMMON = "regular/common"; - public static final String UNCOMMON = "regular/uncommon"; - public static final String RARE = "regular/rare"; + /** 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"; } + /** - * properties for booster draft + * These properties are for a booster draft. */ public static interface DRAFT { - public static final String COMMON = "draft/common"; - public static final String UNCOMMON = "draft/uncommon"; - public static final String RARE = "draft/rare"; + /** 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"; } - + /** - * properties for quest game + * These properties are for a quest game. */ public static interface QUEST { - public static final String COMMON = "quest/common"; - public static final String UNCOMMON = "quest/uncommon"; - public static final String RARE = "quest/rare"; - - public static final String PRICE = "quest/price"; - public static final String QUESTS = "quest/quests"; - - public static final String EASY = "quest/easy"; - public static final String MEDIUM = "quest/medium"; - public static final String HARD = "quest/hard"; - public static final String VERYHARD = "quest/veryhard"; - - public static final String DATA = "quest/data"; - public static final String PREFS = "quest/prefs"; - - public static final String DECKS = "quest/decks-dir"; - public static final String XMLDATA = "quest/data-xml"; + /** 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"; } - + /** - * gui-related properties + * These are GUI-related properties. */ public static interface GUI { public static interface GuiDisplay { - public static final String LAYOUT = "gui/Display"; - public static final String LAYOUT_NEW = "gui/Display/new"; + String LAYOUT = "gui/Display"; + String LAYOUT_NEW = "gui/Display/new"; } - + public static interface GuiDeckEditor { - public static final String LAYOUT = "gui/DeckEditor"; + String LAYOUT = "gui/DeckEditor"; + } } - + /** - * Localization properties + * These are localization properties. */ public static interface LANG { - public static final String PROGRAM_NAME = "%s/program/name"; - public static final String LANGUAGE = "lang"; - + String PROGRAM_NAME = "%s/program/name"; + String LANGUAGE = "lang"; + public static interface HowTo { - public static final String TITLE = "%s/HowTo/title"; - public static final String MESSAGE = "%s/HowTo/message"; + String TITLE = "%s/HowTo/title"; + String MESSAGE = "%s/HowTo/message"; } - + public static interface ErrorViewer { - public static final String SHOW_ERROR = "%s/ErrorViewer/show"; - - public static final String TITLE = "%s/ErrorViewer/title"; - public static final String MESSAGE = "%s/ErrorViewer/message"; - public static final String BUTTON_SAVE = "%s/ErrorViewer/button/save"; - public static final String BUTTON_CLOSE = "%s/ErrorViewer/button/close"; - public static final String BUTTON_EXIT = "%s/ErrorViewer/button/exit"; - + 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 { - public static final String SAVE_MESSAGE = "%s/ErrorViewer/errors/save/message"; - public static final String SHOW_MESSAGE = "%s/ErrorViewer/errors/show/message"; + String SAVE_MESSAGE = "%s/ErrorViewer/errors/save/message"; + String SHOW_MESSAGE = "%s/ErrorViewer/errors/show/message"; } } - + public static interface Gui_BoosterDraft { - public static final String CLOSE_MESSAGE = "%s/BoosterDraft/close/message"; - public static final String SAVE_MESSAGE = "%s/BoosterDraft/save/message"; - public static final String SAVE_TITLE = "%s/BoosterDraft/save/title"; - public static final String RENAME_MESSAGE = "%s/BoosterDraft/rename/message"; - public static final String RENAME_TITLE = "%s/BoosterDraft/rename/title"; - public static final String SAVE_DRAFT_MESSAGE = "%s/BoosterDraft/saveDraft/message"; - public static final String SAVE_DRAFT_TITLE = "%s/BoosterDraft/saveDraft/title"; + 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 { - public static final String TITLE = "%s/Display/menu/title"; + String TITLE = "%s/Display/menu/title"; } - + public static interface PHASE { - public static final String TITLE = "%s/Display/phase/title"; + String TITLE = "%s/Display/phase/title"; } - + public static interface DEV { - public static final String TITLE = "%s/Display/dev/title"; + String TITLE = "%s/Display/dev/title"; } } - - public static final String HUMAN_TITLE = "%s/Display/human/title"; - + + String HUMAN_TITLE = "%s/Display/human/title"; + public static interface HUMAN_HAND { - public static final String TITLE = "%s/Display/human/hand/title"; + String TITLE = "%s/Display/human/hand/title"; } public static interface HUMAN_LIBRARY { - public static final String BASE = "%s/Display/human/library"; - public static final String TITLE = "%s/Display/human/library/title"; - public static final String MENU = "%s/Display/human/library/menu"; - public static final String BUTTON = "%s/Display/human/library/button"; + 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"; } - - public static final String HUMAN_GRAVEYARD = "%s/Display/human/graveyard"; - + + String HUMAN_GRAVEYARD = "%s/Display/human/graveyard"; + public static interface HUMAN_GRAVEYARD { - public static final String TITLE = "%s/Display/human/graveyard/title"; - public static final String BUTTON = "%s/Display/human/graveyard/button"; - public static final String MENU = "%s/Display/human/graveyard/menu"; + String TITLE = "%s/Display/human/graveyard/title"; + String BUTTON = "%s/Display/human/graveyard/button"; + String MENU = "%s/Display/human/graveyard/menu"; } - - public static final String HUMAN_REMOVED = "%s/Display/human/removed"; - + + String HUMAN_REMOVED = "%s/Display/human/removed"; + public static interface HUMAN_REMOVED { - public static final String TITLE = "%s/Display/human/removed/title"; - public static final String BUTTON = "%s/Display/human/removed/button"; - public static final String MENU = "%s/Display/human/removed/menu"; + String TITLE = "%s/Display/human/removed/title"; + String BUTTON = "%s/Display/human/removed/button"; + String MENU = "%s/Display/human/removed/menu"; } - - public static final String COMBAT = "%s/Display/combat/title"; - - public static final String HUMAN_FLASHBACK = "%s/Display/human/flashback"; - + + String COMBAT = "%s/Display/combat/title"; + + String HUMAN_FLASHBACK = "%s/Display/human/flashback"; + public static interface HUMAN_FLASHBACK { - public static final String TITLE = "%s/Display/human/flashback/title"; - public static final String BUTTON = "%s/Display/human/flashback/button"; - public static final String MENU = "%s/Display/human/flashback/menu"; + String TITLE = "%s/Display/human/flashback/title"; + String BUTTON = "%s/Display/human/flashback/button"; + String MENU = "%s/Display/human/flashback/menu"; } - - public static final String COMPUTER_TITLE = "%s/Display/computer/title"; - + + String COMPUTER_TITLE = "%s/Display/computer/title"; + public static interface COMPUTER_HAND { - public static final String BASE = "%s/Display/computer/hand"; - public static final String TITLE = "%s/Display/computer/hand/title"; - public static final String BUTTON = "%s/Display/computer/hand/button"; - public static final String MENU = "%s/Display/computer/hand/menu"; + 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 { - public static final String BASE = "%s/Display/computer/library"; - public static final String TITLE = "%s/Display/computer/library/title"; - public static final String BUTTON = "%s/Display/computer/library/button"; - public static final String MENU = "%s/Display/computer/library/menu"; + 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"; } - - - public static final String COMPUTER_GRAVEYARD = "%s/Display/computer/graveyard"; - + + + String COMPUTER_GRAVEYARD = "%s/Display/computer/graveyard"; + public static interface COMPUTER_GRAVEYARD { - public static final String TITLE = "%s/Display/computer/graveyard/title"; - public static final String BUTTON = "%s/Display/computer/graveyard/button"; - public static final String MENU = "%s/Display/computer/graveyard/menu"; + String TITLE = "%s/Display/computer/graveyard/title"; + String BUTTON = "%s/Display/computer/graveyard/button"; + String MENU = "%s/Display/computer/graveyard/menu"; } - - - public static final String COMPUTER_REMOVED = "%s/Display/computer/removed"; - + + + String COMPUTER_REMOVED = "%s/Display/computer/removed"; + public static interface COMPUTER_REMOVED { - public static final String TITLE = "%s/Display/computer/removed/title"; - public static final String BUTTON = "%s/Display/computer/removed/button"; - public static final String MENU = "%s/Display/computer/removed/menu"; + String TITLE = "%s/Display/computer/removed/title"; + String BUTTON = "%s/Display/computer/removed/button"; + String MENU = "%s/Display/computer/removed/menu"; } - - public static final String CONCEDE = "%s/Display/concede"; - + + String CONCEDE = "%s/Display/concede"; + public static interface CONCEDE { - public static final String BUTTON = "%s/Display/concede/button"; - public static final String MENU = "%s/Display/concede/menu"; + String BUTTON = "%s/Display/concede/button"; + String MENU = "%s/Display/concede/menu"; } - - public static final String MANAGEN = "%s/Display/managen"; - + + String MANAGEN = "%s/Display/managen"; + public static interface MANAGEN { - public static final String BUTTON = "%s/Display/managen/button"; - public static final String MENU = "%s/Display/managen/menu"; + String BUTTON = "%s/Display/managen/button"; + String MENU = "%s/Display/managen/menu"; } - - public static final String SETUPBATTLEFIELD = "%s/Display/setupbattlefield"; - + + String SETUPBATTLEFIELD = "%s/Display/setupbattlefield"; + public static interface SETUPBATTLEFIELD { - public static final String BUTTON = "%s/Display/setupbattlefield/button"; - public static final String MENU = "%s/Display/setupbattlefield/menu"; + 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 { - public static final String TITLE = "%s/DownloadPictures/title"; - - public static final String PROXY_ADDRESS = "%s/DownloadPictures/proxy/address"; - public static final String PROXY_PORT = "%s/DownloadPictures/proxy/port"; - - public static final String NO_PROXY = "%s/DownloadPictures/proxy/type/none"; - public static final String HTTP_PROXY = "%s/DownloadPictures/proxy/type/http"; - public static final String SOCKS_PROXY = "%s/DownloadPictures/proxy/type/socks"; - - public static final String NO_MORE = "%s/DownloadPictures/no-more"; - - public static final String BAR_BEFORE_START = "%s/DownloadPictures/bar/before-start"; - public static final String BAR_WAIT = "%s/DownloadPictures/bar/wait"; - public static final String BAR_CLOSE = "%s/DownloadPictures/bar/close"; - + 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 { - public static final String START = "%s/DownloadPictures/button/start"; - public static final String CANCEL = "%s/DownloadPictures/button/cancel"; - public static final String CLOSE = "%s/DownloadPictures/button/close"; + String START = "%s/DownloadPictures/button/start"; + String CANCEL = "%s/DownloadPictures/button/cancel"; + String CLOSE = "%s/DownloadPictures/button/close"; } - + public static interface ERRORS { - public static final String PROXY_CONNECT = "%s/DownloadPictures/errors/proxy/connect"; - public static final String OTHER = "%s/DownloadPictures/errors/other"; + 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 { - public static final String GAMETYPE = "%s/NewGame/gametype"; - public static final String LIBRARY = "%s/NewGame/library"; - public static final String SETTINGS = "%s/NewGame/settings"; - public static final String NEW_GAME = "%s/NewGame/new_game"; - public static final String CONSTRUCTED_TEXT = "%s/NewGame/constructed_text"; - public static final String SEALED_TEXT = "%s/NewGame/sealed_text"; - public static final String BOOSTER_TEXT = "%s/NewGame/booster_text"; - public static final String YOURDECK = "%s/NewGame/yourdeck"; - public static final String OPPONENT = "%s/NewGame/opponent"; - public static final String DECK_EDITOR = "%s/NewGame/deckeditor"; - public static final String NEW_GUI = "%s/NewGame/newgui"; - public static final String AI_LAND = "%s/NewGame/ailand"; - public static final String DEV_MODE = "%s/NewGame/devmode"; - public static final String QUEST_MODE = "%s/NewGame/questmode"; - public static final String START_GAME = "%s/NewGame/startgame"; - - } + 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 { - public static final String TITLE = "%s/NewGame/menu/title"; - public static final String LF = "%s/NewGame/menu/lookAndFeel"; - public static final String DOWNLOADPRICE = "%s/NewGame/menu/downloadPrice"; - public static final String DOWNLOAD = "%s/NewGame/menu/download"; - public static final String DOWNLOADLQ = "%s/NewGame/menu/downloadlq"; - public static final String DOWNLOADSETLQ = "%s/NewGame/menu/downloadsetlq"; - public static final String IMPORTPICTURE = "%s/NewGame/menu/importPicture"; - public static final String CARD_SIZES = "%s/NewGame/menu/cardSizes"; - public static final String CARD_STACK = "%s/NewGame/menu/cardStack"; - public static final String CARD_STACK_OFFSET = "%s/NewGame/menu/cardStackOffset"; - public static final String ABOUT = "%s/NewGame/menu/about"; + 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 { - public static final String TITLE = "%s/NewGame/options/title"; - public static final String FONT = "%s/NewGame/options/font"; - public static final String CARD_OVERLAY = "%s/NewGame/options/cardOverlay"; - public static final String CARD_SCALE = "%s/NewGame/options/cardScale"; - + 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 { - public static final String TITLE = "%s/NewGame/options/generate/title"; - public static final String REMOVE_SMALL = "%s/NewGame/options/generate/removeSmall"; - public static final String REMOVE_ARTIFACTS = "%s/NewGame/options/generate/removeArtifacts"; + 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 { - public static final String TITLE = "%s/NewGame/help/title"; - } - - - - + public static interface HELP { + String TITLE = "%s/NewGame/help/title"; + } } - - public static interface ERRORS {} + + public static interface ERRORS { + } } - + public static interface Gui_WinLose { - public static interface WINLOSE_TEXT { - public static final String WON = "%s/WinLose/won"; - public static final String LOST = "%s/WinLose/lost"; - public static final String WIN = "%s/WinLose/win"; - public static final String LOSE = "%s/WinLose/lose"; - public static final String CONTINUE = "%s/WinLose/continue"; - public static final String RESTART = "%s/WinLose/restart"; - public static final String QUIT = "%s/WinLose/quit"; - } + 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 { - public static final String TITLE = "%s/DownloadPrices/title"; - public static final String START_UPDATE = "%s/DownloadPrices/startupdate"; - public static final String DOWNLOADING = "%s/DownloadPrices/downloading"; - public static final String COMPILING = "%s/DownloadPrices/compiling"; - } + 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 { - public static final String HEADS ="%s/GameAction/heads"; - public static final String TAILS ="%s/GameAction/tails"; - public static final String HEADS_OR_TAILS ="%s/GameAction/heads_or_tails"; - public static final String COIN_TOSS ="%s/GameAction/coin_toss"; - public static final String HUMAN_WIN ="%s/GameAction/human_win"; - public static final String COMPUTER_WIN ="%s/GameAction/computer_win"; - public static final String COMPUTER_STARTS ="%s/GameAction/computer_starts"; - public static final String HUMAN_STARTS ="%s/GameAction/human_starts"; - public static final String HUMAN_MANA_COST ="%s/GameAction/human_mana_cost"; - public static final String COMPUTER_MANA_COST ="%s/GameAction/computer_mana_cost"; - public static final String COMPUTER_CUT ="%s/GameAction/computer_cut"; - public static final String HUMAN_CUT ="%s/GameAction/human_cut"; - public static final String CUT_NUMBER ="%s/GameAction/cut_number"; - public static final String RESOLVE_STARTER ="%s/GameAction/resolve_starter"; - public static final String EQUAL_CONVERTED_MANA ="%s/GameAction/equal_converted_mana"; - public static final String CUTTING_AGAIN ="%s/GameAction/cutting_again"; - public static final String YES ="%s/GameAction/yes"; - public static final String NO ="%s/GameAction/no"; - public static final String WANT_DREDGE ="%s/GameAction/want_dredge"; - public static final String SELECT_DREDGE ="%s/GameAction/select_dredge"; - public static final String CHOOSE_2ND_LAND ="%s/GameAction/choose_2nd_land"; - - - - } + 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 index eadbf42dbae..1d9db49f956 100644 --- a/src/forge/properties/Preferences.java +++ b/src/forge/properties/Preferences.java @@ -1,76 +1,134 @@ - package forge.properties; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Properties; -import java.util.Set; -import java.util.Vector; +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(); + @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; + if (value == null) return defaultValue; try { return Integer.parseInt(value); - } catch(NumberFormatException ex) { + } 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; + 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; + 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); + 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 index c4e00bb6a6a..f211fe65b8c 100644 --- a/src/forge/properties/SavePreferencesListener.java +++ b/src/forge/properties/SavePreferencesListener.java @@ -1,6 +1,14 @@ - package forge.properties; +/** + *

    SavePreferencesListener interface.

    + * + * @author Forge + * @version $Id$ + */ public interface SavePreferencesListener { - public void savePreferences (); + /** + *

    savePreferences.

    + */ + public void savePreferences(); } diff --git a/src/forge/quest/data/QuestBattleManager.java b/src/forge/quest/data/QuestBattleManager.java index 326e4c3def3..8da9a3f9ae4 100644 --- a/src/forge/quest/data/QuestBattleManager.java +++ b/src/forge/quest/data/QuestBattleManager.java @@ -11,11 +11,22 @@ 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 { @@ -27,14 +38,30 @@ public class QuestBattleManager { } + /** + *

    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(), @@ -44,56 +71,79 @@ public class QuestBattleManager { 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.QuestData.getRandomSeed())); + 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.QuestData.getDifficultyIndex(); + int index = AllZone.getQuestData().getDifficultyIndex(); - if (AllZone.QuestData.getWin() < QuestPreferences.getWinsForMediumAI(index)) { + if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForMediumAI(index)) { return new String[]{ getOpponent(easyAIDecks, 0), getOpponent(easyAIDecks, 1), getOpponent(easyAIDecks, 2)}; } - if (AllZone.QuestData.getWin() == QuestPreferences.getWinsForMediumAI(index)) { + if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForMediumAI(index)) { return new String[]{ getOpponent(easyAIDecks, 0), getOpponent(mediumAIDecks, 0), getOpponent(mediumAIDecks, 1)}; } - if (AllZone.QuestData.getWin() < QuestPreferences.getWinsForHardAI(index)) { + if (AllZone.getQuestData().getWin() < QuestPreferences.getWinsForHardAI(index)) { return new String[]{ getOpponent(mediumAIDecks, 0), getOpponent(mediumAIDecks, 1), getOpponent(mediumAIDecks, 2)}; } - if (AllZone.QuestData.getWin() == QuestPreferences.getWinsForHardAI(index)) { + if (AllZone.getQuestData().getWin() == QuestPreferences.getWinsForHardAI(index)) { return new String[]{ getOpponent(mediumAIDecks, 0), getOpponent(hardAIDecks, 0), getOpponent(hardAIDecks, 1)}; } - if (AllZone.QuestData.getWin() >= QuestPreferences.getWinsForVeryHardAI(index)) { + if (AllZone.getQuestData().getWin() >= QuestPreferences.getWinsForVeryHardAI(index)) { return new String[]{ getOpponent(hardAIDecks, 0), getOpponent(hardAIDecks, 1), @@ -106,6 +156,13 @@ public class QuestBattleManager { 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); @@ -136,4 +193,4 @@ public class QuestBattleManager { return list; } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/QuestBoosterPack.java b/src/forge/quest/data/QuestBoosterPack.java index af219230f31..5c1bca01aed 100644 --- a/src/forge/quest/data/QuestBoosterPack.java +++ b/src/forge/quest/data/QuestBoosterPack.java @@ -1,105 +1,216 @@ package forge.quest.data; -import forge.CardList; +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; + 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); - } + choices = new ArrayList(); + choices.add("Multicolor"); + + for (String s : Constant.Color.Colors) { + choices.add(s); + choices.add(s); + } } - - public ArrayList getQuestStarterDeck(CardList cards, 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); + + /** + *

    + * 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 (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 - sets.add("NPH"); - sets.add("MBS"); - sets.add("SOM"); - sets.add("M11"); - sets.add("ROE"); - sets.add("WWK"); - sets.add("ZEN"); - - cards = cards.getSets(sets); - } - - names.addAll(generateCards(cards, numCommon, Constant.Rarity.Common, null, started)); - names.addAll(generateCards(cards, numUncommon, Constant.Rarity.Uncommon, null, started)); - names.addAll(generateCards(cards, numRare, Constant.Rarity.Rare, null, started)); - - return names; + 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(); } - - public ArrayList generateCards(CardList cards, 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); - - cards = cards.getRarity(rarity); - int count = 0, i = 0; - while(count < num){ - String name; - - if (color == null) - name = getCardName(cards, colorOrder.get(i % size)); - else - name = getCardName(cards); - - if (name != null && !names.contains(name)){ - names.add(name); - count++; - } - i++; - } - - return names; - } - - public ArrayList generateCards(CardList cards, int num, String rarity, String color){ - return generateCards(cards, num, rarity, color, choices); - } - - public String getCardName(CardList cards, String color){ - return getCardName(cards.getColor(color)); - } - - public String getCardName(CardList cards){ - if (cards.isEmpty()) // Only should happen if something is programmed wrong - return null; - cards.shuffle(); - - return cards.get(0).getName(); - } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/QuestData.java b/src/forge/quest/data/QuestData.java index 7b57c241a42..55ec7dd528f 100644 --- a/src/forge/quest/data/QuestData.java +++ b/src/forge/quest/data/QuestData.java @@ -13,6 +13,9 @@ 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 @@ -23,6 +26,12 @@ import java.util.Map; //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; @@ -58,12 +67,15 @@ public class QuestData { 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, @@ -73,6 +85,9 @@ public class QuestData { QuestPetManager petManager = new QuestPetManager(); + /** + *

    Constructor for QuestData.

    + */ public QuestData() { for (int i = 0; i < QuestPreferences.getStartingBasic(); i++) { @@ -95,6 +110,9 @@ public class QuestData { randomizeOpponents(); } + /** + *

    initTransients.

    + */ private void initTransients() { rankArray = new String[]{ "Level 0 - Confused Wizard", @@ -116,10 +134,17 @@ public class QuestData { //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); - CardList allCards = AllZone.CardFactory.getCards(); + Generator allCards = YieldUtils.toGenerator(AllZone.getCardFactory()); ArrayList list = new ArrayList(); @@ -133,8 +158,7 @@ public class QuestData { mode = m; if (mode.equals(FANTASY)) { life = 15; - } - else { + } else { life = 20; } } @@ -147,6 +171,9 @@ public class QuestData { } + /** + *

    saveData.

    + */ public void saveData() { QuestDataIO.saveData(this); } @@ -154,66 +181,124 @@ public class QuestData { //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 { + } 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 { + } 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 { + } 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); } @@ -222,6 +307,12 @@ public class QuestData { //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() @@ -252,6 +343,11 @@ public class QuestData { //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()); } @@ -259,6 +355,11 @@ public class QuestData { //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); } @@ -266,8 +367,11 @@ public class QuestData { //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() { - CardList cards = AllZone.CardFactory.getCards(); + Generator cards = YieldUtils.toGenerator(AllZone.getCardFactory()); int nCommon = QuestPreferences.getNumCommon(); int nUncommon = QuestPreferences.getNumUncommon(); int nRare = QuestPreferences.getNumRare(); @@ -284,9 +388,16 @@ public class QuestData { } + /** + *

    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(AllZone.CardFactory.getCards(), n, Constant.Rarity.Rare, null)); + newCards.addAll(boosterPack.generateCards(allCards, n, Constant.Rarity.Rare, null)); cardPool.addAll(newCards); newCardList.addAll(newCards); @@ -294,18 +405,38 @@ public class QuestData { 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(); @@ -322,10 +453,20 @@ public class QuestData { } } + /** + *

    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)) { @@ -341,6 +482,12 @@ public class QuestData { } } + /** + *

    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(); @@ -355,11 +502,9 @@ public class QuestData { if (s != null) { if (s.equals("Poison Counters")) { creds += QuestPreferences.getMatchRewardPoisonWinBonus(); - } - else if (s.equals("Milled")) { + } else if (s.equals("Milled")) { creds += QuestPreferences.getMatchRewardMilledWinBonus(); - } - else if (s.equals("Battle of Wits") || s.equals("Felidar Sovereign") || s.equals("Helix Pinnacle") || + } 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(); @@ -369,14 +514,11 @@ public class QuestData { for (int i : winTurns) { if (i == 1) { creds += QuestPreferences.getMatchRewardWinFirst(); - } - else if (i <= 5) { + } else if (i <= 5) { creds += QuestPreferences.getMatchRewardWinByFifth(); - } - else if (i <= 10) { + } else if (i <= 10) { creds += QuestPreferences.getMatchRewardWinByTen(); - } - else if (i <= 15) { + } else if (i <= 15) { creds += QuestPreferences.getMatchRewardWinByFifteen(); } } @@ -390,11 +532,9 @@ public class QuestData { if (inventory.getItemLevel("Estates") == 1) { creds *= 1.1; - } - else if (inventory.getItemLevel("Estates") == 2) { + } else if (inventory.getItemLevel("Estates") == 2) { creds *= 1.15; - } - else if (inventory.getItemLevel("Estates") == 3) { + } else if (inventory.getItemLevel("Estates") == 3) { creds *= 1.2; } @@ -405,6 +545,11 @@ public class QuestData { //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 @@ -412,6 +557,12 @@ public class QuestData { } + /** + *

    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; @@ -422,6 +573,9 @@ public class QuestData { //this changes getRank() + /** + *

    addWin.

    + */ public void addWin() { win++; @@ -430,47 +584,93 @@ public class QuestData { } } + /** + *

    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) { @@ -478,10 +678,20 @@ public class QuestData { } } + /** + *

    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 ""; @@ -491,19 +701,37 @@ public class QuestData { //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++) { @@ -513,10 +741,20 @@ public class QuestData { } } + /** + *

    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) { @@ -526,41 +764,70 @@ public class QuestData { 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 { + } 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 { + } 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++) { @@ -575,25 +842,50 @@ public class QuestData { 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 index 6c64a78c326..b6711290115 100644 --- a/src/forge/quest/data/QuestDataIO.java +++ b/src/forge/quest/data/QuestDataIO.java @@ -2,12 +2,10 @@ package forge.quest.data; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.mapper.MapperWrapper; -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.*; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.xml.sax.InputSource; @@ -16,75 +14,91 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.*; import java.util.ArrayList; -import java.util.HashMap; 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() { } - static public QuestData loadData() { + /** + *

    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); - //if the new file format does not exist, convert the old one and save it as the new copy + GZIPInputStream zin = + new GZIPInputStream(new FileInputStream(xmlSaveFile)); - if (!xmlSaveFile.exists()) { - data = convertDeprecatedSaveFormat(); - data.saveData(); + 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); } - else { - GZIPInputStream zin = new GZIPInputStream(new FileInputStream(xmlSaveFile)); + IgnoringXStream xStream = new IgnoringXStream(); + data = (QuestData) xStream.fromXML(xml.toString()); - 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(); + if (data.versionNumber != QuestData.CURRENT_VERSION_NUMBER) { + updateSaveFile(data, xml.toString()); } + + zin.close(); + return data; - } - - catch (Exception ex) { + } catch (Exception ex) { ErrorViewer.showError(ex, "Error loading Quest Data"); throw new RuntimeException(ex); } } - private static void updateSaveFile(QuestData newData, String input) { + /** + *

    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(); + 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 + 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())); + 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())); + 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())); + newData.getInventory().setItemLevel("Sleight", Integer.parseInt(elements.item(0).getTextContent())); elements = document.getElementsByTagName("gearLevel"); int gearLevel = Integer.parseInt(elements.item(0).getTextContent()); @@ -105,6 +119,11 @@ public class QuestDataIO { } } + /** + *

    saveData.

    + * + * @param qd a {@link forge.quest.data.QuestData} object. + */ public static void saveData(QuestData qd) { try { File f = ForgeProps.getFile(NewConstants.QUEST.XMLDATA); @@ -117,86 +136,13 @@ public class QuestDataIO { zout.flush(); zout.close(); } catch (Exception ex) { - ErrorViewer.showError(ex, "Error saving Quest Data"); + ErrorViewer.showError(ex, "Error saving Quest Data."); throw new RuntimeException(ex); } } - @SuppressWarnings({"deprecation"}) - public static QuestData convertDeprecatedSaveFormat() { - forge.QuestData oldData = forge.QuestData.loadData(); - QuestData newData = new QuestData(); - - - newData.difficulty = oldData.getDifficulty(); - newData.diffIndex = oldData.getDiffIndex(); - newData.rankIndex = oldData.getWin() / QuestPreferences.getWinsForRankIncrease(newData.diffIndex); - - newData.win = oldData.getWin(); - newData.lost = oldData.getLost(); - - newData.life = oldData.getLife(); - newData.inventory.setItemLevel("Estates", oldData.getEstatesLevel()); - newData.inventory.setItemLevel("Lucky Coin", oldData.getLuckyCoinLevel()); - newData.inventory.setItemLevel("Sleight", oldData.getSleightOfHandLevel()); - if (oldData.getGearLevel() >= 1) { - newData.inventory.setItemLevel("Map", 1); - } - if (oldData.getGearLevel() == 2) { - newData.inventory.setItemLevel("Zeppelin", 1); - } - - newData.questsPlayed = oldData.getQuestsPlayed(); - newData.credits = oldData.getCredits(); - newData.mode = oldData.getMode(); - - newData.myDecks = new HashMap(); - for (String deckName : oldData.getDeckNames()) { - newData.myDecks.put(deckName, oldData.getDeck(deckName)); - } - - newData.cardPool = oldData.getCardpool(); - newData.newCardList = oldData.getAddedCards(); - newData.shopList = oldData.getShopList(); - - newData.availableQuests = oldData.getAvailableQuests(); - newData.completedQuests = oldData.getCompletedQuests(); - - QuestPetAbstract newPet; - - if (oldData.getBirdPetLevel() > 0) { - newPet = new QuestPetBird(); - newPet.setLevel(oldData.getBirdPetLevel()); - newData.petManager.addPet(newPet); - } - if (oldData.getHoundPetLevel() > 0) { - newPet = new QuestPetHound(); - newPet.setLevel(oldData.getHoundPetLevel()); - newData.petManager.addPet(newPet); - } - if (oldData.getWolfPetLevel() > 0) { - newPet = new QuestPetWolf(); - newPet.setLevel(oldData.getWolfPetLevel()); - newData.petManager.addPet(newPet); - } - if (oldData.getCrocPetLevel() > 0) { - newPet = new QuestPetCrocodile(); - newPet.setLevel(oldData.getCrocPetLevel()); - newData.petManager.addPet(newPet); - } - if (oldData.getPlantLevel() > 0) { - newPet = new QuestPetPlant(); - newPet.setLevel(oldData.getPlantLevel()); - newData.petManager.getPlant().setLevel(oldData.getPlantLevel()); - } - - newData.getPetManager().setSelectedPet(null); - - return newData; - } - /** - * Xstream subclass that ignores fields that are present in the save but not in the class + * 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(); @@ -205,8 +151,9 @@ public class QuestDataIO { protected MapperWrapper wrapMapper(MapperWrapper next) { return new MapperWrapper(next) { @Override - public boolean shouldSerializeMember(Class definedIn, - String fieldName) { + public boolean shouldSerializeMember( + @SuppressWarnings("rawtypes") Class definedIn, + String fieldName) { if (definedIn == Object.class) { ignoredFields.add(fieldName); return false; @@ -215,12 +162,5 @@ public class QuestDataIO { } }; } - - //is not used anywhere as far as I can search for - /* - public List getIgnoredFields() { - return ignoredFields; - } - */ } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/QuestMatchState.java b/src/forge/quest/data/QuestMatchState.java index 0f8e39b49cf..446435acbb0 100644 --- a/src/forge/quest/data/QuestMatchState.java +++ b/src/forge/quest/data/QuestMatchState.java @@ -1,5 +1,11 @@ package forge.quest.data; +/** + *

    QuestMatchState class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestMatchState { //the way wins were achieved: //Damage @@ -19,60 +25,122 @@ public class QuestMatchState { 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; } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/QuestPreferences.java b/src/forge/quest/data/QuestPreferences.java index d0cc2d34452..4d731de0ed4 100644 --- a/src/forge/quest/data/QuestPreferences.java +++ b/src/forge/quest/data/QuestPreferences.java @@ -7,355 +7,659 @@ import java.io.BufferedReader; import java.io.FileReader; import java.io.Serializable; +/** + *

    QuestPreferences class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestPreferences implements Serializable { - private static final long serialVersionUID = 3266336025656577905L; + /** Constant serialVersionUID=3266336025656577905L */ + private static final long serialVersionUID = 3266336025656577905L; - private static int numDiff = 4; - - // Descriptive difficulty names - private static String[] sDifficulty = { "Easy", "Normal", "Hard", "Very Hard" }; - - // Default match wins it takes to gain a booster - private static int[] winsForBooster = { 1, 1, 2, 2 }; - private static int[] winsForRankIncrease = { 1, 2, 3, 4 }; - private static int[] winsForMediumAI = { 6, 6, 11, 11 }; - private static int[] winsForHardAI = { 9, 9, 21, 21 }; - private static int[] winsForVeryHardAI = { 29, 29, 31, 31 }; - - // Default starting land for a quest - private static int startingBasicLand = 20; - private static int startingSnowBasicLand = 20; + /** Constant numDiff=4 */ + private static int numDiff = 4; - // Default starting amount of each rarity - private static int[] startingCommons = {45, 40, 40, 40}; - private static int[] startingUncommons = {20, 15, 15, 15}; - private static int[] startingRares = {10, 10, 10, 10}; - - private static int startingCredits = 250; + // Descriptive difficulty names + /** Constant sDifficulty="{Easy, Normal, Hard, Very Hard}" */ + private static String[] sDifficulty = {"Easy", "Normal", "Hard", "Very Hard"}; - private static int boosterPackRare = 1; - private static int boosterPackUncommon = 3; - private static int boosterPackCommon = 9; + // 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}; - private static int matchRewardBase = 10; - private static double matchRewardTotalWins = 0.3; - private static int matchRewardNoLosses = 10; - - private static int matchRewardPoisonWinBonus = 50; - private static int matchRewardMilledWinBonus = 40; - private static int matchRewardAltWinBonus = 100; - - private static int matchRewardWinOnFirstTurn = 1500; - private static int matchRewardWinByTurnFive = 250; - private static int matchRewardWinByTurnTen = 50; - private static int matchRewardWinByTurnFifteen = 5; - private static int matchRewardMullToZero = 500; - - - static { - // if quest.prefs exists - 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."); - } - } - - public static String[] getDifficulty(){ - return sDifficulty; - } - - public static String getDifficulty(int index){ - return sDifficulty[index]; - } - - public static int getWinsForBooster(int index){ - return winsForBooster[index]; - } - - public static int getWinsForRankIncrease(int index){ - return winsForRankIncrease[index]; - } - - public static int getWinsForMediumAI(int index){ - return winsForMediumAI[index]; - } - - public static int getWinsForHardAI(int index){ - return winsForHardAI[index]; - } - - public static int getWinsForVeryHardAI(int index){ - return winsForVeryHardAI[index]; - } - - public static int getStartingBasic(){ - return startingBasicLand; - } - - public static int getStartingSnowBasic(){ - return startingSnowBasicLand; - } - - public static int getStartingCommons(int index){ - return startingCommons[index]; - } - - public static int getStartingUncommons(int index){ - return startingUncommons[index]; - } - - public static int getStartingRares(int index){ - return startingRares[index]; - } - - public static int getStartingCredits(){ - return startingCredits; - } - - public static int getNumCommon(){ - return boosterPackCommon; - } - - public static int getNumUncommon(){ - return boosterPackUncommon; - } - - public static int getNumRare(){ - return boosterPackRare; - } - - - public static int getMatchRewardBase(){ - return matchRewardBase; - } - - public static double getMatchRewardTotalWins(){ - return matchRewardTotalWins; - } - - public static int getMatchRewardNoLosses(){ - return matchRewardNoLosses; - } - - public static int getMatchRewardPoisonWinBonus(){ - return matchRewardPoisonWinBonus; - } - - public static int getMatchRewardMilledWinBonus(){ - return matchRewardMilledWinBonus; - } - - public static int getMatchRewardAltWinBonus(){ - return matchRewardAltWinBonus; - } - - - public static int getMatchRewardWinFirst(){ - return matchRewardWinOnFirstTurn; - } - - public static int getMatchRewardWinByFifth(){ - return matchRewardWinByTurnFive; - } - - public static int getMatchRewardWinByTen(){ - return matchRewardWinByTurnTen; - } - - public static int getMatchRewardWinByFifteen(){ - return matchRewardWinByTurnFifteen; - } - - public static int getMatchMullToZero(){ - return matchRewardMullToZero; - } - - - // setters - public static void setDifficulty(String diff){ - sDifficulty = diff.split(","); - } - - public static void setWinsForBooster(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - winsForBooster[i] = Integer.parseInt(winsStr[i]); - } - - public static void setWinsForRank(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - winsForRankIncrease[i] = Integer.parseInt(winsStr[i]); - } - - public static void setWinsForMediumAI(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - winsForMediumAI[i] = Integer.parseInt(winsStr[i]); - } - - public static void setWinsForHardAI(String wins){ - String[] winsStr = wins.split(","); - - for(int i = 0; i < numDiff; i++) - winsForHardAI[i] = Integer.parseInt(winsStr[i]); - } - - public static void setStartingBasic(String land){ - startingBasicLand = Integer.parseInt(land); - } - - public static void setStartingSnowBasic(String land){ - startingSnowBasicLand = Integer.parseInt(land); - } - - public static void setStartingCommons(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - startingCommons[i] = Integer.parseInt(splitStr[i]); - } - - public static void setStartingUncommons(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - startingUncommons[i] = Integer.parseInt(splitStr[i]); - } - - public static void setStartingRares(String rarity){ - String[] splitStr = rarity.split(","); - - for(int i = 0; i < numDiff; i++) - startingRares[i] = Integer.parseInt(splitStr[i]); - } - - public static void setStartingCredits(String credits){ - startingCredits = Integer.parseInt(credits); - } - - public static void setNumCommon(String pack){ - boosterPackCommon = Integer.parseInt(pack); - } - - public static void setNumUncommon(String pack){ - boosterPackUncommon = Integer.parseInt(pack); - } - - public static void setNumRares(String pack){ - boosterPackRare = Integer.parseInt(pack); - } - - - public static void setMatchRewardBase(String match){ - matchRewardBase = Integer.parseInt(match); - } - - public static void setMatchRewardTotalWins(String match){ - matchRewardTotalWins = Double.parseDouble(match); - } - - public static void setMatchRewardNoLosses(String match){ - matchRewardNoLosses = Integer.parseInt(match); - } - - public static void setMatchRewardPoisonWinBonus(String match){ - matchRewardPoisonWinBonus = Integer.parseInt(match); - } - - public static void setMatchRewardMilledWinBonus(String match){ - matchRewardMilledWinBonus = Integer.parseInt(match); - } - - public static void setMatchRewardAltWinBonus(String match){ - matchRewardAltWinBonus = Integer.parseInt(match); - } - - - public static void setMatchRewardWinFirst(String match){ - matchRewardWinOnFirstTurn = Integer.parseInt(match); - } - - public static void setMatchRewardWinByFifth(String match){ - matchRewardWinByTurnFive = Integer.parseInt(match); - } - - public static void setMatchRewardWinByTen(String match){ - matchRewardWinByTurnTen = Integer.parseInt(match); - } - - public static void setMatchRewardWinByFifteen(String match){ - matchRewardWinByTurnFifteen = Integer.parseInt(match); - } - - public static void setMatchMullToZero(String match){ - matchRewardMullToZero = Integer.parseInt(match); - } + // 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 index c43b1865eff..6e27594a2c6 100644 --- a/src/forge/quest/data/QuestUtil.java +++ b/src/forge/quest/data/QuestUtil.java @@ -4,518 +4,486 @@ 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 { - public static CardList getComputerCreatures(QuestData qd) - { - return new CardList(); - } - - 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.CardFactory.getCard(s, AllZone.ComputerPlayer); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - list.add(c); - } - } - return list; - } - - public static CardList getHumanPlantAndPet(QuestData qd) - { - CardList list = new CardList(); + /** + *

    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(); + } - if (qd.getPetManager().shouldPetBeUsed()){ + /** + *

    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()){ + if (qd.getPetManager().shouldPlantBeUsed()) { list.add(qd.getPetManager().getPlant().getPetCard()); } - return list; - } - - public static CardList getHumanPlantAndPet(QuestData qd, Quest_Assignment qa) - { - CardList list = getHumanPlantAndPet(qd); - - if (qa!=null) - list.addAll(qa.getHuman()); - - return list; - } + return list; + } - - public static void setupQuest(Quest_Assignment qa) - { - QuestBoosterPack pack = new QuestBoosterPack(); - qa.clearCompy(); - - int id = qa.getId(); + /** + *

    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); - CardList cards = AllZone.CardFactory.getCards(); + if (qa != null) + list.addAll(qa.getHuman()); - if (id == 1) //White Dungeon - { - CardList humanList = new CardList(); - Card c = AllZone.CardFactory.getCard("Adventuring Gear", AllZone.HumanPlayer); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - - qa.setHuman(humanList); + return list; + } - for (int i=0;i<2;i++) - qa.addCompy("Savannah Lions"); + + /** + *

    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 - { - for (int i=0;i<3;i++) - qa.addCompy("Merfolk of the Pearl Trident"); - - 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<2;i++) - qa.addCompy("Ornithopter"); - 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.CardFactory.getCard("Trailblazer's Boots", AllZone.HumanPlayer); - - 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.HumanPlayer); - c.setOwner(AllZone.HumanPlayer); - - //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.CardFactory.getCard("Trusty Machete", AllZone.HumanPlayer); - - 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.CardFactory.getCard("Wall of Spears", AllZone.HumanPlayer); - - 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.HumanPlayer); - c.setOwner(AllZone.HumanPlayer); - - 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.CardFactory.getCard("Seal of Cleansing", AllZone.HumanPlayer); - - 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.HumanPlayer); - c.setOwner(AllZone.HumanPlayer); - - 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.CardFactory.getCard("Sensei's Divining Top", AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - c.setCurSetCode(c.getMostRecentSet()); - c.setImageFilename(CardUtil.buildFilename(c)); - - humanList.add(c); - } - qa.setHuman(humanList); - + } 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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.CardFactory.getCard("Strip Mine", AllZone.HumanPlayer); - - 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)); - } + 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)); + } + + } - 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.CardFactory.getCard(humanSetupCards[i], AllZone.HumanPlayer); - - 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 index 88f18df014f..36dd6fa76d4 100644 --- a/src/forge/quest/data/bazaar/QuestStallDefinition.java +++ b/src/forge/quest/data/bazaar/QuestStallDefinition.java @@ -1,11 +1,25 @@ 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; diff --git a/src/forge/quest/data/bazaar/QuestStallManager.java b/src/forge/quest/data/bazaar/QuestStallManager.java index a51ca208ad8..bd16cc64c07 100644 --- a/src/forge/quest/data/bazaar/QuestStallManager.java +++ b/src/forge/quest/data/bazaar/QuestStallManager.java @@ -4,47 +4,63 @@ import forge.AllZone; import java.util.*; +/** + *

    QuestStallManager class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestStallManager { - static Map stalls ; + /** Constant stalls */ + static Map stalls; + /** Constant items */ static Map> items; - public static void buildStalls(){ + /** + *

    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")); + "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")); + "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")); + "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")); + "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")); + "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")); + new QuestStallDefinition(PET_SHOP, + "Pet Shop", + "This large stall echoes with a multitude of animal noises.", + "FoxIconSmall.png")); } - public static List getStallNames(){ + /** + *

    getStallNames.

    + * + * @return a {@link java.util.List} object. + */ + public static List getStallNames() { List ret = new ArrayList(); ret.add(ALCHEMIST); ret.add(BANKER); @@ -55,19 +71,28 @@ public class QuestStallManager { return ret; } - public static QuestStallDefinition getStall(String stallName){ - if (stalls == null){ + /** + *

    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); } - public static void buildItems(){ + /** + *

    buildItems.

    + */ + public static void buildItems() { SortedSet itemSet = new TreeSet(); - itemSet.addAll(AllZone.QuestData.getInventory().getItems()); - itemSet.addAll(AllZone.QuestData.getPetManager().getPetsAndPlants()); + itemSet.addAll(AllZone.getQuestData().getInventory().getItems()); + itemSet.addAll(AllZone.getQuestData().getPetManager().getPetsAndPlants()); items = new HashMap>(); @@ -81,26 +106,38 @@ public class QuestStallManager { } + /** + *

    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){ + if (items == null) { buildItems(); } List ret = new ArrayList(); for (QuestStallPurchasable purchasable : items.get(stallName)) { - if (purchasable.isAvailableForPurchase()){ + 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 index 9cfe3ec5cb9..07afee21e64 100644 --- a/src/forge/quest/data/bazaar/QuestStallPurchasable.java +++ b/src/forge/quest/data/bazaar/QuestStallPurchasable.java @@ -2,32 +2,44 @@ 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{ +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 + * false if the item should not be displayed in store since, for example, prerequisites are not met */ public boolean isAvailableForPurchase(); @@ -37,6 +49,8 @@ public interface QuestStallPurchasable extends Comparable{ 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 index cd31d2dad13..be7f6e8b091 100644 --- a/src/forge/quest/data/item/QuestInventory.java +++ b/src/forge/quest/data/item/QuestInventory.java @@ -2,9 +2,18 @@ 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) { @@ -12,14 +21,31 @@ public class QuestInventory { } } + /** + *

    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) { @@ -28,11 +54,22 @@ public class QuestInventory { 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(); @@ -47,6 +84,11 @@ public class QuestInventory { } //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())) { @@ -57,10 +99,21 @@ public class QuestInventory { } + /** + *

    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 index cdb7eab08a3..5e85b5c0622 100644 --- a/src/forge/quest/data/item/QuestItemAbstract.java +++ b/src/forge/quest/data/item/QuestItemAbstract.java @@ -3,18 +3,37 @@ package forge.quest.data.item; import forge.AllZone; import forge.quest.data.bazaar.QuestStallPurchasable; -public abstract class QuestItemAbstract implements 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; @@ -23,18 +42,27 @@ public abstract class QuestItemAbstract implements QuestStallPurchasable{ /** * This is the name shared across all item levels e.g., "Estates" + * + * @return a {@link java.lang.String} object. */ - public final String getName(){ + 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(){ + public String getPurchaseName() { return name; } + /** + *

    getStallName.

    + * + * @return a {@link java.lang.String} object. + */ public String getStallName() { return shopName; } @@ -44,37 +72,78 @@ public abstract class QuestItemAbstract implements QuestStallPurchasable{ * This method will be invoked when an item is bought in a shop. */ public void onPurchase() { - int currentLevel = AllZone.QuestData.getInventory().getItemLevel(name); - AllZone.QuestData.getInventory().setItemLevel(name, currentLevel +1); + int currentLevel = AllZone.getQuestData().getInventory().getItemLevel(name); + AllZone.getQuestData().getInventory().setItemLevel(name, currentLevel + 1); } - public boolean isAvailableForPurchase(){ - return AllZone.QuestData.getInventory().getItemLevel(name) < maxLevel; + /** + *

    isAvailableForPurchase.

    + * + * @return a boolean. + */ + public boolean isAvailableForPurchase() { + return AllZone.getQuestData().getInventory().getItemLevel(name) < maxLevel; } - public int getLevel(){ + /** + *

    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; } - public boolean isLeveledItem(){ + /** + *

    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 index 3e084539b22..15d9568cace 100644 --- a/src/forge/quest/data/item/QuestItemElixir.java +++ b/src/forge/quest/data/item/QuestItemElixir.java @@ -5,37 +5,47 @@ import forge.quest.data.bazaar.QuestStallManager; /** * This item has special coding because of the + * + * @author Forge + * @version $Id: $ */ -public class QuestItemElixir extends QuestItemAbstract{ +public class QuestItemElixir extends QuestItemAbstract { - QuestItemElixir(){ + /** + *

    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.QuestData.getLife(); + 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){ + if (getLevel() < 5) { return 250; - } else if (getLevel() < 10){ + } else if (getLevel() < 10) { return 500; - } else{ + } else { return 750; } } + /** {@inheritDoc} */ @Override public void onPurchase() { - AllZone.QuestData.addLife(1); + AllZone.getQuestData().addLife(1); } } diff --git a/src/forge/quest/data/item/QuestItemEstates.java b/src/forge/quest/data/item/QuestItemEstates.java index 33f2b671f3b..1d2c3e43b4c 100644 --- a/src/forge/quest/data/item/QuestItemEstates.java +++ b/src/forge/quest/data/item/QuestItemEstates.java @@ -2,34 +2,44 @@ 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) { + } else if (getLevel() == 1) { return 750; - } - else { + } else { return 1000; } } - + } diff --git a/src/forge/quest/data/item/QuestItemLuckyCoin.java b/src/forge/quest/data/item/QuestItemLuckyCoin.java index 333877c24d5..d8bd2bed016 100644 --- a/src/forge/quest/data/item/QuestItemLuckyCoin.java +++ b/src/forge/quest/data/item/QuestItemLuckyCoin.java @@ -2,26 +2,38 @@ package forge.quest.data.item; import forge.quest.data.bazaar.QuestStallManager; -public class QuestItemLuckyCoin extends QuestItemAbstract{ - QuestItemLuckyCoin(){ +/** + *

    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.
    "+ + 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 index 263c4b2d87b..b783a43dfaa 100644 --- a/src/forge/quest/data/item/QuestItemMap.java +++ b/src/forge/quest/data/item/QuestItemMap.java @@ -2,27 +2,40 @@ package forge.quest.data.item; import forge.quest.data.bazaar.QuestStallManager; -public class QuestItemMap extends QuestItemAbstract{ - QuestItemMap(){ +/** + *

    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.
    "+ + 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 index 34cc7e46573..e9efe3717d4 100644 --- a/src/forge/quest/data/item/QuestItemSleight.java +++ b/src/forge/quest/data/item/QuestItemSleight.java @@ -2,29 +2,43 @@ package forge.quest.data.item; import forge.quest.data.bazaar.QuestStallManager; -public class QuestItemSleight extends QuestItemAbstract{ - QuestItemSleight(){ +/** + *

    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.
    "+ + 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 index 3c16e999a71..9fc00f33bfd 100644 --- a/src/forge/quest/data/item/QuestItemZeppelin.java +++ b/src/forge/quest/data/item/QuestItemZeppelin.java @@ -3,46 +3,70 @@ package forge.quest.data.item; import forge.AllZone; import forge.quest.data.bazaar.QuestStallManager; -public class QuestItemZeppelin extends QuestItemAbstract{ +/** + *

    QuestItemZeppelin class.

    + * + * @author Forge + * @version $Id: $ + */ +public class QuestItemZeppelin extends QuestItemAbstract { boolean zeppelinUsed = false; - QuestItemZeppelin(){ + /** + *

    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.
    "+ + 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.QuestData.getInventory().hasItem("Map"); + return super.isAvailableForPurchase() && AllZone.getQuestData().getInventory().hasItem("Map"); } + /** + *

    hasBeenUsed.

    + * + * @return a boolean. + */ public boolean hasBeenUsed() { return zeppelinUsed; } - public void setZeppelinUsed(boolean used){ + /** + *

    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 index 9777307fc3d..6b3b4cd2b97 100644 --- a/src/forge/quest/data/pet/QuestPetAbstract.java +++ b/src/forge/quest/data/pet/QuestPetAbstract.java @@ -5,104 +5,225 @@ import forge.Card; import forge.quest.data.bazaar.QuestStallManager; import forge.quest.data.bazaar.QuestStallPurchasable; -public abstract class QuestPetAbstract implements 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(); - public int getPrice(){ + + /** + *

    getPrice.

    + * + * @return a int. + */ + public int getPrice() { return getAllUpgradePrices()[level]; } + /** + *

    getAllUpgradeDescriptions.

    + * + * @return an array of {@link java.lang.String} objects. + */ public abstract String[] getAllUpgradeDescriptions(); - public String getUpgradeDescription(){ + + /** + *

    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(); - public String getImageName(){ + + /** + *

    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(); - public String getStats(){ + + /** + *

    getStats.

    + * + * @return a {@link java.lang.String} object. + */ + public String getStats() { return getAllStats()[level]; } - public String getUpgradedStats(){ - return getAllStats()[level+1]; + + /** + *

    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; } - public void incrementLevel(){ - if (level < maxLevel){ + /** + *

    incrementLevel.

    + */ + public void incrementLevel() { + if (level < maxLevel) { level++; } } - public int getMaxLevel(){ + /** + *

    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; } - public void setLevel(int level){ + /** + *

    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()+ + 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.QuestData.getPetManager().getPet(name); - if (pet == null){ + QuestPetAbstract pet = AllZone.getQuestData().getPetManager().getPet(name); + if (pet == null) { return true; } return pet.level < pet.getMaxLevel(); } + /** + *

    onPurchase.

    + */ public void onPurchase() { - AllZone.QuestData.getPetManager().addPetLevel(name); + AllZone.getQuestData().getPetManager().addPetLevel(name); } } diff --git a/src/forge/quest/data/pet/QuestPetBird.java b/src/forge/quest/data/pet/QuestPetBird.java index 6d660bd5391..7b4e73622b1 100644 --- a/src/forge/quest/data/pet/QuestPetBird.java +++ b/src/forge/quest/data/pet/QuestPetBird.java @@ -3,14 +3,21 @@ package forge.quest.data.pet; import forge.AllZone; import forge.Card; -public class QuestPetBird extends QuestPetAbstract{ +/** + *

    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.HumanPlayer); - petCard.setOwner(AllZone.HumanPlayer); + petCard.setController(AllZone.getHumanPlayer()); + petCard.setOwner(AllZone.getHumanPlayer()); petCard.addColor("W"); petCard.setToken(true); @@ -22,46 +29,44 @@ public class QuestPetBird extends QuestPetAbstract{ petCard.addIntrinsicKeyword("Flying"); - if (level == 1) - { - petCard.setImageName("W 0 1 Bird Pet"); + if (level == 1) { + petCard.setImageName("W 0 1 Bird Pet"); petCard.setBaseAttack(0); petCard.setBaseDefense(1); - } - else if (level == 2) - { + } else if (level == 2) { petCard.setImageName("W 1 1 Bird Pet"); petCard.setBaseAttack(1); petCard.setBaseDefense(1); - } - else if (level == 3) - { + } else if (level == 3) { petCard.setImageName("W 2 1 Bird Pet"); petCard.setBaseAttack(2); petCard.setBaseDefense(1); - } - else if (level == 4) - { + } 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[]{ @@ -72,15 +77,17 @@ public class QuestPetBird extends QuestPetAbstract{ "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"}; + "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[]{ @@ -89,6 +96,6 @@ public class QuestPetBird extends QuestPetAbstract{ "w_1_1_bird_pet_small.jpg", "w_2_1_bird_pet_small.jpg", "w_2_1_bird_pet_first_strike_small.jpg" - }; + }; } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/pet/QuestPetCrocodile.java b/src/forge/quest/data/pet/QuestPetCrocodile.java index 11e5bf7c885..cdedbad2a34 100644 --- a/src/forge/quest/data/pet/QuestPetCrocodile.java +++ b/src/forge/quest/data/pet/QuestPetCrocodile.java @@ -3,13 +3,20 @@ package forge.quest.data.pet; import forge.AllZone; import forge.Card; -public class QuestPetCrocodile extends QuestPetAbstract{ +/** + *

    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.HumanPlayer); - petCard.setOwner(AllZone.HumanPlayer); + petCard.setController(AllZone.getHumanPlayer()); + petCard.setOwner(AllZone.getHumanPlayer()); petCard.addColor("B"); petCard.setToken(true); @@ -18,47 +25,45 @@ public class QuestPetCrocodile extends QuestPetAbstract{ petCard.addType("Crocodile"); petCard.addType("Pet"); - if (level == 1) - { - petCard.setImageName("B 1 1 Crocodile Pet"); + if (level == 1) { + petCard.setImageName("B 1 1 Crocodile Pet"); petCard.setBaseAttack(1); petCard.setBaseDefense(1); - } - else if (level == 2) - { + } else if (level == 2) { petCard.setImageName("B 2 1 Crocodile Pet"); petCard.setBaseAttack(2); petCard.setBaseDefense(1); - } - else if (level == 3) - { + } else if (level == 3) { petCard.setImageName("B 3 1 Crocodile Pet"); petCard.setBaseAttack(3); petCard.setBaseDefense(1); - } - else if (level == 4) - { + } 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[]{ @@ -69,15 +74,17 @@ public class QuestPetCrocodile extends QuestPetAbstract{ "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"}; + "1/1, B", + "2/1, B", + "3/1, B", + "3/1, B, Swampwalking"}; } + /** {@inheritDoc} */ @Override public String[] getAllImageNames() { return new String[]{ @@ -86,6 +93,6 @@ public class QuestPetCrocodile extends QuestPetAbstract{ "b_2_1_crocodile_pet_small.jpg", "b_3_1_crocodile_pet_small.jpg", "b_3_1_crocodile_pet_swampwalk_small.jpg" - }; + }; } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/pet/QuestPetHound.java b/src/forge/quest/data/pet/QuestPetHound.java index ad51ad482e3..b5d9d430383 100644 --- a/src/forge/quest/data/pet/QuestPetHound.java +++ b/src/forge/quest/data/pet/QuestPetHound.java @@ -2,22 +2,32 @@ 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; -import forge.card.abilityFactory.*; -public class QuestPetHound extends QuestPetAbstract{ - public QuestPetHound(){ +/** + *

    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.HumanPlayer); - petCard.setOwner(AllZone.HumanPlayer); + petCard.setController(AllZone.getHumanPlayer()); + petCard.setOwner(AllZone.getHumanPlayer()); petCard.addColor("R"); petCard.setToken(true); @@ -26,51 +36,45 @@ public class QuestPetHound extends QuestPetAbstract{ petCard.addType("Hound"); petCard.addType("Pet"); - if (level == 1) - { - petCard.setImageName("R 1 1 Hound Pet"); + if (level == 1) { + petCard.setImageName("R 1 1 Hound Pet"); petCard.setBaseAttack(1); petCard.setBaseDefense(1); - } - else if (level == 2) - { + } 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) - { + } else if (level == 3) { petCard.setImageName("R 2 1 Hound Pet"); petCard.setBaseAttack(2); petCard.setBaseDefense(1); petCard.addIntrinsicKeyword("Haste"); - } - else if (level == 4) - { + } 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[]{ @@ -81,15 +85,17 @@ public class QuestPetHound extends QuestPetAbstract{ "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."}; + "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[]{ @@ -98,6 +104,6 @@ public class QuestPetHound extends QuestPetAbstract{ "r_1_1_hound_pet_haste_small.jpg", "r_2_1_hound_pet_small.jpg", "r_2_1_hound_pet_alone_small.jpg" - }; + }; } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/pet/QuestPetManager.java b/src/forge/quest/data/pet/QuestPetManager.java index ce971817566..3986e241ad4 100644 --- a/src/forge/quest/data/pet/QuestPetManager.java +++ b/src/forge/quest/data/pet/QuestPetManager.java @@ -2,13 +2,22 @@ package forge.quest.data.pet; import java.util.*; -public class QuestPetManager{ +/** + *

    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()) { @@ -16,52 +25,105 @@ public class QuestPetManager{ } } + /** + *

    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 { + } 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(); @@ -74,10 +136,15 @@ public class QuestPetManager{ } + /** + *

    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){ + if (pet.getValue().getLevel() > 0) { set.add(pet.getKey()); } } @@ -85,14 +152,24 @@ public class QuestPetManager{ } + /** + *

    getPetsAndPlants.

    + * + * @return a {@link java.util.Collection} object. + */ public Collection getPetsAndPlants() { - Set petsAndPlants = new HashSet(pets.values()); + 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())) { diff --git a/src/forge/quest/data/pet/QuestPetPlant.java b/src/forge/quest/data/pet/QuestPetPlant.java index f0013714d29..f47969ef849 100644 --- a/src/forge/quest/data/pet/QuestPetPlant.java +++ b/src/forge/quest/data/pet/QuestPetPlant.java @@ -1,20 +1,29 @@ package forge.quest.data.pet; -import forge.*; +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.HumanPlayer); - petCard.setOwner(AllZone.HumanPlayer); + petCard.setController(AllZone.getHumanPlayer()); + petCard.setOwner(AllZone.getHumanPlayer()); petCard.addColor("G"); petCard.setToken(true); @@ -22,50 +31,45 @@ public class QuestPetPlant extends QuestPetAbstract { 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) { + } else if (level == 2) { petCard.setImageName("G 0 2 Plant Wall"); petCard.setBaseAttack(0); petCard.setBaseDefense(2); - } - else if (level == 3) { + } else if (level == 3) { petCard.setImageName("G 0 3 Plant Wall"); petCard.setBaseAttack(0); petCard.setBaseDefense(3); - } - else if (level == 4) { + } 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.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) { + } 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; + Cost abCost = new Cost("T", petCard.getName(), true); + final SpellAbility ability = new Ability_Activated(petCard, abCost, null) { + private static final long serialVersionUID = 7546242087593613719L; - @Override + @Override public boolean canPlayAI() { - return AllZone.Phase.getPhase().equals(Constant.Phase.Main2); + return AllZone.getPhase().getPhase().equals(Constant.Phase.Main2); } @Override @@ -74,11 +78,11 @@ public class QuestPetPlant extends QuestPetAbstract { } }; petCard.addSpellAbility(ability); - ability.setDescription("tap: You gain 1 life."); + 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()); + 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."); } @@ -87,17 +91,22 @@ public class QuestPetPlant extends QuestPetAbstract { 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[]{ @@ -110,6 +119,7 @@ public class QuestPetPlant extends QuestPetAbstract { "You cannot train your plant any further"}; } + /** {@inheritDoc} */ @Override public String[] getAllStats() { return new String[]{"You do not own a plant", @@ -121,6 +131,7 @@ public class QuestPetPlant extends QuestPetAbstract { "1/4, G, Defender, Deathtouch, T: Gain 1 life"}; } + /** {@inheritDoc} */ @Override public String[] getAllImageNames() { return new String[]{ @@ -134,20 +145,23 @@ public class QuestPetPlant extends QuestPetAbstract { }; } + /** {@inheritDoc} */ @Override public String getStallName() { return QuestStallManager.NURSERY; } + /** {@inheritDoc} */ @Override public void onPurchase() { - AllZone.QuestData.getPetManager().addPlantLevel(); + AllZone.getQuestData().getPetManager().addPlantLevel(); } + /** {@inheritDoc} */ @Override public boolean isAvailableForPurchase() { - QuestPetPlant plant = (QuestPetPlant) AllZone.QuestData.getPetManager().getPlant(); + QuestPetPlant plant = (QuestPetPlant) AllZone.getQuestData().getPetManager().getPlant(); return plant == null || plant.getLevel() < plant.getMaxLevel(); } -} \ No newline at end of file +} diff --git a/src/forge/quest/data/pet/QuestPetWolf.java b/src/forge/quest/data/pet/QuestPetWolf.java index f33f0aeca48..743ef922bd4 100644 --- a/src/forge/quest/data/pet/QuestPetWolf.java +++ b/src/forge/quest/data/pet/QuestPetWolf.java @@ -3,14 +3,21 @@ package forge.quest.data.pet; import forge.AllZone; import forge.Card; -public class QuestPetWolf extends QuestPetAbstract{ +/** + *

    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.HumanPlayer); - petCard.setOwner(AllZone.HumanPlayer); + petCard.setController(AllZone.getHumanPlayer()); + petCard.setOwner(AllZone.getHumanPlayer()); petCard.addColor("G"); petCard.setToken(true); @@ -19,46 +26,44 @@ public class QuestPetWolf extends QuestPetAbstract{ petCard.addType("Wolf"); petCard.addType("Pet"); - if (level == 1) - { - petCard.setImageName("G 1 1 Wolf Pet"); + if (level == 1) { + petCard.setImageName("G 1 1 Wolf Pet"); petCard.setBaseAttack(1); petCard.setBaseDefense(1); - } - else if (level == 2) - { + } else if (level == 2) { petCard.setImageName("G 1 2 Wolf Pet"); petCard.setBaseAttack(1); petCard.setBaseDefense(2); - } - else if (level == 3) - { + } else if (level == 3) { petCard.setImageName("G 2 2 Wolf Pet"); petCard.setBaseAttack(2); petCard.setBaseDefense(2); - } - else if (level == 4) - { + } 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[]{ @@ -69,15 +74,17 @@ public class QuestPetWolf extends QuestPetAbstract{ "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"}; + "1/1, G", + "1/2, G", + "2/2, G", + "2/2, G, Flanking"}; } + /** {@inheritDoc} */ @Override public String[] getAllImageNames() { return new String[]{ @@ -86,6 +93,6 @@ public class QuestPetWolf extends QuestPetAbstract{ "g_1_2_wolf_pet_small.jpg", "g_2_2_wolf_pet_small.jpg", "g_2_2_wolf_pet_flanking_small.jpg" - }; + }; } -} \ No newline at end of file +} diff --git a/src/forge/quest/gui/QuestAbstractPanel.java b/src/forge/quest/gui/QuestAbstractPanel.java index 618931ac7f8..72c2373165e 100644 --- a/src/forge/quest/gui/QuestAbstractPanel.java +++ b/src/forge/quest/gui/QuestAbstractPanel.java @@ -2,14 +2,29 @@ package forge.quest.gui; import javax.swing.*; +/** + *

    Abstract QuestAbstractPanel class.

    + * + * @author Forge + * @version $Id: $ + */ public abstract class QuestAbstractPanel extends JPanel { - private static final long serialVersionUID = -6378675010346615367L; - - public QuestFrame mainFrame; + /** 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 index 63b6360e9e1..ac3a46f80e2 100644 --- a/src/forge/quest/gui/QuestFrame.java +++ b/src/forge/quest/gui/QuestFrame.java @@ -8,29 +8,40 @@ import forge.quest.gui.main.QuestMainPanel; import javax.swing.*; import javax.swing.border.EmptyBorder; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Dimension; -import java.awt.HeadlessException; +import java.awt.*; import java.util.HashMap; import java.util.Map; +/** + *

    QuestFrame class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestFrame extends JFrame { - private static final long serialVersionUID = -2832625381531838412L; - - JPanel visiblePanel; + /** 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)); + visiblePanel.setBorder(new EmptyBorder(2, 2, 2, 2)); questLayout = new CardLayout(); visiblePanel.setLayout(questLayout); @@ -43,7 +54,6 @@ public class QuestFrame extends JFrame { subPanelMap.put(BAZAAR_PANEL, newPanel); - this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(visiblePanel, BorderLayout.CENTER); this.setPreferredSize(new Dimension(1024, 768)); @@ -60,25 +70,37 @@ public class QuestFrame extends JFrame { } - - private void showPane(String paneName){ + /** + *

    showPane.

    + * + * @param paneName a {@link java.lang.String} object. + */ + private void showPane(String paneName) { subPanelMap.get(paneName).refreshState(); questLayout.show(visiblePanel, paneName); } - public void showMainPane(){ + /** + *

    showMainPane.

    + */ + public void showMainPane() { showPane(MAIN_PANEL); } - public void showBazaarPane(){ + /** + *

    showBazaarPane.

    + */ + public void showBazaarPane() { showPane(BAZAAR_PANEL); } - + /** + *

    returnToMainMenu.

    + */ public void returnToMainMenu() { - AllZone.QuestData.saveData(); - (new Gui_NewGame()).setVisible(true) ; + 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 index e74e640f587..0a2f573280a 100644 --- a/src/forge/quest/gui/bazaar/QuestBazaarItem.java +++ b/src/forge/quest/gui/bazaar/QuestBazaarItem.java @@ -1,9 +1,7 @@ - package forge.quest.gui.bazaar; import forge.AllZone; -import forge.gui.ForgeFontConstants; import forge.gui.GuiUtils; import forge.gui.MultiLineLabel; import forge.quest.data.bazaar.QuestStallPurchasable; @@ -17,60 +15,81 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +/** + *

    QuestBazaarItem class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestBazaarItem { QuestStallPurchasable item; - protected QuestBazaarItem(QuestStallPurchasable purchasable){ + + /** + *

    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(){ + 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){ - icon = GuiUtils.getEmptyIcon(40,40); + 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); } - ImageIcon resizedImage = GuiUtils.getResizedIcon(icon, 40, 40); - + // 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(ForgeFontConstants.SANS_SERIF, Font.BOLD, 14)); - - JLabel descriptionLabel = new MultiLineLabel("" + item.getPurchaseDescription()+ ""); - descriptionLabel.setFont(new Font(ForgeFontConstants.SANS_SERIF, Font.PLAIN, 12)); - + 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(ForgeFontConstants.SANS_SERIF, Font.PLAIN, 12)); - + 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.QuestData.subtractCredits(item.getPrice()); + AllZone.getQuestData().subtractCredits(item.getPrice()); purchaseItem(); - AllZone.QuestData.saveData(); + AllZone.getQuestData().saveData(); QuestBazaarPanel.refreshLastInstance(); } }); - - if(AllZone.QuestData.getCredits() < item.getPrice()) { + + if (AllZone.getQuestData().getCredits() < item.getPrice()) { purchaseButton.setEnabled(false); } - - JPanel itemPanel = new JPanel() { - private static final long serialVersionUID = -5182857296365949682L; - @Override + JPanel itemPanel = new JPanel() { + private static final long serialVersionUID = -5182857296365949682L; + + @Override public Dimension getPreferredSize() { Dimension realSize = super.getPreferredSize(); realSize.width = 100; @@ -79,30 +98,30 @@ public class QuestBazaarItem { }; 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; @@ -110,11 +129,11 @@ public class QuestBazaarItem { 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 index 78a22558659..9b0f47ff798 100644 --- a/src/forge/quest/gui/bazaar/QuestBazaarPanel.java +++ b/src/forge/quest/gui/bazaar/QuestBazaarPanel.java @@ -5,19 +5,24 @@ import forge.quest.gui.QuestAbstractPanel; import forge.quest.gui.QuestFrame; import javax.swing.*; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.Dimension; -import java.awt.GridLayout; +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 { - private static final long serialVersionUID = 1418913010051869222L; - + /** Constant serialVersionUID=1418913010051869222L */ + private static final long serialVersionUID = 1418913010051869222L; + + /** Constant stallList */ static List stallList = new ArrayList(); JPanel buttonPanel = new JPanel(new BorderLayout()); @@ -29,6 +34,11 @@ public class QuestBazaarPanel extends QuestAbstractPanel { 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()); @@ -39,26 +49,25 @@ public class QuestBazaarPanel extends QuestAbstractPanel { stallList.add(new QuestBazaarStall(QuestStallManager.getStall(stallName))); } - buttonPanelMain.setLayout(new GridLayout(stallList.size(),1)); - + buttonPanelMain.setLayout(new GridLayout(stallList.size(), 1)); + stallPanel.setLayout(stallLayout); List buttonList = new LinkedList(); - double maxWidth=0; - double maxHeight=0; + double maxWidth = 0; + double maxHeight = 0; - for(QuestBazaarStall stall:stallList){ + 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()) - { + if (QuestBazaarPanel.this.selectedStall == e.getSource()) { QuestBazaarPanel.this.selectedStall.setSelected(true); return; } - if (QuestBazaarPanel.this.selectedStall != null){ + if (QuestBazaarPanel.this.selectedStall != null) { QuestBazaarPanel.this.selectedStall.setSelected(false); } @@ -69,11 +78,11 @@ public class QuestBazaarPanel extends QuestAbstractPanel { Dimension preferredSize = stallButton.getPreferredSize(); - if (preferredSize.getWidth() > maxWidth){ + if (preferredSize.getWidth() > maxWidth) { maxWidth = preferredSize.getWidth(); } - if (preferredSize.getHeight() > maxHeight){ + if (preferredSize.getHeight() > maxHeight) { maxHeight = preferredSize.getHeight(); } @@ -86,9 +95,9 @@ public class QuestBazaarPanel extends QuestAbstractPanel { buttonList.get(0).setSelected(true); this.selectedStall = buttonList.get(0); - Dimension max = new Dimension((int)maxWidth, (int)maxHeight); + Dimension max = new Dimension((int) maxWidth, (int) maxHeight); - for (JToggleButton button : buttonList){ + for (JToggleButton button : buttonList) { button.setMinimumSize(max); } @@ -109,20 +118,25 @@ public class QuestBazaarPanel extends QuestAbstractPanel { } + /** + *

    showStall.

    + * + * @param source a {@link java.lang.String} object. + */ private void showStall(String source) { stallLayout.show(stallPanel, source); } /** * Slightly hackish, but should work. - * @return The last created instance of this object, used for updates after purchases. */ - static void refreshLastInstance(){ - for (QuestBazaarStall stall: stallList){ + 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 index 3abefe1a2bd..93e98b2a4db 100644 --- a/src/forge/quest/gui/bazaar/QuestBazaarStall.java +++ b/src/forge/quest/gui/bazaar/QuestBazaarStall.java @@ -13,7 +13,14 @@ 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; @@ -24,8 +31,16 @@ public class QuestBazaarStall extends JPanel implements NewConstants { private JLabel creditLabel = new JLabel(); private JPanel inventoryPanel = new JPanel(); - protected QuestData questData = AllZone.QuestData; + 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; @@ -36,6 +51,11 @@ public class QuestBazaarStall extends JPanel implements NewConstants { } + /** + *

    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); @@ -44,9 +64,12 @@ public class QuestBazaarStall extends JPanel implements NewConstants { initUI(); } + /** + *

    initUI.

    + */ private void initUI() { this.removeAll(); - + JLabel stallNameLabel; GridBagLayout layout = new GridBagLayout(); @@ -66,7 +89,7 @@ public class QuestBazaarStall extends JPanel implements NewConstants { fluffArea.setOpaque(false); fluffArea.setEditable(false); fluffArea.setFocusable(false); - fluffArea.setPreferredSize(new Dimension(fluffArea.getPreferredSize().width,40)); + fluffArea.setPreferredSize(new Dimension(fluffArea.getPreferredSize().width, 40)); GridBagConstraints constraints = new GridBagConstraints(0, 0, 1, @@ -94,7 +117,7 @@ public class QuestBazaarStall extends JPanel implements NewConstants { constraints.gridy = 3; constraints.anchor = GridBagConstraints.NORTHWEST; constraints.fill = GridBagConstraints.BOTH; - constraints.insets = new Insets(10,5,10,5); + constraints.insets = new Insets(10, 5, 10, 5); constraints.weighty = 1; constraints.weightx = GridBagConstraints.REMAINDER; @@ -102,13 +125,18 @@ public class QuestBazaarStall extends JPanel implements NewConstants { JScrollPane scrollPane = new JScrollPane(inventoryPanel); scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(new EmptyBorder(0,0,0,0)); + scrollPane.setBorder(new EmptyBorder(0, 0, 0, 0)); layout.setConstraints(scrollPane, constraints); this.add(scrollPane); - this.setBorder(new EmptyBorder(0,5,0,0)); + 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(); @@ -129,16 +157,14 @@ public class QuestBazaarStall extends JPanel implements NewConstants { JLabel purchaseLabel = new JLabel(); - if (stallItems.size() == 0){ + if (stallItems.size() == 0) { purchaseLabel.setText("The merchant does not have anything useful for sale"); inventoryPanel.add(purchaseLabel); innerConstraints.gridy++; - } + } else { - else{ - - innerConstraints.insets = new Insets(5,20,5,5); + innerConstraints.insets = new Insets(5, 20, 5, 5); for (QuestBazaarItem item : stallItems) { JPanel itemPanel = item.getItemPanel(); @@ -154,27 +180,45 @@ public class QuestBazaarStall extends JPanel implements NewConstants { inventoryPanel.add(fillLabel); } - protected java.util.List populateItems(){ + /** + *

    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; } - public void updateItems(){ + /** + *

    updateItems.

    + */ + public void updateItems() { SwingUtilities.invokeLater(new Runnable() { public void run() { populateInventory(populateItems()); diff --git a/src/forge/quest/gui/main/QuestBattle.java b/src/forge/quest/gui/main/QuestBattle.java index 57cd8af0ef8..2c67b22a4f5 100644 --- a/src/forge/quest/gui/main/QuestBattle.java +++ b/src/forge/quest/gui/main/QuestBattle.java @@ -9,10 +9,18 @@ import java.util.ArrayList; import java.util.List; import java.util.TreeMap; +/** + *

    QuestBattle class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestBattle extends QuestSelectablePanel { - private static final long serialVersionUID = 3112668476017792084L; + /** Constant serialVersionUID=3112668476017792084L */ + private static final long serialVersionUID = 3112668476017792084L; - static TreeMap nameDeckMap = new TreeMap(); + /** Constant nameDeckMap */ + static TreeMap nameDeckMap = new TreeMap(); String deckName; @@ -20,15 +28,22 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -36,7 +51,7 @@ public class QuestBattle extends QuestSelectablePanel { // 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"); @@ -58,11 +73,12 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -72,21 +88,22 @@ public class QuestBattle extends QuestSelectablePanel { 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 2", "medium", "Mono B Quest for the Nihil Stone deck with The Rack and Bottomless Pit"); 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"); @@ -102,13 +119,16 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -116,7 +136,7 @@ public class QuestBattle extends QuestSelectablePanel { // 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"); @@ -128,7 +148,7 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -140,12 +160,12 @@ public class QuestBattle extends QuestSelectablePanel { 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 3", "hard", "UR deck with Demigod of Revenge"); + 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"); @@ -164,12 +184,12 @@ public class QuestBattle extends QuestSelectablePanel { 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 2", "medium", "G Anti-Air deck"); -// addToDeckList("Green Arrow 3", "hard", "G Angry Large Monsters deck"); - addToDeckList("Green Arrow 2", "medium", "Mono G Archer deck"); + 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"); @@ -189,12 +209,12 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -211,12 +231,13 @@ public class QuestBattle extends QuestSelectablePanel { // 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, Knight of the Skyward Eye and Leonin Skyhunter"); - addToDeckList("King Arthur 2", "medium", "WG Knight deck with Wilt-Leaf Cavaliers and Knights with flanking"); - addToDeckList("King Arthur 3", "hard", "WG Knight deck with Sir Shandlar of Eberyn and Knights with first strike"); + 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"); @@ -227,27 +248,30 @@ public class QuestBattle extends QuestSelectablePanel { 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 3", "hard", "UBG Standard Constructed deck"); - + 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"); @@ -256,17 +280,20 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -278,10 +305,12 @@ public class QuestBattle extends QuestSelectablePanel { 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 (Boomerang) spells and Howling Mine"); + + 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", "WUB flying creature deck with Radiant, Archangel, Gravitational Shift and Moat"); + 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"); @@ -290,6 +319,7 @@ public class QuestBattle extends QuestSelectablePanel { // 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"); @@ -298,7 +328,7 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -308,9 +338,10 @@ public class QuestBattle extends QuestSelectablePanel { 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 Black Vise deck with Underworld Dreams, lots of card draw for both players"); + 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 Pestilence deck with Castle, Penumbra Kavu, Spider and Wurm but no pro black"); + 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"); @@ -338,11 +369,12 @@ public class QuestBattle extends QuestSelectablePanel { // 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"); @@ -355,12 +387,12 @@ public class QuestBattle extends QuestSelectablePanel { 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"); @@ -375,21 +407,32 @@ public class QuestBattle extends QuestSelectablePanel { 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)){ + if (nameDeckMap.containsKey(deckName)) { return nameDeckMap.get(deckName).description; - } - - else{ - System.out.println("Deck " +deckName+" does not have a description."); + } else { + System.out.println("Deck " + deckName + " does not have a description."); return ""; } } @@ -406,22 +449,26 @@ public class QuestBattle extends QuestSelectablePanel { } } - public static List getBattles(){ + /** + *

    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); + 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) { + } catch (NullPointerException e) { System.out.println("Missing Deck Description. Fix me:" + opponentName); opponentList.add(new QuestBattle(opponentName, "<>", @@ -434,12 +481,21 @@ public class QuestBattle extends QuestSelectablePanel { 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); + 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 index 72be38bdbc8..b7f3399c01b 100644 --- a/src/forge/quest/gui/main/QuestMainPanel.java +++ b/src/forge/quest/gui/main/QuestMainPanel.java @@ -3,7 +3,6 @@ package forge.quest.gui.main; import forge.*; import forge.deck.Deck; -import forge.gui.ForgeFontConstants; import forge.gui.GuiUtils; import forge.quest.data.QuestBattleManager; import forge.quest.data.QuestData; @@ -24,10 +23,17 @@ import java.util.*; import java.util.List; +/** + *

    QuestMainPanel class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestMainPanel extends QuestAbstractPanel { - private static final long serialVersionUID = 6142934729724012402L; + /** Constant serialVersionUID=6142934729724012402L */ + private static final long serialVersionUID = 6142934729724012402L; - private forge.quest.data.QuestData questData; + private forge.quest.data.QuestData questData; JLabel creditsLabel = new JLabel(); JLabel lifeLabel = new JLabel(); @@ -48,28 +54,40 @@ public class QuestMainPanel extends QuestAbstractPanel { boolean isShowingQuests = false; private JCheckBox devModeCheckBox = new JCheckBox("Developer Mode"); - private JCheckBox newGUICheckbox = new JCheckBox("Use new UI", true); + //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.QuestData; + questData = AllZone.getQuestData(); initUI(); } + /** + *

    initUI.

    + */ private void initUI() { refresh(); this.setLayout(new BorderLayout(5, 5)); @@ -87,14 +105,19 @@ public class QuestMainPanel extends QuestAbstractPanel { 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(ForgeFontConstants.DIALOG, Font.PLAIN, 28)); + titleLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 28)); titleLabel.setAlignmentX(LEFT_ALIGNMENT); northPanel.setLayout(new BoxLayout(northPanel, BoxLayout.Y_AXIS)); northPanel.add(titleLabel); @@ -119,6 +142,11 @@ public class QuestMainPanel extends QuestAbstractPanel { return northPanel; } + /** + *

    createSidePanel.

    + * + * @return a {@link javax.swing.JPanel} object. + */ private JPanel createSidePanel() { JPanel panel = new JPanel(); JPanel optionsPanel;//Create options checkbox list @@ -142,7 +170,7 @@ public class QuestMainPanel extends QuestAbstractPanel { } }); eastComponents.add(cardShopButton); - cardShopButton.setFont(new Font(ForgeFontConstants.SANS_SERIF, Font.PLAIN, 20)); + cardShopButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); JButton bazaarButton = null; if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { @@ -154,7 +182,7 @@ public class QuestMainPanel extends QuestAbstractPanel { } }); eastComponents.add(bazaarButton); - bazaarButton.setFont(new Font(ForgeFontConstants.SANS_SERIF, Font.PLAIN, 20)); + bazaarButton.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 20)); } @@ -164,7 +192,7 @@ public class QuestMainPanel extends QuestAbstractPanel { } }); eastComponents.add(questButton); - questButton.setFont(new Font(ForgeFontConstants.SANS_SERIF, Font.BOLD, 18)); + questButton.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 18)); questButton.setPreferredSize(new Dimension(0, 60)); @@ -174,7 +202,7 @@ public class QuestMainPanel extends QuestAbstractPanel { } }); - playButton.setFont(new Font(ForgeFontConstants.DIALOG, Font.BOLD, 28)); + playButton.setFont(new Font(Font.DIALOG, Font.BOLD, 28)); playButton.setPreferredSize(new Dimension(0, 100)); @@ -191,14 +219,14 @@ public class QuestMainPanel extends QuestAbstractPanel { if (questData.getMode().equals(forge.quest.data.QuestData.FANTASY)) { panel.add(this.lifeLabel); - this.lifeLabel.setFont(new Font(ForgeFontConstants.DIALOG, Font.BOLD, 14)); + 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(ForgeFontConstants.DIALOG, Font.BOLD, 14)); + this.creditsLabel.setFont(new Font(Font.DIALOG, Font.BOLD, 14)); GuiUtils.addGap(panel, 10); panel.add(cardShopButton); @@ -210,7 +238,7 @@ public class QuestMainPanel extends QuestAbstractPanel { panel.add(Box.createVerticalGlue()); panel.add(questButton); - this.nextQuestLabel.setFont(new Font(ForgeFontConstants.DIALOG, Font.PLAIN, 11)); + this.nextQuestLabel.setFont(new Font(Font.DIALOG, Font.PLAIN, 11)); panel.add(nextQuestLabel); GuiUtils.addGap(panel); @@ -220,12 +248,17 @@ public class QuestMainPanel extends QuestAbstractPanel { 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(this.newGUICheckbox); optionsPanel.add(Box.createVerticalStrut(5)); optionsPanel.add(this.smoothLandCheckBox); optionsPanel.add(Box.createVerticalStrut(5)); @@ -234,6 +267,11 @@ public class QuestMainPanel extends QuestAbstractPanel { return optionsPanel; } + /** + *

    createMatchSettingsPanel.

    + * + * @return a {@link javax.swing.JPanel} object. + */ private JPanel createMatchSettingsPanel() { JPanel matchPanel = new JPanel(); @@ -281,8 +319,7 @@ public class QuestMainPanel extends QuestAbstractPanel { public void actionPerformed(ActionEvent actionEvent) { if (petCheckBox.isSelected()) { questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem()); - } - else { + } else { questData.getPetManager().setSelectedPet(null); } @@ -296,15 +333,14 @@ public class QuestMainPanel extends QuestAbstractPanel { public void actionPerformed(ActionEvent actionEvent) { if (petCheckBox.isSelected()) { questData.getPetManager().setSelectedPet((String) petComboBox.getSelectedItem()); - } - else { + } else { questData.getPetManager().setSelectedPet(null); } } }); this.petComboBox.setMaximumSize( - new Dimension(Integer.MAX_VALUE, - (int) this.petCheckBox.getPreferredSize().getHeight())); + new Dimension(Integer.MAX_VALUE, + (int) this.petCheckBox.getPreferredSize().getHeight())); petPanel.add(this.petComboBox); this.plantBox.addActionListener(new ActionListener() { @@ -340,6 +376,11 @@ public class QuestMainPanel extends QuestAbstractPanel { 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)); @@ -359,6 +400,11 @@ public class QuestMainPanel extends QuestAbstractPanel { 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)); @@ -378,12 +424,15 @@ public class QuestMainPanel extends QuestAbstractPanel { return questPanel; } + /** + *

    refresh.

    + */ void refresh() { - AllZone.QuestData.saveData(); + AllZone.getQuestData().saveData(); devModeCheckBox.setSelected(Constant.Runtime.DevMode[0]); smoothLandCheckBox.setSelected(Constant.Runtime.Smooth[0]); - newGUICheckbox.setSelected(Gui_NewGame.preferences.newGui); + //newGUICheckbox.setSelected(Gui_NewGame.preferences.newGui); creditsLabel.setText(" " + questData.getCredits()); statsLabel.setText(questData.getWin() + " wins / " + questData.getLost() + " losses"); @@ -412,9 +461,7 @@ public class QuestMainPanel extends QuestAbstractPanel { for (String deckName : deckNames) { deckComboBox.addItem(deckName); } - } - - else { + } else { deckComboBox.addItem(NO_DECKS_AVAILABLE); deckComboBox.setEnabled(false); } @@ -437,9 +484,7 @@ public class QuestMainPanel extends QuestAbstractPanel { for (String aPetList : petList) { petComboBox.addItem(aPetList); } - } - - else { + } else { petComboBox.addItem("No pets available"); petComboBox.setEnabled(false); petCheckBox.setEnabled(false); @@ -448,8 +493,7 @@ public class QuestMainPanel extends QuestAbstractPanel { if (!questData.getPetManager().shouldPetBeUsed()) { petCheckBox.setSelected(false); petComboBox.setEnabled(false); - } - else { + } else { petCheckBox.setSelected(true); petComboBox.setSelectedItem(questData.getPetManager().getSelectedPet().getName()); } @@ -460,25 +504,23 @@ public class QuestMainPanel extends QuestAbstractPanel { QuestItemZeppelin zeppelin = (QuestItemZeppelin) questData.getInventory().getItem("Zeppelin"); - if (zeppelin.getLevel() > 0){ + if (zeppelin.getLevel() > 0) { zeppelinPanel.removeAll(); - zeppelinPanel.add(zeppelinButton,BorderLayout.CENTER); + zeppelinPanel.add(zeppelinButton, BorderLayout.CENTER); } - if (!zeppelin.hasBeenUsed()){ + if (!zeppelin.hasBeenUsed()) { zeppelinButton.setEnabled(true); - } - else{ + } else { zeppelinButton.setEnabled(false); } - + } if (nextQuestInWins() > 0) { nextQuestLabel.setText("Next Quest in " + nextQuestInWins() + " Wins."); - } - else { + } else { nextQuestLabel.setText("Next Quest available now."); } @@ -487,35 +529,43 @@ public class QuestMainPanel extends QuestAbstractPanel { refreshNextMatchPanel(); } + /** + *

    refreshNextMatchPanel.

    + */ private void refreshNextMatchPanel() { nextMatchPanel.removeAll(); nextMatchLayout = new CardLayout(); nextMatchPanel.setLayout(nextMatchLayout); nextMatchPanel.add(createBattlePanel(), BATTLES); nextMatchPanel.add(createQuestPanel(), QUESTS); - if (isShowingQuests){ + if (isShowingQuests) { this.nextMatchLayout.show(nextMatchPanel, QUESTS); - } - else{ + } else { this.nextMatchLayout.show(nextMatchPanel, BATTLES); } } + /** + *

    nextQuestInWins.

    + * + * @return a int. + */ private int nextQuestInWins() { - if (questData.getWin() < 25) { - return 25 - questData.getWin(); + // 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 = 6; + int mul = 5; if (questData.getInventory().hasItem("Zeppelin")) { + mul = 3; + } else if (questData.getInventory().hasItem("Map")) { mul = 4; } - else if (questData.getInventory().hasItem("Map")) { - mul = 5; - } int delta = (questsPlayed * mul) - questData.getWin(); @@ -523,13 +573,16 @@ public class QuestMainPanel extends QuestAbstractPanel { } + /** + *

    showDeckEditor.

    + */ void showDeckEditor() { Command exit = new Command() { private static final long serialVersionUID = -5110231879431074581L; public void execute() { //saves all deck data - AllZone.QuestData.saveData(); + AllZone.getQuestData().saveData(); new QuestFrame(); } @@ -542,17 +595,23 @@ public class QuestMainPanel extends QuestAbstractPanel { 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.QuestData.saveData(); + AllZone.getQuestData().saveData(); new QuestFrame(); } @@ -567,6 +626,9 @@ public class QuestMainPanel extends QuestAbstractPanel { }//card shop button + /** + *

    launchGame.

    + */ private void launchGame() { //TODO: This is a temporary hack to see if the image cache affects the heap usage significantly. @@ -587,49 +649,56 @@ public class QuestMainPanel extends QuestAbstractPanel { Constant.Runtime.DevMode[0] = devModeCheckBox.isSelected(); //DO NOT CHANGE THIS ORDER, GuiDisplay needs to be created before cards are added - if (newGUICheckbox.isSelected()) { - AllZone.Display = new GuiDisplay4(); - } - else { - AllZone.Display = new GuiDisplay3(); - } + //if (newGUICheckbox.isSelected()) { + AllZone.setDisplay(new GuiDisplay4()); + //} else { + // AllZone.setDisplay(new GuiDisplay3()); + //} - Gui_NewGame.preferences.newGui = newGUICheckbox.isSelected(); + //Gui_NewGame.preferences.newGui = newGUICheckbox.isSelected(); Constant.Runtime.Smooth[0] = smoothLandCheckBox.isSelected(); if (isShowingQuests) { setupQuest(humanDeck); - } - - else { + } else { setupBattle(humanDeck); } - AllZone.QuestData.saveData(); - - AllZone.Display.setVisible(true); + 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.GameAction.newGame(humanDeck, computer, forge.quest.data.QuestUtil.getHumanPlantAndPet(questData), + 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.QuestAssignment = selectedQuest; + AllZone.setQuestAssignment(selectedQuest); int extraLife = 0; @@ -637,33 +706,38 @@ public class QuestMainPanel extends QuestAbstractPanel { extraLife = 3; } - AllZone.GameAction.newGame(humanDeck, computerDeck, + 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 { + } 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 { + } else { isShowingQuests = true; questButton.setText("Battles"); } @@ -700,15 +774,26 @@ public class QuestMainPanel extends QuestAbstractPanel { } + /** + *

    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 index e153b1b86be..fad162655b9 100644 --- a/src/forge/quest/gui/main/QuestQuest.java +++ b/src/forge/quest/gui/main/QuestQuest.java @@ -12,21 +12,31 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +/** + *

    QuestQuest class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestQuest extends QuestSelectablePanel { - private static final long serialVersionUID = -162817410327650160L; - - Quest_Assignment assignment; + /** 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()){ + if (assignment.isRepeatable()) { repeatabilityLabel = new JLabel("This quest is repeatable"); - } - - else{ + } else { repeatabilityLabel = new JLabel("This quest is not repeatable"); } @@ -34,6 +44,11 @@ public class QuestQuest extends QuestSelectablePanel { this.centerPanel.add(repeatabilityLabel); } + /** + *

    getQuests.

    + * + * @return a {@link java.util.List} object. + */ public static List getQuests() { List quests = new ArrayList(); @@ -45,19 +60,23 @@ public class QuestQuest extends QuestSelectablePanel { return quests; } + /** + *

    readQuests.

    + * + * @return a {@link java.util.List} object. + */ private static List readQuests() { - forge.quest.data.QuestData questData = AllZone.QuestData; + 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()); + List availableQuests = read.getQuestsByIds(questData.getAvailableQuests()); questsToDisplay = availableQuests; - } - else { + } else { List allAvailableQuests = read.getQuests(); List availableInts = new ArrayList(); @@ -85,6 +104,11 @@ public class QuestQuest extends QuestSelectablePanel { 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 index c5dc2271d5e..e7107702656 100644 --- a/src/forge/quest/gui/main/QuestSelectablePanel.java +++ b/src/forge/quest/gui/main/QuestSelectablePanel.java @@ -6,14 +6,19 @@ import javax.swing.*; import javax.swing.border.CompoundBorder; import javax.swing.border.EmptyBorder; import javax.swing.border.LineBorder; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Dimension; +import java.awt.*; +/** + *

    QuestSelectablePanel class.

    + * + * @author Forge + * @version $Id: $ + */ public class QuestSelectablePanel extends JPanel { - private static final long serialVersionUID = -1502285997894190742L; - - protected Color backgroundColor; + /** Constant serialVersionUID=-1502285997894190742L */ + private static final long serialVersionUID = -1502285997894190742L; + + protected Color backgroundColor; private boolean selected; ImageIcon icon; @@ -22,6 +27,14 @@ public class QuestSelectablePanel extends JPanel { 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(); @@ -30,16 +43,15 @@ public class QuestSelectablePanel extends JPanel { this.description = description; this.icon = icon; - this.setLayout(new BorderLayout(5,5)); + 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)); + 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)); @@ -52,7 +64,7 @@ public class QuestSelectablePanel extends JPanel { centerPanel.setOpaque(false); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); - this.add(centerPanel,BorderLayout.CENTER); + this.add(centerPanel, BorderLayout.CENTER); JPanel centerTopPanel = new JPanel(); centerTopPanel.setOpaque(false); @@ -78,24 +90,34 @@ public class QuestSelectablePanel extends JPanel { 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))); + this.setBorder(new CompoundBorder(new LineBorder(Color.BLACK), new EmptyBorder(5, 5, 5, 5))); } + /** + *

    isSelected.

    + * + * @return a boolean. + */ public boolean isSelected() { return selected; } - public void setSelected(boolean selected){ - if(selected){ + /** + *

    Setter for the field selected.

    + * + * @param selected a boolean. + */ + public void setSelected(boolean selected) { + if (selected) { this.setBackground(backgroundColor.darker()); - } - else{ + } else { this.setBackground(backgroundColor); } this.selected = selected; } + /** {@inheritDoc} */ @Override public String getName() { return name; diff --git a/src/org/jdesktop/beans/AbstractBean.java b/src/org/jdesktop/beans/AbstractBean.java deleted file mode 100644 index 8f5beb8a1d9..00000000000 --- a/src/org/jdesktop/beans/AbstractBean.java +++ /dev/null @@ -1,501 +0,0 @@ -/* - * $Id$ - * - * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package org.jdesktop.beans; - -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.PropertyVetoException; -import java.beans.VetoableChangeListener; -import java.beans.VetoableChangeSupport; - -/** - *

    - * A convenience class from which to extend all non-visual AbstractBeans. It - * manages the PropertyChange notification system, making it relatively trivial - * to add support for property change events in getters/setters. - *

    - * - *

    - * A non-visual java bean is a Java class that conforms to the AbstractBean - * patterns to allow visual manipulation of the bean's properties and event - * handlers at design-time. - *

    - * - *

    - * Here is a simple example bean that contains one property, foo, and the proper - * pattern for implementing property change notification: - * - *

    
    - * public class ABean extends AbstractBean {
    - *     private String foo;
    - * 
    - *     public void setFoo(String newFoo) {
    - *         String old = getFoo();
    - *         this.foo = newFoo;
    - *         firePropertyChange("foo", old, getFoo());
    - *     }
    - * 
    - *     public String getFoo() {
    - *         return foo;
    - *     }
    - * }
    - * 
    - * - *

    - * - *

    - * You will notice that "getFoo()" is used in the setFoo method rather than - * accessing "foo" directly for the gets. This is done intentionally so that if - * a subclass overrides getFoo() to return, for instance, a constant value the - * property change notification system will continue to work properly. - *

    - * - *

    - * The firePropertyChange method takes into account the old value and the new - * value. Only if the two differ will it fire a property change event. So you - * can be assured from the above code fragment that a property change event will - * only occur if old is indeed different from getFoo() - *

    - * - *

    - * AbstractBean also supports vetoable - * {@link PropertyChangeEvent} events. These events are similar to - * PropertyChange events, except a special exception can be used - * to veto changing the property. For example, perhaps the property is changing - * from "fred" to "red", but a listener deems that "red" is unexceptable. In - * this case, the listener can fire a veto exception and the property must - * remain "fred". For example: - * - *

    
    - *  public class ABean extends AbstractBean {
    - *    private String foo;
    - *    
    - *    public void setFoo(String newFoo) throws PropertyVetoException {
    - *      String old = getFoo();
    - *      this.foo = newFoo;
    - *      fireVetoableChange("foo", old, getFoo());
    - *    }
    - *    public String getFoo() {
    - *      return foo;
    - *    }
    - *  }
    - * 
    - *  public class Tester {
    - *    public static void main(String... args) {
    - *      try {
    - *        ABean a = new ABean();
    - *        a.setFoo("fred");
    - *        a.addVetoableChangeListener(new VetoableChangeListener() {
    - *          public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {
    - *            if ("red".equals(evt.getNewValue()) {
    - *              throw new PropertyVetoException("Cannot be red!", evt);
    - *            }
    - *          }
    - *        }
    - *        a.setFoo("red");
    - *      } catch (Exception e) {
    - *        e.printStackTrace(); // this will be executed
    - *      }
    - *    }
    - *  }
    - * 
    - * - *

    - *

    - * {@code AbstractBean} is not {@link java.io.Serializable}. Special care must - * be taken when creating {@code Serializable} subclasses, as the - * {@code Serializable} listeners will not be saved. Subclasses will need to - * manually save the serializable listeners. The {@link AbstractSerializableBean} - * is {@code Serializable} and already handles the listeners correctly. If - * possible, it is recommended that {@code Serializable} beans should extend - * {@code AbstractSerializableBean}. If it is not possible, the - * {@code AbstractSerializableBean} bean implementation provides details on - * how to correctly serialize an {@code AbstractBean} subclass. - *

    - * - * @see AbstractSerializableBean - * @status REVIEWED - * @author rbair - */ -public abstract class AbstractBean { - /** - * Helper class that manages all the property change notification machinery. - * PropertyChangeSupport cannot be extended directly because it requires - * a bean in the constructor, and the "this" argument is not valid until - * after super construction. Hence, delegation instead of extension - */ - private transient PropertyChangeSupport pcs; - - /** - * Helper class that manages all the veto property change notification machinery. - */ - private transient VetoableChangeSupport vcs; - - /** Creates a new instance of AbstractBean */ - protected AbstractBean() { - pcs = new PropertyChangeSupport(this); - vcs = new VetoableChangeSupport(this); - } - - /** - * Creates a new instance of AbstractBean, using the supplied PropertyChangeSupport and - * VetoableChangeSupport delegates. Neither of these may be null. - */ - protected AbstractBean(PropertyChangeSupport pcs, VetoableChangeSupport vcs) { - if (pcs == null) { - throw new NullPointerException("PropertyChangeSupport must not be null"); - } - if (vcs == null) { - throw new NullPointerException("VetoableChangeSupport must not be null"); - } - - this.pcs = pcs; - this.vcs = vcs; - } - - /** - * Add a PropertyChangeListener to the listener list. - * The listener is registered for all properties. - * The same listener object may be added more than once, and will be called - * as many times as it is added. - * If listener is null, no exception is thrown and no action - * is taken. - * - * @param listener The PropertyChangeListener to be added - */ - public final void addPropertyChangeListener(PropertyChangeListener listener) { - pcs.addPropertyChangeListener(listener); - } - - /** - * Remove a PropertyChangeListener from the listener list. - * This removes a PropertyChangeListener that was registered - * for all properties. - * If listener was added more than once to the same event - * source, it will be notified one less time after being removed. - * If listener is null, or was never added, no exception is - * thrown and no action is taken. - * - * @param listener The PropertyChangeListener to be removed - */ - public final void removePropertyChangeListener(PropertyChangeListener listener) { - pcs.removePropertyChangeListener(listener); - } - - /** - * Returns an array of all the listeners that were added to the - * PropertyChangeSupport object with addPropertyChangeListener(). - *

    - * If some listeners have been added with a named property, then - * the returned array will be a mixture of PropertyChangeListeners - * and PropertyChangeListenerProxys. If the calling - * method is interested in distinguishing the listeners then it must - * test each element to see if it's a - * PropertyChangeListenerProxy, perform the cast, and examine - * the parameter. - * - *

    -     * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners();
    -     * for (int i = 0; i < listeners.length; i++) {
    -     *     if (listeners[i] instanceof PropertyChangeListenerProxy) {
    -     *     PropertyChangeListenerProxy proxy = 
    -     *                    (PropertyChangeListenerProxy)listeners[i];
    -     *     if (proxy.getPropertyName().equals("foo")) {
    -     *       // proxy is a PropertyChangeListener which was associated
    -     *       // with the property named "foo"
    -     *     }
    -     *   }
    -     * }
    -     *
    - * - * @see java.beans.PropertyChangeListenerProxy - * @return all of the PropertyChangeListeners added or an - * empty array if no listeners have been added - */ - public final PropertyChangeListener[] getPropertyChangeListeners() { - return pcs.getPropertyChangeListeners(); - } - - /** - * Add a PropertyChangeListener for a specific property. The listener - * will be invoked only when a call on firePropertyChange names that - * specific property. - * The same listener object may be added more than once. For each - * property, the listener will be invoked the number of times it was added - * for that property. - * If propertyName or listener is null, no - * exception is thrown and no action is taken. - * - * @param propertyName The name of the property to listen on. - * @param listener The PropertyChangeListener to be added - */ - public final void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.addPropertyChangeListener(propertyName, listener); - } - - /** - * Remove a PropertyChangeListener for a specific property. - * If listener was added more than once to the same event - * source for the specified property, it will be notified one less time - * after being removed. - * If propertyName is null, no exception is thrown and no - * action is taken. - * If listener is null, or was never added for the specified - * property, no exception is thrown and no action is taken. - * - * @param propertyName The name of the property that was listened on. - * @param listener The PropertyChangeListener to be removed - */ - public final void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) { - pcs.removePropertyChangeListener(propertyName, listener); - } - - /** - * Returns an array of all the listeners which have been associated - * with the named property. - * - * @param propertyName The name of the property being listened to - * @return all of the PropertyChangeListeners associated with - * the named property. If no such listeners have been added, - * or if propertyName is null, an empty array is - * returned. - */ - public final PropertyChangeListener[] getPropertyChangeListeners(String propertyName) { - return pcs.getPropertyChangeListeners(propertyName); - } - - /** - * Report a bound property update to any registered listeners. - * No event is fired if old and new are equal and non-null. - * - *

    - * This is merely a convenience wrapper around the more general - * firePropertyChange method that takes {@code - * PropertyChangeEvent} value. - * - * @param propertyName The programmatic name of the property - * that was changed. - * @param oldValue The old value of the property. - * @param newValue The new value of the property. - */ - protected final void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - pcs.firePropertyChange(propertyName, oldValue, newValue); - } - - /** - * Fire an existing PropertyChangeEvent to any registered listeners. - * No event is fired if the given event's old and new values are - * equal and non-null. - * @param evt The PropertyChangeEvent object. - */ - protected final void firePropertyChange(PropertyChangeEvent evt) { - pcs.firePropertyChange(evt); - } - - - /** - * Report a bound indexed property update to any registered - * listeners. - *

    - * No event is fired if old and new values are equal - * and non-null. - * - *

    - * This is merely a convenience wrapper around the more general - * firePropertyChange method that takes {@code PropertyChangeEvent} value. - * - * @param propertyName The programmatic name of the property that - * was changed. - * @param index index of the property element that was changed. - * @param oldValue The old value of the property. - * @param newValue The new value of the property. - */ - protected final void fireIndexedPropertyChange(String propertyName, int index, - Object oldValue, Object newValue) { - pcs.fireIndexedPropertyChange(propertyName, index, oldValue, newValue); - } - - /** - * Check if there are any listeners for a specific property, including - * those registered on all properties. If propertyName - * is null, only check for listeners registered on all properties. - * - * @param propertyName the property name. - * @return true if there are one or more listeners for the given property - */ - protected final boolean hasPropertyChangeListeners(String propertyName) { - return pcs.hasListeners(propertyName); - } - - /** - * Check if there are any listeners for a specific property, including - * those registered on all properties. If propertyName - * is null, only check for listeners registered on all properties. - * - * @param propertyName the property name. - * @return true if there are one or more listeners for the given property - */ - protected final boolean hasVetoableChangeListeners(String propertyName) { - return vcs.hasListeners(propertyName); - } - - /** - * Add a VetoableListener to the listener list. - * The listener is registered for all properties. - * The same listener object may be added more than once, and will be called - * as many times as it is added. - * If listener is null, no exception is thrown and no action - * is taken. - * - * @param listener The VetoableChangeListener to be added - */ - - public final void addVetoableChangeListener(VetoableChangeListener listener) { - vcs.addVetoableChangeListener(listener); - } - - /** - * Remove a VetoableChangeListener from the listener list. - * This removes a VetoableChangeListener that was registered - * for all properties. - * If listener was added more than once to the same event - * source, it will be notified one less time after being removed. - * If listener is null, or was never added, no exception is - * thrown and no action is taken. - * - * @param listener The VetoableChangeListener to be removed - */ - public final void removeVetoableChangeListener(VetoableChangeListener listener) { - vcs.removeVetoableChangeListener(listener); - } - - /** - * Returns the list of VetoableChangeListeners. If named vetoable change listeners - * were added, then VetoableChangeListenerProxy wrappers will returned - *

    - * @return List of VetoableChangeListeners and VetoableChangeListenerProxys - * if named property change listeners were added. - */ - public final VetoableChangeListener[] getVetoableChangeListeners(){ - return vcs.getVetoableChangeListeners(); - } - - /** - * Add a VetoableChangeListener for a specific property. The listener - * will be invoked only when a call on fireVetoableChange names that - * specific property. - * The same listener object may be added more than once. For each - * property, the listener will be invoked the number of times it was added - * for that property. - * If propertyName or listener is null, no - * exception is thrown and no action is taken. - * - * @param propertyName The name of the property to listen on. - * @param listener The VetoableChangeListener to be added - */ - - public final void addVetoableChangeListener(String propertyName, - VetoableChangeListener listener) { - vcs.addVetoableChangeListener(propertyName, listener); - } - - /** - * Remove a VetoableChangeListener for a specific property. - * If listener was added more than once to the same event - * source for the specified property, it will be notified one less time - * after being removed. - * If propertyName is null, no exception is thrown and no - * action is taken. - * If listener is null, or was never added for the specified - * property, no exception is thrown and no action is taken. - * - * @param propertyName The name of the property that was listened on. - * @param listener The VetoableChangeListener to be removed - */ - - public final void removeVetoableChangeListener(String propertyName, - VetoableChangeListener listener) { - vcs.removeVetoableChangeListener(propertyName, listener); - } - - /** - * Returns an array of all the listeners which have been associated - * with the named property. - * - * @param propertyName The name of the property being listened to - * @return all the VetoableChangeListeners associated with - * the named property. If no such listeners have been added, - * or if propertyName is null, an empty array is - * returned. - */ - public final VetoableChangeListener[] getVetoableChangeListeners(String propertyName) { - return vcs.getVetoableChangeListeners(propertyName); - } - - /** - * Report a vetoable property update to any registered listeners. If - * anyone vetos the change, then fire a new event reverting everyone to - * the old value and then rethrow the PropertyVetoException. - *

    - * No event is fired if old and new are equal and non-null. - * - * @param propertyName The programmatic name of the property - * that is about to change.. - * @param oldValue The old value of the property. - * @param newValue The new value of the property. - * @exception PropertyVetoException if the recipient wishes the property - * change to be rolled back. - */ - protected final void fireVetoableChange(String propertyName, - Object oldValue, Object newValue) - throws PropertyVetoException { - vcs.fireVetoableChange(propertyName, oldValue, newValue); - } - - /** - * Fire a vetoable property update to any registered listeners. If - * anyone vetos the change, then fire a new event reverting everyone to - * the old value and then rethrow the PropertyVetoException. - *

    - * No event is fired if old and new are equal and non-null. - * - * @param evt The PropertyChangeEvent to be fired. - * @exception PropertyVetoException if the recipient wishes the property - * change to be rolled back. - */ - protected final void fireVetoableChange(PropertyChangeEvent evt) - throws PropertyVetoException { - vcs.fireVetoableChange(evt); - } - - /** - * {@inheritDoc} - */ - @Override - public Object clone() throws CloneNotSupportedException { - AbstractBean result = (AbstractBean) super.clone(); - result.pcs = new PropertyChangeSupport(result); - result.vcs = new VetoableChangeSupport(result); - return result; - } -} \ No newline at end of file diff --git a/src/org/jdesktop/swingworker/AccumulativeRunnable.java b/src/org/jdesktop/swingworker/AccumulativeRunnable.java deleted file mode 100644 index d7e7648a5a8..00000000000 --- a/src/org/jdesktop/swingworker/AccumulativeRunnable.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * $Id: AccumulativeRunnable.java,v 1.2 2006/09/28 20:20:28 idk Exp $ - * - * Copyright © 2005 Sun Microsystems, Inc. All rights - * reserved. Use is subject to license terms. - */ - -package org.jdesktop.swingworker; - -import java.util.*; -import javax.swing.SwingUtilities; - -/** - * An abstract class to be used in the cases where we need {@code Runnable} - * to perform some actions on an appendable set of data. - * The set of data might be appended after the {@code Runnable} is - * sent for the execution. Usually such {@code Runnables} are sent to - * the EDT. - * - *

    - * Usage example: - * - *

    - * Say we want to implement JLabel.setText(String text) which sends - * {@code text} string to the JLabel.setTextImpl(String text) on the EDT. - * In the event JLabel.setText is called rapidly many times off the EDT - * we will get many updates on the EDT but only the last one is important. - * (Every next updates overrides the previous one.) - * We might want to implement this {@code setText} in a way that only - * the last update is delivered. - *

    - * Here is how one can do this using {@code AccumulativeRunnable}: - *

    - * AccumulativeRunnable doSetTextImpl = 
    - * new  AccumulativeRunnable() {
    - *     @Override 
    - *     protected void run(List<String> args) {
    - *         //set to the last string being passed
    - *         setTextImpl(args.get(args.size() - 1);
    - *     }
    - * }
    - * void setText(String text) {
    - *     //add text and send for the execution if needed.
    - *     doSetTextImpl.add(text);
    - * }
    - * 
    - * - *

    - * Say we want want to implement addDirtyRegion(Rectangle rect) - * which sends this region to the - * handleDirtyRegions(List regions) on the EDT. - * addDirtyRegions better be accumulated before handling on the EDT. - * - *

    - * Here is how it can be implemented using AccumulativeRunnable: - *

    - * AccumulativeRunnable doHandleDirtyRegions = 
    - *     new AccumulativeRunnable() {
    - *         @Override 
    - *         protected void run(List<Rectangle> args) {
    - *             handleDirtyRegions(args);
    - *         }
    - *     };
    - *  void addDirtyRegion(Rectangle rect) {
    - *      doHandleDirtyRegions.add(rect);
    - *  }
    - * 
    - * - * @author Igor Kushnirskiy - * @version $Revision: 1.2 $ $Date: 2006/09/28 20:20:28 $ - * - * @param the type this {@code Runnable} accumulates - * - */ -abstract class AccumulativeRunnable implements Runnable { - private List arguments = null; - - /** - * Equivalent to {@code Runnable.run} method with the - * accumulated arguments to process. - * - * @param args accumulated arguments to process. - */ - protected abstract void run(List args); - - /** - * {@inheritDoc} - * - *

    - * This implementation calls {@code run(List args)} method - * with the list of accumulated arguments. - */ - public final void run() { - run(flush()); - } - - /** - * appends arguments and sends this {@code Runnable} for the - * execution if needed. - *

    - * This implementation uses {@see #submit} to send this - * {@code Runnable} for execution. - * @param args the arguments to accumulate - */ - public final synchronized void add(T... args) { - boolean isSubmitted = true; - if (arguments == null) { - isSubmitted = false; - arguments = new ArrayList(); - } - Collections.addAll(arguments, args); - if (!isSubmitted) { - submit(); - } - } - - /** - * Sends this {@code Runnable} for the execution - * - *

    - * This method is to be executed only from {@code add} method. - * - *

    - * This implementation uses {@code SwingWorker.invokeLater}. - */ - protected void submit() { - SwingUtilities.invokeLater(this); - } - - /** - * Returns accumulated arguments and flashes the arguments storage. - * - * @return accumulated arguments - */ - private final synchronized List flush() { - List list = arguments; - arguments = null; - return list; - } -} - diff --git a/src/org/jdesktop/swingworker/SwingPropertyChangeSupport.java b/src/org/jdesktop/swingworker/SwingPropertyChangeSupport.java deleted file mode 100644 index 4762cea70de..00000000000 --- a/src/org/jdesktop/swingworker/SwingPropertyChangeSupport.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * $Id: SwingPropertyChangeSupport.java,v 1.1 2005/06/18 21:27:14 idk Exp $ - * - * Copyright © 2005 Sun Microsystems, Inc. All rights - * reserved. Use is subject to license terms. - */ - -package org.jdesktop.swingworker; - -import java.beans.PropertyChangeSupport; -import java.beans.PropertyChangeEvent; - -import javax.swing.SwingUtilities; - -/** - * This subclass of {@code java.beans.PropertyChangeSupport} is almost - * identical in functionality. The only difference is if constructed with - * {@code SwingPropertyChangeSupport(sourceBean, true)} it ensures - * listeners are only ever notified on the Event Dispatch Thread. - * - * @author Igor Kushnirskiy - * @version $Revision: 1.1 $ $Date: 2005/06/18 21:27:14 $ - */ - -public final class SwingPropertyChangeSupport extends PropertyChangeSupport { - - /** - * Constructs a SwingPropertyChangeSupport object. - * - * @param sourceBean The bean to be given as the source for any - * events. - * @throws NullPointerException if {@code sourceBean} is - * {@code null} - */ - public SwingPropertyChangeSupport(Object sourceBean) { - this(sourceBean, false); - } - - /** - * Constructs a SwingPropertyChangeSupport object. - * - * @param sourceBean the bean to be given as the source for any events - * @param notifyOnEDT whether to notify listeners on the Event - * Dispatch Thread only - * - * @throws NullPointerException if {@code sourceBean} is - * {@code null} - * @since 1.6 - */ - public SwingPropertyChangeSupport(Object sourceBean, boolean notifyOnEDT) { - super(sourceBean); - this.notifyOnEDT = notifyOnEDT; - } - - /** - * {@inheritDoc} - * - *

    - * If {@see #isNotifyOnEDT} is {@code true} and called off the - * Event Dispatch Thread this implementation uses - * {@code SwingUtilities.invokeLater} to send out the notification - * on the Event Dispatch Thread. This ensures listeners - * are only ever notified on the Event Dispatch Thread. - * - * @throws NullPointerException if {@code evt} is - * {@code null} - * @since 1.6 - */ - public void firePropertyChange(final PropertyChangeEvent evt) { - if (evt == null) { - throw new NullPointerException(); - } - if (! isNotifyOnEDT() - || SwingUtilities.isEventDispatchThread()) { - super.firePropertyChange(evt); - } else { - SwingUtilities.invokeLater( - new Runnable() { - public void run() { - firePropertyChange(evt); - } - }); - } - } - - /** - * Returns {@code notifyOnEDT} property. - * - * @return {@code notifyOnEDT} property - * @see #SwingPropertyChangeSupport(Object sourceBean, boolean notifyOnEDT) - * @since 1.6 - */ - public final boolean isNotifyOnEDT() { - return notifyOnEDT; - } - - // Serialization version ID - static final long serialVersionUID = 7162625831330845068L; - - /** - * whether to notify listeners on EDT - * - * @serial - * @since 1.6 - */ - private final boolean notifyOnEDT; -} diff --git a/src/org/jdesktop/swingworker/SwingWorker.java b/src/org/jdesktop/swingworker/SwingWorker.java deleted file mode 100644 index aa7941f9116..00000000000 --- a/src/org/jdesktop/swingworker/SwingWorker.java +++ /dev/null @@ -1,888 +0,0 @@ -/* - * $Id: SwingWorker.java,v 1.5 2007/03/01 19:55:54 idk Exp $ - * - * Copyright © 2005 Sun Microsystems, Inc. All rights - * reserved. Use is subject to license terms. - */ - -package org.jdesktop.swingworker; - -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.beans.PropertyChangeEvent; -import java.util.List; -import java.util.concurrent.*; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.*; - -import java.awt.event.*; - -import javax.swing.SwingUtilities; -import javax.swing.Timer; - -/** - * An abstract class to perform lengthy GUI-interacting tasks in a - * dedicated thread. - * - *

    - * When writing a multi-threaded application using Swing, there are - * two constraints to keep in mind: - * (refer to - * - * How to Use Threads - * for more details): - *

      - *
    • Time-consuming tasks should not be run on the Event - * Dispatch Thread. Otherwise the application becomes unresponsive. - *
    • - *
    • Swing components should be accessed on the Event - * Dispatch Thread only. - *
    • - *
    - * - *

    - * - *

    - * These constraints mean that a GUI application with time intensive - * computing needs at least two threads: 1) a thread to perform the lengthy - * task and 2) the Event Dispatch Thread (EDT) for all GUI-related - * activities. This involves inter-thread communication which can be - * tricky to implement. - * - *

    - * {@code SwingWorker} is designed for situations where you need to have a long - * running task run in a background thread and provide updates to the UI - * either when done, or while processing. - * Subclasses of {@code SwingWorker} must implement - * the {@see #doInBackground} method to perform the background computation. - * - * - *

    - * Workflow - *

    - * There are three threads involved in the life cycle of a - * {@code SwingWorker} : - *

      - *
    • - *

      - * Current thread: The {@link #execute} method is - * called on this thread. It schedules {@code SwingWorker} for the execution on a - * worker - * thread and returns immediately. One can wait for the {@code SwingWorker} to - * complete using the {@link #get get} methods. - *

    • - *

      - * Worker thread: The {@link #doInBackground} - * method is called on this thread. - * This is where all background activities should happen. To notify - * {@code PropertyChangeListeners} about bound properties changes use the - * {@link #firePropertyChange firePropertyChange} and - * {@link #getPropertyChangeSupport} methods. By default there are two bound - * properties available: {@code state} and {@code progress}. - *

    • - *

      - * Event Dispatch Thread: All Swing related activities occur - * on this thread. {@code SwingWorker} invokes the - * {@link #process process} and {@link #done} methods and notifies - * any {@code PropertyChangeListeners} on this thread. - *

    - * - *

    - * Often, the Current thread is the Event Dispatch - * Thread. - * - * - *

    - * Before the {@code doInBackground} method is invoked on a worker thread, - * {@code SwingWorker} notifies any {@code PropertyChangeListeners} about the - * {@code state} property change to {@code StateValue.STARTED}. After the - * {@code doInBackground} method is finished the {@code done} method is - * executed. Then {@code SwingWorker} notifies any {@code PropertyChangeListeners} - * about the {@code state} property change to {@code StateValue.DONE}. - * - *

    - * {@code SwingWorker} is only designed to be executed once. Executing a - * {@code SwingWorker} more than once will not result in invoking the - * {@code doInBackground} method twice. - * - *

    - * Sample Usage - *

    - * The following example illustrates the simplest use case. Some - * processing is done in the background and when done you update a Swing - * component. - * - *

    - * Say we want to find the "Meaning of Life" and display the result in - * a {@code JLabel}. - * - *

    - *   final JLabel label;
    - *   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
    - *       {@code @Override}
    - *       public String doInBackground() {
    - *           return findTheMeaningOfLife();
    - *       }
    - *
    - *       {@code @Override}
    - *       protected void done() {
    - *           try { 
    - *               label.setText(get());
    - *           } catch (Exception ignore) {
    - *           }
    - *       }
    - *   }
    - * 
    - *   (new MeaningOfLifeFinder()).execute();
    - * 
    - * - *

    - * The next example is useful in situations where you wish to process data - * as it is ready on the Event Dispatch Thread. - * - *

    - * Now we want to find the first N prime numbers and display the results in a - * {@code JTextArea}. While this is computing, we want to update our - * progress in a {@code JProgressBar}. Finally, we also want to print - * the prime numbers to {@code System.out}. - *

    - * class PrimeNumbersTask extends 
    - *         SwingWorker<List<Integer>, Integer> {
    - *     PrimeNumbersTask(JTextArea textArea, int numbersToFind) { 
    - *         //initialize 
    - *     }
    - *
    - *     {@code @Override}
    - *     public List<Integer> doInBackground() {
    - *         while (! enough && ! isCancelled()) {
    - *                 number = nextPrimeNumber();
    - *                 publish(number);
    - *                 setProgress(100 * numbers.size() / numbersToFind);
    - *             }
    - *         }
    - *         return numbers;
    - *     }
    - *
    - *     {@code @Override}
    - *     protected void process(List<Integer> chunks) { 
    - *         for (int number : chunks) {
    - *             textArea.append(number + "\n");
    - *         }
    - *     }
    - * }
    - *
    - * JTextArea textArea = new JTextArea();
    - * final JProgressBar progressBar = new JProgressBar(0, 100);
    - * PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
    - * task.addPropertyChangeListener(
    - *     new PropertyChangeListener() {
    - *         public  void propertyChange(PropertyChangeEvent evt) {
    - *             if ("progress".equals(evt.getPropertyName())) {
    - *                 progressBar.setValue((Integer)evt.getNewValue());
    - *             }
    - *         }
    - *     });
    - *
    - * task.execute();
    - * System.out.println(task.get()); //prints all prime numbers we have got
    - * 
    - * - *

    - * Because {@code SwingWorker} implements {@code Runnable}, a - * {@code SwingWorker} can be submitted to an - * {@link java.util.concurrent.Executor} for execution. - * - * @author Igor Kushnirskiy - * @version $Revision: 1.5 $ $Date: 2007/03/01 19:55:54 $ - * - * @param the result type returned by this {@code SwingWorker's} - * {@code doInBackground} and {@code get} methods - * @param the type used for carrying out intermediate results by this - * {@code SwingWorker's} {@code publish} and {@code process} methods - * - */ -public abstract class SwingWorker implements Future, Runnable { - /** - * number of worker threads. - */ - private static final int MAX_WORKER_THREADS = 10; - - /** - * current progress. - */ - private volatile int progress; - - /** - * current state. - */ - private volatile StateValue state; - - /** - * everything is run inside this FutureTask. Also it is used as - * a delegatee for the Future API. - */ - private final FutureTask future; - - /** - * all propertyChangeSupport goes through this. - */ - private final PropertyChangeSupport propertyChangeSupport; - - /** - * handler for {@code process} method. - */ - private AccumulativeRunnable doProcess; - - /** - * handler for progress property change notifications. - */ - private AccumulativeRunnable doNotifyProgressChange; - - private static final AccumulativeRunnable doSubmit = - new DoSubmitAccumulativeRunnable(); - - private static ExecutorService executorService = null; - - /** - * Values for the {@code state} bound property. - */ - public enum StateValue { - /** - * Initial {@code SwingWorker} state. - */ - PENDING, - /** - * {@code SwingWorker} is {@code STARTED} - * before invoking {@code doInBackground}. - */ - STARTED, - - /** - * {@code SwingWorker} is {@code DONE} - * after {@code doInBackground} method - * is finished. - */ - DONE - }; - - /** - * Constructs this {@code SwingWorker}. - */ - public SwingWorker() { - Callable callable = - new Callable() { - public T call() throws Exception { - setState(StateValue.STARTED); - return doInBackground(); - } - }; - - future = new FutureTask(callable) { - @Override - protected void done() { - doneEDT(); - setState(StateValue.DONE); - } - }; - - state = StateValue.PENDING; - propertyChangeSupport = new SwingWorkerPropertyChangeSupport(this); - doProcess = null; - doNotifyProgressChange = null; - } - - /** - * Computes a result, or throws an exception if unable to do so. - * - *

    - * Note that this method is executed only once. - * - *

    - * Note: this method is executed in a background thread. - * - * - * @return the computed result - * @throws Exception if unable to compute a result - * - */ - protected abstract T doInBackground() throws Exception ; - - /** - * Sets this {@code Future} to the result of computation unless - * it has been cancelled. - */ - public final void run() { - future.run(); - } - - /** - * Sends data chunks to the {@link #process} method. This method is to be - * used from inside the {@code doInBackground} method to deliver - * intermediate results - * for processing on the Event Dispatch Thread inside the - * {@code process} method. - * - *

    - * Because the {@code process} method is invoked asynchronously on - * the Event Dispatch Thread - * multiple invocations to the {@code publish} method - * might occur before the {@code process} method is executed. For - * performance purposes all these invocations are coalesced into one - * invocation with concatenated arguments. - * - *

    - * For example: - * - *

    -     * publish("1");
    -     * publish("2", "3");
    -     * publish("4", "5", "6");
    -     * 
    - * - * might result in: - * - *
    -     * process("1", "2", "3", "4", "5", "6")
    -     * 
    - * - *

    - * Sample Usage. This code snippet loads some tabular data and - * updates {@code DefaultTableModel} with it. Note that it safe to mutate - * the tableModel from inside the {@code process} method because it is - * invoked on the Event Dispatch Thread. - * - *

    -     * class TableSwingWorker extends 
    -     *         SwingWorker<DefaultTableModel, Object[]> {
    -     *     private final DefaultTableModel tableModel;
    -     * 
    -     *     public TableSwingWorker(DefaultTableModel tableModel) {
    -     *         this.tableModel = tableModel;
    -     *     }
    -     * 
    -     *     {@code @Override}
    -     *     protected DefaultTableModel doInBackground() throws Exception {
    -     *         for (Object[] row = loadData(); 
    -     *                  ! isCancelled() && row != null; 
    -     *                  row = loadData()) {
    -     *             publish((Object[]) row);
    -     *         }
    -     *         return tableModel;
    -     *     }
    -     * 
    -     *     {@code @Override}
    -     *     protected void process(List<Object[]> chunks) {
    -     *         for (Object[] row : chunks) {
    -     *             tableModel.addRow(row);
    -     *         }
    -     *     }
    -     * }
    -     * 
    - * - * @param chunks intermediate results to process - * - * @see #process - * - */ - protected final void publish(V... chunks) { - synchronized (this) { - if (doProcess == null) { - doProcess = new AccumulativeRunnable() { - @Override - public void run(List args) { - process(args); - } - @Override - protected void submit() { - doSubmit.add(this); - } - }; - } - } - doProcess.add(chunks); - } - - /** - * Receives data chunks from the {@code publish} method asynchronously on the - * Event Dispatch Thread. - * - *

    - * Please refer to the {@link #publish} method for more details. - * - * @param chunks intermediate results to process - * - * @see #publish - * - */ - protected void process(List chunks) { - } - - /** - * Executed on the Event Dispatch Thread after the {@code doInBackground} - * method is finished. The default - * implementation does nothing. Subclasses may override this method to - * perform completion actions on the Event Dispatch Thread. Note - * that you can query status inside the implementation of this method to - * determine the result of this task or whether this task has been cancelled. - * - * @see #doInBackground - * @see #isCancelled() - * @see #get - */ - protected void done() { - } - - /** - * Sets the {@code progress} bound property. - * The value should be from 0 to 100. - * - *

    - * Because {@code PropertyChangeListener}s are notified asynchronously on - * the Event Dispatch Thread multiple invocations to the - * {@code setProgress} method might occur before any - * {@code PropertyChangeListeners} are invoked. For performance purposes - * all these invocations are coalesced into one invocation with the last - * invocation argument only. - * - *

    - * For example, the following invocations: - * - *

    -     * setProgress(1);
    -     * setProgress(2);
    -     * setProgress(3);
    -     * 
    - * - * might result in a single {@code PropertyChangeListener} notification with - * the value {@code 3}. - * - * @param progress the progress value to set - * @throws IllegalArgumentException is value not from 0 to 100 - */ - protected final void setProgress(int progress) { - if (progress < 0 || progress > 100) { - throw new IllegalArgumentException("the value should be from 0 to 100"); - } - if (this.progress == progress) { - return; - } - int oldProgress = this.progress; - this.progress = progress; - if (! getPropertyChangeSupport().hasListeners("progress")) { - return; - } - synchronized (this) { - if (doNotifyProgressChange == null) { - doNotifyProgressChange = - new AccumulativeRunnable() { - @Override - public void run(List args) { - firePropertyChange("progress", - args.get(0), - args.get(args.size() - 1)); - } - @Override - protected void submit() { - doSubmit.add(this); - } - }; - } - } - doNotifyProgressChange.add(oldProgress, progress); - } - - /** - * Returns the {@code progress} bound property. - * - * @return the progress bound property. - */ - public final int getProgress() { - return progress; - } - - /** - * Schedules this {@code SwingWorker} for execution on a worker - * thread. There are a number of worker threads available. In the - * event all worker threads are busy handling other - * {@code SwingWorkers} this {@code SwingWorker} is placed in a waiting - * queue. - * - *

    - * Note: - * {@code SwingWorker} is only designed to be executed once. Executing a - * {@code SwingWorker} more than once will not result in invoking the - * {@code doInBackground} method twice. - */ - public final void execute() { - getWorkersExecutorService().execute(this); - } - - // Future methods START - /** - * {@inheritDoc} - */ - public final boolean cancel(boolean mayInterruptIfRunning) { - return future.cancel(mayInterruptIfRunning); - } - - /** - * {@inheritDoc} - */ - public final boolean isCancelled() { - return future.isCancelled(); - } - - /** - * {@inheritDoc} - */ - public final boolean isDone() { - return future.isDone(); - } - - /** - * {@inheritDoc} - *

    - * Note: calling {@code get} on the Event Dispatch Thread blocks - * all events, including repaints, from being processed until this - * {@code SwingWorker} is complete. - * - *

    - * When you want the {@code SwingWorker} to block on the Event - * Dispatch Thread we recommend that you use a modal dialog. - * - *

    - * For example: - * - *

    -     * class SwingWorkerCompletionWaiter extends PropertyChangeListener {
    -     *     private JDialog dialog;
    -     * 
    -     *     public SwingWorkerCompletionWaiter(JDialog dialog) {
    -     *         this.dialog = dialog;
    -     *     }
    -     * 
    -     *     public void propertyChange(PropertyChangeEvent event) {
    -     *         if ("state".equals(event.getPropertyName())
    -     *                 && SwingWorker.StateValue.DONE == event.getNewValue()) {
    -     *             dialog.setVisible(false);
    -     *             dialog.dispose();
    -     *         }
    -     *     }
    -     * }
    -     * JDialog dialog = new JDialog(owner, true);
    -     * swingWorker.addPropertyChangeListener(
    -     *     new SwingWorkerCompletionWaiter(dialog));
    -     * swingWorker.execute();
    -     * //the dialog will be visible until the SwingWorker is done
    -     * dialog.setVisible(true); 
    -     * 
    - */ - public final T get() throws InterruptedException, ExecutionException { - return future.get(); - } - - /** - * {@inheritDoc} - *

    - * Please refer to {@link #get} for more details. - */ - public final T get(long timeout, TimeUnit unit) throws InterruptedException, - ExecutionException, TimeoutException { - return future.get(timeout, unit); - } - - // Future methods END - - // PropertyChangeSupports methods START - /** - * Adds a {@code PropertyChangeListener} to the listener list. The listener - * is registered for all properties. The same listener object may be added - * more than once, and will be called as many times as it is added. If - * {@code listener} is {@code null}, no exception is thrown and no action is taken. - * - *

    - * Note: This is merely a convenience wrapper. All work is delegated to - * {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * @param listener the {@code PropertyChangeListener} to be added - */ - public final void addPropertyChangeListener(PropertyChangeListener listener) { - getPropertyChangeSupport().addPropertyChangeListener(listener); - } - - /** - * Removes a {@code PropertyChangeListener} from the listener list. This - * removes a {@code PropertyChangeListener} that was registered for all - * properties. If {@code listener} was added more than once to the same - * event source, it will be notified one less time after being removed. If - * {@code listener} is {@code null}, or was never added, no exception is - * thrown and no action is taken. - * - *

    - * Note: This is merely a convenience wrapper. All work is delegated to - * {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * @param listener the {@code PropertyChangeListener} to be removed - */ - public final void removePropertyChangeListener(PropertyChangeListener listener) { - getPropertyChangeSupport().removePropertyChangeListener(listener); - } - - /** - * Reports a bound property update to any registered listeners. No event is - * fired if {@code old} and {@code new} are equal and non-null. - * - *

    - * This {@code SwingWorker} will be the source for - * any generated events. - * - *

    - * When called off the Event Dispatch Thread - * {@code PropertyChangeListeners} are notified asynchronously on - * the Event Dispatch Thread. - *

    - * Note: This is merely a convenience wrapper. All work is delegated to - * {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * - * @param propertyName the programmatic name of the property that was - * changed - * @param oldValue the old value of the property - * @param newValue the new value of the property - */ - public final void firePropertyChange(String propertyName, Object oldValue, - Object newValue) { - getPropertyChangeSupport().firePropertyChange(propertyName, - oldValue, newValue); - } - - /** - * Returns the {@code PropertyChangeSupport} for this {@code SwingWorker}. - * This method is used when flexible access to bound properties support is - * needed. - *

    - * This {@code SwingWorker} will be the source for - * any generated events. - * - *

    - * Note: The returned {@code PropertyChangeSupport} notifies any - * {@code PropertyChangeListener}s asynchronously on the Event Dispatch - * Thread in the event that {@code firePropertyChange} or - * {@code fireIndexedPropertyChange} are called off the Event Dispatch - * Thread. - * - * @return {@code PropertyChangeSupport} for this {@code SwingWorker} - */ - public final PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - // PropertyChangeSupports methods END - - /** - * Returns the {@code SwingWorker} state bound property. - * - * @return the current state - */ - public final StateValue getState() { - /* - * DONE is a special case - * to keep getState and isDone is sync - */ - if (isDone()) { - return StateValue.DONE; - } else { - return state; - } - } - - /** - * Sets this {@code SwingWorker} state bound property. - * @param the state state to set - */ - private void setState(StateValue state) { - StateValue old = this.state; - this.state = state; - firePropertyChange("state", old, state); - } - - /** - * Invokes {@code done} on the EDT. - */ - private void doneEDT() { - Runnable doDone = - new Runnable() { - public void run() { - done(); - } - }; - if (SwingUtilities.isEventDispatchThread()) { - doDone.run(); - } else { - doSubmit.add(doDone); - } - } - - - /** - * returns workersExecutorService. - * - * returns the service stored in the appContext or creates it if - * necessary. If the last one it triggers autoShutdown thread to - * get started. - * - * @return ExecutorService for the {@code SwingWorkers} - * @see #startAutoShutdownThread - */ - private static synchronized ExecutorService getWorkersExecutorService() { - if (executorService == null) { - //this creates non-daemon threads. - ThreadFactory threadFactory = - new ThreadFactory() { - final AtomicInteger threadNumber = new AtomicInteger(1); - public Thread newThread(final Runnable r) { - StringBuilder name = - new StringBuilder("SwingWorker-pool-"); - name.append(System.identityHashCode(this)); - name.append("-thread-"); - name.append(threadNumber.getAndIncrement()); - - Thread t = new Thread(r, name.toString());; - if (t.isDaemon()) - t.setDaemon(false); - if (t.getPriority() != Thread.NORM_PRIORITY) - t.setPriority(Thread.NORM_PRIORITY); - return t; - } - }; - - /* - * We want a to have no more than MAX_WORKER_THREADS - * running threads. - * - * We want a worker thread to wait no longer than 1 second - * for new tasks before terminating. - */ - executorService = new ThreadPoolExecutor(0, MAX_WORKER_THREADS, - 5L, TimeUnit.SECONDS, - new LinkedBlockingQueue(), - threadFactory) { - - private final ReentrantLock pauseLock = new ReentrantLock(); - private final Condition unpaused = pauseLock.newCondition(); - private boolean isPaused = false; - private final ReentrantLock executeLock = new ReentrantLock(); - - @Override - public void execute(Runnable command) { - /* - * ThreadPoolExecutor first tries to run task - * in a corePool. If all threads are busy it - * tries to add task to the waiting queue. If it - * fails it run task in maximumPool. - * - * We want corePool to be 0 and - * maximumPool to be MAX_WORKER_THREADS - * We need to change the order of the execution. - * First try corePool then try maximumPool - * pool and only then store to the waiting - * queue. We can not do that because we would - * need access to the private methods. - * - * Instead we enlarge corePool to - * MAX_WORKER_THREADS before the execution and - * shrink it back to 0 after. - * It does pretty much what we need. - * - * While we changing the corePoolSize we need - * to stop running worker threads from accepting new - * tasks. - */ - - //we need atomicity for the execute method. - executeLock.lock(); - try { - - pauseLock.lock(); - try { - isPaused = true; - } finally { - pauseLock.unlock(); - } - - setCorePoolSize(MAX_WORKER_THREADS); - super.execute(command); - setCorePoolSize(0); - - pauseLock.lock(); - try { - isPaused = false; - unpaused.signalAll(); - } finally { - pauseLock.unlock(); - } - } finally { - executeLock.unlock(); - } - } - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - pauseLock.lock(); - try { - while(isPaused) { - unpaused.await(); - } - } catch(InterruptedException ignore) { - - } finally { - pauseLock.unlock(); - } - } - }; - } - return executorService; - } - - private static class DoSubmitAccumulativeRunnable - extends AccumulativeRunnable implements ActionListener { - private final static int DELAY = (int) (1000 / 30); - @Override - protected void run(List args) { - for (Runnable runnable : args) { - runnable.run(); - } - } - @Override - protected void submit() { - Timer timer = new Timer(DELAY, this); - timer.setRepeats(false); - timer.start(); - } - public void actionPerformed(ActionEvent event) { - run(); - } - } - - private class SwingWorkerPropertyChangeSupport - extends PropertyChangeSupport { - private static final long serialVersionUID = -6694014073227886163L; - SwingWorkerPropertyChangeSupport(Object source) { - super(source); - } - @Override - public void firePropertyChange(final PropertyChangeEvent evt) { - if (SwingUtilities.isEventDispatchThread()) { - super.firePropertyChange(evt); - } else { - doSubmit.add( - new Runnable() { - public void run() { - SwingWorkerPropertyChangeSupport.this - .firePropertyChange(evt); - } - }); - } - } - } -} diff --git a/src/org/jdesktop/swingx/JXMultiSplitPane.java b/src/org/jdesktop/swingx/JXMultiSplitPane.java deleted file mode 100644 index 74c8528afc8..00000000000 --- a/src/org/jdesktop/swingx/JXMultiSplitPane.java +++ /dev/null @@ -1,569 +0,0 @@ -/* - * $Id: JXMultiSplitPane.java 3475 2009-08-28 08:30:47Z kleopatra $ - * - * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package org.jdesktop.swingx; - -import java.awt.Color; -import java.awt.Cursor; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Insets; -import java.awt.Rectangle; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseEvent; - -import javax.accessibility.AccessibleContext; -import javax.accessibility.AccessibleRole; -import javax.swing.JPanel; -import javax.swing.event.MouseInputAdapter; - -import org.jdesktop.swingx.MultiSplitLayout.Divider; -import org.jdesktop.swingx.MultiSplitLayout.Node; -import org.jdesktop.swingx.painter.AbstractPainter; -import org.jdesktop.swingx.painter.Painter; - -/** - * - *

    - * All properties in this class are bound: when a properties value - * is changed, all PropertyChangeListeners are fired. - * - * @author Hans Muller - * @author Luan O'Carroll - */ -public class JXMultiSplitPane extends JPanel { - private static final long serialVersionUID = 255040079203554096L; - private AccessibleContext accessibleContext = null; - private boolean continuousLayout = true; - private DividerPainter dividerPainter = new DefaultDividerPainter(); - private Painter backgroundPainter; - - /** - * Creates a MultiSplitPane with it's LayoutManager set to - * to an empty MultiSplitLayout. - */ - public JXMultiSplitPane() { - this(new MultiSplitLayout()); - } - - /** - * Creates a MultiSplitPane. - * @param layout the new split pane's layout - */ - public JXMultiSplitPane( MultiSplitLayout layout ) { - super(layout); - InputHandler inputHandler = new InputHandler(); - addMouseListener(inputHandler); - addMouseMotionListener(inputHandler); - addKeyListener(inputHandler); - setFocusable(true); - } - - /** - * A convenience method that returns the layout manager cast - * to MutliSplitLayout. - * - * @return this MultiSplitPane's layout manager - * @see java.awt.Container#getLayout - * @see #setModel - */ - public final MultiSplitLayout getMultiSplitLayout() { - return (MultiSplitLayout)getLayout(); - } - - /** - * A convenience method that sets the MultiSplitLayout model. - * Equivalent to getMultiSplitLayout.setModel(model) - * - * @param model the root of the MultiSplitLayout model - * @see #getMultiSplitLayout - * @see MultiSplitLayout#setModel - */ - public final void setModel(Node model) { - getMultiSplitLayout().setModel(model); - } - - /** - * A convenience method that sets the MultiSplitLayout dividerSize - * property. Equivalent to - * getMultiSplitLayout().setDividerSize(newDividerSize). - * - * @param dividerSize the value of the dividerSize property - * @see #getMultiSplitLayout - * @see MultiSplitLayout#setDividerSize - */ - public final void setDividerSize(int dividerSize) { - getMultiSplitLayout().setDividerSize(dividerSize); - } - - /** - * A convenience method that returns the MultiSplitLayout dividerSize - * property. Equivalent to - * getMultiSplitLayout().getDividerSize(). - * - * @see #getMultiSplitLayout - * @see MultiSplitLayout#getDividerSize - */ - public final int getDividerSize() { - return getMultiSplitLayout().getDividerSize(); - } - - /** - * Sets the value of the continuousLayout property. - * If true, then the layout is revalidated continuously while - * a divider is being moved. The default value of this property - * is true. - * - * @param continuousLayout value of the continuousLayout property - * @see #isContinuousLayout - */ - public void setContinuousLayout(boolean continuousLayout) { - boolean oldContinuousLayout = isContinuousLayout(); - this.continuousLayout = continuousLayout; - firePropertyChange("continuousLayout", oldContinuousLayout, isContinuousLayout()); - } - - /** - * Returns true if dragging a divider only updates - * the layout when the drag gesture ends (typically, when the - * mouse button is released). - * - * @return the value of the continuousLayout property - * @see #setContinuousLayout - */ - public boolean isContinuousLayout() { - return continuousLayout; - } - - /** - * Returns the Divider that's currently being moved, typically - * because the user is dragging it, or null. - * - * @return the Divider that's being moved or null. - */ - public Divider activeDivider() { - return dragDivider; - } - - /** - * Draws a single Divider. Typically used to specialize the - * way the active Divider is painted. - * - * @see #getDividerPainter - * @see #setDividerPainter - */ - public static abstract class DividerPainter extends AbstractPainter { - } - - private class DefaultDividerPainter extends DividerPainter { - @Override - protected void doPaint(Graphics2D g, Divider divider, int width, int height) { - if ((divider == activeDivider()) && !isContinuousLayout()) { - g.setColor(Color.black); - g.fillRect(0, 0, width, height); - } - } - } - - /** - * The DividerPainter that's used to paint Dividers on this MultiSplitPane. - * This property may be null. - * - * @return the value of the dividerPainter Property - * @see #setDividerPainter - */ - public DividerPainter getDividerPainter() { - return dividerPainter; - } - - /** - * Sets the DividerPainter that's used to paint Dividers on this - * MultiSplitPane. The default DividerPainter only draws - * the activeDivider (if there is one) and then, only if - * continuousLayout is false. The value of this property is - * used by the paintChildren method: Dividers are painted after - * the MultiSplitPane's children have been rendered so that - * the activeDivider can appear "on top of" the children. - * - * @param dividerPainter the value of the dividerPainter property, can be null - * @see #paintChildren - * @see #activeDivider - */ - public void setDividerPainter(DividerPainter dividerPainter) { - DividerPainter old = getDividerPainter(); - this.dividerPainter = dividerPainter; - firePropertyChange("dividerPainter", old, getDividerPainter()); - } - - /** - * Calls the UI delegate's paint method, if the UI delegate - * is non-null. We pass the delegate a copy of the - * Graphics object to protect the rest of the - * paint code from irrevocable changes - * (for example, Graphics.translate). - *

    - * If you override this in a subclass you should not make permanent - * changes to the passed in Graphics. For example, you - * should not alter the clip Rectangle or modify the - * transform. If you need to do these operations you may find it - * easier to create a new Graphics from the passed in - * Graphics and manipulate it. Further, if you do not - * invoker super's implementation you must honor the opaque property, - * that is - * if this component is opaque, you must completely fill in the background - * in a non-opaque color. If you do not honor the opaque property you - * will likely see visual artifacts. - *

    - * The passed in Graphics object might - * have a transform other than the identify transform - * installed on it. In this case, you might get - * unexpected results if you cumulatively apply - * another transform. - * - * @param g the Graphics object to protect - * @see #paint(Graphics) - * @see javax.swing.plaf.ComponentUI - */ - @Override - protected void paintComponent(Graphics g) - { - if (backgroundPainter != null) { - Graphics2D g2 = (Graphics2D)g.create(); - - try { - Insets ins = this.getInsets(); - g2.translate(ins.left, ins.top); - backgroundPainter.paint(g2, this, this.getWidth() - ins.left - - ins.right, this.getHeight() - ins.top - ins.bottom); - } finally { - g2.dispose(); - } - } else { - super.paintComponent(g); - } - } - - /** - * Specifies a Painter to use to paint the background of this JXPanel. - * If p is not null, then setOpaque(false) will be called - * as a side effect. A component should not be opaque if painters are - * being used, because Painters may paint transparent pixels or not - * paint certain pixels, such as around the border insets. - */ - public void setBackgroundPainter(Painter p) - { - Painter old = getBackgroundPainter(); - this.backgroundPainter = p; - - if (p != null) { - setOpaque(false); - } - - firePropertyChange("backgroundPainter", old, getBackgroundPainter()); - repaint(); - } - - public Painter getBackgroundPainter() { - return backgroundPainter; - } - /** - * Uses the DividerPainter (if any) to paint each Divider that - * overlaps the clip Rectangle. This is done after the call to - * super.paintChildren() so that Dividers can be - * rendered "on top of" the children. - *

    - * {@inheritDoc} - */ - @Override - protected void paintChildren(Graphics g) { - super.paintChildren(g); - DividerPainter dp = getDividerPainter(); - Rectangle clipR = g.getClipBounds(); - if ((dp != null) && (clipR != null)) { - MultiSplitLayout msl = getMultiSplitLayout(); - if ( msl.hasModel()) { - for(Divider divider : msl.dividersThatOverlap(clipR)) { - Rectangle bounds = divider.getBounds(); - Graphics cg = g.create( bounds.x, bounds.y, bounds.width, bounds.height ); - try { - dp.paint((Graphics2D)cg, divider, bounds.width, bounds.height ); - } finally { - cg.dispose(); - } - } - } - } - } - - private boolean dragUnderway = false; - private MultiSplitLayout.Divider dragDivider = null; - private Rectangle initialDividerBounds = null; - private boolean oldFloatingDividers = true; - private int dragOffsetX = 0; - private int dragOffsetY = 0; - private int dragMin = -1; - private int dragMax = -1; - - private void startDrag(int mx, int my) { - requestFocusInWindow(); - MultiSplitLayout msl = getMultiSplitLayout(); - MultiSplitLayout.Divider divider = msl.dividerAt(mx, my); - if (divider != null) { - MultiSplitLayout.Node prevNode = divider.previousSibling(); - MultiSplitLayout.Node nextNode = divider.nextSibling(); - if ((prevNode == null) || (nextNode == null)) { - dragUnderway = false; - } - else { - initialDividerBounds = divider.getBounds(); - dragOffsetX = mx - initialDividerBounds.x; - dragOffsetY = my - initialDividerBounds.y; - dragDivider = divider; - - Rectangle prevNodeBounds = prevNode.getBounds(); - Rectangle nextNodeBounds = nextNode.getBounds(); - if (dragDivider.isVertical()) { - dragMin = prevNodeBounds.x; - dragMax = nextNodeBounds.x + nextNodeBounds.width; - dragMax -= dragDivider.getBounds().width; - if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT ) - dragMax -= msl.getUserMinSize(); - } - else { - dragMin = prevNodeBounds.y; - dragMax = nextNodeBounds.y + nextNodeBounds.height; - dragMax -= dragDivider.getBounds().height; - if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT ) - dragMax -= msl.getUserMinSize(); - } - - if ( msl.getLayoutMode() == MultiSplitLayout.USER_MIN_SIZE_LAYOUT ) { - dragMin = dragMin + msl.getUserMinSize(); - } - else { - if (dragDivider.isVertical()) { - dragMin = Math.max( dragMin, dragMin + getMinNodeSize(msl,prevNode).width ); - dragMax = Math.min( dragMax, dragMax - getMinNodeSize(msl,nextNode).width ); - - Dimension maxDim = getMaxNodeSize(msl,prevNode); - if ( maxDim != null ) - dragMax = Math.min( dragMax, prevNodeBounds.x + maxDim.width ); - } - else { - dragMin = Math.max( dragMin, dragMin + getMinNodeSize(msl,prevNode).height ); - dragMax = Math.min( dragMax, dragMax - getMinNodeSize(msl,nextNode).height ); - - Dimension maxDim = getMaxNodeSize(msl,prevNode); - if ( maxDim != null ) - dragMax = Math.min( dragMax, prevNodeBounds.y + maxDim.height ); - } - } - - oldFloatingDividers = getMultiSplitLayout().getFloatingDividers(); - getMultiSplitLayout().setFloatingDividers(false); - dragUnderway = true; - } - } - else { - dragUnderway = false; - } - } - - /** - * Set the maximum node size. This method can be overridden to limit the - * size of a node during a drag operation on a divider. When implementing - * this method in a subclass the node instance should be checked, for - * example: - * - * class MyMultiSplitPane extends JXMultiSplitPane - * { - * protected Dimension getMaxNodeSize( MultiSplitLayout msl, Node n ) - * { - * if (( n instanceof Leaf ) && ((Leaf)n).getName().equals( "top" )) - * return msl.maximumNodeSize( n ); - * return null; - * } - * } - * - * @param msl the MultiSplitLayout used by this pane - * @param n the node being resized - * @return the maximum size or null (by default) to ignore the maximum size. - */ - protected Dimension getMaxNodeSize( MultiSplitLayout msl, Node n ) { - return null; - } - - /** - * Set the minimum node size. This method can be overridden to limit the - * size of a node during a drag operation on a divider. - * @param msl the MultiSplitLayout used by this pane - * @param n the node being resized - * @return the maximum size or null (by default) to ignore the maximum size. - */ - protected Dimension getMinNodeSize( MultiSplitLayout msl, Node n ) { - return msl.minimumNodeSize(n); - } - - private void repaintDragLimits() { - Rectangle damageR = dragDivider.getBounds(); - if (dragDivider.isVertical()) { - damageR.x = dragMin; - damageR.width = dragMax - dragMin; - } - else { - damageR.y = dragMin; - damageR.height = dragMax - dragMin; - } - repaint(damageR); - } - - private void updateDrag(int mx, int my) { - if (!dragUnderway) { - return; - } - Rectangle oldBounds = dragDivider.getBounds(); - Rectangle bounds = new Rectangle(oldBounds); - if (dragDivider.isVertical()) { - bounds.x = mx - dragOffsetX; - bounds.x = Math.max(bounds.x, dragMin ); - bounds.x = Math.min(bounds.x, dragMax); - } - else { - bounds.y = my - dragOffsetY; - bounds.y = Math.max(bounds.y, dragMin ); - bounds.y = Math.min(bounds.y, dragMax); - } - dragDivider.setBounds(bounds); - if (isContinuousLayout()) { - revalidate(); - repaintDragLimits(); - } - else { - repaint(oldBounds.union(bounds)); - } - } - - private void clearDragState() { - dragDivider = null; - initialDividerBounds = null; - oldFloatingDividers = true; - dragOffsetX = dragOffsetY = 0; - dragMin = dragMax = -1; - dragUnderway = false; - } - - private void finishDrag(int x, int y) { - if (dragUnderway) { - clearDragState(); - if (!isContinuousLayout()) { - revalidate(); - repaint(); - } - } - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - } - - private void cancelDrag() { - if (dragUnderway) { - dragDivider.setBounds(initialDividerBounds); - getMultiSplitLayout().setFloatingDividers(oldFloatingDividers); - setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); - repaint(); - revalidate(); - clearDragState(); - } - } - - private void updateCursor(int x, int y, boolean show) { - if (dragUnderway) { - return; - } - int cursorID = Cursor.DEFAULT_CURSOR; - if (show) { - MultiSplitLayout.Divider divider = getMultiSplitLayout().dividerAt(x, y); - if (divider != null) { - cursorID = (divider.isVertical()) ? - Cursor.E_RESIZE_CURSOR : - Cursor.N_RESIZE_CURSOR; - } - } - setCursor(Cursor.getPredefinedCursor(cursorID)); - } - - - private class InputHandler extends MouseInputAdapter implements KeyListener { - - @Override - public void mouseEntered(MouseEvent e) { - updateCursor(e.getX(), e.getY(), true); - } - - @Override - public void mouseMoved(MouseEvent e) { - updateCursor(e.getX(), e.getY(), true); - } - - @Override - public void mouseExited(MouseEvent e) { - updateCursor(e.getX(), e.getY(), false); - } - - @Override - public void mousePressed(MouseEvent e) { - startDrag(e.getX(), e.getY()); - } - @Override - public void mouseReleased(MouseEvent e) { - finishDrag(e.getX(), e.getY()); - } - @Override - public void mouseDragged(MouseEvent e) { - updateDrag(e.getX(), e.getY()); - } - public void keyPressed(KeyEvent e) { - if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { - cancelDrag(); - } - } - public void keyReleased(KeyEvent e) { } - - public void keyTyped(KeyEvent e) { } - } - - @Override - public AccessibleContext getAccessibleContext() { - if( accessibleContext == null ) { - accessibleContext = new AccessibleMultiSplitPane(); - } - return accessibleContext; - } - - protected class AccessibleMultiSplitPane extends AccessibleJPanel { - private static final long serialVersionUID = 5056475597412456379L; - - @Override - public AccessibleRole getAccessibleRole() { - return AccessibleRole.SPLIT_PANE; - } - } -} \ No newline at end of file diff --git a/src/org/jdesktop/swingx/MultiSplitLayout.java b/src/org/jdesktop/swingx/MultiSplitLayout.java deleted file mode 100644 index 37a045ef4c7..00000000000 --- a/src/org/jdesktop/swingx/MultiSplitLayout.java +++ /dev/null @@ -1,2215 +0,0 @@ -/* - * $Id: MultiSplitLayout.java 3471 2009-08-27 13:10:39Z kleopatra $ - * - * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package org.jdesktop.swingx; - -import java.awt.Component; -import java.awt.Container; -import java.awt.Dimension; -import java.awt.Insets; -import java.awt.LayoutManager; -import java.awt.Rectangle; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.io.IOException; -import java.io.Reader; -import java.io.StreamTokenizer; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; -import java.util.Map; - -import javax.swing.UIManager; - - -/** - * The MultiSplitLayout layout manager recursively arranges its - * components in row and column groups called "Splits". Elements of - * the layout are separated by gaps called "Dividers". The overall - * layout is defined with a simple tree model whose nodes are - * instances of MultiSplitLayout.Split, MultiSplitLayout.Divider, - * and MultiSplitLayout.Leaf. Named Leaf nodes represent the space - * allocated to a component that was added with a constraint that - * matches the Leaf's name. Extra space is distributed - * among row/column siblings according to their 0.0 to 1.0 weight. - * If no weights are specified then the last sibling always gets - * all of the extra space, or space reduction. - * - *

    - * Although MultiSplitLayout can be used with any Container, it's - * the default layout manager for MultiSplitPane. MultiSplitPane - * supports interactively dragging the Dividers, accessibility, - * and other features associated with split panes. - * - *

    - * All properties in this class are bound: when a properties value - * is changed, all PropertyChangeListeners are fired. - * - * - * @author Hans Muller - * @author Luan O'Carroll - * @see JXMultiSplitPane - */ - -/* - * Changes by Luan O'Carroll - * 1 Support for visibility added. - */ -public class MultiSplitLayout implements LayoutManager -{ - public static final int DEFAULT_LAYOUT = 0; - public static final int NO_MIN_SIZE_LAYOUT = 1; - public static final int USER_MIN_SIZE_LAYOUT = 2; - - private final Map childMap = new HashMap(); - private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); - private Node model; - private int dividerSize; - private boolean floatingDividers = true; - - private boolean removeDividers = true; - private boolean layoutByWeight = false; - - private int layoutMode; - private int userMinSize = 20; - - /** - * Create a MultiSplitLayout with a default model with a single - * Leaf node named "default". - * - * #see setModel - */ - public MultiSplitLayout() - { - this(new Leaf("default")); - } - - /** - * Create a MultiSplitLayout with a default model with a single - * Leaf node named "default". - * - * @param layoutByWeight if true the layout is initialized in proportion to - * the node weights rather than the component preferred sizes. - * #see setModel - */ - public MultiSplitLayout(boolean layoutByWeight) - { - this(new Leaf("default")); - this.layoutByWeight = layoutByWeight; - } - - /** - * Set the size of the child components to match the weights of the children. - * If the components to not all specify a weight then the available layout - * space is divided equally between the components. - */ - public void layoutByWeight( Container parent ) - { - doLayoutByWeight( parent ); - - layoutContainer( parent ); - } - - /** - * Set the size of the child components to match the weights of the children. - * If the components to not all specify a weight then the available layout - * space is divided equally between the components. - */ - private void doLayoutByWeight( Container parent ) - { - Dimension size = parent.getSize(); - Insets insets = parent.getInsets(); - int width = size.width - (insets.left + insets.right); - int height = size.height - (insets.top + insets.bottom); - Rectangle bounds = new Rectangle(insets.left, insets.top, width, height); - - if (model instanceof Leaf) - model.setBounds(bounds); - else if (model instanceof Split) - doLayoutByWeight( model, bounds ); - } - - private void doLayoutByWeight( Node node, Rectangle bounds ) - { - int width = bounds.width; - int height = bounds.height; - Split split = (Split)node; - List splitChildren = split.getChildren(); - double distributableWeight = 1.0; - int unweightedComponents = 0; - int dividerSpace = 0; - for( Node splitChild : splitChildren ) { - if ( !splitChild.isVisible()) - continue; - else if ( splitChild instanceof Divider ) { - dividerSpace += dividerSize; - continue; - } - - double weight = splitChild.getWeight(); - if ( weight > 0.0 ) - distributableWeight -= weight; - else - unweightedComponents++; - } - - if ( split.isRowLayout()) { - width -= dividerSpace; - double distributableWidth = width * distributableWeight; - for( Node splitChild : splitChildren ) { - if ( !splitChild.isVisible() || ( splitChild instanceof Divider )) - continue; - - double weight = splitChild.getWeight(); - Rectangle splitChildBounds = splitChild.getBounds(); - if ( weight >= 0 ) - splitChildBounds = new Rectangle( splitChildBounds.x, splitChildBounds.y, (int)( width * weight ), height ); - else - splitChildBounds = new Rectangle( splitChildBounds.x, splitChildBounds.y, (int)( distributableWidth / unweightedComponents ), height ); - - if ( layoutMode == USER_MIN_SIZE_LAYOUT ) { - splitChildBounds.setSize( Math.max( splitChildBounds.width, userMinSize ), splitChildBounds.height ); - } - - splitChild.setBounds( splitChildBounds ); - - if ( splitChild instanceof Split ) - doLayoutByWeight( splitChild, splitChildBounds ); - else { - Component comp = getComponentForNode( splitChild ); - if ( comp != null ) - comp.setPreferredSize( splitChildBounds.getSize()); - } - } - } - else { - height -= dividerSpace; - double distributableHeight = height * distributableWeight; - for( Node splitChild : splitChildren ) { - if ( !splitChild.isVisible() || ( splitChild instanceof Divider )) - continue; - - double weight = splitChild.getWeight(); - Rectangle splitChildBounds = splitChild.getBounds(); - if ( weight >= 0 ) - splitChildBounds = new Rectangle( splitChildBounds.x, splitChildBounds.y, width, (int)( height * weight )); - else - splitChildBounds = new Rectangle( splitChildBounds.x, splitChildBounds.y, width, (int)( distributableHeight / unweightedComponents )); - - if ( layoutMode == USER_MIN_SIZE_LAYOUT ) { - splitChildBounds.setSize( splitChildBounds.width, Math.max( splitChildBounds.height, userMinSize ) ); - } - - splitChild.setBounds( splitChildBounds ); - - if ( splitChild instanceof Split ) - doLayoutByWeight( splitChild, splitChildBounds ); - else { - Component comp = getComponentForNode( splitChild ); - if ( comp != null ) - comp.setPreferredSize( splitChildBounds.getSize()); - } - } - } - } - - /** - * Get the component associated with a MultiSplitLayout.Node - * @param n the layout node - * @return the component handled by the layout or null if not found - */ - public Component getComponentForNode( Node n ) - { - String name = ((Leaf)n).getName(); - return (name != null) ? (Component)childMap.get(name) : null; - } - - /** - * Get the MultiSplitLayout.Node associated with a component - * @param comp the component being positioned by the layout - * @return the node associated with the component - */ - public Node getNodeForComponent( Component comp ) - { - return getNodeForName( getNameForComponent( comp )); - } - - /** - * Get the MultiSplitLayout.Node associated with a component - * @param name the name used to associate a component with the layout - * @return the node associated with the component - */ - public Node getNodeForName( String name ) - { - if ( model instanceof Split ) { - Split split = ((Split)model); - return getNodeForName( split, name ); - } - else - return null; - } - - /** - * Get the name used to map a component - * @param child the component - * @return the name used to map the component or null if no mapping is found - */ - public String getNameForComponent( Component child ) - { - String name = null; - for(Map.Entry kv : childMap.entrySet()) { - if (kv.getValue() == child) { - name = kv.getKey(); - break; - } - } - - return name; - } - - /** - * Get the MultiSplitLayout.Node associated with a component - * @param split the layout split that owns the requested node - * @param comp the component being positioned by the layout - * @return the node associated with the component - */ - public Node getNodeForComponent( Split split, Component comp ) - { - return getNodeForName( split, getNameForComponent( comp )); - } - - /** - * Get the MultiSplitLayout.Node associated with a component - * @param split the layout split that owns the requested node - * @param name the name used to associate a component with the layout - * @return the node associated with the component - */ - public Node getNodeForName( Split split, String name ) - { - for(Node n : split.getChildren()) { - if ( n instanceof Leaf ) { - if ( ((Leaf)n).getName().equals( name )) - return n; - } - else if ( n instanceof Split ) { - Node n1 = getNodeForName( (Split)n, name ); - if ( n1 != null ) - return n1; - } - } - return null; - } - - /** - * Is there a valid model for the layout? - * @return true if there is a model - */ - public boolean hasModel() - { - return model != null; - } - - /** - * Create a MultiSplitLayout with the specified model. - * - * #see setModel - */ - public MultiSplitLayout(Node model) { - this.model = model; - this.dividerSize = UIManager.getInt("SplitPane.dividerSize"); - if (this.dividerSize == 0) { - this.dividerSize = 7; - } - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - if (listener != null) { - pcs.addPropertyChangeListener(listener); - } - } - public void removePropertyChangeListener(PropertyChangeListener listener) { - if (listener != null) { - pcs.removePropertyChangeListener(listener); - } - } - public PropertyChangeListener[] getPropertyChangeListeners() { - return pcs.getPropertyChangeListeners(); - } - - private void firePCS(String propertyName, Object oldValue, Object newValue) { - if (!(oldValue != null && newValue != null && oldValue.equals(newValue))) { - pcs.firePropertyChange(propertyName, oldValue, newValue); - } - } - - /** - * Return the root of the tree of Split, Leaf, and Divider nodes - * that define this layout. - * - * @return the value of the model property - * @see #setModel - */ - public Node getModel() { return model; } - - /** - * Set the root of the tree of Split, Leaf, and Divider nodes - * that define this layout. The model can be a Split node - * (the typical case) or a Leaf. The default value of this - * property is a Leaf named "default". - * - * @param model the root of the tree of Split, Leaf, and Divider node - * @throws IllegalArgumentException if model is a Divider or null - * @see #getModel - */ - public void setModel(Node model) { - if ((model == null) || (model instanceof Divider)) { - throw new IllegalArgumentException("invalid model"); - } - Node oldModel = getModel(); - this.model = model; - firePCS("model", oldModel, getModel()); - } - - /** - * Returns the width of Dividers in Split rows, and the height of - * Dividers in Split columns. - * - * @return the value of the dividerSize property - * @see #setDividerSize - */ - public int getDividerSize() { return dividerSize; } - - /** - * Sets the width of Dividers in Split rows, and the height of - * Dividers in Split columns. The default value of this property - * is the same as for JSplitPane Dividers. - * - * @param dividerSize the size of dividers (pixels) - * @throws IllegalArgumentException if dividerSize < 0 - * @see #getDividerSize - */ - public void setDividerSize(int dividerSize) { - if (dividerSize < 0) { - throw new IllegalArgumentException("invalid dividerSize"); - } - int oldDividerSize = this.dividerSize; - this.dividerSize = dividerSize; - firePCS("dividerSize", Integer.valueOf( oldDividerSize ), Integer.valueOf( dividerSize )); - } - - /** - * @return the value of the floatingDividers property - * @see #setFloatingDividers - */ - public boolean getFloatingDividers() { return floatingDividers; } - - - /** - * If true, Leaf node bounds match the corresponding component's - * preferred size and Splits/Dividers are resized accordingly. - * If false then the Dividers define the bounds of the adjacent - * Split and Leaf nodes. Typically this property is set to false - * after the (MultiSplitPane) user has dragged a Divider. - * - * @see #getFloatingDividers - */ - public void setFloatingDividers(boolean floatingDividers) - { - boolean oldFloatingDividers = this.floatingDividers; - this.floatingDividers = floatingDividers; - firePCS("floatingDividers", Boolean.valueOf( oldFloatingDividers ), Boolean.valueOf( floatingDividers )); - } - - /** - * @return the value of the removeDividers property - * @see #setRemoveDividers - */ - public boolean getRemoveDividers() { return removeDividers; } - - /** - * If true, the next divider is removed when a component is removed from the - * layout. If false, only the node itself is removed. Normally the next - * divider should be removed from the layout when a component is removed. - * @param removeDividers true to removed the next divider whena component is - * removed from teh layout - */ - public void setRemoveDividers( boolean removeDividers ) - { - boolean oldRemoveDividers = this.removeDividers; - this.removeDividers = removeDividers; - firePCS("removeDividers", Boolean.valueOf( oldRemoveDividers ), Boolean.valueOf( removeDividers )); - } - - /** - * Add a component to this MultiSplitLayout. The - * name should match the name property of the Leaf - * node that represents the bounds of child. After - * layoutContainer() recomputes the bounds of all of the nodes in - * the model, it will set this child's bounds to the bounds of the - * Leaf node with name. Note: if a component was already - * added with the same name, this method does not remove it from - * its parent. - * - * @param name identifies the Leaf node that defines the child's bounds - * @param child the component to be added - * @see #removeLayoutComponent - */ - public void addLayoutComponent(String name, Component child) { - if (name == null) { - throw new IllegalArgumentException("name not specified"); - } - childMap.put(name, child); - } - - /** - * Removes the specified component from the layout. - * - * @param child the component to be removed - * @see #addLayoutComponent - */ - public void removeLayoutComponent(Component child) { - String name = getNameForComponent( child ); - - if ( name != null ) { - childMap.remove( name ); - } - } - - /** - * Removes the specified node from the layout. - * - * @param name the name of the component to be removed - * @see #addLayoutComponent - */ - public void removeLayoutNode(String name) { - - if ( name != null ) { - Node n; - if ( !( model instanceof Split )) - n = model; - else - n = getNodeForName( name ); - - childMap.remove(name); - - if ( n != null ) { - Split s = n.getParent(); - s.remove( n ); - if (removeDividers) { - while ( s.getChildren().size() < 2 ) { - Split p = s.getParent(); - if ( p == null ) { - if ( s.getChildren().size() > 0 ) - model = (Node)s.getChildren().get( 0 ); - else - model = null; - return; - } - if ( s.getChildren().size() == 1 ) { - Node next = s.getChildren().get( 0 ); - p.replace( s, next ); - next.setParent( p ); - } - else - p.remove( s ); - s = p; - } - } - } - else { - childMap.remove( name ); - } - } - } - - /** - * Show/Hide nodes. Any dividers that are no longer required due to one of the - * nodes being made visible/invisible are also shown/hidder. The visibility of - * the component managed by the node is also changed by this method - * @param name the node name - * @param visible the new node visible state - */ - public void displayNode( String name, boolean visible ) - { - Node node = getNodeForName( name ); - if ( node != null ) { - Component comp = getComponentForNode( node ); - comp.setVisible( visible ); - node.setVisible( visible ); - - MultiSplitLayout.Split p = node.getParent(); - if ( !visible ) { - p.hide( node ); - if ( !p.isVisible()) - p.getParent().hide( p ); - - p.checkDividers( p ); - // If the split has become invisible then the parent may also have a - // divider that needs to be hidden. - while ( !p.isVisible()) { - p = p.getParent(); - if ( p != null ) - p.checkDividers( p ); - else - break; - } - } - else - p.restoreDividers( p ); - } - setFloatingDividers( false ); - } - - private Component childForNode(Node node) { - if (node instanceof Leaf) { - Leaf leaf = (Leaf)node; - String name = leaf.getName(); - return (name != null) ? childMap.get(name) : null; - } - return null; - } - - - private Dimension preferredComponentSize(Node node) { - if ( layoutMode == NO_MIN_SIZE_LAYOUT ) - return new Dimension(0, 0); - - Component child = childForNode(node); - return ((child != null) && child.isVisible() ) ? child.getPreferredSize() : new Dimension(0, 0); - } - - @SuppressWarnings("unused") -private Dimension minimumComponentSize(Node node) { - if ( layoutMode == NO_MIN_SIZE_LAYOUT ) - return new Dimension(0, 0); - - Component child = childForNode(node); - return ((child != null) && child.isVisible() ) ? child.getMinimumSize() : new Dimension(0, 0); - } - - private Dimension preferredNodeSize(Node root) { - if (root instanceof Leaf) { - return preferredComponentSize(root); - } - else if (root instanceof Divider) { - if ( !((Divider)root).isVisible()) - return new Dimension(0,0); - int divSize = getDividerSize(); - return new Dimension(divSize, divSize); - } - else { - Split split = (Split)root; - List splitChildren = split.getChildren(); - int width = 0; - int height = 0; - if (split.isRowLayout()) { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = preferredNodeSize(splitChild); - width += size.width; - height = Math.max(height, size.height); - } - } - else { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = preferredNodeSize(splitChild); - width = Math.max(width, size.width); - height += size.height; - } - } - return new Dimension(width, height); - } - } - - /** - * Get the minimum size of this node. Sums the minumum sizes of rows or - * columns to get the overall minimum size for the layout node, including the - * dividers. - * @param root the node whose size is required. - * @return the minimum size. - */ - public Dimension minimumNodeSize(Node root) { - assert( root.isVisible ); - if (root instanceof Leaf) { - if ( layoutMode == NO_MIN_SIZE_LAYOUT ) - return new Dimension(0, 0); - - Component child = childForNode(root); - return ((child != null) && child.isVisible() ) ? child.getMinimumSize() : new Dimension(0, 0); - } - else if (root instanceof Divider) { - if ( !((Divider)root).isVisible() ) - return new Dimension(0,0); - int divSize = getDividerSize(); - return new Dimension(divSize, divSize); - } - else { - Split split = (Split)root; - List splitChildren = split.getChildren(); - int width = 0; - int height = 0; - if (split.isRowLayout()) { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = minimumNodeSize(splitChild); - width += size.width; - height = Math.max(height, size.height); - } - } - else { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = minimumNodeSize(splitChild); - width = Math.max(width, size.width); - height += size.height; - } - } - return new Dimension(width, height); - } - } - - /** - * Get the maximum size of this node. Sums the minumum sizes of rows or - * columns to get the overall maximum size for the layout node, including the - * dividers. - * @param root the node whose size is required. - * @return the minimum size. - */ - public Dimension maximumNodeSize(Node root) { - assert( root.isVisible ); - if (root instanceof Leaf) { - Component child = childForNode(root); - return ((child != null) && child.isVisible() ) ? child.getMaximumSize() : new Dimension(0, 0); - } - else if (root instanceof Divider) { - if ( !((Divider)root).isVisible() ) - return new Dimension(0,0); - int divSize = getDividerSize(); - return new Dimension(divSize, divSize); - } - else { - Split split = (Split)root; - List splitChildren = split.getChildren(); - int width = Integer.MAX_VALUE; - int height = Integer.MAX_VALUE; - if (split.isRowLayout()) { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = maximumNodeSize(splitChild); - width += size.width; - height = Math.min(height, size.height); - } - } - else { - for(Node splitChild : splitChildren) { - if ( !splitChild.isVisible()) - continue; - Dimension size = maximumNodeSize(splitChild); - width = Math.min(width, size.width); - height += size.height; - } - } - return new Dimension(width, height); - } - } - - private Dimension sizeWithInsets(Container parent, Dimension size) { - Insets insets = parent.getInsets(); - int width = size.width + insets.left + insets.right; - int height = size.height + insets.top + insets.bottom; - return new Dimension(width, height); - } - - public Dimension preferredLayoutSize(Container parent) { - Dimension size = preferredNodeSize(getModel()); - return sizeWithInsets(parent, size); - } - - public Dimension minimumLayoutSize(Container parent) { - Dimension size = minimumNodeSize(getModel()); - return sizeWithInsets(parent, size); - } - - - private Rectangle boundsWithYandHeight(Rectangle bounds, double y, double height) { - Rectangle r = new Rectangle(); - r.setBounds((int)(bounds.getX()), (int)y, (int)(bounds.getWidth()), (int)height); - return r; - } - - private Rectangle boundsWithXandWidth(Rectangle bounds, double x, double width) { - Rectangle r = new Rectangle(); - r.setBounds((int)x, (int)(bounds.getY()), (int)width, (int)(bounds.getHeight())); - return r; - } - - - private void minimizeSplitBounds(Split split, Rectangle bounds) { - assert ( split.isVisible()); - Rectangle splitBounds = new Rectangle(bounds.x, bounds.y, 0, 0); - List splitChildren = split.getChildren(); - Node lastChild = null; - int lastVisibleChildIdx = splitChildren.size(); - do { - lastVisibleChildIdx--; - lastChild = splitChildren.get( lastVisibleChildIdx ); - } while (( lastVisibleChildIdx > 0 ) && !lastChild.isVisible()); - - if ( !lastChild.isVisible()) - return; - if ( lastVisibleChildIdx >= 0 ) { - Rectangle lastChildBounds = lastChild.getBounds(); - if (split.isRowLayout()) { - int lastChildMaxX = lastChildBounds.x + lastChildBounds.width; - splitBounds.add(lastChildMaxX, bounds.y + bounds.height); - } - else { - int lastChildMaxY = lastChildBounds.y + lastChildBounds.height; - splitBounds.add(bounds.x + bounds.width, lastChildMaxY); - } - } - split.setBounds(splitBounds); - } - - - private void layoutShrink(Split split, Rectangle bounds) { - Rectangle splitBounds = split.getBounds(); - ListIterator splitChildren = split.getChildren().listIterator(); - - if (split.isRowLayout()) { - int totalWidth = 0; // sum of the children's widths - int minWeightedWidth = 0; // sum of the weighted childrens' min widths - int totalWeightedWidth = 0; // sum of the weighted childrens' widths - for(Node splitChild : split.getChildren()) { - if ( !splitChild.isVisible()) - continue; - int nodeWidth = splitChild.getBounds().width; - int nodeMinWidth = 0; - if (( layoutMode == USER_MIN_SIZE_LAYOUT ) && !( splitChild instanceof Divider )) - nodeMinWidth = userMinSize; - else if ( layoutMode == DEFAULT_LAYOUT ) - nodeMinWidth = Math.min(nodeWidth, minimumNodeSize(splitChild).width); - totalWidth += nodeWidth; - if (splitChild.getWeight() > 0.0) { - minWeightedWidth += nodeMinWidth; - totalWeightedWidth += nodeWidth; - } - } - - double x = bounds.getX(); - double extraWidth = splitBounds.getWidth() - bounds.getWidth(); - double availableWidth = extraWidth; - boolean onlyShrinkWeightedComponents = - (totalWeightedWidth - minWeightedWidth) > extraWidth; - - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - if ( splitChildren.hasNext()) - splitChildren.next(); - continue; - } - Rectangle splitChildBounds = splitChild.getBounds(); - double minSplitChildWidth = 0.0; - if (( layoutMode == USER_MIN_SIZE_LAYOUT ) && !( splitChild instanceof Divider )) - minSplitChildWidth = userMinSize; - else if ( layoutMode == DEFAULT_LAYOUT ) - minSplitChildWidth = minimumNodeSize(splitChild).getWidth(); - double splitChildWeight = (onlyShrinkWeightedComponents) - ? splitChild.getWeight() - : (splitChildBounds.getWidth() / (double)totalWidth); - - if (!splitChildren.hasNext()) { - double newWidth = Math.max(minSplitChildWidth, bounds.getMaxX() - x); - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, newWidth); - layout2(splitChild, newSplitChildBounds); - } - if ( splitChild.isVisible()) { - if ((availableWidth > 0.0) && (splitChildWeight > 0.0)) { - double oldWidth = splitChildBounds.getWidth(); - double newWidth; - if ( splitChild instanceof Divider ) { - newWidth = dividerSize; - } - else { - double allocatedWidth = Math.rint(splitChildWeight * extraWidth); - newWidth = Math.max(minSplitChildWidth, oldWidth - allocatedWidth); - } - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, newWidth); - layout2(splitChild, newSplitChildBounds); - availableWidth -= (oldWidth - splitChild.getBounds().getWidth()); - } - else { - double existingWidth = splitChildBounds.getWidth(); - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, existingWidth); - layout2(splitChild, newSplitChildBounds); - } - x = splitChild.getBounds().getMaxX(); - } - } - } - - else { - int totalHeight = 0; // sum of the children's heights - int minWeightedHeight = 0; // sum of the weighted childrens' min heights - int totalWeightedHeight = 0; // sum of the weighted childrens' heights - for(Node splitChild : split.getChildren()) { - if ( !splitChild.isVisible()) - continue; - int nodeHeight = splitChild.getBounds().height; - int nodeMinHeight = 0; - if (( layoutMode == USER_MIN_SIZE_LAYOUT ) && !( splitChild instanceof Divider )) - nodeMinHeight = userMinSize; - else if ( layoutMode == DEFAULT_LAYOUT ) - nodeMinHeight = Math.min(nodeHeight, minimumNodeSize(splitChild).height); - totalHeight += nodeHeight; - if (splitChild.getWeight() > 0.0) { - minWeightedHeight += nodeMinHeight; - totalWeightedHeight += nodeHeight; - } - } - - double y = bounds.getY(); - double extraHeight = splitBounds.getHeight() - bounds.getHeight(); - double availableHeight = extraHeight; - boolean onlyShrinkWeightedComponents = - (totalWeightedHeight - minWeightedHeight) > extraHeight; - - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - if ( splitChildren.hasNext()) - splitChildren.next(); - continue; - } - Rectangle splitChildBounds = splitChild.getBounds(); - double minSplitChildHeight = 0.0; - if (( layoutMode == USER_MIN_SIZE_LAYOUT ) && !( splitChild instanceof Divider )) - minSplitChildHeight = userMinSize; - else if ( layoutMode == DEFAULT_LAYOUT ) - minSplitChildHeight = minimumNodeSize(splitChild).getHeight(); - double splitChildWeight = (onlyShrinkWeightedComponents) - ? splitChild.getWeight() - : (splitChildBounds.getHeight() / (double)totalHeight); - - // If this split child is the last visible node it should all the - // remaining space - if ( !hasMoreVisibleSiblings( splitChild )) { - double oldHeight = splitChildBounds.getHeight(); - double newHeight; - if ( splitChild instanceof Divider ) { - newHeight = dividerSize; - } - else { - newHeight = Math.max(minSplitChildHeight, bounds.getMaxY() - y); - } - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, newHeight); - layout2(splitChild, newSplitChildBounds); - availableHeight -= (oldHeight - splitChild.getBounds().getHeight()); - } - else /*if ( splitChild.isVisible()) {*/ - if ((availableHeight > 0.0) && (splitChildWeight > 0.0)) { - double newHeight; - double oldHeight = splitChildBounds.getHeight(); - // Prevent the divider from shrinking - if ( splitChild instanceof Divider ) { - newHeight = dividerSize; - } - else { - double allocatedHeight = Math.rint(splitChildWeight * extraHeight); - newHeight = Math.max(minSplitChildHeight, oldHeight - allocatedHeight); - } - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, newHeight); - layout2(splitChild, newSplitChildBounds); - availableHeight -= (oldHeight - splitChild.getBounds().getHeight()); - } - else { - double existingHeight = splitChildBounds.getHeight(); - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, existingHeight); - layout2(splitChild, newSplitChildBounds); - } - y = splitChild.getBounds().getMaxY(); - } - } - - /* The bounds of the Split node root are set to be - * big enough to contain all of its children. Since - * Leaf children can't be reduced below their - * (corresponding java.awt.Component) minimum sizes, - * the size of the Split's bounds maybe be larger than - * the bounds we were asked to fit within. - */ - minimizeSplitBounds(split, bounds); - } - - /** - * Check if the specified node has any following visible siblings - * @param splitChild the node to check - * @param true if there are visible children following - */ - private boolean hasMoreVisibleSiblings( Node splitChild ) { - Node next = splitChild.nextSibling(); - if ( next == null ) - return false; - - do { - if ( next.isVisible()) - return true; - next = next.nextSibling(); - } while ( next != null ); - - return false; - } - - private void layoutGrow(Split split, Rectangle bounds) { - Rectangle splitBounds = split.getBounds(); - ListIterator splitChildren = split.getChildren().listIterator(); - Node lastWeightedChild = split.lastWeightedChild(); - - /* Layout the Split's child Nodes' along the X axis. The bounds - * of each child will have the same y coordinate and height as the - * layoutGrow() bounds argument. Extra width is allocated to the - * to each child with a non-zero weight: - * newWidth = currentWidth + (extraWidth * splitChild.getWeight()) - * Any extraWidth "left over" (that's availableWidth in the loop - * below) is given to the last child. Note that Dividers always - * have a weight of zero, and they're never the last child. - */ - if (split.isRowLayout()) { - double x = bounds.getX(); - double extraWidth = bounds.getWidth() - splitBounds.getWidth(); - double availableWidth = extraWidth; - - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - continue; - } - Rectangle splitChildBounds = splitChild.getBounds(); - double splitChildWeight = splitChild.getWeight(); - - if ( !hasMoreVisibleSiblings( splitChild )) { - double newWidth = bounds.getMaxX() - x; - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, newWidth); - layout2(splitChild, newSplitChildBounds); - } - else if ((availableWidth > 0.0) && (splitChildWeight > 0.0)) { - double allocatedWidth = (splitChild.equals(lastWeightedChild)) - ? availableWidth - : Math.rint(splitChildWeight * extraWidth); - double newWidth = splitChildBounds.getWidth() + allocatedWidth; - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, newWidth); - layout2(splitChild, newSplitChildBounds); - availableWidth -= allocatedWidth; - } - else { - double existingWidth = splitChildBounds.getWidth(); - Rectangle newSplitChildBounds = boundsWithXandWidth(bounds, x, existingWidth); - layout2(splitChild, newSplitChildBounds); - } - x = splitChild.getBounds().getMaxX(); - } - } - - /* Layout the Split's child Nodes' along the Y axis. The bounds - * of each child will have the same x coordinate and width as the - * layoutGrow() bounds argument. Extra height is allocated to the - * to each child with a non-zero weight: - * newHeight = currentHeight + (extraHeight * splitChild.getWeight()) - * Any extraHeight "left over" (that's availableHeight in the loop - * below) is given to the last child. Note that Dividers always - * have a weight of zero, and they're never the last child. - */ - else { - double y = bounds.getY(); - double extraHeight = bounds.getHeight() - splitBounds.getHeight(); - double availableHeight = extraHeight; - - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - continue; - } - Rectangle splitChildBounds = splitChild.getBounds(); - double splitChildWeight = splitChild.getWeight(); - - if (!splitChildren.hasNext()) { - double newHeight = bounds.getMaxY() - y; - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, newHeight); - layout2(splitChild, newSplitChildBounds); - } - else if ((availableHeight > 0.0) && (splitChildWeight > 0.0)) { - double allocatedHeight = (splitChild.equals(lastWeightedChild)) - ? availableHeight - : Math.rint(splitChildWeight * extraHeight); - double newHeight = splitChildBounds.getHeight() + allocatedHeight; - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, newHeight); - layout2(splitChild, newSplitChildBounds); - availableHeight -= allocatedHeight; - } - else { - double existingHeight = splitChildBounds.getHeight(); - Rectangle newSplitChildBounds = boundsWithYandHeight(bounds, y, existingHeight); - layout2(splitChild, newSplitChildBounds); - } - y = splitChild.getBounds().getMaxY(); - } - } - } - - - /* Second pass of the layout algorithm: branch to layoutGrow/Shrink - * as needed. - */ - private void layout2(Node root, Rectangle bounds) { - if (root instanceof Leaf) { - Component child = childForNode(root); - if (child != null) { - child.setBounds(bounds); - } - root.setBounds(bounds); - } - else if (root instanceof Divider) { - root.setBounds(bounds); - } - else if (root instanceof Split) { - Split split = (Split)root; - boolean grow = split.isRowLayout() - ? (split.getBounds().width <= bounds.width) - : (split.getBounds().height <= bounds.height); - if (grow) { - layoutGrow(split, bounds); - root.setBounds(bounds); - } - else { - layoutShrink(split, bounds); - // split.setBounds() called in layoutShrink() - } - } - } - - - /* First pass of the layout algorithm. - * - * If the Dividers are "floating" then set the bounds of each - * node to accomodate the preferred size of all of the - * Leaf's java.awt.Components. Otherwise, just set the bounds - * of each Leaf/Split node so that it's to the left of (for - * Split.isRowLayout() Split children) or directly above - * the Divider that follows. - * - * This pass sets the bounds of each Node in the layout model. It - * does not resize any of the parent Container's - * (java.awt.Component) children. That's done in the second pass, - * see layoutGrow() and layoutShrink(). - */ - private void layout1(Node root, Rectangle bounds) { - if (root instanceof Leaf) { - root.setBounds(bounds); - } - else if (root instanceof Split) { - Split split = (Split)root; - Iterator splitChildren = split.getChildren().iterator(); - Rectangle childBounds = null; - int divSize = getDividerSize(); - boolean initSplit = false; - - - /* Layout the Split's child Nodes' along the X axis. The bounds - * of each child will have the same y coordinate and height as the - * layout1() bounds argument. - * - * Note: the column layout code - that's the "else" clause below - * this if, is identical to the X axis (rowLayout) code below. - */ - if (split.isRowLayout()) { - double x = bounds.getX(); - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - if ( splitChildren.hasNext()) - splitChildren.next(); - continue; - } - Divider dividerChild = - (splitChildren.hasNext()) ? (Divider)(splitChildren.next()) : null; - - double childWidth = 0.0; - if (getFloatingDividers()) { - childWidth = preferredNodeSize(splitChild).getWidth(); - } - else { - if ((dividerChild != null) && dividerChild.isVisible()) { - double cw = dividerChild.getBounds().getX() - x; - if ( cw > 0.0 ) - childWidth = cw; - else { - childWidth = preferredNodeSize(splitChild).getWidth(); - initSplit = true; - } - } - else { - childWidth = split.getBounds().getMaxX() - x; - } - } - childBounds = boundsWithXandWidth(bounds, x, childWidth); - layout1(splitChild, childBounds); - - if (( initSplit || getFloatingDividers()) && (dividerChild != null) && dividerChild.isVisible()) { - double dividerX = childBounds.getMaxX(); - Rectangle dividerBounds; - dividerBounds = boundsWithXandWidth(bounds, dividerX, divSize); - dividerChild.setBounds(dividerBounds); - } - if ((dividerChild != null) && dividerChild.isVisible()) { - x = dividerChild.getBounds().getMaxX(); - } - } - } - - /* Layout the Split's child Nodes' along the Y axis. The bounds - * of each child will have the same x coordinate and width as the - * layout1() bounds argument. The algorithm is identical to what's - * explained above, for the X axis case. - */ - else { - double y = bounds.getY(); - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - if ( splitChildren.hasNext()) - splitChildren.next(); - continue; - } - Divider dividerChild = - (splitChildren.hasNext()) ? (Divider)(splitChildren.next()) : null; - - double childHeight = 0.0; - if (getFloatingDividers()) { - childHeight = preferredNodeSize(splitChild).getHeight(); - } - else { - if ((dividerChild != null) && dividerChild.isVisible()) { - double cy = dividerChild.getBounds().getY() - y; - if ( cy > 0.0 ) - childHeight = cy; - else { - childHeight = preferredNodeSize(splitChild).getHeight(); - initSplit = true; - } - } - else { - childHeight = split.getBounds().getMaxY() - y; - } - } - childBounds = boundsWithYandHeight(bounds, y, childHeight); - layout1(splitChild, childBounds); - - if (( initSplit || getFloatingDividers()) && (dividerChild != null) && dividerChild.isVisible()) { - double dividerY = childBounds.getMaxY(); - Rectangle dividerBounds = boundsWithYandHeight(bounds, dividerY, divSize); - dividerChild.setBounds(dividerBounds); - } - if ((dividerChild != null) && dividerChild.isVisible()) { - y = dividerChild.getBounds().getMaxY(); - } - } - } - /* The bounds of the Split node root are set to be just - * big enough to contain all of its children, but only - * along the axis it's allocating space on. That's - * X for rows, Y for columns. The second pass of the - * layout algorithm - see layoutShrink()/layoutGrow() - * allocates extra space. - */ - minimizeSplitBounds(split, bounds); - } - } - - /** - * Get the layout mode - * @return current layout mode - */ - public int getLayoutMode() - { - return layoutMode; - } - - /** - * Set the layout mode. By default this layout uses the preferred and minimum - * sizes of the child components. To ignore the minimum size set the layout - * mode to MultiSplitLayout.LAYOUT_NO_MIN_SIZE. - * @param layoutMode the layout mode - *

      - *
    • DEFAULT_LAYOUT - use the preferred and minimum sizes when sizing the children
    • - *
    • LAYOUT_NO_MIN_SIZE - ignore the minimum size when sizing the children
    • - * - */ - public void setLayoutMode( int layoutMode ) - { - this.layoutMode = layoutMode; - } - - /** - * Get the minimum node size - * @return the minimum size - */ - public int getUserMinSize() - { - return userMinSize; - } - - /** - * Set the user defined minimum size support in the USER_MIN_SIZE_LAYOUT - * layout mode. - * @param minSize the new minimum size - */ - public void setUserMinSize( int minSize ) - { - userMinSize = minSize; - } - - /** - * Get the layoutByWeight falg. If the flag is true the layout initializes - * itself using the model weights - * @return the layoutByWeight - */ - public boolean getLayoutByWeight() - { - return layoutByWeight; - } - - /** - * Sset the layoutByWeight falg. If the flag is true the layout initializes - * itself using the model weights - * @param state the new layoutByWeight to set - */ - public void setLayoutByWeight( boolean state ) - { - layoutByWeight = state; - } - - /** - * The specified Node is either the wrong type or was configured - * incorrectly. - */ - public static class InvalidLayoutException extends RuntimeException { - private static final long serialVersionUID = -5960249230256779327L; - private final Node node; - public InvalidLayoutException(String msg, Node node) { - super(msg); - this.node = node; - } - /** - * @return the invalid Node. - */ - public Node getNode() { return node; } - } - - private void throwInvalidLayout(String msg, Node node) { - throw new InvalidLayoutException(msg, node); - } - - private void checkLayout(Node root) { - if (root instanceof Split) { - Split split = (Split)root; - if (split.getChildren().size() <= 2) { - throwInvalidLayout("Split must have > 2 children", root); - } - Iterator splitChildren = split.getChildren().iterator(); - double weight = 0.0; - while(splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - if ( splitChildren.hasNext()) - splitChildren.next(); - continue; - } - if (splitChild instanceof Divider) { - continue; - //throwInvalidLayout("expected a Split or Leaf Node", splitChild); - } - if (splitChildren.hasNext()) { - Node dividerChild = splitChildren.next(); - if (!(dividerChild instanceof Divider)) { - throwInvalidLayout("expected a Divider Node", dividerChild); - } - } - weight += splitChild.getWeight(); - checkLayout(splitChild); - } - if (weight > 1.0) { - throwInvalidLayout("Split children's total weight > 1.0", root); - } - } - } - - /** - * Compute the bounds of all of the Split/Divider/Leaf Nodes in - * the layout model, and then set the bounds of each child component - * with a matching Leaf Node. - */ - public void layoutContainer(Container parent) - { - if ( layoutByWeight && floatingDividers ) - doLayoutByWeight( parent ); - - checkLayout(getModel()); - Insets insets = parent.getInsets(); - Dimension size = parent.getSize(); - int width = size.width - (insets.left + insets.right); - int height = size.height - (insets.top + insets.bottom); - Rectangle bounds = new Rectangle( insets.left, insets.top, width, height); - layout1(getModel(), bounds); - layout2(getModel(), bounds); - } - - - private Divider dividerAt(Node root, int x, int y) { - if (root instanceof Divider) { - Divider divider = (Divider)root; - return (divider.getBounds().contains(x, y)) ? divider : null; - } - else if (root instanceof Split) { - Split split = (Split)root; - for(Node child : split.getChildren()) { - if ( !child.isVisible()) - continue; - if (child.getBounds().contains(x, y)) { - return dividerAt(child, x, y); - } - } - } - return null; - } - - /** - * Return the Divider whose bounds contain the specified - * point, or null if there isn't one. - * - * @param x x coordinate - * @param y y coordinate - * @return the Divider at x,y - */ - public Divider dividerAt(int x, int y) { - return dividerAt(getModel(), x, y); - } - - private boolean nodeOverlapsRectangle(Node node, Rectangle r2) { - Rectangle r1 = node.getBounds(); - return - (r1.x <= (r2.x + r2.width)) && ((r1.x + r1.width) >= r2.x) && - (r1.y <= (r2.y + r2.height)) && ((r1.y + r1.height) >= r2.y); - } - - private List dividersThatOverlap(Node root, Rectangle r) { - if (nodeOverlapsRectangle(root, r) && (root instanceof Split)) { - List dividers = new ArrayList(); - for(Node child : ((Split)root).getChildren()) { - if (child instanceof Divider) { - if (nodeOverlapsRectangle(child, r)) { - dividers.add((Divider)child); - } - } - else if (child instanceof Split) { - dividers.addAll(dividersThatOverlap(child, r)); - } - } - return dividers; - } - else { - return Collections.emptyList(); - } - } - - /** - * Return the Dividers whose bounds overlap the specified - * Rectangle. - * - * @param r target Rectangle - * @return the Dividers that overlap r - * @throws IllegalArgumentException if the Rectangle is null - */ - public List dividersThatOverlap(Rectangle r) { - if (r == null) { - throw new IllegalArgumentException("null Rectangle"); - } - return dividersThatOverlap(getModel(), r); - } - - - /** - * Base class for the nodes that model a MultiSplitLayout. - */ - public static abstract class Node { - private Split parent = null; - private Rectangle bounds = new Rectangle(); - private double weight = 0.0; - private boolean isVisible = true; - public void setVisible( boolean b ) { - isVisible = b; - } - - /** - * Determines whether this node should be visible when its - * parent is visible. Nodes are - * initially visible - * @return true if the node is visible, - * false otherwise - */ - public boolean isVisible() { - return isVisible; - } - - /** - * Returns the Split parent of this Node, or null. - * - * @return the value of the parent property. - * @see #setParent - */ - public Split getParent() { return parent; } - - /** - * Set the value of this Node's parent property. The default - * value of this property is null. - * - * @param parent a Split or null - * @see #getParent - */ - public void setParent(Split parent) { - this.parent = parent; - } - - /** - * Returns the bounding Rectangle for this Node. - * - * @return the value of the bounds property. - * @see #setBounds - */ - public Rectangle getBounds() { - return new Rectangle(this.bounds); - } - - /** - * Set the bounding Rectangle for this node. The value of - * bounds may not be null. The default value of bounds - * is equal to new Rectangle(0,0,0,0). - * - * @param bounds the new value of the bounds property - * @throws IllegalArgumentException if bounds is null - * @see #getBounds - */ - public void setBounds(Rectangle bounds) { - if (bounds == null) { - throw new IllegalArgumentException("null bounds"); - } - this.bounds = new Rectangle(bounds); - } - - /** - * Value between 0.0 and 1.0 used to compute how much space - * to add to this sibling when the layout grows or how - * much to reduce when the layout shrinks. - * - * @return the value of the weight property - * @see #setWeight - */ - public double getWeight() { return weight; } - - /** - * The weight property is a between 0.0 and 1.0 used to - * compute how much space to add to this sibling when the - * layout grows or how much to reduce when the layout shrinks. - * If rowLayout is true then this node's width grows - * or shrinks by (extraSpace * weight). If rowLayout is false, - * then the node's height is changed. The default value - * of weight is 0.0. - * - * @param weight a double between 0.0 and 1.0 - * @see #getWeight - * @see MultiSplitLayout#layoutContainer - * @throws IllegalArgumentException if weight is not between 0.0 and 1.0 - */ - public void setWeight(double weight) { - if ((weight < 0.0)|| (weight > 1.0)) { - throw new IllegalArgumentException("invalid weight"); - } - this.weight = weight; - } - - private Node siblingAtOffset(int offset) { - Split p = getParent(); - if (p == null) { return null; } - List siblings = p.getChildren(); - int index = siblings.indexOf(this); - if (index == -1) { return null; } - index += offset; - return ((index > -1) && (index < siblings.size())) ? siblings.get(index) : null; - } - - /** - * Return the Node that comes after this one in the parent's - * list of children, or null. If this node's parent is null, - * or if it's the last child, then return null. - * - * @return the Node that comes after this one in the parent's list of children. - * @see #previousSibling - * @see #getParent - */ - public Node nextSibling() { - return siblingAtOffset(+1); - } - - /** - * Return the Node that comes before this one in the parent's - * list of children, or null. If this node's parent is null, - * or if it's the last child, then return null. - * - * @return the Node that comes before this one in the parent's list of children. - * @see #nextSibling - * @see #getParent - */ - public Node previousSibling() { - return siblingAtOffset(-1); - } - } - - public static class RowSplit extends Split { - public RowSplit() { - } - - public RowSplit(Node... children) { - setChildren(children); - } - - /** - * Returns true if the this Split's children are to be - * laid out in a row: all the same height, left edge - * equal to the previous Node's right edge. If false, - * children are laid on in a column. - * - * @return the value of the rowLayout property. - * @see #setRowLayout - */ - @Override - public final boolean isRowLayout() { return true; } - } - - public static class ColSplit extends Split { - public ColSplit() { - } - - public ColSplit(Node... children) { - setChildren(children); - } - - /** - * Returns true if the this Split's children are to be - * laid out in a row: all the same height, left edge - * equal to the previous Node's right edge. If false, - * children are laid on in a column. - * - * @return the value of the rowLayout property. - * @see #setRowLayout - */ - @Override - public final boolean isRowLayout() { return false; } - } - - /** - * Defines a vertical or horizontal subdivision into two or more - * tiles. - */ - public static class Split extends Node { - private List children = Collections.emptyList(); - private boolean rowLayout = true; - private String name; - - public Split(Node... children) { - setChildren(children); - } - - /** - * Default constructor to support xml (de)serialization and other bean spec dependent ops. - * Resulting instance of Split is invalid until setChildren() is called. - */ - public Split() { - } - - /** - * Determines whether this node should be visible when its - * parent is visible. Nodes are - * initially visible - * @return true if the node is visible, - * false otherwise - */ - @Override - public boolean isVisible() { - for(Node child : children) { - if ( child.isVisible() && !( child instanceof Divider )) - return true; - } - return false; - } - - /** - * Returns true if the this Split's children are to be - * laid out in a row: all the same height, left edge - * equal to the previous Node's right edge. If false, - * children are laid on in a column. - * - * @return the value of the rowLayout property. - * @see #setRowLayout - */ - public boolean isRowLayout() { return rowLayout; } - - /** - * Set the rowLayout property. If true, all of this Split's - * children are to be laid out in a row: all the same height, - * each node's left edge equal to the previous Node's right - * edge. If false, children are laid on in a column. Default - * value is true. - * - * @param rowLayout true for horizontal row layout, false for column - * @see #isRowLayout - */ - public void setRowLayout(boolean rowLayout) { - this.rowLayout = rowLayout; - } - - /** - * Returns this Split node's children. The returned value - * is not a reference to the Split's internal list of children - * - * @return the value of the children property. - * @see #setChildren - */ - public List getChildren() { - return new ArrayList(children); - } - - - /** - * Remove a node from the layout. Any sibling dividers will also be removed - * @param n the node to be removed - */ - public void remove( Node n ) { - if ( n.nextSibling() instanceof Divider ) - children.remove( n.nextSibling() ); - else if ( n.previousSibling() instanceof Divider ) - children.remove( n.previousSibling() ); - children.remove( n ); - } - - /** - * Replace one node with another. This method is used when a child is removed - * from a split and the split is no longer required, in which case the - * remaining node in the child split can replace the split in the parent - * node - * @param target the node being replaced - * @param replacement the replacement node - */ - public void replace( Node target, Node replacement ) { - int idx = children.indexOf( target ); - children.remove( target ); - children.add( idx, replacement ); - - replacement.setParent ( this ); - target.setParent( this ); - } - - /** - * Change a node to being hidden. Any associated divider nodes are also hidden - * @param target the node to hide - */ - public void hide( Node target ){ - Node next = target.nextSibling(); - if ( next instanceof Divider ) - next.setVisible( false ); - else { - Node prev = target.previousSibling(); - if ( prev instanceof Divider ) - prev.setVisible( false ); - } - target.setVisible( false ); - } - - /** - * Check the dividers to ensure that redundant dividers are hidden and do - * not interfere in the layout, for example when all the children of a split - * are hidden (the split is then invisible), so two dividers may otherwise - * appear next to one another. - * @param split the split to check - */ - public void checkDividers( Split split ) { - ListIterator splitChildren = split.getChildren().listIterator(); - while( splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( !splitChild.isVisible()) { - continue; - } - else if ( splitChildren.hasNext()) { - Node dividerChild = splitChildren.next(); - if ( dividerChild instanceof Divider ) { - if ( splitChildren.hasNext()) { - Node rightChild = splitChildren.next(); - while ( !rightChild.isVisible()) { - rightChild = rightChild.nextSibling(); - if ( rightChild == null ) { - // No visible right sibling found, so hide the divider - dividerChild.setVisible( false ); - break; - } - } - - // A visible child is found but it's a divider and therefore - // we have to visible and adjacent dividers - so we hide one - if (( rightChild != null ) && ( rightChild instanceof Divider )) - dividerChild.setVisible( false ); - } - } - else if (( splitChild instanceof Divider ) && ( dividerChild instanceof Divider )) { - splitChild.setVisible( false ); - } - } - } - } - - /** - * Restore any of the hidden dividers that are required to separate visible nodes - * @param split the node to check - */ - public void restoreDividers( Split split ) { - ListIterator splitChildren = split.getChildren().listIterator(); - while( splitChildren.hasNext()) { - Node splitChild = splitChildren.next(); - if ( splitChild instanceof Divider ) { - Node prev = splitChild.previousSibling(); - if ( prev.isVisible()) { - Node next = splitChild.nextSibling(); - while ( next != null ) { - if ( next.isVisible()) { - splitChild.setVisible( true ); - break; - } - next = next.nextSibling(); - } - } - } - } - if ( split.getParent() != null ) - restoreDividers( split.getParent()); - } - - /** - * Set's the children property of this Split node. The parent - * of each new child is set to this Split node, and the parent - * of each old child (if any) is set to null. This method - * defensively copies the incoming List. Default value is - * an empty List. - * - * @param children List of children - * @see #getChildren - * @throws IllegalArgumentException if children is null - */ - public void setChildren(List children) { - if (children == null) { - throw new IllegalArgumentException("children must be a non-null List"); - } - for(Node child : this.children) { - child.setParent(null); - } - - this.children = new ArrayList(children); - for(Node child : this.children) { - child.setParent(this); - } - } - - /** - * Convenience method for setting the children of this Split node. The parent - * of each new child is set to this Split node, and the parent - * of each old child (if any) is set to null. This method - * defensively copies the incoming array. - * - * @param children array of children - * @see #getChildren - * @throws IllegalArgumentException if children is null - */ - public void setChildren(Node... children) { - setChildren(children == null ? null : Arrays.asList(children)); - } - - /** - * Convenience method that returns the last child whose weight - * is > 0.0. - * - * @return the last child whose weight is > 0.0. - * @see #getChildren - * @see Node#getWeight - */ - public final Node lastWeightedChild() { - List kids = getChildren(); - Node weightedChild = null; - for(Node child : kids) { - if ( !child.isVisible()) - continue; - if (child.getWeight() > 0.0) { - weightedChild = child; - } - } - return weightedChild; - } - - /** - * Return the Leaf's name. - * - * @return the value of the name property. - * @see #setName - */ - public String getName() { return name; } - - /** - * Set the value of the name property. Name may not be null. - * - * @param name value of the name property - * @throws IllegalArgumentException if name is null - */ - public void setName(String name) { - if (name == null) { - throw new IllegalArgumentException("name is null"); - } - this.name = name; - } - - @Override - public String toString() { - int nChildren = getChildren().size(); - StringBuffer sb = new StringBuffer("MultiSplitLayout.Split"); - sb.append(" \""); - sb.append(getName()); - sb.append("\""); - sb.append(isRowLayout() ? " ROW [" : " COLUMN ["); - sb.append(nChildren + ((nChildren == 1) ? " child" : " children")); - sb.append("] "); - sb.append(getBounds()); - return sb.toString(); - } - } - - - /** - * Models a java.awt Component child. - */ - public static class Leaf extends Node { - private String name = ""; - - /** - * Create a Leaf node. The default value of name is "". - */ - public Leaf() { } - - - /** - * Create a Leaf node with the specified name. Name can not - * be null. - * - * @param name value of the Leaf's name property - * @throws IllegalArgumentException if name is null - */ - public Leaf(String name) { - if (name == null) { - throw new IllegalArgumentException("name is null"); - } - this.name = name; - } - - /** - * Return the Leaf's name. - * - * @return the value of the name property. - * @see #setName - */ - public String getName() { return name; } - - /** - * Set the value of the name property. Name may not be null. - * - * @param name value of the name property - * @throws IllegalArgumentException if name is null - */ - public void setName(String name) { - if (name == null) { - throw new IllegalArgumentException("name is null"); - } - this.name = name; - } - - @Override - public String toString() { - StringBuffer sb = new StringBuffer("MultiSplitLayout.Leaf"); - sb.append(" \""); - sb.append(getName()); - sb.append("\""); - sb.append(" weight="); - sb.append(getWeight()); - sb.append(" "); - sb.append(getBounds()); - return sb.toString(); - } - } - - - /** - * Models a single vertical/horiztonal divider. - */ - public static class Divider extends Node { - /** - * Convenience method, returns true if the Divider's parent - * is a Split row (a Split with isRowLayout() true), false - * otherwise. In other words if this Divider's major axis - * is vertical, return true. - * - * @return true if this Divider is part of a Split row. - */ - public final boolean isVertical() { - Split parent = getParent(); - return (parent != null) ? parent.isRowLayout() : false; - } - - /** - * Dividers can't have a weight, they don't grow or shrink. - * @throws UnsupportedOperationException - */ - @Override - public void setWeight(double weight) { - throw new UnsupportedOperationException(); - } - - @Override - public String toString() { - return "MultiSplitLayout.Divider " + getBounds().toString(); - } - } - - - private static void throwParseException(StreamTokenizer st, String msg) throws Exception { - throw new Exception("MultiSplitLayout.parseModel Error: " + msg); - } - - private static void parseAttribute(String name, StreamTokenizer st, Node node) throws Exception { - if ((st.nextToken() != '=')) { - throwParseException(st, "expected '=' after " + name); - } - if (name.equalsIgnoreCase("WEIGHT")) { - if (st.nextToken() == StreamTokenizer.TT_NUMBER) { - node.setWeight(st.nval); - } - else { - throwParseException(st, "invalid weight"); - } - } - else if (name.equalsIgnoreCase("NAME")) { - if (st.nextToken() == StreamTokenizer.TT_WORD) { - if (node instanceof Leaf) { - ((Leaf)node).setName(st.sval); - } - else if (node instanceof Split) { - ((Split)node).setName(st.sval); - } - else { - throwParseException(st, "can't specify name for " + node); - } - } - else { - throwParseException(st, "invalid name"); - } - } - else { - throwParseException(st, "unrecognized attribute \"" + name + "\""); - } - } - - private static void addSplitChild(Split parent, Node child) { - List children = new ArrayList(parent.getChildren()); - if (children.size() == 0) { - children.add(child); - } - else { - children.add(new Divider()); - children.add(child); - } - parent.setChildren(children); - } - - private static void parseLeaf(StreamTokenizer st, Split parent) throws Exception { - Leaf leaf = new Leaf(); - int token; - while ((token = st.nextToken()) != StreamTokenizer.TT_EOF) { - if (token == ')') { - break; - } - if (token == StreamTokenizer.TT_WORD) { - parseAttribute(st.sval, st, leaf); - } - else { - throwParseException(st, "Bad Leaf: " + leaf); - } - } - addSplitChild(parent, leaf); - } - - private static void parseSplit(StreamTokenizer st, Split parent) throws Exception { - int token; - while ((token = st.nextToken()) != StreamTokenizer.TT_EOF) { - if (token == ')') { - break; - } - else if (token == StreamTokenizer.TT_WORD) { - if (st.sval.equalsIgnoreCase("WEIGHT")) { - parseAttribute(st.sval, st, parent); - } - else if (st.sval.equalsIgnoreCase("NAME")) { - parseAttribute(st.sval, st, parent); - } - else { - addSplitChild(parent, new Leaf(st.sval)); - } - } - else if (token == '(') { - if ((token = st.nextToken()) != StreamTokenizer.TT_WORD) { - throwParseException(st, "invalid node type"); - } - String nodeType = st.sval.toUpperCase(); - if (nodeType.equals("LEAF")) { - parseLeaf(st, parent); - } - else if (nodeType.equals("ROW") || nodeType.equals("COLUMN")) { - Split split = new Split(); - split.setRowLayout(nodeType.equals("ROW")); - addSplitChild(parent, split); - parseSplit(st, split); - } - else { - throwParseException(st, "unrecognized node type '" + nodeType + "'"); - } - } - } - } - - private static Node parseModel(Reader r) { - StreamTokenizer st = new StreamTokenizer(r); - try { - Split root = new Split(); - parseSplit(st, root); - return root.getChildren().get(0); - } - catch (Exception e) { - System.err.println(e); - } - finally { - try { r.close(); } catch (IOException ignore) {} - } - return null; - } - - /** - * A convenience method that converts a string to a - * MultiSplitLayout model (a tree of Nodes) using a - * a simple syntax. Nodes are represented by - * parenthetical expressions whose first token - * is one of ROW/COLUMN/LEAF. ROW and COLUMN specify - * horizontal and vertical Split nodes respectively, - * LEAF specifies a Leaf node. A Leaf's name and - * weight can be specified with attributes, - * name=myLeafName weight=myLeafWeight. - * Similarly, a Split's weight can be specified with - * weight=mySplitWeight. - * - *

      For example, the following expression generates - * a horizontal Split node with three children: - * the Leafs named left and right, and a Divider in - * between: - *

      -   * (ROW (LEAF name=left) (LEAF name=right weight=1.0))
      -   * 
      - * - *

      Dividers should not be included in the string, - * they're added automatcially as needed. Because - * Leaf nodes often only need to specify a name, one - * can specify a Leaf by just providing the name. - * The previous example can be written like this: - *

      -   * (ROW left (LEAF name=right weight=1.0))
      -   * 
      - * - *

      Here's a more complex example. One row with - * three elements, the first and last of which are columns - * with two leaves each: - *

      -   * (ROW (COLUMN weight=0.5 left.top left.bottom)
      -   *      (LEAF name=middle)
      -   *      (COLUMN weight=0.5 right.top right.bottom))
      -   * 
      - * - * - *

      This syntax is not intended for archiving or - * configuration files . It's just a convenience for - * examples and tests. - * - * @return the Node root of a tree based on s. - */ - public static Node parseModel(String s) { - return parseModel(new StringReader(s)); - } - - - private static void printModel(String indent, Node root) { - if (root instanceof Split) { - Split split = (Split)root; - System.out.println(indent + split); - for(Node child : split.getChildren()) { - printModel(indent + " ", child); - } - } - else { - System.out.println(indent + root); - } - } - - /** - * Print the tree with enough detail for simple debugging. - */ - public static void printModel(Node root) { - printModel("", root); - } -} \ No newline at end of file diff --git a/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java b/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java deleted file mode 100644 index 4c1980eb1ff..00000000000 --- a/src/org/jdesktop/swingx/graphics/GraphicsUtilities.java +++ /dev/null @@ -1,765 +0,0 @@ -/* - * $Id$ - * - * Dual-licensed under LGPL (Sun and Romain Guy) and BSD (Romain Guy). - * - * Copyright 2005 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * Copyright (c) 2006 Romain Guy - * 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 name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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. - */ - -package org.jdesktop.swingx.graphics; - -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GraphicsConfiguration; -import java.awt.GraphicsEnvironment; -import java.awt.Image; -import java.awt.RenderingHints; -import java.awt.Shape; -import java.awt.Transparency; -import java.awt.geom.Area; -import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; -import java.awt.image.Raster; -import java.awt.image.WritableRaster; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; - -import javax.imageio.ImageIO; - -/** - *

      GraphicsUtilities contains a set of tools to perform - * common graphics operations easily. These operations are divided into - * several themes, listed below.

      - * - *

      Compatible Images

      - * - *

      Compatible images can, and should, be used to increase drawing - * performance. This class provides a number of methods to load compatible - * images directly from files or to convert existing images to compatibles - * images.

      - * - *

      Creating Thumbnails

      - * - *

      This class provides a number of methods to easily scale down images. - * Some of these methods offer a trade-off between speed and result quality and - * shouuld be used all the time. They also offer the advantage of producing - * compatible images, thus automatically resulting into better runtime - * performance.

      - * - *

      All these methodes are both faster than - * {@link java.awt.Image#getScaledInstance(int, int, int)} and produce - * better-looking results than the various drawImage() methods - * in {@link java.awt.Graphics}, which can be used for image scaling.

      - *

      Image Manipulation

      - * - *

      This class provides two methods to get and set pixels in a buffered image. - * These methods try to avoid unmanaging the image in order to keep good - * performance.

      - * - * @author Romain Guy - * @author rbair - */ -public class GraphicsUtilities { - private GraphicsUtilities() { - } - - // Returns the graphics configuration for the primary screen - private static GraphicsConfiguration getGraphicsConfiguration() { - return GraphicsEnvironment.getLocalGraphicsEnvironment(). - getDefaultScreenDevice().getDefaultConfiguration(); - } - - private static boolean isHeadless() { - return GraphicsEnvironment.isHeadless(); - } - - /** - * Converts the specified image into a compatible buffered image. - * - * @param img - * the image to convert - * @return a compatible buffered image of the input - */ - public static BufferedImage convertToBufferedImage(Image img) { - BufferedImage buff = createCompatibleTranslucentImage( - img.getWidth(null), img.getHeight(null)); - Graphics2D g2 = buff.createGraphics(); - - try { - g2.drawImage(img, 0, 0, null); - } finally { - g2.dispose(); - } - - return buff; - } - - /** - *

      Returns a new BufferedImage using the same color model - * as the image passed as a parameter. The returned image is only compatible - * with the image passed as a parameter. This does not mean the returned - * image is compatible with the hardware.

      - * - * @param image the reference image from which the color model of the new - * image is obtained - * @return a new BufferedImage, compatible with the color model - * of image - */ - public static BufferedImage createColorModelCompatibleImage(BufferedImage image) { - ColorModel cm = image.getColorModel(); - return new BufferedImage(cm, - cm.createCompatibleWritableRaster(image.getWidth(), - image.getHeight()), - cm.isAlphaPremultiplied(), null); - } - - /** - *

      Returns a new compatible image with the same width, height and - * transparency as the image specified as a parameter. That is, the - * returned BufferedImage will be compatible with the graphics hardware. - * If this method is called in a headless environment, then - * the returned BufferedImage will be compatible with the source - * image.

      - * - * @see java.awt.Transparency - * @see #createCompatibleImage(int, int) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #loadCompatibleImage(java.net.URL) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param image the reference image from which the dimension and the - * transparency of the new image are obtained - * @return a new compatible BufferedImage with the same - * dimension and transparency as image - */ - public static BufferedImage createCompatibleImage(BufferedImage image) { - return createCompatibleImage(image, image.getWidth(), image.getHeight()); - } - - /** - *

      Returns a new compatible image of the specified width and height, and - * the same transparency setting as the image specified as a parameter. - * That is, the returned BufferedImage is compatible with - * the graphics hardware. If the method is called in a headless - * environment, then the returned BufferedImage will be compatible with - * the source image.

      - * - * @see java.awt.Transparency - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #loadCompatibleImage(java.net.URL) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param width the width of the new image - * @param height the height of the new image - * @param image the reference image from which the transparency of the new - * image is obtained - * @return a new compatible BufferedImage with the same - * transparency as image and the specified dimension - */ - public static BufferedImage createCompatibleImage(BufferedImage image, - int width, int height) { - return isHeadless() ? - new BufferedImage(width, height, image.getType()) : - getGraphicsConfiguration().createCompatibleImage(width, height, - image.getTransparency()); - } - - /** - *

      Returns a new opaque compatible image of the specified width and - * height. That is, the returned BufferedImage is compatible with - * the graphics hardware. If the method is called in a headless - * environment, then the returned BufferedImage will be compatible with - * the source image.

      - * - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #loadCompatibleImage(java.net.URL) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param width the width of the new image - * @param height the height of the new image - * @return a new opaque compatible BufferedImage of the - * specified width and height - */ - public static BufferedImage createCompatibleImage(int width, int height) { - return isHeadless() ? - new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB) : - getGraphicsConfiguration().createCompatibleImage(width, height); - } - - /** - *

      Returns a new translucent compatible image of the specified width and - * height. That is, the returned BufferedImage is compatible with - * the graphics hardware. If the method is called in a headless - * environment, then the returned BufferedImage will be compatible with - * the source image.

      - * - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleImage(int, int) - * @see #loadCompatibleImage(java.net.URL) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param width the width of the new image - * @param height the height of the new image - * @return a new translucent compatible BufferedImage of the - * specified width and height - */ - public static BufferedImage createCompatibleTranslucentImage(int width, - int height) { - return isHeadless() ? - new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) : - getGraphicsConfiguration().createCompatibleImage(width, height, - Transparency.TRANSLUCENT); - } - - /** - *

      - * Returns a new compatible image from a stream. The image is loaded from - * the specified stream and then turned, if necessary into a compatible - * image. - *

      - * - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleImage(int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param in - * the stream of the picture to load as a compatible image - * @return a new translucent compatible BufferedImage of the - * specified width and height - * @throws java.io.IOException - * if the image cannot be read or loaded - */ - public static BufferedImage loadCompatibleImage(InputStream in) throws IOException { - BufferedImage image = ImageIO.read(in); - if(image == null) return null; - return toCompatibleImage(image); - } - - /** - *

      Returns a new compatible image from a URL. The image is loaded from the - * specified location and then turned, if necessary into a compatible - * image.

      - * - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleImage(int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #toCompatibleImage(java.awt.image.BufferedImage) - * @param resource the URL of the picture to load as a compatible image - * @return a new translucent compatible BufferedImage of the - * specified width and height - * @throws java.io.IOException if the image cannot be read or loaded - */ - public static BufferedImage loadCompatibleImage(URL resource) - throws IOException { - BufferedImage image = ImageIO.read(resource); - return toCompatibleImage(image); - } - - /** - *

      Return a new compatible image that contains a copy of the specified - * image. This method ensures an image is compatible with the hardware, - * and therefore optimized for fast blitting operations.

      - * - *

      If the method is called in a headless environment, then the returned - * BufferedImage will be the source image.

      - * - * @see #createCompatibleImage(java.awt.image.BufferedImage) - * @see #createCompatibleImage(java.awt.image.BufferedImage, int, int) - * @see #createCompatibleImage(int, int) - * @see #createCompatibleTranslucentImage(int, int) - * @see #loadCompatibleImage(java.net.URL) - * @param image the image to copy into a new compatible image - * @return a new compatible copy, with the - * same width and height and transparency and content, of image - */ - public static BufferedImage toCompatibleImage(BufferedImage image) { - if (isHeadless()) { - return image; - } - - if (image.getColorModel().equals( - getGraphicsConfiguration().getColorModel())) { - return image; - } - - BufferedImage compatibleImage = - getGraphicsConfiguration().createCompatibleImage( - image.getWidth(), image.getHeight(), - image.getTransparency()); - Graphics g = compatibleImage.getGraphics(); - - try { - g.drawImage(image, 0, 0, null); - } finally { - g.dispose(); - } - - return compatibleImage; - } - - /** - *

      Returns a thumbnail of a source image. newSize defines - * the length of the longest dimension of the thumbnail. The other - * dimension is then computed according to the dimensions ratio of the - * original picture.

      - *

      This method favors speed over quality. When the new size is less than - * half the longest dimension of the source image, - * {@link #createThumbnail(BufferedImage, int)} or - * {@link #createThumbnail(BufferedImage, int, int)} should be used instead - * to ensure the quality of the result without sacrificing too much - * performance.

      - * - * @see #createThumbnailFast(java.awt.image.BufferedImage, int, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int, int) - * @param image the source image - * @param newSize the length of the largest dimension of the thumbnail - * @return a new compatible BufferedImage containing a - * thumbnail of image - * @throws IllegalArgumentException if newSize is larger than - * the largest dimension of image or <= 0 - */ - public static BufferedImage createThumbnailFast(BufferedImage image, - int newSize) { - float ratio; - int width = image.getWidth(); - int height = image.getHeight(); - - if (width > height) { - if (newSize >= width) { - throw new IllegalArgumentException("newSize must be lower than" + - " the image width"); - } else if (newSize <= 0) { - throw new IllegalArgumentException("newSize must" + - " be greater than 0"); - } - - ratio = (float) width / (float) height; - width = newSize; - height = (int) (newSize / ratio); - } else { - if (newSize >= height) { - throw new IllegalArgumentException("newSize must be lower than" + - " the image height"); - } else if (newSize <= 0) { - throw new IllegalArgumentException("newSize must" + - " be greater than 0"); - } - - ratio = (float) height / (float) width; - height = newSize; - width = (int) (newSize / ratio); - } - - BufferedImage temp = createCompatibleImage(image, width, height); - Graphics2D g2 = temp.createGraphics(); - - try { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(image, 0, 0, temp.getWidth(), temp.getHeight(), null); - } finally { - g2.dispose(); - } - - return temp; - } - - /** - *

      Returns a thumbnail of a source image.

      - *

      This method favors speed over quality. When the new size is less than - * half the longest dimension of the source image, - * {@link #createThumbnail(BufferedImage, int)} or - * {@link #createThumbnail(BufferedImage, int, int)} should be used instead - * to ensure the quality of the result without sacrificing too much - * performance.

      - * - * @see #createThumbnailFast(java.awt.image.BufferedImage, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int, int) - * @param image the source image - * @param newWidth the width of the thumbnail - * @param newHeight the height of the thumbnail - * @return a new compatible BufferedImage containing a - * thumbnail of image - * @throws IllegalArgumentException if newWidth is larger than - * the width of image or if code>newHeight is larger - * than the height of image or if one of the dimensions - * is <= 0 - */ - public static BufferedImage createThumbnailFast(BufferedImage image, - int newWidth, int newHeight) { - if (newWidth >= image.getWidth() || - newHeight >= image.getHeight()) { - throw new IllegalArgumentException("newWidth and newHeight cannot" + - " be greater than the image" + - " dimensions"); - } else if (newWidth <= 0 || newHeight <= 0) { - throw new IllegalArgumentException("newWidth and newHeight must" + - " be greater than 0"); - } - - BufferedImage temp = createCompatibleImage(image, newWidth, newHeight); - Graphics2D g2 = temp.createGraphics(); - - try { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(image, 0, 0, temp.getWidth(), temp.getHeight(), null); - } finally { - g2.dispose(); - } - - return temp; - } - - /** - *

      Returns a thumbnail of a source image. newSize defines - * the length of the longest dimension of the thumbnail. The other - * dimension is then computed according to the dimensions ratio of the - * original picture.

      - *

      This method offers a good trade-off between speed and quality. - * The result looks better than - * {@link #createThumbnailFast(java.awt.image.BufferedImage, int)} when - * the new size is less than half the longest dimension of the source - * image, yet the rendering speed is almost similar.

      - * - * @see #createThumbnailFast(java.awt.image.BufferedImage, int, int) - * @see #createThumbnailFast(java.awt.image.BufferedImage, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int, int) - * @param image the source image - * @param newSize the length of the largest dimension of the thumbnail - * @return a new compatible BufferedImage containing a - * thumbnail of image - * @throws IllegalArgumentException if newSize is larger than - * the largest dimension of image or <= 0 - */ - public static BufferedImage createThumbnail(BufferedImage image, - int newSize) { - int width = image.getWidth(); - int height = image.getHeight(); - - boolean isTranslucent = image.getTransparency() != Transparency.OPAQUE; - boolean isWidthGreater = width > height; - - if (isWidthGreater) { - if (newSize >= width) { - throw new IllegalArgumentException("newSize must be lower than" + - " the image width"); - } - } else if (newSize >= height) { - throw new IllegalArgumentException("newSize must be lower than" + - " the image height"); - } - - if (newSize <= 0) { - throw new IllegalArgumentException("newSize must" + - " be greater than 0"); - } - - float ratioWH = (float) width / (float) height; - float ratioHW = (float) height / (float) width; - - BufferedImage thumb = image; - BufferedImage temp = null; - - Graphics2D g2 = null; - - try { - int previousWidth = width; - int previousHeight = height; - - do { - if (isWidthGreater) { - width /= 2; - if (width < newSize) { - width = newSize; - } - height = (int) (width / ratioWH); - } else { - height /= 2; - if (height < newSize) { - height = newSize; - } - width = (int) (height / ratioHW); - } - - if (temp == null || isTranslucent) { - if (g2 != null) { - //do not need to wrap with finally - //outer finally block will ensure - //that resources are properly reclaimed - g2.dispose(); - } - temp = createCompatibleImage(image, width, height); - g2 = temp.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - } - g2.drawImage(thumb, 0, 0, width, height, - 0, 0, previousWidth, previousHeight, null); - - previousWidth = width; - previousHeight = height; - - thumb = temp; - } while (newSize != (isWidthGreater ? width : height)); - } finally { - g2.dispose(); - } - - if (width != thumb.getWidth() || height != thumb.getHeight()) { - temp = createCompatibleImage(image, width, height); - g2 = temp.createGraphics(); - - try { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(thumb, 0, 0, width, height, 0, 0, width, height, null); - } finally { - g2.dispose(); - } - - thumb = temp; - } - - return thumb; - } - - /** - *

      Returns a thumbnail of a source image.

      - *

      This method offers a good trade-off between speed and quality. - * The result looks better than - * {@link #createThumbnailFast(java.awt.image.BufferedImage, int)} when - * the new size is less than half the longest dimension of the source - * image, yet the rendering speed is almost similar.

      - * - * @see #createThumbnailFast(java.awt.image.BufferedImage, int) - * @see #createThumbnailFast(java.awt.image.BufferedImage, int, int) - * @see #createThumbnail(java.awt.image.BufferedImage, int) - * @param image the source image - * @param newWidth the width of the thumbnail - * @param newHeight the height of the thumbnail - * @return a new compatible BufferedImage containing a - * thumbnail of image - * @throws IllegalArgumentException if newWidth is larger than - * the width of image or if code>newHeight is larger - * than the height of image or if one the dimensions is not > 0 - */ - public static BufferedImage createThumbnail(BufferedImage image, - int newWidth, int newHeight) { - int width = image.getWidth(); - int height = image.getHeight(); - - boolean isTranslucent = image.getTransparency() != Transparency.OPAQUE; - - if (newWidth >= width || newHeight >= height) { - throw new IllegalArgumentException("newWidth and newHeight cannot" + - " be greater than the image" + - " dimensions"); - } else if (newWidth <= 0 || newHeight <= 0) { - throw new IllegalArgumentException("newWidth and newHeight must" + - " be greater than 0"); - } - - BufferedImage thumb = image; - BufferedImage temp = null; - - Graphics2D g2 = null; - - try { - int previousWidth = width; - int previousHeight = height; - - do { - if (width > newWidth) { - width /= 2; - if (width < newWidth) { - width = newWidth; - } - } - - if (height > newHeight) { - height /= 2; - if (height < newHeight) { - height = newHeight; - } - } - - if (temp == null || isTranslucent) { - if (g2 != null) { - //do not need to wrap with finally - //outer finally block will ensure - //that resources are properly reclaimed - g2.dispose(); - } - temp = createCompatibleImage(image, width, height); - g2 = temp.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - } - g2.drawImage(thumb, 0, 0, width, height, - 0, 0, previousWidth, previousHeight, null); - - previousWidth = width; - previousHeight = height; - - thumb = temp; - } while (width != newWidth || height != newHeight); - } finally { - g2.dispose(); - } - - if (width != thumb.getWidth() || height != thumb.getHeight()) { - temp = createCompatibleImage(image, width, height); - g2 = temp.createGraphics(); - - try { - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, - RenderingHints.VALUE_INTERPOLATION_BILINEAR); - g2.drawImage(thumb, 0, 0, width, height, 0, 0, width, height, null); - } finally { - g2.dispose(); - } - - thumb = temp; - } - - return thumb; - } - - /** - *

      Returns an array of pixels, stored as integers, from a - * BufferedImage. The pixels are grabbed from a rectangular - * area defined by a location and two dimensions. Calling this method on - * an image of type different from BufferedImage.TYPE_INT_ARGB - * and BufferedImage.TYPE_INT_RGB will unmanage the image.

      - * - * @param img the source image - * @param x the x location at which to start grabbing pixels - * @param y the y location at which to start grabbing pixels - * @param w the width of the rectangle of pixels to grab - * @param h the height of the rectangle of pixels to grab - * @param pixels a pre-allocated array of pixels of size w*h; can be null - * @return pixels if non-null, a new array of integers - * otherwise - * @throws IllegalArgumentException is pixels is non-null and - * of length < w*h - */ - public static int[] getPixels(BufferedImage img, - int x, int y, int w, int h, int[] pixels) { - if (w == 0 || h == 0) { - return new int[0]; - } - - if (pixels == null) { - pixels = new int[w * h]; - } else if (pixels.length < w * h) { - throw new IllegalArgumentException("pixels array must have a length" + - " >= w*h"); - } - - int imageType = img.getType(); - if (imageType == BufferedImage.TYPE_INT_ARGB || - imageType == BufferedImage.TYPE_INT_RGB) { - Raster raster = img.getRaster(); - return (int[]) raster.getDataElements(x, y, w, h, pixels); - } - - // Unmanages the image - return img.getRGB(x, y, w, h, pixels, 0, w); - } - - /** - *

      Writes a rectangular area of pixels in the destination - * BufferedImage. Calling this method on - * an image of type different from BufferedImage.TYPE_INT_ARGB - * and BufferedImage.TYPE_INT_RGB will unmanage the image.

      - * - * @param img the destination image - * @param x the x location at which to start storing pixels - * @param y the y location at which to start storing pixels - * @param w the width of the rectangle of pixels to store - * @param h the height of the rectangle of pixels to store - * @param pixels an array of pixels, stored as integers - * @throws IllegalArgumentException is pixels is non-null and - * of length < w*h - */ - public static void setPixels(BufferedImage img, - int x, int y, int w, int h, int[] pixels) { - if (pixels == null || w == 0 || h == 0) { - return; - } else if (pixels.length < w * h) { - throw new IllegalArgumentException("pixels array must have a length" + - " >= w*h"); - } - - int imageType = img.getType(); - if (imageType == BufferedImage.TYPE_INT_ARGB || - imageType == BufferedImage.TYPE_INT_RGB) { - WritableRaster raster = img.getRaster(); - raster.setDataElements(x, y, w, h, pixels); - } else { - // Unmanages the image - img.setRGB(x, y, w, h, pixels, 0, w); - } - } - - /** - * Sets the clip on a graphics object by merging a supplied clip with the - * existing one. The new clip will be an intersection of the old clip and - * the supplied clip. The old clip shape will be returned. This is useful - * for resetting the old clip after an operation is performed. - * - * @param g - * the graphics object to update - * @param clip - * a new clipping region to add to the graphics clip. This may - * return {@code null} if the current clip is {@code null}. - * @return the current clipping region of the supplied graphics object - * @throws NullPointerException - * if any parameter is {@code null} - */ - public static Shape mergeClip(Graphics g, Shape clip) { - Shape oldClip = g.getClip(); - if(oldClip == null) { - g.setClip(clip); - return null; - } - Area area = new Area(oldClip); - area.intersect(new Area(clip));//new Rectangle(0,0,width,height))); - g.setClip(area); - return oldClip; - } -} \ No newline at end of file diff --git a/src/org/jdesktop/swingx/painter/AbstractPainter.java b/src/org/jdesktop/swingx/painter/AbstractPainter.java deleted file mode 100644 index a42fa7196e7..00000000000 --- a/src/org/jdesktop/swingx/painter/AbstractPainter.java +++ /dev/null @@ -1,427 +0,0 @@ -/* - * $Id$ - * - * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package org.jdesktop.swingx.painter; - -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Graphics2D; -import java.awt.RenderingHints; -import java.awt.image.BufferedImage; -import java.awt.image.BufferedImageOp; -import java.lang.ref.SoftReference; - -import org.jdesktop.beans.AbstractBean; -import org.jdesktop.swingx.graphics.GraphicsUtilities; - -/** - *

      A convenient base class from which concrete {@link Painter} implementations may - * extend. It extends {@link org.jdesktop.beans.AbstractBean} as a convenience for - * adding property change notification support. In addition, AbstractPainter - * provides subclasses with the ability to cacheable painting operations, configure the - * drawing surface with common settings (such as antialiasing and interpolation), and - * toggle whether a subclass paints or not via the visibility property.

      - * - *

      Subclasses of AbstractPainter generally need only override the - * {@link #doPaint(Graphics2D, Object, int, int)} method. If a subclass requires more control - * over whether cacheing is enabled, or for configuring the graphics state, then it - * may override the appropriate protected methods to interpose its own behavior.

      - * - *

      For example, here is the doPaint method of a simple Painter that - * paints an opaque rectangle: - *

      
      - *  public void doPaint(Graphics2D g, T obj, int width, int height) {
      - *      g.setPaint(Color.BLUE);
      - *      g.fillRect(0, 0, width, height);
      - *  }
      - * 

      - * - * @author rbair - */ -public abstract class AbstractPainter extends AbstractBean implements Painter { - /** - * An enum representing the possible interpolation values of Bicubic, Bilinear, and - * Nearest Neighbor. These map to the underlying RenderingHints, - * but are easier to use and serialization safe. - */ - public enum Interpolation { - /** - * use bicubic interpolation - */ - Bicubic(RenderingHints.VALUE_INTERPOLATION_BICUBIC), - /** - * use bilinear interpolation - */ - Bilinear(RenderingHints.VALUE_INTERPOLATION_BILINEAR), - /** - * use nearest neighbor interpolation - */ - NearestNeighbor(RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR); - - private Object value; - Interpolation(Object value) { - this.value = value; - } - private void configureGraphics(Graphics2D g) { - g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, value); - } - } - - //--------------------------------------------------- Instance Variables - /** - * The cached image, if shouldUseCache() returns true - */ - private transient SoftReference cachedImage; - private boolean cacheCleared = true; - private boolean cacheable = false; - private boolean dirty = false; - private BufferedImageOp[] filters = new BufferedImageOp[0]; - private boolean antialiasing = true; - private Interpolation interpolation = Interpolation.NearestNeighbor; - private boolean visible = true; - - /** - * Creates a new instance of AbstractPainter. - */ - public AbstractPainter() { } - - /** - * Creates a new instance of AbstractPainter. - * @param cacheable indicates if this painter should be cacheable - */ - public AbstractPainter(boolean cacheable) { - setCacheable(cacheable); - } - - /** - * A defensive copy of the Effects to apply to the results - * of the AbstractPainter's painting operation. The array may - * be empty but it will never be null. - * @return the array of filters applied to this painter - */ - public final BufferedImageOp[] getFilters() { - BufferedImageOp[] results = new BufferedImageOp[filters.length]; - System.arraycopy(filters, 0, results, 0, results.length); - return results; - } - - /** - *

      A convenience method for specifying the filters to use based on - * BufferedImageOps. These will each be individually wrapped by an ImageFilter - * and then setFilters(Effect... filters) will be called with the resulting - * array

      - * - * - * @param effects the BufferedImageOps to wrap as filters - */ - public void setFilters(BufferedImageOp ... effects) { - if (effects == null) effects = new BufferedImageOp[0]; - BufferedImageOp[] old = getFilters(); - this.filters = new BufferedImageOp[effects == null ? 0 : effects.length]; - System.arraycopy(effects, 0, this.filters, 0, this.filters.length); - setDirty(true); - firePropertyChange("filters", old, getFilters()); - } - - /** - * Returns if antialiasing is turned on or not. The default value is true. - * This is a bound property. - * @return the current antialiasing setting - */ - public boolean isAntialiasing() { - return antialiasing; - } - /** - * Sets the antialiasing setting. This is a bound property. - * @param value the new antialiasing setting - */ - public void setAntialiasing(boolean value) { - boolean old = isAntialiasing(); - antialiasing = value; - if (old != value) setDirty(true); - firePropertyChange("antialiasing", old, isAntialiasing()); - } - - /** - * Gets the current interpolation setting. This property determines if interpolation will - * be used when drawing scaled images. @see java.awt.RenderingHints.KEY_INTERPOLATION. - * @return the current interpolation setting - */ - public Interpolation getInterpolation() { - return interpolation; - } - - /** - * Sets a new value for the interpolation setting. This setting determines if interpolation - * should be used when drawing scaled images. @see java.awt.RenderingHints.KEY_INTERPOLATION. - * @param value the new interpolation setting - */ - public void setInterpolation(Interpolation value) { - Object old = getInterpolation(); - this.interpolation = value == null ? Interpolation.NearestNeighbor : value; - if (old != value) setDirty(true); - firePropertyChange("interpolation", old, getInterpolation()); - } - - /** - * Gets the visible property. This controls if the painter should - * paint itself. It is true by default. Setting visible to false - * is good when you want to temporarily turn off a painter. An example - * of this is a painter that you only use when a button is highlighted. - * - * @return current value of visible property - */ - public boolean isVisible() { - return this.visible; - } - - /** - *

      Sets the visible property. This controls if the painter should - * paint itself. It is true by default. Setting visible to false - * is good when you want to temporarily turn off a painter. An example - * of this is a painter that you only use when a button is highlighted.

      - * - * @param visible New value of visible property. - */ - public void setVisible(boolean visible) { - boolean old = isVisible(); - this.visible = visible; - if (old != visible) setDirty(true); //not the most efficient, but I must do this otherwise a CompoundPainter - //or other aggregate painter won't know that it is now invalid - //there might be a tricky solution but that is a performance optimization - firePropertyChange("visible", old, isVisible()); - } - - /** - *

      Gets whether this AbstractPainter can be cached as an image. - * If cacheing is enabled, then it is the responsibility of the developer to - * invalidate the painter (via {@link #clearCache}) if external state has - * changed in such a way that the painter is invalidated and needs to be - * repainted.

      - * - * @return whether this is cacheable - */ - public boolean isCacheable() { - return cacheable; - } - - /** - *

      Sets whether this AbstractPainter can be cached as an image. - * If true, this is treated as a hint. That is, a cacheable may or may not be used. - * The {@link #shouldUseCache} method actually determines whether the cacheable is used. - * However, if false, then this is treated as an absolute value. That is, no - * cacheable will be used.

      - * - *

      If set to false, then #clearCache is called to free system resources.

      - * - * @param cacheable - */ - public void setCacheable(boolean cacheable) { - boolean old = isCacheable(); - this.cacheable = cacheable; - firePropertyChange("cacheable", old, isCacheable()); - if (!isCacheable()) { - clearCache(); - } - } - - /** - *

      Call this method to clear the cacheable. This may be called whether there is - * a cacheable being used or not. If cleared, on the next call to paint, - * the painting routines will be called.

      - * - *

      SubclassesIf overridden in subclasses, you - * must call super.clearCache, or physical - * resources (such as an Image) may leak.

      - */ - public void clearCache() { - BufferedImage cache = cachedImage == null ? null : cachedImage.get(); - if (cache != null) { - cache.flush(); - } - cacheCleared = true; - if (!isCacheable()) { - cachedImage = null; - } - } - - /** - * Only made package private for testing. Don't call this method outside - * of this class! This is NOT a bound property - */ - boolean isCacheCleared() { - return cacheCleared; - } - - /** - *

      Called to allow Painter subclasses a chance to see if any state - * in the given object has changed from the last paint operation. If it has, then - * the Painter has a chance to mark itself as dirty, thus causing a - * repaint, even if cached.

      - * - * @param object - */ - protected void validate(T object) { } - - /** - * Ye olde dirty bit. If true, then the painter is considered dirty and in need of - * being repainted. This is a bound property. - * - * @return true if the painter state has changed and the painter needs to be - * repainted. - */ - protected boolean isDirty() { - return dirty; - } - - /** - * Sets the dirty bit. If true, then the painter is considered dirty, and the cache - * will be cleared. This property is bound. - * - * @param d whether this Painter is dirty. - */ - protected void setDirty(boolean d) { - boolean old = isDirty(); - this.dirty = d; - firePropertyChange("dirty", old, isDirty()); - if (isDirty()) { - clearCache(); - } - } - - /** - *

      Returns true if the painter should use caching. This method allows subclasses to - * specify the heuristics regarding whether to cache or not. If a Painter - * has intelligent rules regarding painting times, and can more accurately indicate - * whether it should be cached, it could implement that logic in this method.

      - * - * @return whether or not a cache should be used - */ - protected boolean shouldUseCache() { - return isCacheable() || filters.length > 0; //NOTE, I can only do this because getFilters() is final - } - - /** - *

      This method is called by the paint method prior to - * any drawing operations to configure the drawing surface. The default - * implementation sets the rendering hints that have been specified for - * this AbstractPainter.

      - * - *

      This method can be overridden by subclasses to modify the drawing - * surface before any painting happens.

      - * - * @param g the graphics surface to configure. This will never be null. - * @see #paint(Graphics2D, Object, int, int) - */ - protected void configureGraphics(Graphics2D g) { - //configure antialiasing - if(isAntialiasing()) { - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_ON); - } else { - g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, - RenderingHints.VALUE_ANTIALIAS_OFF); - } - - getInterpolation().configureGraphics(g); - } - - - /** - * Subclasses must implement this method and perform custom painting operations - * here. - * @param width - * @param height - * @param g The Graphics2D object in which to paint - * @param object - */ - protected abstract void doPaint(Graphics2D g, T object, int width, int height); - - /** - * @inheritDoc - */ - public final void paint(Graphics2D g, T obj, int width, int height) { - if (g == null) { - throw new NullPointerException("The Graphics2D must be supplied"); - } - - if(!isVisible() || width < 1 || height < 1) { - return; - } - - configureGraphics(g); - - //paint to a temporary image if I'm caching, or if there are filters to apply - if (shouldUseCache() || filters.length > 0) { - validate(obj); - BufferedImage cache = cachedImage == null ? null : cachedImage.get(); - boolean invalidCache = null == cache || - cache.getWidth() != width || - cache.getHeight() != height; - - if (cacheCleared || invalidCache || isDirty()) { - //rebuild the cacheable. I do this both if a cacheable is needed, and if any - //filters exist. I only *save* the resulting image if caching is turned on - if (invalidCache) { - cache = GraphicsUtilities.createCompatibleTranslucentImage(width, height); - } - Graphics2D gfx = cache.createGraphics(); - - try { - gfx.setClip(0, 0, width, height); - - if (!invalidCache) { - // If we are doing a repaint, but we didn't have to - // recreate the image, we need to clear it back - // to a fully transparent background. - Composite composite = gfx.getComposite(); - gfx.setComposite(AlphaComposite.Clear); - gfx.fillRect(0, 0, width, height); - gfx.setComposite(composite); - } - - configureGraphics(gfx); - doPaint(gfx, obj, width, height); - } finally { - gfx.dispose(); - } - - for (BufferedImageOp f : getFilters()) { - cache = f.filter(cache, null); - } - - //only save the temporary image as the cacheable if I'm caching - if (shouldUseCache()) { - cachedImage = new SoftReference(cache); - cacheCleared = false; - } - } - - g.drawImage(cache, 0, 0, null); - } else { - //can't use the cacheable, so just paint - doPaint(g, obj, width, height); - } - - //painting has occurred, so restore the dirty bit to false - setDirty(false); - } -} \ No newline at end of file diff --git a/src/org/jdesktop/swingx/painter/Painter.java b/src/org/jdesktop/swingx/painter/Painter.java deleted file mode 100644 index dd1dffc2ed2..00000000000 --- a/src/org/jdesktop/swingx/painter/Painter.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * $Id$ - * - * Copyright 2006 Sun Microsystems, Inc., 4150 Network Circle, - * Santa Clara, California 95054, U.S.A. All rights reserved. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -package org.jdesktop.swingx.painter; - -import java.awt.Graphics2D; - -/** - *

      A painting delegate. The Painter interface defines exactly one method, - * paint. It is used in situations where the developer can change - * the painting routine of a component without having to resort to subclassing - * the component.

      - * - *

      Painters are simply encapsulations of Java2D code and make - * it fairly trivial to reuse existing Painters or to combine - * them together. Implementations of this interface are also trivial to write, - * such that if you can't find a Painter that does what you need, - * you can write one with minimal effort. Writing a Painter requires - * knowledge of Java2D.

      - * - *

      A Painter may be created with a type parameter. This type will be - * expected in the paint method. For example, you may wish to write a - * Painter that only works with subclasses of {@link java.awt.Component}. - * In that case, when the Painter is declared, you may declare that - * it requires a Component, allowing the paint method to be type safe. Ex: - *

      
      - *     Painter<Component> p = new Painter<Component>() {
      - *         public void paint(Graphics2D g, Component c, int width, int height) {
      - *             g.setColor(c.getBackground());
      - *             //and so forth
      - *         }
      - *     }
      - * 

      - * - *

      This class is not threadsafe.

      - * - * @author rbair - * @see AbstractPainter - * @see CompoundPainter - * @see org.jdesktop.swingx.JXPanel - * @see org.jdesktop.swingx.JXLabel - * @see org.jdesktop.swingx.JXButton - */ -public interface Painter { - /** - *

      Renders to the given {@link java.awt.Graphics2D} object. Implementations - * of this method may modify state on the Graphics2D, and are not - * required to restore that state upon completion. In most cases, it is recommended - * that the caller pass in a scratch graphics object. The Graphics2D - * must never be null.

      - * - *

      State on the graphics object may be honored by the paint method, - * but may not be. For instance, setting the antialiasing rendering hint on the - * graphics may or may not be respected by the Painter implementation.

      - * - *

      The supplied object parameter acts as an optional configuration argument. - * For example, it could be of type Component. A Painter - * that expected it could then read state from that Component and - * use the state for painting. For example, an implementation may read the - * backgroundColor and use that.

      - * - *

      Generally, to enhance reusability, most standard Painters ignore - * this parameter. They can thus be reused in any context. The object - * may be null. Implementations must not throw a NullPointerException if the object - * parameter is null.

      - * - *

      Finally, the width and height arguments specify the - * width and height that the Painter should paint into. More - * specifically, the specified width and height instruct the painter that it should - * paint fully within this width and height. Any specified clip on the - * g param will further constrain the region.

      - * - *

      For example, suppose I have a Painter implementation that draws - * a gradient. The gradient goes from white to black. It "stretches" to fill the - * painted region. Thus, if I use this Painter to paint a 500 x 500 - * region, the far left would be black, the far right would be white, and a smooth - * gradient would be painted between. I could then, without modification, reuse the - * Painter to paint a region that is 20x20 in size. This region would - * also be black on the left, white on the right, and a smooth gradient painted - * between.

      - * - * @param g The Graphics2D to render to. This must not be null. - * @param object an optional configuration parameter. This may be null. - * @param width width of the area to paint. - * @param height height of the area to paint. - */ - public void paint(Graphics2D g, T object, int width, int height); -} \ No newline at end of file diff --git a/src/treeProperties/PropertyElement.java b/src/treeProperties/PropertyElement.java index 59d6a7e6aee..4fb020683af 100644 --- a/src/treeProperties/PropertyElement.java +++ b/src/treeProperties/PropertyElement.java @@ -1,38 +1,44 @@ /** * PropertyElement.java - * + * * Created on 19.08.2009 */ package treeProperties; - - /** * The class PropertyElement. - * - * @version V0.0 19.08.2009 + * * @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 index d01f2c77a88..86baeba0eab 100644 --- a/src/treeProperties/PropertyType.java +++ b/src/treeProperties/PropertyType.java @@ -1,34 +1,44 @@ - -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 - * - * @version V0.0 19.08.2009 - * @author Clemens Koza - */ -public interface PropertyType { - /** - * The suffix, not including "--", that identifies this content type. - */ - public String getSuffix(); - - /** - * The class that identifies this content type. - */ - public Class getType(); - - /** - * Returns an object for the specified value, in the context of a TreeProperties. - */ - public T toObject(TreeProperties p, String s); -} +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 index 1453e531f5d..b48e764cef6 100644 --- a/src/treeProperties/TreeProperties.java +++ b/src/treeProperties/TreeProperties.java @@ -1,401 +1,457 @@ - -package treeProperties; - - -/** - * TreeProperties.java - * - * Created on 19.08.2009 - */ - - -import static java.lang.String.*; -import static java.util.Collections.*; - -import java.io.BufferedInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Properties; -import java.util.Set; -import java.util.Map.Entry; - -import treeProperties.types.FileType; - - -/** - * 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 - * - * @version V0.0 19.08.2009 - * @author Clemens Koza - * @see Properties - */ -public class TreeProperties implements Iterable { - private static final Map> suffixes; - private static final Map, PropertyType> types; - - private static final String transparent = "transparent-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; - - public static void addType(PropertyType type) { - types.put(type.getType(), type); - suffixes.put(type.getSuffix(), type); - } - - 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)} - */ - public TreeProperties(String f) throws IOException { - this(new File(f)); - } - - /** - * Delegate to {@link #TreeProperties(File)} with a new {@link File#File(File, String)} - */ - 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. - */ - 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. - */ - public List getExceptions() { - return exceptions; - } - - /** - * If exceptions occurred during construction, this method throws an IOException that combines the messages of - * those exceptions. - */ - 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. - */ - 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 - */ - private void checkQueryKey(String key) { - if(key.contains("--")) throw new IllegalArgumentException("Invalid key: " + key); - } - - /** - * Retrieves the string property for the given key. - */ - public String getProperty(String key) { - return getProperty(key, String.class); - } - - /** - * Convenience for {@code getProperty(key, File.class)}. - */ - 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. - */ - public TreeProperties getChildProperties(String key) { - return (TreeProperties) getProperty(key, "--" + child, true); - } - - /** - * Retrieves the child properties for the given key. - */ - 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. - */ - @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); - } - - 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. - */ - public Iterator iterator() { - return iterator(""); - }; - - 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(); - } - } -} +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 index 67080bc8db6..e3d8525ca9a 100644 --- a/src/treeProperties/types/FileType.java +++ b/src/treeProperties/types/FileType.java @@ -1,64 +1,80 @@ -/** - * FileType.java - * - * Created on 19.08.2009 - */ - -package treeProperties.types; - - -import java.io.File; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import treeProperties.PropertyType; -import treeProperties.TreeProperties; - - -/** - * The class FileType. - * - * @version V0.0 19.08.2009 - * @author Clemens Koza - */ -public class FileType implements PropertyType { - public static final String suffix = "file"; - public static final Class type = File.class; - - public String getSuffix() { - return suffix; - } - - public Class getType() { - return type; - } - - - 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)}
      • - *
      - */ - 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(); - } -} +/** + * 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(); + } +}